@posiwise/resource-module 0.0.202 → 0.0.204

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 (45) hide show
  1. package/fesm2022/{posiwise-resource-module-base-top-banner.component-CrdBpNSj.mjs → posiwise-resource-module-base-top-banner.component-BwujN_up.mjs} +16 -32
  2. package/fesm2022/posiwise-resource-module-base-top-banner.component-BwujN_up.mjs.map +1 -0
  3. package/fesm2022/{posiwise-resource-module-resource-blogs.module-hxktrj98.mjs → posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs} +54 -72
  4. package/fesm2022/posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs.map +1 -0
  5. package/fesm2022/{posiwise-resource-module-resource-cards.module-D3yf7FNt.mjs → posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs} +718 -705
  6. package/fesm2022/posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs.map +1 -0
  7. package/fesm2022/{posiwise-resource-module-resource-case-studies.module-CFcO0CI-.mjs → posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs} +64 -63
  8. package/fesm2022/posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs.map +1 -0
  9. package/fesm2022/{posiwise-resource-module-resource-events.module-0PDppSJ6.mjs → posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs} +55 -56
  10. package/fesm2022/posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs.map +1 -0
  11. package/fesm2022/{posiwise-resource-module-resource-hub.module-2qzLV9I1.mjs → posiwise-resource-module-resource-hub.module-alVvQLvR.mjs} +145 -126
  12. package/fesm2022/posiwise-resource-module-resource-hub.module-alVvQLvR.mjs.map +1 -0
  13. package/fesm2022/{posiwise-resource-module-resource-integrations.module-DqDd_1U9.mjs → posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs} +133 -136
  14. package/fesm2022/posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs.map +1 -0
  15. package/fesm2022/posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs +399 -0
  16. package/fesm2022/posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs.map +1 -0
  17. package/fesm2022/{posiwise-resource-module-resource-post.module-BFuEjqA9.mjs → posiwise-resource-module-resource-post.module-CGxj27dN.mjs} +208 -214
  18. package/fesm2022/posiwise-resource-module-resource-post.module-CGxj27dN.mjs.map +1 -0
  19. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-BbofH_0n.mjs → posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs} +63 -75
  20. package/fesm2022/posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs.map +1 -0
  21. package/fesm2022/{posiwise-resource-module-resource-root.module-C9c17Dhm.mjs → posiwise-resource-module-resource-root.module-x4TYntdq.mjs} +135 -138
  22. package/fesm2022/posiwise-resource-module-resource-root.module-x4TYntdq.mjs.map +1 -0
  23. package/fesm2022/{posiwise-resource-module-resource-videos.module-BsnB9vFd.mjs → posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs} +54 -75
  24. package/fesm2022/posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs.map +1 -0
  25. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-BC-OyhAK.mjs → posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs} +58 -72
  26. package/fesm2022/posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs.map +1 -0
  27. package/fesm2022/{posiwise-resource-module-resource.service-IK3r0iUB.mjs → posiwise-resource-module-resource.service-DAXsq-WG.mjs} +7 -8
  28. package/fesm2022/posiwise-resource-module-resource.service-DAXsq-WG.mjs.map +1 -0
  29. package/fesm2022/posiwise-resource-module.mjs +254 -221
  30. package/fesm2022/posiwise-resource-module.mjs.map +1 -1
  31. package/package.json +1 -1
  32. package/types/posiwise-resource-module.d.ts +159 -168
  33. package/fesm2022/posiwise-resource-module-base-top-banner.component-CrdBpNSj.mjs.map +0 -1
  34. package/fesm2022/posiwise-resource-module-resource-blogs.module-hxktrj98.mjs.map +0 -1
  35. package/fesm2022/posiwise-resource-module-resource-cards.module-D3yf7FNt.mjs.map +0 -1
  36. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CFcO0CI-.mjs.map +0 -1
  37. package/fesm2022/posiwise-resource-module-resource-events.module-0PDppSJ6.mjs.map +0 -1
  38. package/fesm2022/posiwise-resource-module-resource-hub.module-2qzLV9I1.mjs.map +0 -1
  39. package/fesm2022/posiwise-resource-module-resource-integrations.module-DqDd_1U9.mjs.map +0 -1
  40. package/fesm2022/posiwise-resource-module-resource-post.module-BFuEjqA9.mjs.map +0 -1
  41. package/fesm2022/posiwise-resource-module-resource-release-notes.module-BbofH_0n.mjs.map +0 -1
  42. package/fesm2022/posiwise-resource-module-resource-root.module-C9c17Dhm.mjs.map +0 -1
  43. package/fesm2022/posiwise-resource-module-resource-videos.module-BsnB9vFd.mjs.map +0 -1
  44. package/fesm2022/posiwise-resource-module-resource-white-papers.module-BC-OyhAK.mjs.map +0 -1
  45. package/fesm2022/posiwise-resource-module-resource.service-IK3r0iUB.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-cards.module-D3yf7FNt.mjs","names":["i1.ResourceService","i9.ResourceEditCardLazyComponent","i1.ResourceService","i9.ResourceEditCardLazyComponent","i1.ResourceService","i9.ResourceEditCardLazyComponent","i1.ResourceService","i1.ResourceService","i9.ResourceEditCardLazyComponent","i2.ResourceService","i3","i4","i5","i6","i7","i8","i9","i10.ResourceEditCardLazyComponent","i11","i1.ResourceService","i3","i4","i5","i6","i7.ResourceEditCardLazyComponent","i8","i1.ResourceService","i9.ReplayEventCardComponent","i10.ResourceEditCardLazyComponent","i11"],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-contact-us/resource-contact-us.module.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card-lazy/resource-edit-card-lazy.component.ts","../../../../libs/resource-module/src/lib/public/shared/resource-pager.ts","../../../../libs/resource-module/src/lib/public/components/reslease-note-card/release-note-card.component.ts","../../../../libs/resource-module/src/lib/public/components/reslease-note-card/release-note-card.component.html","../../../../libs/resource-module/src/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/resource-cards/resource-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/resource-cards/resource-cards.component.html","../../../../libs/resource-module/src/lib/public/components/base/base-resource.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-vault/resource-vault.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-vault/resource-vault.component.html","../../../../libs/resource-module/src/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-webinars/replay-event-cards/replay-event-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-webinars/replay-event-cards/replay-event-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.html","../../../../libs/resource-module/src/lib/public/shared/resource-cards.module.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\n\nimport { Trial4SharedContactUsModule } from '@posiwise/resource-contact-us';\n\n@NgModule({\n imports: [Trial4SharedContactUsModule],\n exports: [Trial4SharedContactUsModule]\n})\nexport class Trial4ContactUsModule {}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n type SimpleChanges,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\n\n/**\n * Lazy-loading wrapper for ResourceEditCard\n */\n@Component({\n selector: 'pw-resource-edit-card-lazy',\n template: `<ng-container #editCardContainer></ng-container>`,\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceEditCardLazyComponent implements OnChanges, OnDestroy {\n @ViewChild('editCardContainer', { read: ViewContainerRef, static: true })\n container!: ViewContainerRef;\n\n @Input() id!: number;\n @Input() resourceData;\n @Input() canEdit = false;\n @Output() updated = new EventEmitter<void>();\n\n private componentRef = null;\n private loading = false;\n\n constructor(private readonly cdr: ChangeDetectorRef) {}\n\n async ngOnChanges(changes: SimpleChanges) {\n if (this.canEdit && !this.componentRef && !this.loading) {\n await this.loadEditCard();\n } else if (!this.canEdit && this.componentRef) {\n this.container.clear();\n this.componentRef = null;\n } else if (this.componentRef && (changes['id'] || changes['resourceData'])) {\n // Update existing component inputs\n this.componentRef.instance.id = this.id;\n this.componentRef.instance.resourceData = this.resourceData;\n }\n }\n\n private async loadEditCard() {\n if (this.componentRef || this.loading) return; // Prevent double loading\n\n this.loading = true; // Set BEFORE async operation\n\n try {\n // Dynamically import ResourceEditCard component (145 KB)\n const module = await import('../resource-edit-card/resource-edit-card.component');\n const ResourceEditCardComponent = module.ResourceEditCardComponent;\n\n // Ensure container exists and is clear\n if (!this.container) return;\n this.container.clear();\n\n // Create component dynamically (only once)\n this.componentRef = this.container.createComponent(ResourceEditCardComponent);\n this.componentRef.instance.id = this.id;\n this.componentRef.instance.resourceData = this.resourceData;\n this.componentRef.instance.updated.subscribe(() => {\n this.updated.emit();\n this.cdr.markForCheck();\n });\n this.loading = false;\n } catch (error) {\n console.error('Failed to load ResourceEditCard:', error);\n this.loading = false;\n }\n }\n\n ngOnDestroy() {\n this.componentRef?.destroy();\n }\n}\n","import { Resource } from '@posiwise/common-utilities';\n\nimport { Observable } from 'rxjs';\n\nimport type { ResourceService } from '../../resource.service';\n\n/** One page of `/posts/get_all`; `object_count` is the total after filtering. */\nexport interface ResourcePostsPage<T> {\n posts?: T[];\n object_count?: number;\n}\n\n/** Sort sent to `/posts/get_all` so that pages line up with the order the cards are shown. */\nexport const NEWEST_PUBLISHED_FIRST = { order_by: 'published_at', order_direction: 'desc' };\n\n/** A post as `/posts/get_all` returns it: the shared `Resource` plus the listing fields. */\nexport type PublicPost = Resource & { showcase?: boolean; when?: string };\n\n/** What to list: the subscription plus a tag category or specific tags. */\nexport interface PublicPostsQuery {\n subscriptionId: number;\n tagCategoryIds?: string;\n tagIds?: string;\n}\n\n/** Posts fetched per request on every resources page. */\nexport const RESOURCE_PAGE_SIZE = 15;\n\n/** Distance from the page bottom (px) at which the next page is requested on scroll. */\nconst SCROLL_THRESHOLD = 300;\n\n/**\n * Pages through a resources list. Each load keeps fetching until it has added\n * `pageSize` posts that pass `keep` (or the server runs out), so a filter that\n * hides most of a page — showcase only, upcoming events only — never stalls it.\n */\nexport class ResourcePager<T> {\n items: T[] = [];\n isLoaded = false;\n isLoadingMore = false;\n\n private page = 0;\n private fetched = 0;\n private total = 0;\n // Bumped on reset, so a reply to a superseded request is ignored.\n private generation = 0;\n\n constructor(\n private readonly fetchPage: (\n page: number,\n pageSize: number\n ) => Observable<ResourcePostsPage<T>>,\n private readonly onChange: () => void,\n private readonly keep: (post: T) => boolean = () => true,\n readonly pageSize = RESOURCE_PAGE_SIZE\n ) {}\n\n /** A pager over the public `/posts` list, newest-published first. */\n static forPublicPosts(\n service: ResourceService,\n query: () => PublicPostsQuery,\n onChange: () => void,\n keep: (post: PublicPost) => boolean,\n pageSize = RESOURCE_PAGE_SIZE\n ): ResourcePager<PublicPost> {\n const fetchPage = (page: number, size: number) => {\n const q = query();\n return service.getPublicPosts(\n q.subscriptionId,\n page,\n size,\n '',\n q.tagCategoryIds,\n q.tagIds,\n NEWEST_PUBLISHED_FIRST\n );\n };\n return new ResourcePager<PublicPost>(fetchPage, onChange, keep, pageSize);\n }\n\n get hasMore(): boolean {\n return this.fetched < this.total;\n }\n\n /** Clears the list and loads the first posts. */\n reset(): void {\n this.generation += 1;\n this.items = [];\n this.page = 0;\n this.fetched = 0;\n this.total = 0;\n this.isLoaded = false;\n this.isLoadingMore = false;\n this.fetchNext(this.generation, 0);\n }\n\n /** Appends the next posts; ignored while a load is in flight or nothing is left. */\n loadMore(): void {\n if (!this.isLoaded || this.isLoadingMore || !this.hasMore) return;\n this.isLoadingMore = true;\n this.onChange();\n this.fetchNext(this.generation, 0);\n }\n\n /** Calls `loadMore` when the viewport is near the bottom of the page (browser only). */\n loadMoreIfNearBottom(): void {\n if (typeof window === 'undefined' || !this.isLoaded || !this.hasMore) return;\n const viewportBottom = window.scrollY + window.innerHeight;\n if (viewportBottom >= document.documentElement.scrollHeight - SCROLL_THRESHOLD) {\n this.loadMore();\n }\n }\n\n private fetchNext(generation: number, added: number): void {\n this.page += 1;\n this.fetchPage(this.page, this.pageSize).subscribe({\n next: response => {\n if (generation !== this.generation) return;\n const posts = response?.posts ?? [];\n this.fetched += posts.length;\n // An empty page ends paging even if the count disagrees, so this can't loop.\n this.total = posts.length ? (response.object_count ?? this.fetched) : this.fetched;\n const kept = posts.filter(this.keep);\n this.items = [...this.items, ...kept];\n const addedNow = added + kept.length;\n if (addedNow < this.pageSize && this.hasMore) {\n this.fetchNext(generation, addedNow);\n return;\n }\n this.finish();\n },\n error: () => {\n if (generation !== this.generation) return;\n this.page -= 1; // retry the same page on the next load\n this.finish();\n }\n });\n }\n\n private finish(): void {\n this.isLoaded = true;\n this.isLoadingMore = false;\n this.onChange();\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../shared/resource-pager';\n\nconst RELEASE_TAG_NAMES: Record<string, string> = {\n product: 'Product Release Notes',\n press: 'Press Release Notes'\n};\n\n@Component({\n selector: 'pw-resource-note-card',\n templateUrl: './release-note-card.component.html',\n styleUrls: [\n '../resources/resources-shared.component.scss',\n '../../shared/resource-load-more.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceNoteCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() releaseHeader = false;\n @Input() categoryId!: string;\n @Input() isReleasePress = false;\n @Input() isResource = false;\n @Input() postSlice = false;\n @Input() resourceTitle!: string;\n @Input() tag;\n @Input() user: User;\n\n canEditResourcesValue = false;\n @Input() userLoggedIn: boolean;\n\n isLoaded = false;\n subscriptionId;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n\n postTags: { [key: string]: { id: string; title: string } } = {};\n releasePosts: { [key: string]: Resource[] } = {};\n pagers: { [key: string]: ResourcePager<PublicPost> } = {};\n isLoadingMore: { [key: string]: boolean } = {};\n\n tagCategory;\n isEditingTitle: boolean;\n isPressEditingTitle: boolean;\n editedTitle: string;\n isMasterSubscription;\n\n constructor(\n injector: Injector,\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.getTags();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if ((changes['user'] || changes['userLoggedIn']) && this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n\n private getTags() {\n this.isLoaded = false;\n this.tagService\n .getAllTagCategories({ search: 'Release Notes' }, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.tagCategory = response?.tag_categories?.[0];\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n for (const [type, name] of Object.entries(RELEASE_TAG_NAMES)) {\n this.postTags[type] = this.findTag(response.tags, name, this.tagCategory?.id);\n if (this.postTags[type]?.id) {\n this.loadReleases(type);\n } else {\n this.isLoaded = true;\n this.releasePosts[type] = [];\n }\n }\n this.cdr.markForCheck();\n });\n }\n\n private findTag(tags, name: string, categoryId: number) {\n return tags.find(tag => tag.name === name && tag.tag_category_id === categoryId);\n }\n\n hasReleases(type: string): boolean {\n return this.releasePosts[type]?.length !== 0 && this.isLoaded;\n }\n\n /** Full page: newest first, 15 at a time (\"Load more\"). Landing: the 3 newest. */\n loadReleases(type: string): void {\n this.isLoaded = false;\n this.pagers[type] = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagIds: this.postTags[type]?.id\n }),\n () => this.syncFromPager(type),\n post => post.showcase === true,\n this.postSlice ? RESOURCE_PAGE_SIZE : 3\n );\n this.pagers[type].reset();\n }\n\n private syncFromPager(type: string): void {\n const pager = this.pagers[type];\n // Landing: 3 newest, oldest first. Full page: newest first, so \"Load more\" adds below.\n this.releasePosts[type] = this.postSlice ? pager.items : pager.items.slice(0, 3).reverse();\n this.isLoadingMore[type] = pager.isLoadingMore;\n this.isLoaded = Object.values(this.pagers).every(p => p.isLoaded);\n this.cdr.markForCheck();\n }\n\n toggleEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.postTags['product'].title;\n }\n\n toggleEditPressTitle() {\n this.isPressEditingTitle = true;\n this.editedTitle = this.postTags['press'].title;\n }\n\n saveEditedTitle(type) {\n HelperService.updateTagTitle(\n this.postTags[type],\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.postTags[type].title = this.editedTitle;\n if (type === 'product') {\n this.isEditingTitle = false;\n } else {\n this.isPressEditingTitle = false;\n }\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","@if (hasReleases('product')) {\n<section class=\"resource-vault-section bg-white\">\n <div class=\"container\">\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (postTags['product']?.title) {\n <span [innerHTML]=\"postTags['product']?.title\"></span>\n } @else {\n Product Release Notes\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleEditTitle()\" (keydown.enter)=\"toggleEditTitle()\" (keydown.space)=\"toggleEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_9216\" name=\"input_editedTitle_9216\"\n aria-label=\"Input Edited Title 9216\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle('product')\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n @if (!postSlice) {\n <a class=\"view-all\" routerLink=\"/resources/release-notes\">VIEW ALL ></a>\n }\n </div>\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (releasePosts['product']?.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (hasReleases('product')) {\n <div class=\"row mt-5 d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of releasePosts['product']; track post.id; let i = $index) {\n <div class=\"resource-blog-card p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadReleases('product')\">\n </pw-resource-edit-card-lazy>\n <p class=\"resource-title\" [innerHTML]=\"post.title\"></p>\n @if (!post.picture?.url?.includes('default-photo.jpg')) {\n <img\n src=\"{{ post.picture.url }}\"\n class=\"resource-image mt-auto\"\n alt=\"Product Resource Icon\"\n width=\"240\"\n height=\"240\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n } @else {\n <img\n src=\"assets/img/resource/rocket-box.png\"\n class=\"press-release-icon mt-auto\"\n alt=\"Product Resource Default Icon\"\n width=\"240\"\n height=\"240\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n }\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n [href]=\"post.external_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [routerLink]=\"['/resources/view', post?.slug]\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n @if (postSlice && pagers['product']?.hasMore) {\n <button type=\"button\" class=\"resource-load-more\" [disabled]=\"isLoadingMore['product']\" (click)=\"pagers['product'].loadMore()\">\n {{ 'Resource.LoadMore' | transloco }}\n </button>\n }\n }\n </div>\n</section>\n}\n@if (isReleasePress && hasReleases('press')) {\n<section class=\"resource-vault-section bg-white\">\n <div class=\"container\">\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isPressEditingTitle }\">\n @if (!isPressEditingTitle) {\n @if (postTags['press']?.title) {\n <span [innerHTML]=\"postTags['press']?.title\"></span>\n } @else {\n Press Release Notes\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleEditPressTitle()\" (keydown.enter)=\"toggleEditPressTitle()\" (keydown.space)=\"toggleEditPressTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isPressEditingTitle }\" id=\"input_editedTitle_1600\" name=\"input_editedTitle_1600\"\n aria-label=\"Input Edited Title 1600\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle('press')\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isPressEditingTitle = false\">Cancel</button>\n }\n </h2>\n @if (!postSlice) {\n <a class=\"view-all\" routerLink=\"/resources/release-notes\">VIEW ALL ></a>\n }\n </div>\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (releasePosts['press']?.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (hasReleases('press')) {\n <div class=\"row mt-5 d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of releasePosts['press']; track post.id; let i = $index) {\n <div class=\"resource-blog-card p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadReleases('press')\">\n </pw-resource-edit-card-lazy>\n <p class=\"resource-title\" [innerHTML]=\"post.title\"></p>\n @if (!post.picture?.url.includes('default-photo.jpg')) {\n <img\n src=\"{{ post.picture.url }}\"\n class=\"resource-image mt-auto\"\n alt=\"Press Resource Icon\"\n width=\"240\"\n height=\"240\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n } @else {\n <img\n src=\"assets/img/resource/rocket-box.png\"\n class=\"press-release-icon mt-auto\"\n alt=\"Press Resource Default Icon\"\n width=\"240\"\n height=\"240\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n }\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n [href]=\"post.external_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [routerLink]=\"['/resources/view', post?.slug]\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n @if (postSlice && pagers['press']?.hasMore) {\n <button type=\"button\" class=\"resource-load-more\" [disabled]=\"isLoadingMore['press']\" (click)=\"pagers['press'].loadMore()\">\n {{ 'Resource.LoadMore' | transloco }}\n </button>\n }\n }\n </div>\n</section>\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../shared/resource-pager';\n\n@Component({\n selector: 'pw-case-studies-card',\n templateUrl: './case-studies-cards.component.html',\n styleUrls: ['./case-studies-cards.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n standalone: false\n})\nexport class CaseStudyCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() showCaseStudyHeader = false;\n @Input() categoryId!: string;\n @Input() postSlice = false;\n @Input() tag;\n @Input() resourceTitle!: string;\n @Input() user: User;\n\n canEditResourcesValue = false;\n @Input() userLoggedIn: boolean;\n\n /** Full list (`postSlice`) pages on scroll; the landing strip shows 3. */\n pager: ResourcePager<PublicPost>;\n\n get posts(): Resource[] {\n return this.pager?.items ?? [];\n }\n\n get isLoaded(): boolean {\n return this.pager?.isLoaded ?? false;\n }\n\n get isLoadingMore(): boolean {\n return this.pager?.isLoadingMore ?? false;\n }\n subscriptionId;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n companyName = this.appConfig.company.name;\n\n isMasterSubscription;\n\n isEditingTitle = false;\n editedTitle: string;\n\n constructor(\n injector: Injector,\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['user'] || changes['userLoggedIn']) {\n if (this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.categoryId\n }),\n () => this.cdr.markForCheck(),\n post => post.showcase === true,\n this.postSlice ? RESOURCE_PAGE_SIZE : 3\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.postSlice) this.pager?.loadMoreIfNearBottom();\n }\n\n toggleEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.resourceTitle;\n }\n\n saveEditedTitle() {\n HelperService.updateTagTitle(\n this.tag,\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.resourceTitle = this.editedTitle;\n this.isEditingTitle = false;\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n\n trackByPostId(index: number, post: Resource): number {\n return post.id;\n }\n}\n","<section class=\"resource-vault-section bg-white text-center py-5 extra-top-padding section-outer\" id=\"case-studies\">\n <div class=\"container\">\n @if (showCaseStudyHeader) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <ng-container *ngTemplateOutlet=\"caseStudyHeaderTemplate\"></ng-container>\n <a class=\"view-all\" routerLink=\"/resources/case-studies\">VIEW ALL ></a>\n </div>\n } @else {\n <div class=\"d-md-flex justify-content-between align-items-start\">\n <ng-container *ngTemplateOutlet=\"caseStudyHeaderTemplate\"></ng-container>\n </div>\n }\n\n\n <ng-template #caseStudyHeaderTemplate>\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span>\n <span [innerHTML]=\"resourceTitle\"></span>\n </span>\n } @else {\n Case Studies\n }\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\"\n (click)=\"toggleEditTitle()\"\n (keydown.enter)=\"toggleEditTitle()\"\n (keydown.space)=\"toggleEditTitle()\"\n title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_9216\" name=\"input_editedTitle_9216\"\n aria-label=\"Input Edited Title 9216\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n\n </h2>\n </ng-template>\n\n\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n\n\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"row d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of posts; track trackByPostId($index, post); let i = $index) {\n <div class=\"testimonial-box\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\">\n </pw-resource-edit-card-lazy>\n <div>\n @if (!post.rectangular_picture.url.includes('default-photo.jpg') ) {\n <img [src]=\"post.rectangular_picture.url\"\n alt=\"IT Partners Logo\"\n class=\"company-logo mb-3\"\n width=\"320\"\n height=\"180\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n }\n <p class=\"mb-4 mt-3 testimonial-section\">\n <span [innerHTML]=\"post.title\"></span>\n </p>\n </div>\n <!-- BOTTOM AVATAR -->\n <div class=\"avatar-container mt-5\">\n @if (post.picture.url && !post.picture.url.includes('default-photo.jpg')) {\n <img [src]=\"post.picture.url\"\n alt=\"User Avatar\"\n class=\"testimonial-avatar\"\n width=\"96\"\n height=\"96\"\n loading=\"lazy\"\n decoding=\"async\" />\n }\n @if (post?.external_url) {\n <a\n class=\"read-more-btn-overlay\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n [href]=\"post.external_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"read-more-btn-overlay\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [routerLink]=\"['/resources/view', post?.slug]\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n </div>\n }\n </div>\n }\n @if (isLoadingMore) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n </div>\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../../shared/resource-pager';\n\n@Component({\n selector: 'pw-resource-cards',\n templateUrl: './resource-cards.component.html',\n styleUrls: ['../../../resources/resources-shared.component.scss'],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() categoryId!: string;\n @Input() isHeaderVisible = true;\n @Input() isRelated = false;\n @Input() resourceTitle!: string;\n @Input() postSlice = false;\n @Input() header;\n @Input() tag;\n @Input() resourceLink;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n /** Full list (`postSlice`) pages on scroll; the related strip shows 3. */\n pager: ResourcePager<PublicPost>;\n\n subscriptionId;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n\n isEditingTitle: boolean;\n editedTitle: string;\n isMasterSubscription;\n\n canEditResourcesValue = false;\n\n constructor(\n injector: Injector,\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['user'] || changes['userLoggedIn']) {\n if (this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n }\n\n get posts(): Resource[] {\n return this.pager?.items ?? [];\n }\n\n get isLoaded(): boolean {\n return this.pager?.isLoaded ?? false;\n }\n\n get isLoadingMore(): boolean {\n return this.pager?.isLoadingMore ?? false;\n }\n\n get hasMorePosts(): boolean {\n return this.postSlice && !!this.pager?.hasMore;\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.categoryId\n }),\n () => this.cdr.markForCheck(),\n post => post.showcase === true,\n this.postSlice ? RESOURCE_PAGE_SIZE : 3\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.postSlice) this.pager?.loadMoreIfNearBottom();\n }\n\n toggleTagEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.resourceTitle;\n }\n\n saveEditedTitle() {\n HelperService.updateTagTitle(\n this.tag,\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.resourceTitle = this.editedTitle;\n this.isEditingTitle = false;\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<section class=\"resource-vault-section bg-white\">\n <div class=\"container\">\n @if (isHeaderVisible) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span [innerHTML]=\"resourceTitle\"></span>\n } @else {\n Our team's articles\n }\n @if (!isRelated && canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleTagEditTitle()\" (keydown.enter)=\"toggleTagEditTitle()\" (keydown.space)=\"toggleTagEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_9056\" name=\"input_editedTitle_9056\"\n aria-label=\"Input Edited Title 9056\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n <a class=\"view-all\" [routerLink]=\"resourceLink\">VIEW ALL ></a>\n </div>\n }\n\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded && !hasMorePosts && !isLoadingMore) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"row d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of posts; track post; let i = $index) {\n <div class=\"resource-blog-card p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\">\n </pw-resource-edit-card-lazy>\n <p class=\"resource-title\" [innerHTML]=\"post.title \"></p>\n <a\n [href]=\"post.external_url || ('/resources/view/' + post?.slug)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"'Open resource card: ' + (post?.title || 'article')\"\n >\n <img\n [src]=\"post.picture.url\"\n class=\"img-fluid my-3 mt-auto\"\n alt=\"Webinar\"\n width=\"640\"\n height=\"360\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\"\n /></a>\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [href]=\"post.external_url\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [href]=\"'/resources/view/' + post?.slug\" target=\"_blank\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n @if (isLoadingMore) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n }\n </div>\n</section>","import { ChangeDetectionStrategy,\n ChangeDetectorRef, Component, Injector, OnInit } from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { forkJoin } from 'rxjs';\n\nimport { ResourceService } from '../../../resource.service';\n\n@Component({\n template: '',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport abstract class BaseResourceComponent extends AppBaseComponent implements OnInit {\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n testimonialsPosts: Resource[] = [];\n userLoggedIn: boolean;\n blogPostTag;\n tagCategory;\n blogTestimonialsPostTag;\n isLoaded = false;\n user: User;\n isMasterSubscription;\n\n canEditResourcesValue = false;\n\n constructor(\n protected readonly resourceService: ResourceService,\n protected readonly tagService: TagService,\n private readonly authService: AuthService,\n protected readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit() {\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.updateCanEditResourcesValue();\n this.initializeComponent();\n this.cdr.markForCheck();\n });\n } else {\n this.initializeComponent();\n }\n this.cdr.markForCheck();\n });\n }\n\n protected initializeComponent() {\n if (this.shouldUseTagCategories()) {\n this.getTags();\n } else {\n this.getPostTags();\n }\n\n if (this.shouldLoadTestimonials()) {\n this.getTestimonialTags();\n }\n }\n\n protected getTags() {\n this.isLoaded = false;\n forkJoin({\n categories: this.tagService.getAllTagCategories(\n { search: this.getSearchTerm() },\n this.getEffectiveSubscriptionId()\n ),\n tags: this.tagService.getTagsByType(\n 'post_categories',\n {},\n this.getEffectiveSubscriptionId()\n )\n })\n .subscribe(({ categories, tags }) => {\n this.tagCategory = categories?.tag_categories?.[0];\n this.blogPostTag = tags.tags.find(\n tag => tag.tag_category_id === this.tagCategory?.id\n );\n this.getPosts(1, 100);\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n protected getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogPostTag = response.tags.find(tag => tag.name === this.getResourceType());\n this.getPosts(1, 100);\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n protected getTestimonialTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogTestimonialsPostTag = response.tags.find(\n tag => tag.name === 'Testimonials'\n );\n this.getTestimonialsPosts(1, 100);\n this.cdr.markForCheck();\n });\n }\n\n protected getPosts(page: number, pageSize: number) {\n this.fetchPosts(page, pageSize, this.blogPostTag?.tag_category_id, 'posts');\n }\n\n getTestimonialsPosts(page: number, pageSize: number) {\n this.fetchPosts(\n page,\n pageSize,\n this.blogTestimonialsPostTag?.tag_category_id,\n 'testimonialsPosts'\n );\n }\n\n /** Shared method to fetch posts with common filtering, sorting, and slicing logic */\n private fetchPosts(\n page: number,\n pageSize: number,\n tagCategoryId,\n targetProperty: 'posts' | 'testimonialsPosts'\n ) {\n this.resourceService\n .getPublicPosts(this.getEffectiveSubscriptionId(), page, pageSize, '', tagCategoryId)\n .subscribe(response => {\n const filteredPosts = response.posts\n .filter(post => post.tags?.some(tag => tag.tag_category_id === tagCategoryId))\n .sort(\n (a, b) =>\n new Date(b.published_at).getTime() - new Date(a.published_at).getTime()\n )\n .slice(0, 12);\n\n if (targetProperty === 'posts') {\n this.posts = filteredPosts;\n } else {\n this.testimonialsPosts = filteredPosts;\n }\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n protected getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n\n // Abstract methods that each component must implement\n protected abstract getResourceType(): string;\n\n // Optional methods that can be overridden\n protected getSearchTerm(): string {\n return this.getResourceType();\n }\n\n protected shouldUseTagCategories(): boolean {\n return false;\n }\n\n protected shouldLoadTestimonials(): boolean {\n return false;\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n HostListener,\n Injector,\n Input,\n OnInit,\n Output\n} from '@angular/core';\n\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../shared/resource-pager';\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\n@Component({\n selector: 'pw-resource--vault',\n templateUrl: './resource-vault.component.html',\n styleUrls: ['../resources/resources-shared.component.scss'],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceVaultComponent extends BaseResourceComponent implements OnInit {\n @Input() showVaultSection = false;\n @Input() postSlice = false;\n @Input() categoryId;\n @Input() resourceTitle;\n @Input() tag;\n @Output() isLoadedChange = new EventEmitter<boolean>();\n\n /** Full list (`postSlice`) pages on scroll; the landing strip shows 3. */\n pager: ResourcePager<PublicPost>;\n isLoadingMore = false;\n private announcedPager: ResourcePager<PublicPost>;\n\n isEditingTitle = false;\n editedTitle: string;\n\n constructor(\n resourceService: ResourceService,\n tagService: TagService,\n authService: AuthService,\n cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(resourceService, tagService, authService, cdr, injector);\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.getPosts();\n }\n\n protected getResourceType(): string {\n return 'Vault';\n }\n\n // Also called by BaseResourceComponent once tags load; the view reads only the newest pager.\n protected override getPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.categoryId\n }),\n () => this.syncFromPager(),\n post => post.showcase === true,\n this.postSlice ? RESOURCE_PAGE_SIZE : 3\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.postSlice) this.pager?.loadMoreIfNearBottom();\n }\n\n private syncFromPager(): void {\n this.posts = this.pager.items;\n this.isLoaded = this.pager.isLoaded;\n this.isLoadingMore = this.pager.isLoadingMore;\n // Once per pager: the base class also sets isLoaded, so a false→true check can miss it.\n if (this.isLoaded && this.announcedPager !== this.pager) {\n this.announcedPager = this.pager;\n this.isLoadedChange.emit(true);\n }\n this.cdr.markForCheck();\n }\n\n toggleEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.resourceTitle;\n }\n\n saveEditedTitle() {\n HelperService.updateTagTitle(\n this.tag,\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.resourceTitle = this.editedTitle;\n this.isEditingTitle = false;\n this.cdr.markForCheck();\n });\n }\n}\n","<section class=\"resource-vault-section bg-white text-center py-5 extra-top-padding section-outer\">\n <div class=\"container\">\n @if (showVaultSection) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap mb-5\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span [innerHTML]=\"resourceTitle\"></span>\n } @else {\n Whitepapers &amp; Tools\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleEditTitle()\" (keydown.enter)=\"toggleEditTitle()\" (keydown.space)=\"toggleEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_9216\" name=\"input_editedTitle_9216\"\n aria-label=\"Input Edited Title 9216\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n <a class=\"view-all\" routerLink=\"/resources/white-papers\">VIEW ALL ></a>\n </div>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"d-flex mt-2 flex-wrap justify-content-center gap-4 video-row\">\n @for (post of posts; track post) {\n <div class=\"resource-blog-card text-center p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\">\n </pw-resource-edit-card-lazy>\n <p class=\"mb-4\" [innerHTML]=\"post.title\"></p>\n <a\n [href]=\"post.external_url || ('/resources/view/' + post?.slug)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"'Open resource card: ' + (post?.title || 'article')\"\n >\n <img\n [src]=\"post.picture.url\"\n class=\"img-fluid my-3 mt-auto\"\n alt=\"Webinar\"\n loading=\"lazy\"\n />\n </a>\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n [href]=\"post.external_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [href]=\"'/resources/view/' + post?.slug\" target=\"_blank\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n }\n @if (isLoadingMore) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n </div>\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../shared/resource-pager';\n\n@Component({\n selector: 'pw-resource-video-card',\n templateUrl: './resource-video-cards.component.html',\n styleUrls: ['../../resources/resources-shared.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n standalone: false\n})\nexport class ResourceVideoCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() showVideoSection = false;\n @Input() categoryId!: string;\n @Input() tag;\n @Input() postSlice = false;\n @Input() resourceTitle!: string;\n @Input() user: User;\n\n canEditResourcesValue = false;\n @Input() userLoggedIn: boolean;\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n\n /** Full list (`postSlice`) pages on scroll; the landing strip shows 3. */\n pager: ResourcePager<PublicPost>;\n\n get posts(): Resource[] {\n return this.pager?.items ?? [];\n }\n\n get isLoaded(): boolean {\n return this.pager?.isLoaded ?? false;\n }\n\n get isLoadingMore(): boolean {\n return this.pager?.isLoadingMore ?? false;\n }\n\n videoStates: { [slug: string]: { loaded: boolean; url: SafeResourceUrl } } = {};\n\n isEditingTitle = false;\n editedTitle: string;\n isMasterSubscription;\n\n constructor(\n private readonly sanitizer: DomSanitizer,\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['user'] || changes['userLoggedIn']) {\n if (this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n }\n\n loadVideo(post): void {\n if (!post.external_url) return;\n\n const slug = post.slug;\n let externalUrl = post.external_url;\n\n // Append autoplay only when clicked\n externalUrl += externalUrl.includes('?') ? '&autoplay=1' : '?autoplay=1';\n // baseUrl is a trusted internal source (e.g. YouTube embed URL)\n this.videoStates[slug].url = this.sanitizer.bypassSecurityTrustResourceUrl(externalUrl); //NOSONAR\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.categoryId\n }),\n () => {\n this.syncVideoStates();\n this.cdr.markForCheck();\n },\n post => post.showcase === true,\n this.postSlice ? RESOURCE_PAGE_SIZE : 3\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.postSlice) this.pager?.loadMoreIfNearBottom();\n }\n\n /** Gives every loaded video post an embed URL, keeping any it already has. */\n private syncVideoStates(): void {\n this.posts.forEach(post => {\n if (post.external_url && !this.videoStates[post.slug]) {\n this.videoStates[post.slug] = {\n loaded: true,\n // baseUrl is a trusted internal source (e.g. YouTube embed URL)\n url: this.sanitizer.bypassSecurityTrustResourceUrl(post.external_url) //NOSONAR\n };\n }\n });\n }\n\n toggleTagEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.resourceTitle;\n }\n\n saveEditedTitle() {\n HelperService.updateTagTitle(\n this.tag,\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.resourceTitle = this.editedTitle;\n this.isEditingTitle = false;\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n\n trackByPostId(index: number, post: Resource): number {\n return post.id;\n }\n}\n","<section class=\"resource-vault-section bg-white text-center py-5 extra-top-padding section-outer\">\n <div class=\"container\">\n @if (showVideoSection) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span [innerHTML]=\"resourceTitle\"></span>\n } @else {\n On-Demand Videos\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleTagEditTitle()\" (keydown.enter)=\"toggleTagEditTitle()\" (keydown.space)=\"toggleTagEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_9216\" name=\"input_editedTitle_9216\"\n aria-label=\"Input Edited Title 9216\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n <a class=\"view-all\" routerLink=\"/resources/videos\">VIEW ALL ></a>\n </div>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"row mt-5 d-flex flex-wrap justify-content-center video-row\">\n @for (post of posts; track trackByPostId($index, post); let i = $index) {\n <div class=\"resource-blog-card\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\">\n </pw-resource-edit-card-lazy>\n <p [innerHTML]=\"post.title\" class=\"mb-5\"></p>\n <a [href]=\" post.external_url\" target=\"_blank\">\n <img\n [src]=\"post.picture?.url\"\n class=\"img-fluid mb-3\"\n [alt]=\"post.title\"\n width=\"640\"\n height=\"360\"\n [attr.loading]=\"i === 0 ? 'eager' : 'lazy'\"\n [attr.fetchpriority]=\"i === 0 ? 'high' : null\"\n decoding=\"async\" />\n </a>\n <a class=\"resource-btn mt-3\" [href]=\" post.external_url\" target=\"_blank\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Watch now' }}</span>\n <span class=\"arrow\">→</span>\n </a>\n </div>\n }\n </div>\n }\n @if (isLoadingMore) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n </div>\n\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\n\n@Component({\n selector: 'pw-replay-event-card',\n templateUrl: './replay-event-cards.component.html',\n styleUrls: [\n '../../resources/resources-shared.component.scss',\n '../../../shared/resource-load-more.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ReplayEventCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() showEventContent = false;\n @Input() categoryId!: string;\n @Input() resourceTitle!: string;\n @Input() user: User;\n\n canEditResourcesValue = false;\n @Input() userLoggedIn: boolean;\n\n subscriptionId;\n\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n\n posts: Resource[] = [];\n\n isLoaded = false;\n isLoadingMore = false;\n pager: ResourcePager<PublicPost>;\n blogPostTag;\n\n isMasterSubscription;\n\n constructor(\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.getPostTags();\n } else {\n this.getPostTags();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['user'] || changes['userLoggedIn']) {\n if (this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogPostTag = response.tags.find(tag => tag.name === 'Events');\n if (this.blogPostTag?.tag_category_id) {\n this.loadReplays();\n } else {\n this.isLoaded = true;\n }\n this.cdr.markForCheck();\n });\n }\n\n /** Pages through this list 15 visible posts at a time (\"Load more\"). */\n loadReplays(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.blogPostTag?.tag_category_id\n }),\n () => this.syncFromPager(),\n post => post.showcase === true && new Date(post?.when).getTime() < Date.now()\n );\n this.pager.reset();\n }\n\n private syncFromPager(): void {\n this.posts = this.pager.items;\n this.isLoaded = this.pager.isLoaded;\n this.isLoadingMore = this.pager.isLoadingMore;\n this.cdr.markForCheck();\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<section class=\"resource-vault-section bg-white text-center py-5 extra-top-padding section-outer\">\n <div class=\"container\">\n <div class=\"d-md-flex justify-content-between align-items-start\">\n <div class=\"vault-header\">\n @if (resourceTitle) {\n <h2 class=\"vault-heading\">{{resourceTitle}} Replays</h2>\n } @else {\n <h2 class=\"vault-heading\">Events &amp; Webinars Replays</h2>\n }\n </div>\n </div>\n\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"row mt-5 d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of posts; track post) {\n <div class=\"resource-blog-card vault-card text-center p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadReplays()\">\n </pw-resource-edit-card-lazy>\n <h5 class=\"badge-title fw-bold\">REPLAY:</h5>\n <p class=\"event-title mb-4\" [innerHtml]=\"post?.title\"></p>\n <img\n [src]=\"post.picture.url\"\n class=\"img-fluid my-3 mt-auto\"\n alt=\"Webinar\" />\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [href]=\"post.external_url\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [routerLink]=\"['/resources/view', post?.slug]\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n @if (pager?.hasMore) {\n <button type=\"button\" class=\"resource-load-more\" [disabled]=\"isLoadingMore\" (click)=\"pager.loadMore()\">\n {{ 'Resource.LoadMore' | transloco }}\n </button>\n }\n }\n </div>\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\n\n@Component({\n selector: 'pw-upcoming-event-card',\n templateUrl: './upcoming-event-cards.component.html',\n styleUrls: [\n '../../resources/resources-shared.component.scss',\n '../../../shared/resource-load-more.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n standalone: false\n})\nexport class UpcomingEventCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n @Input() showEventContent = false;\n @Input() categoryId!: string;\n @Input() tag;\n @Input() postSlice = false;\n @Input() resourceTitle!: string;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n canEditResourcesValue = false;\n\n now = Date.now();\n subscriptionId;\n\n isEditingTitle = false;\n editedTitle: string;\n\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n\n posts: Resource[] = [];\n\n isLoaded = false;\n isLoadingMore = false;\n pager: ResourcePager<PublicPost>;\n blogPostTag;\n isMasterSubscription;\n\n constructor(\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.getPostTags();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['user'] || changes['userLoggedIn']) {\n if (this.userLoggedIn && this.user) {\n this.updateCanEditResourcesValue();\n }\n }\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogPostTag = response.tags.find(tag => tag.name === 'Events');\n if (this.blogPostTag?.tag_category_id) {\n this.refresh();\n } else {\n this.isLoaded = true;\n }\n this.cdr.markForCheck();\n });\n }\n\n /** Reloads in the current mode: paged full list, or the 3-card landing preview. */\n refresh(): void {\n if (this.postSlice) {\n this.loadUpcoming();\n } else {\n this.getAllPosts(1, 100);\n }\n }\n\n loadUpcoming(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: this.getEffectiveSubscriptionId(),\n tagCategoryIds: this.categoryId ?? this.blogPostTag?.tag_category_id\n }),\n () => this.syncFromPager(),\n post => post.showcase === true && this.isUpcoming(post)\n );\n this.pager.reset();\n }\n\n private syncFromPager(): void {\n this.posts = this.pager.items;\n this.isLoaded = this.pager.isLoaded;\n this.isLoadingMore = this.pager.isLoadingMore;\n this.cdr.markForCheck();\n }\n\n isUpcoming(post): boolean {\n return new Date(post?.when).getTime() > this.now;\n }\n\n getAllPosts(page: number, pageSize: number): void {\n this.isLoaded = false;\n this.resourceService\n .getPublicPosts(\n this.getEffectiveSubscriptionId(),\n page,\n pageSize,\n '',\n this.categoryId ?? this.blogPostTag?.tag_category_id\n )\n .subscribe(response => {\n const sortedPosts = (response.posts ?? [])\n .filter(post => post.showcase === true)\n .sort((a, b) => new Date(b.when).getTime() - new Date(a.when).getTime());\n\n this.posts = [...sortedPosts].slice(0, 3).reverse();\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n toggleEditTitle() {\n this.isEditingTitle = true;\n this.editedTitle = this.resourceTitle;\n }\n\n saveEditedTitle() {\n HelperService.updateTagTitle(\n this.tag,\n this.editedTitle,\n this.tagService,\n this.getEffectiveSubscriptionId(),\n this.toast\n ).subscribe(() => {\n this.resourceTitle = this.editedTitle;\n this.isEditingTitle = false;\n this.cdr.markForCheck();\n });\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n\n trackByPostId(index: number, post: Resource): number {\n return post.id;\n }\n}\n","<section class=\"resource-vault-section bg-white text-center py-5 extra-top-padding section-outer\">\n <div class=\"container\">\n @if (showEventContent) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span [innerHTML]=\"resourceTitle\"></span>\n } @else {\n Events &amp; Webinars\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleEditTitle()\" (keydown.enter)=\"toggleEditTitle()\" (keydown.space)=\"toggleEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_7936\" name=\"input_editedTitle_7936\"\n aria-label=\"Input Edited Title 7936\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n <a class=\"view-all\" routerLink=\"/resources/events\">VIEW ALL ></a>\n </div>\n }\n @if (!showEventContent) {\n <div class=\"d-md-flex justify-content-between align-items-start\">\n <h2 class=\"section-heading d-flex align-items-center\" [ngClass]=\"{ 'w-50': isEditingTitle }\">\n @if (!isEditingTitle) {\n @if (resourceTitle) {\n <span [innerHTML]=\"resourceTitle\"></span>\n } @else {\n Upcoming Events\n }\n @if (canEditResourcesValue) {\n <i class=\"fa fa-edit in-page-edit-icon ms-3 cursor-pointer\" (click)=\"toggleEditTitle()\" (keydown.enter)=\"toggleEditTitle()\" (keydown.space)=\"toggleEditTitle()\" title=\"Edit Title\"></i>\n }\n } @else {\n <input [(ngModel)]=\"editedTitle\" class=\"form-control d-inline w-auto me-2\" [ngClass]=\"{ 'w-100': isEditingTitle }\" id=\"input_editedTitle_7936\" name=\"input_editedTitle_7936\"\n aria-label=\"Input Edited Title 7936\" />\n <button class=\"btn btn-sm btn-primary me-1\" (click)=\"saveEditedTitle()\">Save</button>\n <button class=\"btn btn-sm btn-secondary\" (click)=\"isEditingTitle = false\">Cancel</button>\n }\n </h2>\n </div>\n }\n\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (posts.length === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n\n @if (posts.length !== 0 && isLoaded) {\n <div class=\"row mt-5 d-flex flex-wrap justify-content-center gap-4 video-row\">\n @for (post of posts; track trackByPostId($index, post)) {\n <div class=\"resource-blog-card d text-center p-4\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"refresh()\">\n </pw-resource-edit-card-lazy>\n @if (postSlice) {\n <h5 class=\"badge-title fw-bold\">UPCOMING:</h5>\n } @else {\n <h5 class=\"badge-title fw-bold\">\n {{ isUpcoming(post) ? 'UPCOMING:' : 'REPLAY:' }}\n </h5>\n }\n\n <p class=\"event-title mb-4\" [innerHtml]=\"post?.title\"></p>\n <a\n [href]=\"post.external_url || ('/resources/view/' + post?.slug)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"'Open resource card: ' + (post?.title || 'article')\"\n >\n <img\n [src]=\"post.picture?.url\"\n class=\"img-fluid my-3 mt-auto\"\n alt=\"Webinar\"\n loading=\"lazy\"\n />\n </a>\n\n @if (post?.external_url) {\n <a\n class=\"resource-btn mt-3\"\n [attr.aria-label]=\"'Open external: ' + (post?.title || 'article')\"\n [href]=\"post.external_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">external</span>\n <span class=\"arrow\">→</span>\n </a>\n } @else {\n <a class=\"resource-btn mt-3\" [attr.aria-label]=\"'Read resource: ' + (post?.title || 'article')\" [href]=\"'/resources/view/' + post?.slug\" target=\"_blank\">\n <span>{{ post?.cta_text && post.cta_text !== 'null' ? post.cta_text : 'Read Now' }}</span>\n <span class=\"visually-hidden\">on site</span>\n <span class=\"arrow\">→</span>\n </a>\n }\n </div>\n }\n </div>\n @if (postSlice && pager?.hasMore) {\n <button type=\"button\" class=\"resource-load-more\" [disabled]=\"isLoadingMore\" (click)=\"pager.loadMore()\">\n {{ 'Resource.LoadMore' | transloco }}\n </button>\n }\n }\n </div>\n</section>\n\n\n@if (!showEventContent) {\n<section class=\"bg-white\">\n <pw-replay-event-card [resourceTitle]=\"resourceTitle\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-replay-event-card>\n</section>\n}\n","import { DragDropModule } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\nimport { CoreTranslocoModule } from '@posiwise/core-transloco';\nimport { DirectivesModule } from '@posiwise/directives';\nimport { PipesModule } from '@posiwise/pipes';\nimport { ResourceSharedComponentsModule } from '@posiwise/shared-components';\n\nimport { NgxCaptchaModule } from 'ngx-captcha';\nimport { PaginatorModule } from 'primeng/paginator';\nimport { SelectModule } from 'primeng/select';\n\nimport { TranslocoModule } from '@jsverse/transloco';\n\nimport { ResourceNoteCardComponent } from '../components/reslease-note-card/release-note-card.component';\nimport { CaseStudyCardComponent } from '../components/resource-case-studies/case-studies-cards/case-studies-cards.component';\nimport { Trial4ContactUsModule } from '../components/resource-contact-us/resource-contact-us.module';\nimport { ResourceEditCardLazyComponent } from '../components/resource-edit-card-lazy/resource-edit-card-lazy.component';\nimport { ResourceCardComponent } from '../components/resource-post/related-resources/resource-cards/resource-cards.component';\nimport { ResourceVaultComponent } from '../components/resource-vault/resource-vault.component';\nimport { ResourceVideoCardComponent } from '../components/resource-videos/resource-video-cards/resource-video-cards.component';\nimport { ReplayEventCardComponent } from '../components/resource-webinars/replay-event-cards/replay-event-cards.component';\nimport { UpcomingEventCardComponent } from '../components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component';\n\n/**\n * Module containing resource card components (lightweight version)\n * ResourceEditCard is lazy-loaded on demand to save 145 KB\n * Trial4ContactUs moved to separate module for better tree-shaking\n * Used by both ResourceRootModule and ResourceSharedModule\n */\n@NgModule({\n declarations: [\n ResourceVideoCardComponent,\n UpcomingEventCardComponent,\n // Rendered inside UpcomingEventCardComponent's template, so it must be declared alongside it.\n ReplayEventCardComponent,\n ResourceCardComponent,\n CaseStudyCardComponent,\n ResourceNoteCardComponent,\n ResourceVaultComponent,\n ResourceEditCardLazyComponent\n ],\n imports: [\n CommonModule,\n RouterModule,\n FormsModule,\n ReactiveFormsModule,\n PipesModule,\n PaginatorModule,\n SelectModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n DragDropModule,\n NgxCaptchaModule,\n Trial4ContactUsModule // ✅ Import standalone module\n ],\n exports: [\n ResourceVideoCardComponent,\n UpcomingEventCardComponent,\n ResourceCardComponent,\n CaseStudyCardComponent,\n ResourceNoteCardComponent,\n ResourceVaultComponent,\n Trial4ContactUsModule, // ✅ Re-export for backward compatibility\n ResourceEditCardLazyComponent,\n PaginatorModule // Export PaginatorModule so ResourceCompanyCardComponent can use p-paginator\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceCardsModule {}\n"],"mappings":"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A,UAAA;GAAA,MAAA;GAAmB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAnB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,cAAA;IAvCxB;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;GAA6B;GAAA,SAAA;IAG7B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GAGA;GAAA,SAAA;IAAA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;;CAIK;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,SAAA;IA5BxB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IASA;IAEA;;;;;AAIK,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAzC/B,MAAA;EAAS,MAAA,CAAA;GACN,cAAc;IACV;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;GACH;GACD,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GACD,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GACD,SAAS,CAAC,sBAAsB;EACnC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-case-studies.module-CFcO0CI-.mjs","names":["i1.ResourceService","i4.ResourceTopBannerEditComponent","i5.CaseStudyCardComponent","i9.TestimonialCardListComponent"],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-case-studies/resource-case-studies.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-case-studies/resource-case-studies.component.html","../../../../libs/resource-module/src/lib/public/modules/case-studies/resource-case-studies.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AuthService, TagService } from '@posiwise/common-services';\n\nimport { ResourceService } from '../../../resource.service';\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\n@Component({\n selector: 'pw-resource-case-studies',\n templateUrl: './resource-case-studies.component.html',\n styleUrls: ['./resource-case-studies.component.scss'],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceCaseStudiesComponent extends BaseResourceComponent {\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n constructor(\n resourceService: ResourceService,\n tagService: TagService,\n authService: AuthService,\n cdr: ChangeDetectorRef,\n private readonly titleService: Title,\n injector: Injector\n ) {\n super(resourceService, tagService, authService, cdr, injector);\n }\n\n protected getResourceType(): string {\n return 'Case Studies';\n }\n\n protected override getSearchTerm(): string {\n return 'Case Studies';\n }\n\n protected override shouldUseTagCategories(): boolean {\n return true;\n }\n\n protected override shouldLoadTestimonials(): boolean {\n return true;\n }\n\n protected override getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n if (this.shouldUseTagCategories()) {\n this.blogPostTag = response.tags.find(\n tag => tag.tag_category_id === this.tagCategory?.id\n );\n } else {\n this.blogPostTag = response.tags.find(\n tag => tag.name === this.getResourceType()\n );\n }\n this.updateSEOMetadata();\n this.getPosts(1, 100);\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n private updateSEOMetadata() {\n if (this.blogPostTag) {\n // Update page title if meta_title is available\n if (this.blogPostTag.meta_title) {\n this.titleService.setTitle(this.blogPostTag.meta_title);\n }\n\n if (this.blogPostTag.meta_description) {\n this.updateMetaDescription(this.blogPostTag.meta_description);\n }\n }\n }\n\n private updateMetaDescription(description: string) {\n let metaDescription = document.querySelector('meta[name=\"description\"]');\n if (!metaDescription) {\n metaDescription = document.createElement('meta');\n metaDescription.setAttribute('name', 'description');\n document.head.appendChild(metaDescription);\n }\n metaDescription.setAttribute('content', description);\n }\n shouldShowTestimonials(): boolean {\n // Show if there are testimonials\n if (this.testimonialsPosts && this.testimonialsPosts.length > 0) {\n return true;\n }\n\n // Show if user is not logged in (no admin checks needed)\n if (!this.userLoggedIn || !this.user) {\n return false;\n }\n\n // Show if user is SUPER ADMIN\n if (this.permissionService.isSuperAdmin()) {\n return true;\n }\n\n // Show if user is MASTER SUBSCRIPTION ADMIN\n const userMasterSubscription = this.user?.subscriptions?.find(sub =>\n sub.products?.some(p => p.is_master_product)\n );\n const masterProduct = userMasterSubscription?.products?.find(p => p.is_master_product);\n const masterProductWithSlug = masterProduct\n ? {\n ...masterProduct,\n subscription_slug: userMasterSubscription?.slug\n }\n : null;\n\n if (\n masterProductWithSlug &&\n this.permissionService.isUserSubscriptionSuperAdmin(masterProductWithSlug)\n ) {\n return true;\n }\n\n return false;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n\n<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <!-- Left Content -->\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Case Studies'\"></span>\n @if (canEditResourcesValue) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension mt-4\">\n <div class=\"cta-buttons d-flex flex-column justify-between h-100\">\n <div class=\"flex-grow-1\">\n @if (blogPostTag?.description && blogPostTag.description !== 'null' ) {\n <p class=\"intro\" [innerHTML]=\"blogPostTag.description\"></p>\n } @else {\n <p class=\"intro\">Real solutions &mdash; real results.</p>\n }\n </div>\n <div class=\"d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n </div>\n <!-- Right Content -->\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img\"\n [src]=\"(blogPostTag?.image?.url && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared'))) ? blogPostTag?.image?.url : '/assets/img/resource/case-studies-man.png'\"\n alt=\"Case studies banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n\n@if (shouldShowTestimonials()) {\n <pw-testimonial-card [posts]=\"testimonialsPosts\" [postHeader]=\"'Testimonials'\" [canEdit]=\"canEditResourcesValue\" (editPost)=\"getTestimonialsPosts(1, 100)\" id=\"reviews\"></pw-testimonial-card>\n}\n@if (blogPostTag?.tag_category_id) {\n <pw-case-studies-card [tag]=\"blogPostTag\" id=\"case-studies\" [categoryId]=\"blogPostTag?.tag_category_id\" [resourceTitle]=\"blogPostTag?.title\" [postSlice]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-case-studies-card>\n}\n\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceCaseStudiesComponent } from '../../components/resource-case-studies/resource-case-studies.component';\nimport { TestimonialCardListComponent } from '../../components/testimonial-card/testimonial-card.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceCaseStudiesComponent,\n data: {\n title: 'Resources - Case Studies',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n declarations: [\n ResourceCaseStudiesComponent,\n TestimonialCardListComponent // Only used in case studies\n ],\n imports: [ResourceSharedModule, RouterModule.forChild(routes)]\n})\nexport class ResourceCaseStudiesModule {}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-events.module-0PDppSJ6.mjs","names":["i1.ResourceService","i4.ResourceTopBannerEditComponent","i5.UpcomingEventCardComponent"],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-webinars/resource-webinars.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-webinars/resource-webinars.component.html","../../../../libs/resource-module/src/lib/public/modules/events/resource-events.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, Tag, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../resource.service';\n\n@Component({\n selector: 'pw-resource-webinars',\n templateUrl: './resource-webinars.component.html',\n styleUrls: [\n './resource-webinars.component.scss',\n '../resource-case-studies/resource-case-studies.component.scss',\n '../resources/resources-shared.component.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceWebinarComponent extends AppBaseComponent implements OnInit {\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n upcomingPosts = [];\n tagCategory;\n userLoggedIn: boolean;\n blogPostTag;\n isLoaded = false;\n\n canEditResourcesValue = false;\n\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n user: User;\n isMasterSubscription;\n\n constructor(\n private readonly resourceService: ResourceService,\n private readonly authService: AuthService,\n private readonly tagService: TagService,\n private readonly titleService: Title,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit() {\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.getTags();\n this.updateCanEditResourcesValue();\n this.cdr.markForCheck();\n });\n } else {\n this.getTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n private getTags() {\n this.isLoaded = false;\n this.tagService\n .getAllTagCategories({ search: 'Events' }, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.tagCategory = response?.tag_categories?.[0];\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogPostTag = response.tags.find(\n tag => tag.tag_category_id === this.tagCategory?.id\n );\n this.updateSEOMetadata();\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n private updateSEOMetadata() {\n if (this.blogPostTag) {\n // Update page title if meta_title is available\n if ((this.blogPostTag as Tag).meta_title) {\n this.titleService.setTitle((this.blogPostTag as Tag).meta_title);\n }\n\n // Update meta description if meta_description is available\n if ((this.blogPostTag as Tag).meta_description) {\n this.updateMetaDescription((this.blogPostTag as Tag).meta_description);\n }\n }\n }\n\n private updateMetaDescription(description: string) {\n let metaDescription = document.querySelector('meta[name=\"description\"]');\n if (!metaDescription) {\n metaDescription = document.createElement('meta');\n metaDescription.setAttribute('name', 'description');\n document.head.appendChild(metaDescription);\n }\n metaDescription.setAttribute('content', description);\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n\n<section class=\"bg-white\">\n <div class=\"resource-banner resource-section\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Events & Webinars'\"></span>\n @if (canEditResourcesValue) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getPostTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension\">\n @if (!blogPostTag?.description || blogPostTag.description === 'null') {\n <p class=\"intro\">\n We&rsquo;re big on community and even bigger on sharing what works.\n </p>\n } @else {\n <p class=\"intro\" [innerHTML]=\"blogPostTag.description\"></p>\n }\n <div class=\"cta-buttons d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img\"\n [src]=\"(blogPostTag?.image?.url !== null && !blogPostTag?.image?.url?.includes('default-photo.jpg') && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared')) ) ? blogPostTag?.image?.url : 'assets/img/resource/events-women.png'\"\n alt=\"Events and webinars banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n\n<section class=\"bg-white\">\n <pw-upcoming-event-card [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [resourceTitle]=\"blogPostTag?.title\" [postSlice]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-upcoming-event-card>\n</section>\n\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceWebinarComponent } from '../../components/resource-webinars/resource-webinars.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceWebinarComponent,\n data: {\n title: 'Resources - Events',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n declarations: [ResourceWebinarComponent],\n imports: [ResourceSharedModule, RouterModule.forChild(routes)]\n})\nexport class ResourceEventsModule {}\n"],"mappings":";;;;;;;;;;;;;;AA4BA,IAAa,2BAAb,MAAa,iCAAiC,iBAAgB;CAiB1D,YACqB,iBACA,aACA,YACA,cACA,KACjB,UAAkB;EAElB,MAAM,QAAQ;EAPG,KAAA,kBAAA;EACA,KAAA,cAAA;EACA,KAAA,aAAA;EACA,KAAA,eAAA;EACA,KAAA,MAAA;EApBrB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAC1D,KAAA,QAAoB,CAAA;EACpB,KAAA,gBAAgB,CAAA;EAIhB,KAAA,WAAW;EAEX,KAAA,wBAAwB;EAExB,KAAA,eAAe,KAAK,WAAW,cAAc,YAAY;CAczD;CAEA,WAAQ;EACJ,KAAK,sBAAqB,CAAE,CAAC,WAAU,aAAW;GAC9C,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;EACD,KAAK,YAAY,UAAS,CAAE,CAAC,WAAU,QAAM;GACzC,KAAK,eAAe,CAAC,CAAC;GACtB,IAAI,KAAK,cAAc;IACnB,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;KAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;KACrC,KAAK,iBAAiB,MAAM;KAC5B,KAAK,IAAI,aAAY;IACzB,CAAC;IACD,KAAK,YAAY,YAAW,CAAE,CAAC,WAAU,SAAO;KAC5C,KAAK,OAAO;KACZ,KAAK,QAAO;KACZ,KAAK,4BAA2B;KAChC,KAAK,IAAI,aAAY;IACzB,CAAC;GACL,OACI,KAAK,QAAO;GAEhB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEQ,UAAO;EACX,KAAK,WAAW;EAChB,KAAK,WACA,oBAAoB,EAAE,QAAQ,SAAQ,GAAI,KAAK,2BAA0B,CAAE,CAAC,CAC5E,WAAU,aAAW;GAClB,KAAK,cAAc,UAAU,iBAAiB;GAC9C,KAAK,YAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEQ,cAAW;EACf,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACvE,WAAU,aAAW;GAClB,KAAK,cAAc,SAAS,KAAK,MAC7B,QAAO,IAAI,oBAAoB,KAAK,aAAa,EAAE;GAEvD,KAAK,kBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,WAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEQ,oBAAiB;EACrB,IAAI,KAAK,aAAa;GAElB,IAAK,KAAK,YAAoB,YAC1B,KAAK,aAAa,SAAU,KAAK,YAAoB,UAAU;GAInE,IAAK,KAAK,YAAoB,kBAC1B,KAAK,sBAAuB,KAAK,YAAoB,gBAAgB;EAE7E;CACJ;CAEQ,sBAAsB,aAAmB;EAC7C,IAAI,kBAAkB,SAAS,cAAc,4BAA0B;EACvE,IAAI,CAAC,iBAAiB;GAClB,kBAAkB,SAAS,cAAc,MAAM;GAC/C,gBAAgB,aAAa,QAAQ,aAAa;GAClD,SAAS,KAAK,YAAY,eAAe;EAC7C;EACA,gBAAgB,aAAa,WAAW,WAAW;CACvD;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CAEQ,8BAA2B;EAC/B,IAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;OAG1B,KAAK,wBAAwB;CAErC;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAhIS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAwB,MAAA;IAAA,EAAA,OAAAA,gBAAA;IAAA,EAAA,OAAA,GAAA,YAAA;IAAA,EAAA,OAAA,GAAA,WAAA;IAAA,EAAA,OAAA,GAAA,MAAA;IAAA,EAAA,OAAA,GAAA,kBAAA;IAAA,EAAA,OAAA,GAAA,SAAA;GAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAxB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAwB,cAAA;GAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UC5BrC;GAwDA,QAAA;IAAA;IAAA;IAAA;GAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MAAAC;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAC;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA,CAAA,QAAA,cAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AD5Ba,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAwB,YAAA,CAAA;EAZpC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAsB,iBAQf,wBAAwB;GAAM,YACnC;GAAK,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;;;;;;;;;;;AEpBrB,MAAM,SAAiB,CACnB;CACI,MAAM;CACN,WAAW;CACX,MAAM;EACF,OAAO;EACP,YAAY;EACZ,SAAS;CACZ;AACJ,CACJ;AAMD,IAAa,uBAAb,MAAa,qBAAoB;CAApB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAoB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAApB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAoB,cAAA,CAHd,wBAAwB;GAAA,SAAA,CAC7B,sBAAoB,GAAA,YAAA;EAAA,CAAA;CAAA;CAErB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAoB,SAAA,CAFnB,sBAAsB,aAAa,SAAS,MAAM,CAAC;EAAA,CAAA;CAAA;;AAEpD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAJhC,MAAA;EAAS,MAAA,CAAA;GACN,cAAc,CAAC,wBAAwB;GACvC,SAAS,CAAC,sBAAsB,aAAa,SAAS,MAAM,CAAC;EAChE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-hub.module-2qzLV9I1.mjs","names":["i1.ResourceService","i7.ResourceEditCardLazyComponent","i1"],"sources":["../../../../libs/resource-module/src/lib/public/components/resources-hub/resources-hub.component.ts","../../../../libs/resource-module/src/lib/public/components/resources-hub/resources-hub.component.html","../../../../libs/resource-module/src/lib/public/modules/hub/resource-hub.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n Injector,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, Tag, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { forkJoin, Subscription } from 'rxjs';\n\nimport { ResourceService } from '../../../resource.service';\nimport { RESOURCE_PAGE_SIZE } from '../../shared/resource-pager';\n\n@Component({\n selector: 'pw-posts-list',\n templateUrl: './resources-hub.component.html',\n styleUrls: [\n './resources-hub.component.scss',\n '../resource-company-card/resource-company-card.component.scss'\n ],\n encapsulation: ViewEncapsulation.None,\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceHubComponent extends AppBaseComponent implements OnInit, OnDestroy {\n private delayTimeout: ReturnType<typeof setTimeout> | null = null;\n private userSub: Subscription;\n\n data = [];\n\n posts: Resource[] = [];\n tags: Tag[] = [];\n\n selectedTags = [];\n\n currentPage = 1;\n pageSize = RESOURCE_PAGE_SIZE;\n objectCount = 0;\n\n searchTextItems = '';\n searchInput = false;\n\n readingTime: number;\n\n totalRecords: number;\n\n loading = true;\n loaded = false;\n\n masterSubscriptionId: number;\n subscriptionId;\n userLoggedIn: boolean;\n isMasterSubscription;\n\n scrollLocked = false;\n\n iconClasses: string[] = [\n 'fa-lightbulb',\n 'fa-rocket',\n 'fa-file-alt',\n 'fa-users',\n 'fa-video',\n 'fa-pencil-alt',\n 'fa-book-open',\n 'fa-cogs'\n ];\n user: User;\n\n canEditResourcesValue = false;\n\n constructor(\n private readonly resourceService: ResourceService,\n private readonly authService: AuthService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit() {\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userSub = this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.updateCanEditResourcesValue();\n this.getPostsAndTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostsAndTags();\n }\n this.cdr.markForCheck();\n });\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.readingTime = 0;\n }\n\n getPostsAndTags() {\n this.loading = true;\n this.loaded = false;\n forkJoin({\n resPosts: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n this.currentPage,\n this.pageSize,\n this.searchTextItems\n ),\n resTags: this.tagService.getTagsByType(\n 'post_categories',\n {},\n this.getEffectiveSubscriptionId()\n )\n })\n .subscribe(res => {\n this.posts = res?.resPosts?.posts;\n this.objectCount = res?.resPosts.object_count;\n this.data = res?.resPosts?.posts;\n this.data = res?.resPosts?.posts.map(post => ({\n ...post,\n expandedTags: false\n }));\n this.totalRecords = this.posts?.length;\n\n this.tags = res?.resTags?.tags?.filter(tag => tag.visible_in_resources);\n this.tags = this.tags.map(tag => ({\n ...tag\n }));\n this.cdr.markForCheck();\n })\n .add(() => {\n this.loading = false;\n this.loaded = true;\n this.cdr.markForCheck();\n });\n }\n\n toggleDropdown(event: Event, post): void {\n event.stopPropagation();\n post.showDropdown = !post.showDropdown;\n }\n\n getPosts(page: number, pageSize: number, fetchAll = false, append = false) {\n if (fetchAll) this.selectedTags = [];\n\n if (!append) {\n this.loading = true;\n this.loaded = false;\n }\n\n const tagCategoryParam = this.selectedTags.map(tag => tag.tag_category_id).join(',');\n\n this.resourceService\n .getPublicPosts(\n this.getEffectiveSubscriptionId(),\n page,\n pageSize,\n this.searchTextItems,\n tagCategoryParam\n )\n .subscribe(response => {\n this.objectCount = response.object_count;\n this.posts = append ? [...this.posts, ...response.posts] : response.posts;\n this.data = [...this.posts];\n this.totalRecords = this.posts?.length;\n this.cdr.markForCheck();\n })\n .add(() => {\n this.loading = false;\n this.loaded = true;\n this.cdr.markForCheck();\n });\n }\n\n onSearch(seconds: number) {\n let delay = 0;\n delay = seconds * 1000;\n clearTimeout(this.delayTimeout);\n const delayTimeout = setTimeout(() => {\n this.currentPage = 1;\n this.getPosts(1, this.pageSize);\n }, delay);\n\n this.delayTimeout = delayTimeout;\n }\n\n navigateToTagList(): void {\n HelperService.navigateToTagList();\n }\n\n @HostListener('window:scroll', [])\n onWindowScroll(): void {\n const scrollPosition = window.scrollY + window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n\n const nearBottom = scrollPosition >= pageHeight - 100;\n\n if (\n nearBottom &&\n this.posts.length < this.objectCount &&\n !this.loading &&\n !this.scrollLocked\n ) {\n this.scrollLocked = true;\n this.currentPage += 1;\n\n this.getPosts(this.currentPage, this.pageSize, false, true);\n\n setTimeout(() => {\n this.scrollLocked = false;\n }, 500);\n }\n }\n\n isSelected(tagId: number): boolean {\n return this.selectedTags.map(tag => tag.id).includes(tagId);\n }\n\n tagPost(selectedTag) {\n const index = this.selectedTags.findIndex(\n tag => tag.tag_category_id === selectedTag?.tag_category_id && tag.id === selectedTag.id\n );\n\n if (index === -1) {\n this.selectedTags.push({\n tag_category_id: selectedTag?.tag_category_id,\n id: selectedTag.id\n });\n } else {\n this.selectedTags.splice(index, 1);\n }\n\n this.currentPage = 1;\n this.getPosts(1, this.pageSize);\n }\n\n thisPostReadingTime(text: string): string {\n if (text) {\n const wordsPerMinute = 200;\n const noOfWords = text.split(/\\s/g).length;\n const minutes = noOfWords / wordsPerMinute;\n const readTime = Math.ceil(minutes);\n\n return `${readTime} minute read`;\n }\n\n return '';\n }\n\n override ngOnDestroy() {\n this.userSub?.unsubscribe();\n super.ngOnDestroy();\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.appConfig.master_subscription.subscription_id\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n\n<div class=\"hub-page\">\n<section class=\"hub-hero\" aria-labelledby=\"hub-hero-title\">\n <div class=\"hub-hero__glow\" aria-hidden=\"true\"></div>\n <div class=\"hub-hero__grid\" aria-hidden=\"true\"></div>\n <div class=\"hub-hero__inner\">\n <p class=\"hub-hero__eyebrow\">{{ 'Resource.Posts.Title' | transloco | uppercase }}</p>\n <h1 id=\"hub-hero-title\" class=\"hub-hero__title\">\n Stories, guides, and notes <br class=\"hub-hero__br\" />from the team.\n </h1>\n <p class=\"hub-hero__subtitle\">{{ 'Resource.Hub.Subtitle' | transloco }}</p>\n <div class=\"hub-hero__search\">\n <p-iconfield class=\"hub-hero__search-field\" iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\" id=\"resources-hub-search\" name=\"resources-hub-search\"\n [(ngModel)]=\"searchTextItems\" pInputText\n [placeholder]=\"'Resource.Hub.SearchPlaceholder' | transloco\"\n (input)=\"onSearch(1)\" class=\"hub-hero__search-input\"\n aria-label=\"Resources Hub Search\" />\n </p-iconfield>\n @if (userLoggedIn && user?.auth?.granted['Pages.Admin']) {\n <button type=\"button\" class=\"hub-hero__edit\"\n [title]=\"'Resource.Hub.EditTagsTooltip' | transloco\"\n [attr.aria-label]=\"'Resource.Hub.EditTagsTooltip' | transloco\"\n (click)=\"navigateToTagList()\" (keydown.enter)=\"navigateToTagList()\">\n <i class=\"fa fa-edit\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n</section>\n\n<div class=\"hub-shell\">\n <nav class=\"hub-chips\" aria-label=\"Resource categories\">\n <button type=\"button\" class=\"hub-chip hub-chip--all\"\n [class.hub-chip--selected]=\"selectedTags.length === 0\"\n (click)=\"getPosts(1, pageSize, true)\" (keydown.enter)=\"getPosts(1, pageSize, true)\">\n <span class=\"hub-chip__dot\" aria-hidden=\"true\"></span>\n <span class=\"hub-chip__label\">{{ 'Resource.Hub.AllResources' | transloco }}</span>\n @if (objectCount) { <span class=\"hub-chip__count\">{{ objectCount }}</span> }\n </button>\n @for (tag of tags; track tag.id) {\n <button type=\"button\" class=\"hub-chip\"\n [class.hub-chip--selected]=\"isSelected(tag.id)\"\n (click)=\"tagPost(tag)\" (keydown.enter)=\"tagPost(tag)\">\n <span class=\"hub-chip__dot\" [attr.data-cat]=\"tag.id % 6\" aria-hidden=\"true\"></span>\n <span class=\"hub-chip__label\">{{ tag.name }}</span>\n </button>\n }\n </nav>\n\n @if (loading && !loaded) {\n <div class=\"hub-loading\"><p-progress-spinner strokeWidth=\"2\"></p-progress-spinner></div>\n }\n\n @if (posts?.length && !loading) {\n <ul class=\"hub-grid\" role=\"list\">\n @for (post of data; track post.id; let i = $index) {\n <li class=\"hub-post\" [style.--reveal-delay.ms]=\"i * 40\">\n <pw-resource-edit-card-lazy [canEdit]=\"canEditResourcesValue\" [id]=\"post?.id\"\n [resourceData]=\"post\" (updated)=\"getPosts(1, pageSize)\"></pw-resource-edit-card-lazy>\n\n <a class=\"hub-post__media\" [routerLink]=\"['/resources/view', post.slug]\"\n [attr.aria-label]=\"post.title\"\n [attr.data-cat]=\"(post?.tags?.[0]?.id || 0) % 6\">\n @if (post.picture?.url && !post.picture.url.includes('default-photo')) {\n <img [src]=\"post.picture?.url\" alt=\"\" loading=\"lazy\" class=\"hub-post__image\" />\n } @else {\n <span class=\"hub-post__glyph\" aria-hidden=\"true\">\n {{ (post.title?.[0] || '?').toUpperCase() }}\n </span>\n @if (post?.tags?.[0]?.icon_name) {\n <i class=\"fa hub-post__icon\" [ngClass]=\"post.tags[0].icon_name\" aria-hidden=\"true\"></i>\n }\n }\n </a>\n\n <div class=\"hub-post__body\">\n @if (post?.tags?.[0]) {\n <p class=\"hub-post__eyebrow\" [attr.data-cat]=\"post.tags[0].id % 6\">\n <span class=\"hub-post__dot\" aria-hidden=\"true\"></span>\n {{ post.tags[0].name }}\n </p>\n }\n <h2 class=\"hub-post__title\" [routerLink]=\"['/resources/view', post.slug]\">{{ post.title }}</h2>\n <p class=\"hub-post__excerpt\">{{ post.blurb || (post.body | removeHtml: 'quill' | textTruncate: 140) }}</p>\n <div class=\"hub-post__foot\">\n @if (post.author?.avatar?.[0]?.url) {\n <img class=\"hub-post__avatar\" [src]=\"post.author.avatar[0].url\" alt=\"\" />\n } @else {\n <span class=\"hub-post__avatar hub-post__avatar--text\" aria-hidden=\"true\">{{ (post.author?.first_name?.[0] || '?').toUpperCase() }}</span>\n }\n <div class=\"hub-post__author-meta\">\n <span class=\"hub-post__author-name\">{{ post.author?.first_name }}</span>\n <span class=\"hub-post__author-sub\">\n <time [attr.datetime]=\"post.published_at\">{{ post.published_at | date: 'd MMM' }}</time>\n <span class=\"hub-post__sep\" aria-hidden=\"true\">·</span>\n <span class=\"hub-post__rt\">{{ thisPostReadingTime(post.body) }}</span>\n </span>\n </div>\n <span class=\"hub-post__views\" [title]=\"'Resource.Hub.ViewCount' | transloco: { count: post.view ?? 0 }\">\n {{ post.view ?? 0 }}\n </span>\n </div>\n </div>\n </li>\n }\n </ul>\n }\n\n @if (!posts?.length && loaded) {\n <div class=\"hub-empty\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n</div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceHubComponent } from '../../components/resources-hub/resources-hub.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceHubComponent,\n data: {\n title: 'Resources - Hub',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n declarations: [ResourceHubComponent],\n imports: [ResourceSharedModule, RouterModule.forChild(routes)]\n})\nexport class ResourceHubModule {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,uBAAb,MAAa,6BAA6B,iBAAgB;CA8CtD,YACqB,iBACA,aACA,YACA,KACjB,UAAkB;EAElB,MAAM,QAAQ;EANG,KAAA,kBAAA;EACA,KAAA,cAAA;EACA,KAAA,aAAA;EACA,KAAA,MAAA;EAjDb,KAAA,eAAqD;EAG7D,KAAA,OAAO,CAAA;EAEP,KAAA,QAAoB,CAAA;EACpB,KAAA,OAAc,CAAA;EAEd,KAAA,eAAe,CAAA;EAEf,KAAA,cAAc;EACd,KAAA,WAAA;EACA,KAAA,cAAc;EAEd,KAAA,kBAAkB;EAClB,KAAA,cAAc;EAMd,KAAA,UAAU;EACV,KAAA,SAAS;EAOT,KAAA,eAAe;EAEf,KAAA,cAAwB;GACpB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACH;EAGD,KAAA,wBAAwB;CAUxB;CAEA,WAAQ;EACJ,KAAK,YAAY,UAAS,CAAE,CAAC,WAAU,QAAM;GACzC,KAAK,eAAe,CAAC,CAAC;GACtB,IAAI,KAAK,cAAc;IACnB,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;KAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;KACrC,KAAK,iBAAiB,MAAM;KAC5B,KAAK,IAAI,aAAY;IACzB,CAAC;IACD,KAAK,UAAU,KAAK,YAAY,YAAW,CAAE,CAAC,WAAU,SAAO;KAC3D,KAAK,OAAO;KACZ,KAAK,4BAA2B;KAChC,KAAK,gBAAe;KACpB,KAAK,IAAI,aAAY;IACzB,CAAC;GACL,OACI,KAAK,gBAAe;GAExB,KAAK,IAAI,aAAY;EACzB,CAAC;EACD,KAAK,uBAAuB,KAAK,UAAU,oBAAoB;EAC/D,KAAK,cAAc;CACvB;CAEA,kBAAe;EACX,KAAK,UAAU;EACf,KAAK,SAAS;EACd,SAAS;GACL,UAAU,KAAK,gBAAgB,eAC3B,KAAK,2BAA0B,GAC/B,KAAK,aACL,KAAK,UACL,KAAK,eAAe;GAExB,SAAS,KAAK,WAAW,cACrB,mBACA,CAAA,GACA,KAAK,2BAA0B,CAAE;EAExC,CAAA,CAAC,CACG,WAAU,QAAM;GACb,KAAK,QAAQ,KAAK,UAAU;GAC5B,KAAK,cAAc,KAAK,SAAS;GACjC,KAAK,OAAO,KAAK,UAAU;GAC3B,KAAK,OAAO,KAAK,UAAU,MAAM,KAAI,UAAS;IAC1C,GAAG;IACH,cAAc;GACjB,EAAC;GACF,KAAK,eAAe,KAAK,OAAO;GAEhC,KAAK,OAAO,KAAK,SAAS,MAAM,QAAO,QAAO,IAAI,oBAAoB;GACtE,KAAK,OAAO,KAAK,KAAK,KAAI,SAAQ,EAC9B,GAAG,IACN,EAAC;GACF,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,UAAU;GACf,KAAK,SAAS;GACd,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEA,eAAe,OAAc,MAAI;EAC7B,MAAM,gBAAe;EACrB,KAAK,eAAe,CAAC,KAAK;CAC9B;CAEA,SAAS,MAAc,UAAkB,WAAW,OAAO,SAAS,OAAK;EACrE,IAAI,UAAU,KAAK,eAAe,CAAA;EAElC,IAAI,CAAC,QAAQ;GACT,KAAK,UAAU;GACf,KAAK,SAAS;EAClB;EAEA,MAAM,mBAAmB,KAAK,aAAa,KAAI,QAAO,IAAI,eAAe,CAAC,CAAC,KAAK,GAAG;EAEnF,KAAK,gBACA,eACG,KAAK,2BAA0B,GAC/B,MACA,UACA,KAAK,iBACL,gBAAgB,CACnB,CACA,WAAU,aAAW;GAClB,KAAK,cAAc,SAAS;GAC5B,KAAK,QAAQ,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG,SAAS,KAAK,IAAI,SAAS;GACpE,KAAK,OAAO,CAAC,GAAG,KAAK,KAAK;GAC1B,KAAK,eAAe,KAAK,OAAO;GAChC,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,UAAU;GACf,KAAK,SAAS;GACd,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEA,SAAS,SAAe;EACpB,IAAI,QAAQ;EACZ,QAAQ,UAAU;EAClB,aAAa,KAAK,YAAY;EAC9B,MAAM,eAAe,iBAAgB;GACjC,KAAK,cAAc;GACnB,KAAK,SAAS,GAAG,KAAK,QAAQ;EAClC,GAAG,KAAK;EAER,KAAK,eAAe;CACxB;CAEA,oBAAiB;EACb,cAAc,kBAAiB;CACnC;CAGA,iBAAc;EAMV,IALuB,OAAO,UAAU,OAAO,eAC5B,SAAS,gBAAgB,eAEM,OAI9C,KAAK,MAAM,SAAS,KAAK,eACzB,CAAC,KAAK,WACN,CAAC,KAAK,cACR;GACE,KAAK,eAAe;GACpB,KAAK,eAAe;GAEpB,KAAK,SAAS,KAAK,aAAa,KAAK,UAAU,OAAO,IAAI;GAE1D,iBAAgB;IACZ,KAAK,eAAe;GACxB,GAAG,GAAG;EACV;CACJ;CAEA,WAAW,OAAa;EACpB,OAAO,KAAK,aAAa,KAAI,QAAO,IAAI,EAAE,CAAC,CAAC,SAAS,KAAK;CAC9D;CAEA,QAAQ,aAAW;EACf,MAAM,QAAQ,KAAK,aAAa,WAC5B,QAAO,IAAI,oBAAoB,aAAa,mBAAmB,IAAI,OAAO,YAAY,EAAE;EAG5F,IAAI,UAAU,IACV,KAAK,aAAa,KAAK;GACnB,iBAAiB,aAAa;GAC9B,IAAI,YAAY;EACnB,CAAA;OAED,KAAK,aAAa,OAAO,OAAO,CAAC;EAGrC,KAAK,cAAc;EACnB,KAAK,SAAS,GAAG,KAAK,QAAQ;CAClC;CAEA,oBAAoB,MAAY;EAC5B,IAAI,MAAM;GAGN,MAAM,UADY,KAAK,MAAM,KAAK,CAAC,CAAC,SACR;GAG5B,OAAO,GAFU,KAAK,KAAK,OAEjB,EAAQ;EACtB;EAEA,OAAO;CACX;CAES,cAAW;EAChB,KAAK,SAAS,YAAW;EACzB,MAAM,YAAW;CACrB;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,UAAU,oBAAoB,eAAe;CAE1D;CAEQ,8BAA2B;EAC/B,IAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;OAG1B,KAAK,wBAAwB;CAErC;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAnQS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAoB,MAAA;IAAA,EAAA,OAAAA,gBAAA;IAAA,EAAA,OAAA,GAAA,YAAA;IAAA,EAAA,OAAA,GAAA,WAAA;IAAA,EAAA,OAAA,GAAA,kBAAA;IAAA,EAAA,OAAA,GAAA,SAAA;GAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAApB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAoB,cAAA;GAAA,UAAA;GAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,mBAAA,EAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UCjCjC;GAsHA,QAAA,CAAA,mvUAAA,w5CAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAC;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA,CAAA,QAAA,cAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,UAAA;KAAA,QAAA,CAAA,YAAA,cAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,UAAA;KAAA,QAAA,CAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,IAAA;KAAA,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;ADrFa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAZhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,eAMV,kBAAkB;GAAI,iBAEpB,wBAAwB;GAAM,YACnC;GAAK,UAAA;GAAA,QAAA,CAAA,mvUAAA,w5CAAA;EAAA,CAAA;;;;;;;;;;EA8KhB,MAAA;EAAa,MAAA,CAAA,iBAAiB,CAAA,CAAE;;;AEvMrC,MAAM,SAAiB,CACnB;CACI,MAAM;CACN,WAAW;CACX,MAAM;EACF,OAAO;EACP,YAAY;EACZ,SAAS;CACZ;AACJ,CACJ;AAMD,IAAa,oBAAb,MAAa,kBAAiB;CAAjB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAiB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAjB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAiB,cAAA,CAHX,oBAAoB;GAAA,SAAA,CACzB,sBAAoBC,GAAA,YAAA;EAAA,CAAA;CAAA;CAErB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAiB,SAAA,CAFhB,sBAAsB,aAAa,SAAS,MAAM,CAAC;EAAA,CAAA;CAAA;;AAEpD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAJ7B,MAAA;EAAS,MAAA,CAAA;GACN,cAAc,CAAC,oBAAoB;GACnC,SAAS,CAAC,sBAAsB,aAAa,SAAS,MAAM,CAAC;EAChE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-integrations.module-DqDd_1U9.mjs","names":["i1.ResourceService","i3","i4.ResourceTopBannerEditComponent","i5","i1","i2.ResourceService","i4","i6.ResourceCompanyCardComponent","i7.ResourceNoteCardComponent","i11","i16.IntegrationTopBannerComponent"],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-integration/resource-integration.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-integration/resource-integration.component.html","../../../../libs/resource-module/src/lib/public/modules/integrations/resource-integrations.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy,\n ChangeDetectorRef, Component, Injector } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AuthService, TagService } from '@posiwise/common-services';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\n\n@Component({\n selector: 'pw-integration-top-banner',\n templateUrl: './integration-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class IntegrationTopBannerComponent extends BaseTopBannerComponent {\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n constructor(\n resourceService: ResourceService,\n tagService: TagService,\n authService: AuthService,\n titleService: Title,\n cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(resourceService, tagService, authService, titleService, cdr, injector);\n }\n\n protected getSearchTerm(): string {\n return 'Integrations';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Integrated vendors'\"></span>\n @if (canEditResourcesValue) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n <span class=\"blue-text\"></span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension mt-4\">\n <div class=\"cta-buttons d-flex flex-column justify-between h-100\">\n <div class=\"flex-grow-1\">\n @if (blogPostTag?.description && blogPostTag.description !== 'null' ) {\n <p class=\"intro\" [innerHTML]=\"blogPostTag.description\"></p>\n } @else {\n <p class=\"intro\">\n Browse below the vendor integrations<br />\n we support.\n </p>\n }\n </div>\n <div class=\"d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img dyn-img\"\n [src]=\"(blogPostTag?.image?.url && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared'))) ? blogPostTag?.image?.url : '/assets/img/resource/men.png'\"\n alt=\"Integrated vendors banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n Injector,\n OnInit,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { AdminService } from '@posiwise/admin-module-utils';\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { CompanyData, Resource, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { CustomUploaderComponent } from '@posiwise/utils';\n\nimport { forkJoin } from 'rxjs';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\nimport { ResourceService } from '../../../resource.service';\n\n@Component({\n selector: 'pw-resource-integration',\n templateUrl: './resource-integration.component.html',\n styleUrls: [\n './resource-integration.component.scss',\n '../resources/resources-shared.component.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceIntegrationComponent extends AppBaseComponent implements OnInit {\n private readonly doc = inject(DOCUMENT);\n\n @ViewChild('editIntegrationsModal') editIntegrationsModal: TemplateRef<CustomUploaderComponent>;\n editingIntegrations;\n distributorsData = CompanyData?.distributorsData;\n vendorsData = CompanyData?.vendorsData;\n\n textColor = this.appConfig?.color_codes?.text;\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n distributerPosts = [];\n userLoggedIn: boolean;\n blogPostTag;\n isLoaded = false;\n resourcePostTag;\n blogPostVendorTag;\n isMasterSubscription;\n\n integrations = this.appConfig?.pages_config?.integrations;\n\n releaseNotesLink = '/resources/product-release-notes';\n q1NotesLink = '/resources/product-release-q1-2025';\n q3NotesLink = '/resources/product-release-q3-2024';\n q4NotesLink = '/resources/product-release-q4-2024';\n companyName;\n\n videoWebinarLoaded = false;\n videoDemoLoaded = false;\n youtubeVideoId = 'R7Vk219zbhA';\n videoTitle = 'CloudOlive Overview';\n sanitizedMicrosoftVideoUrl: SafeResourceUrl;\n sanitizedKesyaVideoUrl: SafeResourceUrl;\n integrationCountDisplay: number;\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n tagCategory;\n totalPosts: number;\n\n guideData = this.appConfig?.pages_config?.guides;\n editingGuides = { items: [] };\n user: User;\n\n canEditResourcesValue = false;\n domainId = this.appConfig.domain_id;\n\n constructor(\n private readonly sanitizer: DomSanitizer,\n private readonly resourceService: ResourceService,\n private readonly modalService: NgbModal,\n private readonly tagService: TagService,\n private readonly authService: AuthService,\n private readonly adminService: AdminService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit() {\n this.companyName = this.appConfig.company.name;\n\n this.doc.documentElement.style.setProperty('--text-color', this.textColor);\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n\n this.getTags();\n this.updateCanEditResourcesValue();\n this.cdr.markForCheck();\n });\n } else {\n this.getTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n private getTags() {\n this.isLoaded = false;\n this.tagService\n .getAllTagCategories({ search: 'Integrations' }, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.tagCategory = response?.tag_categories?.[0];\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n openEditIntegrationsModal(modalRef) {\n this.editingIntegrations = structuredClone(this.integrations);\n this.modalService.open(modalRef, {\n size: 'lg',\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n showIntegrations(): boolean {\n if (this.userLoggedIn) {\n return true;\n }\n\n if (Array.isArray(this.guideData?.items) && this.guideData.items.length) {\n const item = this.guideData.items[0];\n return (\n !!item?.title ||\n !!item?.description ||\n !!item?.guide_url ||\n (!!item?.image_url && !item.image_url.includes('default-image.png'))\n );\n }\n\n return false;\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.resourcePostTag = response.tags.find(\n tag => tag.name === 'Product Release Notes'\n );\n this.blogPostTag = response.tags.find(\n tag =>\n tag.name === 'Integrated Distributors' &&\n tag.tag_category_id === this.tagCategory?.id\n );\n this.blogPostVendorTag = response.tags.find(\n tag =>\n tag.name === 'Integrated Vendors' &&\n tag.tag_category_id === this.tagCategory?.id\n );\n\n // use forkJoin to fetch both sets of posts in parallel\n forkJoin({\n vendorResponse: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n 1,\n 100,\n '',\n '',\n this.blogPostVendorTag?.id\n ),\n distributorResponse: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n 1,\n 100,\n '',\n '',\n this.blogPostTag?.id\n )\n }).subscribe(({ vendorResponse, distributorResponse }) => {\n const sortedVendors = vendorResponse.posts.sort(\n (a, b) =>\n new Date(b.published_at).getTime() - new Date(a.published_at).getTime()\n );\n const sortedDistributors = distributorResponse.posts.sort(\n (a, b) =>\n new Date(b.published_at).getTime() - new Date(a.published_at).getTime()\n );\n\n // Show only integrations that have an image; count still includes all\n this.posts = sortedVendors.filter(post => this.hasDisplayableImage(post));\n this.distributerPosts = sortedDistributors.filter(post =>\n this.hasDisplayableImage(post)\n );\n\n const vendorCount = vendorResponse?.object_count ?? 0;\n const distributorCount = distributorResponse?.object_count ?? 0;\n const total = vendorCount + distributorCount;\n\n this.integrationCountDisplay = total === 0 ? 0 : Math.ceil(total / 10) * 10;\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n this.cdr.markForCheck();\n });\n }\n\n loadMicrosoftVideo(videoUrl) {\n window.open(videoUrl, '_blank', 'noopener,noreferrer');\n }\n\n loadKeseyaVideo(): void {\n const baseUrl = `https://www.youtube.com/embed/${this.youtubeVideoId}?autoplay=1`;\n // baseUrl is a trusted internal source (e.g. YouTube embed URL)\n this.sanitizedKesyaVideoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(baseUrl); // NOSONAR\n this.videoWebinarLoaded = true;\n }\n\n addIntegrationItem() {\n this.editingIntegrations.items.push({\n title: '',\n description: '',\n blog_url: '',\n image_url: '',\n video_url: ''\n });\n }\n\n removeIntegrationItem(index: number) {\n this.editingIntegrations.items.splice(index, 1);\n }\n\n dropIntegrationItems(event) {\n moveItemInArray(this.editingIntegrations.items, event.previousIndex, event.currentIndex);\n }\n\n saveIntegrations(modalRef) {\n const updatedIntegrations = {\n ...this.editingIntegrations\n };\n\n this.adminService\n .updateDomainConfig(this.domainId, {\n integrations: updatedIntegrations,\n subscription_id: this.getEffectiveSubscriptionId()\n })\n .subscribe(() => {\n this.integrations = updatedIntegrations;\n this.toast.success('Integrations updated');\n modalRef.close();\n this.cdr.markForCheck();\n });\n }\n\n saveGuides(modalRef) {\n const updatedGuides = {\n ...this.editingGuides\n };\n\n this.adminService\n .updateDomainConfig(this.domainId, {\n guides: updatedGuides,\n subscription_id: this.getEffectiveSubscriptionId()\n })\n .subscribe(() => {\n this.guideData = updatedGuides;\n this.toast.success('Guides updated');\n modalRef.close();\n this.cdr.markForCheck();\n });\n }\n\n openGuidesModal(template) {\n this.editingGuides = structuredClone(this.guideData ?? { items: [] });\n this.modalService.open(template, { size: 'xl' });\n }\n\n addGuide() {\n this.editingGuides.items.push({\n title: '',\n button_text: '',\n image_url: '',\n guide_url: '',\n description: ''\n });\n }\n\n removeGuide(index: number) {\n this.editingGuides.items.splice(index, 1);\n }\n\n dropGuides(event: CdkDragDrop<string[]>) {\n moveItemInArray(this.editingGuides.items, event.previousIndex, event.currentIndex);\n }\n\n private hasDisplayableImage(post: {\n companyImg?: string;\n rectangular_picture?: { url?: string };\n }): boolean {\n if (post?.companyImg) {\n return true;\n }\n const url = post?.rectangular_picture?.url;\n return !!url && !url.includes('default-photo');\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<pw-integration-top-banner></pw-integration-top-banner>\n<div class=\"bg-white\">\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container sec-container\">\n @if (isLoaded && (posts.length + distributerPosts.length) > 0) {\n <div>\n <h1 class=\"int-title mb-0\">{{ integrationCountDisplay }}+ integrations <span class=\"int-title__sub\">(&amp; counting)</span></h1>\n <p class=\"int-text\">Search the current list of {{ companyName }} vendor and distributor integrations below.</p>\n </div>\n }\n @if (isLoaded) {\n <pw-resource-company-card [header]=\"'integrated vendors'\"\n (getPosts)=\"getPostTags()\"\n [integrationCountDisplay]=\"integrationCountDisplay\"\n [data]=\"posts\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"></pw-resource-company-card>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\"\n >\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (integrationCountDisplay === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (isLoaded && (posts.length + distributerPosts.length) > 0) {\n <div class=\"text-center pt-3 mt-4\">\n <p class=\"see-span\">Don&rsquo;t see what you&rsquo;re after? <a [href]=\"contactUsUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"int-span team-span\">Speak with our team to request a connection <i class=\"fa fa-chevron-right team-span__icon\" aria-hidden=\"true\"></i></a>\n </p>\n </div>\n }\n </div>\n\n</section>\n<section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n @if (isLoaded) {\n <pw-resource-company-card [header]=\"'integrated Distributors'\"\n [integrationCountDisplay]=\"integrationCountDisplay\"\n [vendor]=\"true\"\n (getPosts)=\"getPostTags()\"\n [data]=\"distributerPosts\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"></pw-resource-company-card>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\"\n >\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (integrationCountDisplay === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n </div>\n\n</section>\n@if (integrations) {\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n <div class=\"how-it-works-wrapper\">\n <div class=\"d-flex\">\n <h2 class=\"it-works-title mb-0\">{{ integrations?.title || 'How it works' }}</h2>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit in-page-edit-icon text-black ms-4 mt-3 cursor-pointer\"\n (click)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n (keydown.enter)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n (keydown.space)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n title=\"Edit Integrations Section\"></i>\n }\n </div>\n <p class=\"pb-20\" [innerHTML]=\"integrations?.description || 'View short example videos to understand how these integrations can work for you:'\"></p>\n <div class=\"row section-row\" [ngClass]=\"{ 'justify-content-center': integrations?.items?.length === 1 }\">\n @if (integrations?.items?.length > 0) {\n @for (integration of integrations?.items; track integration) {\n @if (integration?.image_url || integration?.title || integration?.description) {\n <div\n class=\"col-md-6\"\n >\n @if (integration?.video_url && integration?.video_url.includes('https')) {\n <div class=\"d-flex justify-content-center cursor-pointer\">\n @if (integration?.video_url) {\n <img\n [src]=\"integration?.image_url\"\n (click)=\"loadMicrosoftVideo(integration?.video_url)\"\n (keydown.enter)=\"loadMicrosoftVideo(integration?.video_url)\"\n class=\"how-it-works-img\"\n alt=\"Integration Video Thumbnail\"\n />\n }\n </div>\n } @else {\n <div class=\"d-flex justify-content-center\">\n <div class=\"w-100\">\n <pw-no-data [withImage]=\"true\" [message]=\"'No video found' | transloco\">\n </pw-no-data>\n </div>\n </div>\n }\n </div>\n }\n }\n } @else {\n <div class=\"w-100 text-center\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Integration.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n </div>\n </div>\n </div>\n </section>\n}\n@if (showIntegrations()) {\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n <div class=\"row align-items-start\">\n <div class=\"col-md-6 text-md-start text-center\">\n <div class=\"d-flex\">\n <h2 class=\"guide-title mb-3\">{{ guideData?.items?.[0]?.title || 'Featured guide' }}</h2>\n @if (canEditResourcesValue) {\n <button type=\"button\"\n class=\"in-page-edit-icon text-black ms-4 mt-3 cursor-pointer\"\n (click)=\"openGuidesModal(guidesEditModal)\"\n title=\"Edit featured guide\"\n aria-label=\"Edit featured guide\">\n <i class=\"fa fa-edit\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <p class=\"guide-subtext\"\n [innerHTML]=\"guideData?.items?.[0]?.description || (canEditResourcesValue ? 'Add a featured guide via Admin &rarr; Domain config &rarr; Integrations.' : 'A practical walkthrough of how to get the most from your integrations.')\">\n </p>\n @if (guideData?.items?.[0]?.guide_url) {\n <a class=\"vault-btn\"\n [href]=\"guideData?.items?.[0]?.guide_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n {{ guideData?.items?.[0]?.button_text || 'View the guide' }} <i class=\"fa fa-chevron-right vault-btn__icon\" aria-hidden=\"true\"></i>\n </a>\n }\n </div>\n <div class=\"col-md-6 text-center\">\n @if (guideData?.items?.[0]?.image_url && !guideData?.items?.[0]?.image_url?.includes('default-photo.jpg')) {\n <img\n [src]=\"guideData?.items?.[0]?.image_url\"\n alt=\"\"\n class=\"guide-img\"\n loading=\"lazy\" />\n }\n </div>\n </div>\n </div>\n </section>\n}\n</div>\n\n@if (resourcePostTag?.tag_category_id) {\n <pw-resource-note-card [categoryId]=\"resourcePostTag?.tag_category_id\" [tag]=\"resourcePostTag\" [releaseHeader]=\"true\" [resourceTitle]=\"resourcePostTag?.title\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-note-card>\n}\n\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n\n\n\n<ng-template #editIntegrationsModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Integrations Section</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label class=\"form-label\" for=\"integration-title\">Title</label>\n <input class=\"form-control\" id=\"integration-title\" [(ngModel)]=\"editingIntegrations.title\"\n aria-label=\"Integration Title\" />\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label\" for=\"integration-description\">Description</label>\n <textarea class=\"form-control\" id=\"integration-description\" rows=\"3\" [(ngModel)]=\"editingIntegrations.description\"\n aria-label=\"Integration Description\"></textarea>\n </div>\n\n <div cdkDropList (cdkDropListDropped)=\"dropIntegrationItems($event)\">\n @for (integration of editingIntegrations.items; track integration; let i = $index) {\n <div class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"pw-label-style form-label mb-0\" id=\"integration-item-label\">Integration Item</span>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-title-' + i\">Title</label>\n <input class=\"form-control\" [id]=\"'integration-item-title-' + i\" [(ngModel)]=\"integration.title\" id=\"input_integration.title_7712\" name=\"input_integration.title_7712\"\n aria-label=\"Input Integration.title 7712\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-description-' + i\">Description</label>\n <input class=\"form-control\" [id]=\"'integration-item-description-' + i\" [(ngModel)]=\"integration.description\" id=\"input_integration.description_9056\" name=\"input_integration.description_9056\"\n aria-label=\"Input Integration.description 9056\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-blog-url-' + i\">Blog URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-blog-url-' + i\" [(ngModel)]=\"integration.blog_url\" id=\"input_integration.blog_url_7856\" name=\"input_integration.blog_url_7856\"\n aria-label=\"Input Integration.blog Url 7856\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-image-url-' + i\">Image URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-image-url-' + i\" [(ngModel)]=\"integration.image_url\" id=\"input_integration.image_url_9056\" name=\"input_integration.image_url_9056\"\n aria-label=\"Input Integration.image Url 9056\" />\n </div>\n <div class=\"col-md-12 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-video-url-' + i\">Video URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-video-url-' + i\" [(ngModel)]=\"integration.video_url\" id=\"input_integration.video_url_9056\" name=\"input_integration.video_url_9056\"\n aria-label=\"Input Integration.video Url 9056\" />\n </div>\n </div>\n <div class=\"d-flex justify-content-end\">\n <i class=\"fa fa-trash text-danger cursor-pointer\" (click)=\"removeIntegrationItem(i)\" (keydown.enter)=\"removeIntegrationItem(i)\"\n (keydown.space)=\"removeIntegrationItem(i)\"></i>\n </div>\n </div>\n }\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm\" (click)=\"addIntegrationItem()\">+ Add Integration</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)=\"saveIntegrations(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #guidesEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Guides</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\">Guides Section</h4>\n\n <div cdkDropList (cdkDropListDropped)=\"dropGuides($event)\">\n @for (guide of editingGuides.items; track guide; let i = $index) {\n <div class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-title-' + i\">Title</label>\n <input class=\"form-control\" [id]=\"'guide-title-' + i\" [(ngModel)]=\"guide.title\" id=\"input_guide.title_7072\" name=\"input_guide.title_7072\"\n aria-label=\"Input Guide.title 7072\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-button-text-' + i\">Button Text</label>\n <input class=\"form-control\" [id]=\"'guide-button-text-' + i\" [(ngModel)]=\"guide.button_text\" id=\"input_guide.button_text_7712\" name=\"input_guide.button_text_7712\"\n aria-label=\"Input Guide.button Text 7712\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-image-url-' + i\">Image URL</label>\n <input class=\"form-control\" [id]=\"'guide-image-url-' + i\" [(ngModel)]=\"guide.image_url\" id=\"input_guide.image_url_7856\" name=\"input_guide.image_url_7856\"\n aria-label=\"Input Guide.image Url 7856\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-url-' + i\">Guide URL</label>\n <input class=\"form-control\" [id]=\"'guide-url-' + i\" [(ngModel)]=\"guide.guide_url\" id=\"input_guide.guide_url_6944\" name=\"input_guide.guide_url_6944\"\n aria-label=\"Input Guide.guide Url 6944\" />\n </div>\n <div class=\"col-12 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-description-' + i\">Description</label>\n <textarea class=\"form-control\" [id]=\"'guide-description-' + i\" [name]=\"'guide-description-' + i\" rows=\"3\" [(ngModel)]=\"guide.description\"></textarea>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <i class=\"fa fa-trash text-danger cursor-pointer\" (click)=\"removeGuide(i)\" (keydown.enter)=\"removeGuide(i)\" (keydown.space)=\"removeGuide(i)\"></i>\n <i class=\"fa fa-bars cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n }\n </div>\n\n <button class=\"btn btn-primary mt-2\" (click)=\"addGuide()\">+ Add Guide</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)=\"saveGuides(modal)\">Save</button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { IntegrationTopBannerComponent } from '../../components/resource-integration/integration-top-banner/integration-top-banner.component';\nimport { ResourceIntegrationComponent } from '../../components/resource-integration/resource-integration.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceIntegrationComponent,\n data: {\n title: 'Resources - Integrations',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n declarations: [ResourceIntegrationComponent, IntegrationTopBannerComponent],\n imports: [ResourceSharedModule, RouterModule.forChild(routes)]\n})\nexport class ResourceIntegrationsModule {}\n"],"mappings":"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"}