@posiwise/resource-module 0.0.206 → 0.0.207

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 (43) hide show
  1. package/fesm2022/{posiwise-resource-module-base-top-banner.component-BwujN_up.mjs → posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs} +4 -4
  2. package/fesm2022/posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs.map +1 -0
  3. package/fesm2022/{posiwise-resource-module-resource-blogs.module-DEXimOOY.mjs → posiwise-resource-module-resource-blogs.module-LKr-SjAo.mjs} +3 -3
  4. package/fesm2022/{posiwise-resource-module-resource-blogs.module-DEXimOOY.mjs.map → posiwise-resource-module-resource-blogs.module-LKr-SjAo.mjs.map} +1 -1
  5. package/fesm2022/{posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs → posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs} +15 -15
  6. package/fesm2022/posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs.map +1 -0
  7. package/fesm2022/{posiwise-resource-module-resource-case-studies.module-CQHAhbsv.mjs → posiwise-resource-module-resource-case-studies.module-CzB9wtnf.mjs} +4 -4
  8. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CzB9wtnf.mjs.map +1 -0
  9. package/fesm2022/{posiwise-resource-module-resource-edit-card.component-2VvTki2u.mjs → posiwise-resource-module-resource-edit-card.component-d9cDJUJf.mjs} +3 -3
  10. package/fesm2022/posiwise-resource-module-resource-edit-card.component-d9cDJUJf.mjs.map +1 -0
  11. package/fesm2022/{posiwise-resource-module-resource-events.module-D8mxidoP.mjs → posiwise-resource-module-resource-events.module-BO9CcIFp.mjs} +5 -5
  12. package/fesm2022/posiwise-resource-module-resource-events.module-BO9CcIFp.mjs.map +1 -0
  13. package/fesm2022/{posiwise-resource-module-resource-hub.module-DklN3KeA.mjs → posiwise-resource-module-resource-hub.module-B3EZao2L.mjs} +10 -10
  14. package/fesm2022/posiwise-resource-module-resource-hub.module-B3EZao2L.mjs.map +1 -0
  15. package/fesm2022/{posiwise-resource-module-resource-integrations.module-iTlhrAYt.mjs → posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs} +11 -11
  16. package/fesm2022/posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs.map +1 -0
  17. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DpTqKqS9.mjs → posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs} +4 -4
  18. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DpTqKqS9.mjs.map → posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs.map} +1 -1
  19. package/fesm2022/{posiwise-resource-module-resource-post.module-PU-KBg_G.mjs → posiwise-resource-module-resource-post.module-C343zv-t.mjs} +13 -13
  20. package/fesm2022/posiwise-resource-module-resource-post.module-C343zv-t.mjs.map +1 -0
  21. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs → posiwise-resource-module-resource-release-notes.module-CE21Yiss.mjs} +4 -4
  22. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs.map → posiwise-resource-module-resource-release-notes.module-CE21Yiss.mjs.map} +1 -1
  23. package/fesm2022/{posiwise-resource-module-resource-root.module-TMvR1c1H.mjs → posiwise-resource-module-resource-root.module-BzvAo30C.mjs} +3 -3
  24. package/fesm2022/posiwise-resource-module-resource-root.module-BzvAo30C.mjs.map +1 -0
  25. package/fesm2022/{posiwise-resource-module-resource-videos.module-BCDet6S9.mjs → posiwise-resource-module-resource-videos.module-OJpXslFg.mjs} +3 -3
  26. package/fesm2022/{posiwise-resource-module-resource-videos.module-BCDet6S9.mjs.map → posiwise-resource-module-resource-videos.module-OJpXslFg.mjs.map} +1 -1
  27. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-DtxUgC_Z.mjs → posiwise-resource-module-resource-white-papers.module-rr8wWULi.mjs} +3 -3
  28. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-DtxUgC_Z.mjs.map → posiwise-resource-module-resource-white-papers.module-rr8wWULi.mjs.map} +1 -1
  29. package/fesm2022/{posiwise-resource-module-resource.service-DAXsq-WG.mjs → posiwise-resource-module-resource.service-BBvcVvWN.mjs} +10 -10
  30. package/fesm2022/posiwise-resource-module-resource.service-BBvcVvWN.mjs.map +1 -0
  31. package/fesm2022/posiwise-resource-module.mjs +13 -13
  32. package/package.json +1 -1
  33. package/types/posiwise-resource-module.d.ts +17 -16
  34. package/fesm2022/posiwise-resource-module-base-top-banner.component-BwujN_up.mjs.map +0 -1
  35. package/fesm2022/posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs.map +0 -1
  36. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CQHAhbsv.mjs.map +0 -1
  37. package/fesm2022/posiwise-resource-module-resource-edit-card.component-2VvTki2u.mjs.map +0 -1
  38. package/fesm2022/posiwise-resource-module-resource-events.module-D8mxidoP.mjs.map +0 -1
  39. package/fesm2022/posiwise-resource-module-resource-hub.module-DklN3KeA.mjs.map +0 -1
  40. package/fesm2022/posiwise-resource-module-resource-integrations.module-iTlhrAYt.mjs.map +0 -1
  41. package/fesm2022/posiwise-resource-module-resource-post.module-PU-KBg_G.mjs.map +0 -1
  42. package/fesm2022/posiwise-resource-module-resource-root.module-TMvR1c1H.mjs.map +0 -1
  43. package/fesm2022/posiwise-resource-module-resource.service-DAXsq-WG.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs","names":[],"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-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-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-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 CUSTOM_ELEMENTS_SCHEMA,\n EventEmitter,\n inject,\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 changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceEditCardLazyComponent implements OnChanges, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 /** The last request failed; cleared by the next load that succeeds. */\n hasError = 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 /** Posts the server matched, including those not loaded yet. */\n get totalCount(): number {\n return 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.hasError = 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 this.hasError = false;\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.hasError = true;\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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../resource-edit-card-lazy/resource-edit-card-lazy.component';\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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n FormsModule,\n RouterLink,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceNoteCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\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 imports: [\n NgClass,\n FormsModule,\n RouterLink,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceVideoCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly sanitizer = inject(DomSanitizer);\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\nimport { ResourceVideoCardComponent } from '../../resource-videos/resource-video-cards/resource-video-cards.component';\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 imports: [\n NgTemplateOutlet,\n RouterLink,\n NgClass,\n FormsModule,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n ResourceVideoCardComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class CaseStudyCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../../resource.service';\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../../resource-edit-card-lazy/resource-edit-card-lazy.component';\nimport { ResourceVideoCardComponent } from '../../../resource-videos/resource-video-cards/resource-video-cards.component';\n\n@Component({\n selector: 'pw-resource-cards',\n templateUrl: './resource-cards.component.html',\n styleUrls: ['../../../resources/resources-shared.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n FormsModule,\n RouterLink,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n ResourceVideoCardComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n OnInit\n} 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})\nexport abstract class BaseResourceComponent extends AppBaseComponent implements OnInit {\n protected readonly resourceService = inject(ResourceService);\n protected readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n protected readonly cdr = inject(ChangeDetectorRef);\n\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 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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n EventEmitter,\n HostListener,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { PublicPost, RESOURCE_PAGE_SIZE, ResourcePager } from '../../shared/resource-pager';\nimport { BaseResourceComponent } from '../base/base-resource.component';\nimport { ResourceEditCardLazyComponent } from '../resource-edit-card-lazy/resource-edit-card-lazy.component';\nimport { ResourceVideoCardComponent } from '../resource-videos/resource-video-cards/resource-video-cards.component';\n\n@Component({\n selector: 'pw-resource--vault',\n templateUrl: './resource-vault.component.html',\n styleUrls: ['../resources/resources-shared.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n FormsModule,\n RouterLink,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n ResourceVideoCardComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\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 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 inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n RouterLink,\n TranslocoPipe\n ]\n})\nexport class ReplayEventCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\nimport { ReplayEventCardComponent } from '../replay-event-cards/replay-event-cards.component';\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 imports: [\n NgClass,\n FormsModule,\n RouterLink,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n ResourceEditCardLazyComponent,\n LazyImgDirective,\n ReplayEventCardComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class UpcomingEventCardComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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 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 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 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":";;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAa,wBAAb,MAAa,sBAAqB;CAArB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAArB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,SAAA,CAHpB,2BAA2B;GAAA,SAAA,CAC3B,2BAA2B;EAAA,CAAA;CAAA;CAE5B;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,SAAA,CAHpB,6BACA,2BAA2B;EAAA,CAAA;CAAA;;AAE5B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAJjC,MAAA;EAAS,MAAA,CAAA;GACN,SAAS,CAAC,2BAA2B;GACrC,SAAS,CAAC,2BAA2B;EACxC,CAAA;;;ACkBD,IAAa,gCAAb,MAAa,8BAA6B;CAN1C,cAAA;EAOqB,KAAA,MAAM,OAAO,iBAAiB;EAOtC,KAAA,UAAU;EACT,KAAA,UAAU,IAAI,aAAY;EAE5B,KAAA,eAAe;EACf,KAAA,UAAU;CA+CrB;CA7CG,MAAM,YAAY,SAAsB;EACpC,IAAI,KAAK,WAAW,CAAC,KAAK,gBAAgB,CAAC,KAAK,SAC5C,MAAM,KAAK,aAAY;OACpB,IAAI,CAAC,KAAK,WAAW,KAAK,cAAc;GAC3C,KAAK,UAAU,MAAK;GACpB,KAAK,eAAe;EACxB,OAAO,IAAI,KAAK,iBAAiB,QAAQ,SAAS,QAAQ,kBAAkB;GAExE,KAAK,aAAa,SAAS,KAAK,KAAK;GACrC,KAAK,aAAa,SAAS,eAAe,KAAK;EACnD;CACJ;CAEQ,MAAM,eAAY;EACtB,IAAI,KAAK,gBAAgB,KAAK,SAAS;EAEvC,KAAK,UAAU;EAEf,IAAI;GAGA,MAAM,6BAA4B,MADb,OAAO,wEACM,CAAO;GAGzC,IAAI,CAAC,KAAK,WAAW;GACrB,KAAK,UAAU,MAAK;GAGpB,KAAK,eAAe,KAAK,UAAU,gBAAgB,yBAAyB;GAC5E,KAAK,aAAa,SAAS,KAAK,KAAK;GACrC,KAAK,aAAa,SAAS,eAAe,KAAK;GAC/C,KAAK,aAAa,SAAS,QAAQ,gBAAe;IAC9C,KAAK,QAAQ,KAAI;IACjB,KAAK,IAAI,aAAY;GACzB,CAAC;GACD,KAAK,UAAU;EACnB,SAAS,OAAO;GACZ,QAAQ,MAAM,oCAAoC,KAAK;GACvD,KAAK,UAAU;EACnB;CACJ;CAEA,cAAW;EACP,KAAK,cAAc,QAAO;CAC9B;CA1DS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAA6B,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAA7B;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAA6B,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,IAAA;IAAA,cAAA;IAAA,SAAA;GAAA;GAAA,SAAA,EAAA,SAAA,UAAA;GAAA,aAAA,CAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,mBAAA;IAAA,aAAA;IAAA,MAGE;IAAgB,QAAA;GAAA,CAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UAP9C;GAAkD,UAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAInD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA6B,YAAA,CAAA;EANzC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;GACV,iBAAiB,wBAAwB;GACzC,SAAS,CAAC,sBAAsB;EACnC,CAAA;;;;GAII,MAAA;GAAU,MAAA,CAAA,qBAAqB;IAAE,MAAM;IAAkB,QAAQ;GAAI,CAAE;;EAGvE,IAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,SAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,SAAA,CAAA,EAAA,MAAA,OAAA,CAAA;;;ACrBL,MAAa,yBAAyB;CAAE,UAAU;CAAgB,iBAAiB;AAAM;AAgBzF,MAAM,mBAAmB;AAOzB,IAAa,gBAAb,MAAa,cAAa;CAatB,YACqB,WAIA,UACA,aAAmC,MAC3C,WAAA,IAA6B;EANrB,KAAA,YAAA;EAIA,KAAA,WAAA;EACA,KAAA,OAAA;EACR,KAAA,WAAA;EAnBb,KAAA,QAAa,CAAA;EACb,KAAA,WAAW;EACX,KAAA,gBAAgB;EAEhB,KAAA,WAAW;EAEH,KAAA,OAAO;EACP,KAAA,UAAU;EACV,KAAA,QAAQ;EAER,KAAA,aAAa;CAUlB;CAGH,OAAO,eACH,SACA,OACA,UACA,MACA,WAAA,IAA6B;EAE7B,MAAM,aAAa,MAAc,SAAgB;GAC7C,MAAM,IAAI,MAAK;GACf,OAAO,QAAQ,eACX,EAAE,gBACF,MACA,MACA,IACA,EAAE,gBACF,EAAE,QACF,sBAAsB;EAE9B;EACA,OAAO,IAAI,cAA0B,WAAW,UAAU,MAAM,QAAQ;CAC5E;CAEA,IAAI,UAAO;EACP,OAAO,KAAK,UAAU,KAAK;CAC/B;CAGA,IAAI,aAAU;EACV,OAAO,KAAK;CAChB;CAGA,QAAK;EACD,KAAK,cAAc;EACnB,KAAK,QAAQ,CAAA;EACb,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,QAAQ;EACb,KAAK,WAAW;EAChB,KAAK,gBAAgB;EACrB,KAAK,WAAW;EAChB,KAAK,UAAU,KAAK,YAAY,CAAC;CACrC;CAGA,WAAQ;EACJ,IAAI,CAAC,KAAK,YAAY,KAAK,iBAAiB,CAAC,KAAK,SAAS;EAC3D,KAAK,gBAAgB;EACrB,KAAK,SAAQ;EACb,KAAK,UAAU,KAAK,YAAY,CAAC;CACrC;CAGA,uBAAoB;EAChB,IAAI,OAAO,WAAW,eAAe,CAAC,KAAK,YAAY,CAAC,KAAK,SAAS;EAEtE,IADuB,OAAO,UAAU,OAAO,eACzB,SAAS,gBAAgB,eAAe,kBAC1D,KAAK,SAAQ;CAErB;CAEQ,UAAU,YAAoB,OAAa;EAC/C,KAAK,QAAQ;EACb,KAAK,UAAU,KAAK,MAAM,KAAK,QAAQ,CAAC,CAAC,UAAU;GAC/C,OAAM,aAAW;IACb,IAAI,eAAe,KAAK,YAAY;IACpC,KAAK,WAAW;IAChB,MAAM,QAAQ,UAAU,SAAS,CAAA;IACjC,KAAK,WAAW,MAAM;IAEtB,KAAK,QAAQ,MAAM,SAAU,SAAS,gBAAgB,KAAK,UAAW,KAAK;IAC3E,MAAM,OAAO,MAAM,OAAO,KAAK,IAAI;IACnC,KAAK,QAAQ,CAAC,GAAG,KAAK,OAAO,GAAG,IAAI;IACpC,MAAM,WAAW,QAAQ,KAAK;IAC9B,IAAI,WAAW,KAAK,YAAY,KAAK,SAAS;KAC1C,KAAK,UAAU,YAAY,QAAQ;KACnC;IACJ;IACA,KAAK,OAAM;GACf;GACA,aAAY;IACR,IAAI,eAAe,KAAK,YAAY;IACpC,KAAK,QAAQ;IACb,KAAK,WAAW;IAChB,KAAK,OAAM;GACf;EACH,CAAA;CACL;CAEQ,SAAM;EACV,KAAK,WAAW;EAChB,KAAK,gBAAgB;EACrB,KAAK,SAAQ;CACjB;AACH;AC3HD,MAAM,oBAA4C;CAC9C,SAAS;CACT,OAAO;AACV;AAuBD,IAAa,4BAAb,MAAa,kCAAkC,iBAAgB;CArB/D,cAAA;;EAsBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAEtC,KAAA,gBAAgB;EAEhB,KAAA,iBAAiB;EACjB,KAAA,aAAa;EACb,KAAA,YAAY;EAKrB,KAAA,wBAAwB;EAGxB,KAAA,WAAW;EAEX,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAE1D,KAAA,WAA6D,CAAA;EAC7D,KAAA,eAA8C,CAAA;EAC9C,KAAA,SAAuD,CAAA;EACvD,KAAA,gBAA4C,CAAA;CAqI/C;CA7HG,WAAQ;EACJ,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;GAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;GACrC,KAAK,iBAAiB,MAAM;GAC5B,KAAK,IAAI,aAAY;EACzB,CAAC;EAEL,KAAK,QAAO;CAChB;CAEA,YAAY,SAAsB;EAC9B,KAAK,QAAQ,WAAW,QAAQ,oBAAoB,KAAK,gBAAgB,KAAK,MAC1E,KAAK,4BAA2B;CAExC;CAEQ,UAAO;EACX,KAAK,WAAW;EAChB,KAAK,WACA,oBAAoB,EAAE,QAAQ,gBAAe,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACnF,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,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,iBAAiB,GAAG;IAC1D,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,MAAM,MAAM,KAAK,aAAa,EAAE;IAC5E,IAAI,KAAK,SAAS,KAAK,EAAE,IACrB,KAAK,aAAa,IAAI;SACnB;KACH,KAAK,WAAW;KAChB,KAAK,aAAa,QAAQ,CAAA;IAC9B;GACJ;GACA,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEQ,QAAQ,MAAM,MAAc,YAAkB;EAClD,OAAO,KAAK,MAAK,QAAO,IAAI,SAAS,QAAQ,IAAI,oBAAoB,UAAU;CACnF;CAEA,YAAY,MAAY;EACpB,OAAO,KAAK,aAAa,KAAK,EAAE,WAAW,KAAK,KAAK;CACzD;CAGA,aAAa,MAAY;EACrB,KAAK,WAAW;EAChB,KAAK,OAAO,QAAQ,cAAc,eAC9B,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,QAAQ,KAAK,SAAS,KAAK,EAAE;EAChC,UACK,KAAK,cAAc,IAAI,IAC7B,SAAQ,KAAK,aAAa,MAC1B,KAAK,YAAA,KAAiC,CAAC;EAE3C,KAAK,OAAO,KAAK,CAAC,MAAK;CAC3B;CAEQ,cAAc,MAAY;EAC9B,MAAM,QAAQ,KAAK,OAAO;EAE1B,KAAK,aAAa,QAAQ,KAAK,YAAY,MAAM,QAAQ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,QAAO;EACxF,KAAK,cAAc,QAAQ,MAAM;EACjC,KAAK,WAAW,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,OAAM,MAAK,EAAE,QAAQ;EAChE,KAAK,IAAI,aAAY;CACzB;CAEA,kBAAe;EACX,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK,SAAS,UAAU,CAAC;CAChD;CAEA,uBAAoB;EAChB,KAAK,sBAAsB;EAC3B,KAAK,cAAc,KAAK,SAAS,QAAQ,CAAC;CAC9C;CAEA,gBAAgB,MAAI;EAChB,cAAc,eACV,KAAK,SAAS,OACd,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,SAAS,KAAK,CAAC,QAAQ,KAAK;GACjC,IAAI,SAAS,WACT,KAAK,iBAAiB;QAEtB,KAAK,sBAAsB;GAE/B,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CA5JS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAzB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAyB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,eAAA;IAAA,YAAA;IAAA,gBAAA;IAAA,YAAA;IAAA,WAAA;IAAA,eAAA;IAAA,KAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UCzDtC;GAkMA,QAAA,CAAA,4sGAAA,2ZAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDrJQ;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEV;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EArBrC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAuB,iBAMhB,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,4sGAAA,2ZAAA;EAAA,CAAA;;;EAOhC,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,gBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EAGA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;;AErBL,IAAa,6BAAb,MAAa,mCAAmC,iBAAgB;CAlBhE,cAAA;;EAmBqB,KAAA,YAAY,OAAO,YAAY;EAC/B,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAEtC,KAAA,mBAAmB;EAGnB,KAAA,YAAY;EAIrB,KAAA,wBAAwB;EAIxB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAiB1D,KAAA,cAA6E,CAAA;EAE7E,KAAA,iBAAiB;CAgHpB;CA9HG,IAAI,QAAK;EACL,OAAO,KAAK,OAAO,SAAS,CAAA;CAChC;CAEA,IAAI,WAAQ;EACR,OAAO,KAAK,OAAO,YAAY;CACnC;CAEA,IAAI,gBAAa;EACb,OAAO,KAAK,OAAO,iBAAiB;CACxC;CAQA,WAAQ;EACJ,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;GAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;GACrC,KAAK,iBAAiB,MAAM;GAC5B,KAAK,IAAI,aAAY;EACzB,CAAC;EAEL,KAAK,UAAS;CAClB;CAEA,YAAY,SAAsB;EAC9B,IAAI,QAAQ,WAAW,QAAQ,iBAC3B;OAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,4BAA2B;EACpC;CAER;CAEA,UAAU,MAAI;EACV,IAAI,CAAC,KAAK,cAAc;EAExB,MAAM,OAAO,KAAK;EAClB,IAAI,cAAc,KAAK;EAGvB,eAAe,YAAY,SAAS,GAAG,IAAI,gBAAgB;EAE3D,KAAK,YAAY,KAAK,CAAC,MAAM,KAAK,UAAU,+BAA+B,WAAW;CAC1F;CAEA,YAAS;EACL,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK;EACxB,UACI;GACD,KAAK,gBAAe;GACpB,KAAK,IAAI,aAAY;EACzB,IACA,SAAQ,KAAK,aAAa,MAC1B,KAAK,YAAA,KAAiC,CAAC;EAE3C,KAAK,MAAM,MAAK;CACpB;CAGA,iBAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,qBAAoB;CACxD;CAGQ,kBAAe;EACnB,KAAK,MAAM,SAAQ,SAAO;GACtB,IAAI,KAAK,gBAAgB,CAAC,KAAK,YAAY,KAAK,OAC5C,KAAK,YAAY,KAAK,QAAQ;IAC1B,QAAQ;IAER,KAAK,KAAK,UAAU,+BAA+B,KAAK,YAAY;GACvE;EAET,CAAC;CACL;CAEA,qBAAkB;EACd,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK;CAC5B;CAEA,kBAAe;EACX,cAAc,eACV,KAAK,KACL,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,gBAAgB,KAAK;GAC1B,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAEA,cAAc,OAAe,MAAc;EACvC,OAAO,KAAK;CAChB;CAnJS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAA0B,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAA1B;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAA0B,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,kBAAA;IAAA,YAAA;IAAA,KAAA;IAAA,WAAA;IAAA,eAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,mBAAA,EAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UCnDvC;GAwEA,QAAA,CAAA,0sGAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDjCQ;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEV;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EAlBtC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAwB,iBAGjB,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,0sGAAA;EAAA,CAAA;;;EAQhC,kBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EAGA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;GA0EA,MAAA;GAAa,MAAA,CAAA,eAAe;;;;AEtFjC,IAAa,yBAAb,MAAa,+BAA+B,iBAAgB;CApB5D,cAAA;;EAqBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAEtC,KAAA,sBAAsB;EAEtB,KAAA,YAAY;EAKrB,KAAA,wBAAwB;EAkBxB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAC1D,KAAA,cAAc,KAAK,UAAU,QAAQ;EAIrC,KAAA,iBAAiB;CAmFpB;CApGG,IAAI,QAAK;EACL,OAAO,KAAK,OAAO,SAAS,CAAA;CAChC;CAEA,IAAI,WAAQ;EACR,OAAO,KAAK,OAAO,YAAY;CACnC;CAEA,IAAI,gBAAa;EACb,OAAO,KAAK,OAAO,iBAAiB;CACxC;CAUA,WAAQ;EACJ,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;GAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;GACrC,KAAK,iBAAiB,MAAM;GAC5B,KAAK,IAAI,aAAY;EACzB,CAAC;EAEL,KAAK,UAAS;CAClB;CAEA,YAAY,SAAsB;EAC9B,IAAI,QAAQ,WAAW,QAAQ,iBAC3B;OAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,4BAA2B;EACpC;CAER;CAEA,YAAS;EACL,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK;EACxB,UACK,KAAK,IAAI,aAAY,IAC3B,SAAQ,KAAK,aAAa,MAC1B,KAAK,YAAA,KAAiC,CAAC;EAE3C,KAAK,MAAM,MAAK;CACpB;CAGA,iBAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,qBAAoB;CACxD;CAEA,kBAAe;EACX,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK;CAC5B;CAEA,kBAAe;EACX,cAAc,eACV,KAAK,KACL,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,gBAAgB,KAAK;GAC1B,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAEA,cAAc,OAAe,MAAc;EACvC,OAAO,KAAK;CAChB;CArHS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAsB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAtB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAsB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,qBAAA;IAAA,YAAA;IAAA,WAAA;IAAA,KAAA;IAAA,eAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,mBAAA,EAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UCrDnC;GAyHA,QAAA,CAAA,6/DAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDlFQ;KAAgB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEX;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEhB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EApBlC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAsB,iBAGf,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,6/DAAA;EAAA,CAAA;;;EAOhC,qBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EAGA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;GA0DA,MAAA;GAAa,MAAA,CAAA,eAAe;;;;AExEjC,IAAa,wBAAb,MAAa,8BAA8B,iBAAgB;CAnB3D,cAAA;;EAoBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAGtC,KAAA,kBAAkB;EAClB,KAAA,YAAY;EAEZ,KAAA,YAAY;EAWrB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAM1D,KAAA,wBAAwB;CA8F3B;CA5FG,WAAQ;EACJ,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;GAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;GACrC,KAAK,iBAAiB,MAAM;GAC5B,KAAK,IAAI,aAAY;EACzB,CAAC;EAEL,KAAK,UAAS;CAClB;CAEA,YAAY,SAAsB;EAC9B,IAAI,QAAQ,WAAW,QAAQ,iBAC3B;OAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,4BAA2B;EACpC;CAER;CAEA,IAAI,QAAK;EACL,OAAO,KAAK,OAAO,SAAS,CAAA;CAChC;CAEA,IAAI,WAAQ;EACR,OAAO,KAAK,OAAO,YAAY;CACnC;CAEA,IAAI,gBAAa;EACb,OAAO,KAAK,OAAO,iBAAiB;CACxC;CAEA,IAAI,eAAY;EACZ,OAAO,KAAK,aAAa,CAAC,CAAC,KAAK,OAAO;CAC3C;CAEA,YAAS;EACL,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK;EACxB,UACK,KAAK,IAAI,aAAY,IAC3B,SAAQ,KAAK,aAAa,MAC1B,KAAK,YAAA,KAAiC,CAAC;EAE3C,KAAK,MAAM,MAAK;CACpB;CAGA,iBAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,qBAAoB;CACxD;CAEA,qBAAkB;EACd,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK;CAC5B;CAEA,kBAAe;EACX,cAAc,eACV,KAAK,KACL,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,gBAAgB,KAAK;GAC1B,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAvHS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAArB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAqB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,YAAA;IAAA,iBAAA;IAAA,WAAA;IAAA,eAAA;IAAA,WAAA;IAAA,QAAA;IAAA,KAAA;IAAA,cAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,mBAAA,EAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UCpDlC;GA2FU,QAAA,CAAA,0sGAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDpDF;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEV;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEhB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAnBjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAmB,iBAGZ,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,0sGAAA;EAAA,CAAA;;;EAOhC,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,iBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,QAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;GA+DA,MAAA;GAAa,MAAA,CAAA,eAAe;;;;AE3GjC,IAAsB,wBAAtB,MAAsB,8BAA8B,iBAAgB;CALpE,cAAA;;EAMuB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAChC,KAAA,cAAc,OAAO,WAAW;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAGjD,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAC1D,KAAA,QAAoB,CAAA;EACpB,KAAA,oBAAgC,CAAA;EAKhC,KAAA,WAAW;EAIX,KAAA,wBAAwB;CA6K3B;CA3KG,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,4BAA2B;KAChC,KAAK,oBAAmB;KACxB,KAAK,IAAI,aAAY;IACzB,CAAC;GACL,OACI,KAAK,oBAAmB;GAE5B,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEU,sBAAmB;EACzB,IAAI,KAAK,uBAAsB,GAC3B,KAAK,QAAO;OAEZ,KAAK,YAAW;EAGpB,IAAI,KAAK,uBAAsB,GAC3B,KAAK,mBAAkB;CAE/B;CAEU,UAAO;EACb,KAAK,WAAW;EAChB,SAAS;GACL,YAAY,KAAK,WAAW,oBACxB,EAAE,QAAQ,KAAK,cAAa,EAAE,GAC9B,KAAK,2BAA0B,CAAE;GAErC,MAAM,KAAK,WAAW,cAClB,mBACA,CAAA,GACA,KAAK,2BAA0B,CAAE;EAExC,CAAA,CAAC,CACG,WAAW,EAAE,YAAY,WAAU;GAChC,KAAK,cAAc,YAAY,iBAAiB;GAChD,KAAK,cAAc,KAAK,KAAK,MACzB,QAAO,IAAI,oBAAoB,KAAK,aAAa,EAAE;GAEvD,KAAK,SAAS,GAAG,GAAG;GACpB,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,WAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEU,cAAW;EACjB,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACvE,WAAU,aAAW;GAClB,KAAK,cAAc,SAAS,KAAK,MAAK,QAAO,IAAI,SAAS,KAAK,gBAAe,CAAE;GAChF,KAAK,SAAS,GAAG,GAAG;GACpB,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,WAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEU,qBAAkB;EACxB,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACvE,WAAU,aAAW;GAClB,KAAK,0BAA0B,SAAS,KAAK,MACzC,QAAO,IAAI,SAAS,cAAc;GAEtC,KAAK,qBAAqB,GAAG,GAAG;GAChC,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEU,SAAS,MAAc,UAAgB;EAC7C,KAAK,WAAW,MAAM,UAAU,KAAK,aAAa,iBAAiB,OAAO;CAC9E;CAEA,qBAAqB,MAAc,UAAgB;EAC/C,KAAK,WACD,MACA,UACA,KAAK,yBAAyB,iBAC9B,mBAAmB;CAE3B;CAGQ,WACJ,MACA,UACA,eACA,gBAA6C;EAE7C,KAAK,gBACA,eAAe,KAAK,2BAA0B,GAAI,MAAM,UAAU,IAAI,aAAa,CAAC,CACpF,WAAU,aAAW;GAClB,MAAM,gBAAgB,SAAS,MAC1B,QAAO,SAAQ,KAAK,MAAM,MAAK,QAAO,IAAI,oBAAoB,aAAa,CAAC,CAAC,CAC7E,MACI,GAAG,MACA,IAAI,KAAK,EAAE,YAAY,CAAC,CAAC,QAAO,IAAK,IAAI,KAAK,EAAE,YAAY,CAAC,CAAC,QAAO,CAAE,CAC9E,CACA,MAAM,GAAG,EAAE;GAEhB,IAAI,mBAAmB,SACnB,KAAK,QAAQ;QAEb,KAAK,oBAAoB;GAE7B,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAGU,6BAA0B;EAChC,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CAMU,gBAAa;EACnB,OAAO,KAAK,gBAAe;CAC/B;CAEU,yBAAsB;EAC5B,OAAO;CACX;CAEU,yBAAsB;EAC5B,OAAO;CACX;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;CA9LkB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAArB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAqB,cAAA;GAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UAJ7B;GAAE,UAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIM,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAL1C,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GAEV,iBAAiB,wBAAwB;EAC5C,CAAA;;;AC0BD,IAAa,yBAAb,MAAa,+BAA+B,sBAAqB;CAnBjE,cAAA;;EAoBa,KAAA,mBAAmB;EACnB,KAAA,YAAY;EAIX,KAAA,iBAAiB,IAAI,aAAY;EAI3C,KAAA,gBAAgB;EAGhB,KAAA,iBAAiB;CA8DpB;CA3DY,WAAQ;EACb,MAAM,SAAQ;EACd,KAAK,SAAQ;CACjB;CAEU,kBAAe;EACrB,OAAO;CACX;CAGmB,WAAQ;EACvB,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK;EACxB,UACK,KAAK,cAAa,IACxB,SAAQ,KAAK,aAAa,MAC1B,KAAK,YAAA,KAAiC,CAAC;EAE3C,KAAK,MAAM,MAAK;CACpB;CAGA,iBAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,qBAAoB;CACxD;CAEQ,gBAAa;EACjB,KAAK,QAAQ,KAAK,MAAM;EACxB,KAAK,WAAW,KAAK,MAAM;EAC3B,KAAK,gBAAgB,KAAK,MAAM;EAEhC,IAAI,KAAK,YAAY,KAAK,mBAAmB,KAAK,OAAO;GACrD,KAAK,iBAAiB,KAAK;GAC3B,KAAK,eAAe,KAAK,IAAI;EACjC;EACA,KAAK,IAAI,aAAY;CACzB;CAEA,kBAAe;EACX,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK;CAC5B;CAEA,kBAAe;EACX,cAAc,eACV,KAAK,KACL,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,gBAAgB,KAAK;GAC1B,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CA1ES;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAsB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAtB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAsB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,kBAAA;IAAA,WAAA;IAAA,YAAA;IAAA,eAAA;IAAA,KAAA;GAAA;GAAA,SAAA,EAAA,gBAAA,iBAAA;GAAA,MAAA,EAAA,WAAA,EAAA,iBAAA,mBAAA,EAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UC/CnC;GAuFA,QAAA,CAAA,0sGAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDrDQ;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEV;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEhB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EAnBlC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAoB,iBAGb,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,0sGAAA;EAAA,CAAA;;;EAGhC,kBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,gBAAA,CAAA,EAAA,MAAA,OAAA,CAAA;;GAkCA,MAAA;GAAa,MAAA,CAAA,eAAe;;;;AEzCjC,IAAa,2BAAb,MAAa,iCAAiC,iBAAgB;CAlB9D,cAAA;;EAmBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAEtC,KAAA,mBAAmB;EAK5B,KAAA,wBAAwB;EAKxB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAE1D,KAAA,QAAoB,CAAA;EAEpB,KAAA,WAAW;EACX,KAAA,gBAAgB;CAiFnB;CA3EG,WAAQ;EACJ,IAAI,KAAK,cAAc;GACnB,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;IAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;IACrC,KAAK,iBAAiB,MAAM;IAC5B,KAAK,IAAI,aAAY;GACzB,CAAC;GACD,KAAK,YAAW;EACpB,OACI,KAAK,YAAW;CAExB;CAEA,YAAY,SAAsB;EAC9B,IAAI,QAAQ,WAAW,QAAQ,iBAC3B;OAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,4BAA2B;EACpC;CAER;CAEQ,cAAW;EACf,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACvE,WAAU,aAAW;GAClB,KAAK,cAAc,SAAS,KAAK,MAAK,QAAO,IAAI,SAAS,QAAQ;GAClE,IAAI,KAAK,aAAa,iBAClB,KAAK,YAAW;QAEhB,KAAK,WAAW;GAEpB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAGA,cAAW;EACP,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK,aAAa;EACrC,UACK,KAAK,cAAa,IACxB,SAAQ,KAAK,aAAa,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,QAAO,IAAK,KAAK,IAAG,CAAE;EAEjF,KAAK,MAAM,MAAK;CACpB;CAEQ,gBAAa;EACjB,KAAK,QAAQ,KAAK,MAAM;EACxB,KAAK,WAAW,KAAK,MAAM;EAC3B,KAAK,gBAAgB,KAAK,MAAM;EAChC,KAAK,IAAI,aAAY;CACzB;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CApGS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAwB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAxB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAwB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,kBAAA;IAAA,YAAA;IAAA,eAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UC9CrC;GAoEA,QAAA,CAAA,4sGAAA,2ZAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MD9BQ;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAGR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAwB,YAAA,CAAA;EAlBpC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAsB,iBAMf,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,UAAA;GAAA,QAAA,CAAA,4sGAAA,2ZAAA;EAAA,CAAA;;;EAOA,kBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EAGA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;;AEHL,IAAa,6BAAb,MAAa,mCAAmC,iBAAgB;CAtBhE,cAAA;;EAuBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAEtC,KAAA,mBAAmB;EAGnB,KAAA,YAAY;EAKrB,KAAA,wBAAwB;EAExB,KAAA,MAAM,KAAK,IAAG;EAGd,KAAA,iBAAiB;EAGjB,KAAA,uBAAuB,KAAK,UAAU,oBAAoB;EAE1D,KAAA,QAAoB,CAAA;EAEpB,KAAA,WAAW;EACX,KAAA,gBAAgB;CAyInB;CApIG,WAAQ;EACJ,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;GAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;GACrC,KAAK,iBAAiB,MAAM;GAC5B,KAAK,IAAI,aAAY;EACzB,CAAC;EAEL,KAAK,YAAW;CACpB;CAEA,YAAY,SAAsB;EAC9B,IAAI,QAAQ,WAAW,QAAQ,iBAC3B;OAAI,KAAK,gBAAgB,KAAK,MAC1B,KAAK,4BAA2B;EACpC;CAER;CAEQ,cAAW;EACf,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,2BAA0B,CAAE,CAAC,CACvE,WAAU,aAAW;GAClB,KAAK,cAAc,SAAS,KAAK,MAAK,QAAO,IAAI,SAAS,QAAQ;GAClE,IAAI,KAAK,aAAa,iBAClB,KAAK,QAAO;QAEZ,KAAK,WAAW;GAEpB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAGA,UAAO;EACH,IAAI,KAAK,WACL,KAAK,aAAY;OAEjB,KAAK,YAAY,GAAG,GAAG;CAE/B;CAEA,eAAY;EACR,KAAK,QAAQ,cAAc,eACvB,KAAK,wBACE;GACH,gBAAgB,KAAK,2BAA0B;GAC/C,gBAAgB,KAAK,cAAc,KAAK,aAAa;EACxD,UACK,KAAK,cAAa,IACxB,SAAQ,KAAK,aAAa,QAAQ,KAAK,WAAW,IAAI,CAAC;EAE3D,KAAK,MAAM,MAAK;CACpB;CAEQ,gBAAa;EACjB,KAAK,QAAQ,KAAK,MAAM;EACxB,KAAK,WAAW,KAAK,MAAM;EAC3B,KAAK,gBAAgB,KAAK,MAAM;EAChC,KAAK,IAAI,aAAY;CACzB;CAEA,WAAW,MAAI;EACX,OAAO,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,QAAO,IAAK,KAAK;CACjD;CAEA,YAAY,MAAc,UAAgB;EACtC,KAAK,WAAW;EAChB,KAAK,gBACA,eACG,KAAK,2BAA0B,GAC/B,MACA,UACA,IACA,KAAK,cAAc,KAAK,aAAa,eAAe,CACvD,CACA,WAAU,aAAW;GAClB,MAAM,eAAe,SAAS,SAAS,CAAA,EAAA,CAClC,QAAO,SAAQ,KAAK,aAAa,IAAI,CAAC,CACtC,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,QAAO,IAAK,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,QAAO,CAAE;GAE3E,KAAK,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAO;GACjD,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,WAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEA,kBAAe;EACX,KAAK,iBAAiB;EACtB,KAAK,cAAc,KAAK;CAC5B;CAEA,kBAAe;EACX,cAAc,eACV,KAAK,KACL,KAAK,aACL,KAAK,YACL,KAAK,2BAA0B,GAC/B,KAAK,KAAK,CACb,CAAC,gBAAe;GACb,KAAK,gBAAgB,KAAK;GAC1B,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CACQ,8BAA2B;EAC/B,KAAK,wBAAwB,cAAc,iBACvC,KAAK,MACL,KAAK,cACL,KAAK,iBAAiB;CAE9B;CAEA,mBAAgB;EACZ,OAAO,KAAK;CAChB;CAEA,cAAc,OAAe,MAAc;EACvC,OAAO,KAAK;CAChB;CAlKS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAA0B,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAA1B;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAA0B,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,kBAAA;IAAA,YAAA;IAAA,KAAA;IAAA,WAAA;IAAA,eAAA;IAAA,MAAA;IAAA,cAAA;GAAA;GAAA,iBAAA;GAAA,eAAA;GAAA,UAAA;GAAA,UCtDvC;GA8HA,QAAA,CAAA,4sGAAA,2ZAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDrFQ;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;IAAW;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;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEV;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAA6B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC7B;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAwB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACxB;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EAtBtC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAwB,iBAMjB,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,4sGAAA,2ZAAA;EAAA,CAAA;;;EAOhC,kBAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,YAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,KAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,WAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,eAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,MAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;;;AEOL,IAAa,sBAAb,MAAa,oBAAmB;CAAnB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,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,SAAA;IArCxB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;GAA6B;GAAA,SAAA;IAG7B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;;CAIK;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,SAAA;IArCxB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IAUA;IAEA;;;;;AAIK,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAvC/B,MAAA;EAAS,MAAA,CAAA;GACN,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;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-CQHAhbsv.mjs","names":[],"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, Component, inject } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { BaseResourceComponent } from '../base/base-resource.component';\nimport { ResourceTopBannerEditComponent } from '../resource-top-banner-edit/resource-top-banner-edit.component';\nimport { TestimonialCardListComponent } from '../testimonial-card/testimonial-card.component';\n\nimport { CaseStudyCardComponent } from './case-studies-cards/case-studies-cards.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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceTopBannerEditComponent,\n LazyImgDirective,\n TestimonialCardListComponent,\n CaseStudyCardComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceCaseStudiesComponent extends BaseResourceComponent {\n private readonly titleService = inject(Title);\n\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\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<main>\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</main>\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 imports: [\n ResourceSharedModule,\n RouterModule.forChild(routes),\n ResourceCaseStudiesComponent,\n TestimonialCardListComponent // Only used in case studies\n ]\n})\nexport class ResourceCaseStudiesModule {}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-edit-card.component-2VvTki2u.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card-images.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-payload.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card.component.html"],"sourcesContent":["import { Component, inject } from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\n/** The two cover pictures of the resource edit card: square and rectangular. */\n@Component({\n template: ''\n})\nexport abstract class ResourceEditCardImages extends AppBaseComponent {\n protected readonly modalService = inject(NgbModal);\n\n image = '';\n rectangularImage = '';\n file: File | null = null;\n rectangularFile: File | null = null;\n imageModalRef;\n\n openImageModal(modalTemplate): void {\n this.imageModalRef = this.modalService.open(modalTemplate, { centered: true, size: 'md' });\n }\n\n openRectModal(content) {\n this.imageModalRef = this.modalService.open(content, {\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n onImageSelected(base64: string): void {\n this.image = base64;\n this.file = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n onRectangularImageSelection(base64: string) {\n this.rectangularImage = base64;\n this.rectangularFile = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n removeImage(): void {\n this.image = null;\n this.file = null;\n }\n\n deleteRectangularImage() {\n this.rectangularImage = null;\n this.rectangularFile = null;\n }\n\n handleImageError(event: Event, fallbackPath): void {\n HelperService.handleImageFallbackPath(event, fallbackPath);\n }\n}\n","import { FormBuilder, FormGroup } from '@angular/forms';\n\nimport moment from 'moment';\n\n/** The cover images as the edit card holds them: a new file, or the current URL, or nothing. */\nexport interface ResourceEditImages {\n file: File | null;\n image: string | null;\n rectangularFile: File | null;\n rectangularImage: string | null;\n}\n\nexport function resourceEditForm(fb: FormBuilder): FormGroup {\n return fb.group({\n title: [''],\n external_url: [''],\n cta_text: [''],\n when: [''],\n showcase: [false],\n published_at: [false],\n accepted_at: [false],\n body: ['']\n });\n}\n\n/** The form's values for a post, with blanks where the post has no value yet. */\nexport function resourceFormValue(resource) {\n return {\n title: resource.title ?? '',\n external_url: resource.external_url ?? '',\n cta_text: resource.cta_text ?? '',\n when: resource.when ? new Date(resource.when) : '',\n showcase: !!resource.showcase,\n published_at: !!resource.published_at,\n accepted_at: !!resource.accepted_at,\n body: resource.body\n };\n}\n\n/** The update payload: the form's values plus the cover-image changes and the toggled dates. */\nexport function buildResourcePayload(\n form: FormGroup,\n subscriptionId: number,\n images: ResourceEditImages\n) {\n const data = { ...form.value, subscription_id: subscriptionId };\n setFile(data, 'picture', images.file);\n setFile(data, 'rectangular_picture', images.rectangularFile);\n setToggledDate(form, data, 'published_at');\n setToggledDate(form, data, 'accepted_at');\n if (!form.get('when')?.value) {\n data.when = '';\n }\n if (!form.get('showcase')?.value) {\n data.showcase = '';\n }\n if (!images.file && !images.image) {\n data.remove_picture = true;\n }\n if (!images.rectangularFile && !images.rectangularImage) {\n data.remove_rectangular_picture = true;\n }\n return data;\n}\n\nfunction setFile(data, key: string, file: File | null): void {\n if (file) {\n data[key] = file;\n } else {\n delete data[key];\n }\n}\n\n/** A date sent only when its switch was touched: today when on, blank when off. */\nfunction setToggledDate(form: FormGroup, data, key: string): void {\n const control = form.get(key);\n if (control?.dirty) {\n data[key] = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data[key];\n }\n}\n\n/** Tags whose name contains the query; all tags when the query is empty. */\nexport function filterTags<T extends { name: string }>(tags: T[], query: string): T[] {\n if (!query) {\n return [...tags];\n }\n const needle = query.toLowerCase();\n return tags.filter(tag => tag.name.toLowerCase().includes(needle));\n}\n\n/** The request that links the selected tags to the post. */\nexport function postTagsPayload(tags: { id: number }[], postId: number | string) {\n return {\n entity_tags: tags.map(tag => ({ tag_id: tag.id })),\n slug: postId,\n tag_entity: 'Post'\n };\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { ButtonBusyDirective, LazyImgDirective } from '@posiwise/directives';\nimport { InputContainerComponent } from '@posiwise/shared-components';\nimport { ProfileImageCropperComponent } from '@posiwise/utils';\nimport { editorImageUpload, QuillHelper } from '@posiwise/utils/quill';\n\nimport { QuillEditorComponent } from 'ngx-quill';\nimport { UiSwitchModule } from 'ngx-ui-switch';\nimport { AutoComplete } from 'primeng/autocomplete';\nimport { Bind } from 'primeng/bind';\nimport { DatePicker } from 'primeng/datepicker';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../resource.service';\n\nimport { ResourceEditCardImages } from './resource-edit-card-images';\nimport {\n buildResourcePayload,\n filterTags,\n postTagsPayload,\n resourceEditForm,\n resourceFormValue\n} from './resource-edit-payload';\n\n@Component({\n selector: 'pw-resource-edit-card',\n templateUrl: './resource-edit-card.component.html',\n styleUrl: './resource-edit-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n InputContainerComponent,\n QuillEditorComponent,\n NgClass,\n Bind,\n DatePicker,\n AutoComplete,\n UiSwitchModule,\n LazyImgDirective,\n ButtonBusyDirective,\n ProfileImageCropperComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceEditCardComponent extends ResourceEditCardImages implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() id!: number;\n @Input() resourceData;\n @Output() updated = new EventEmitter<void>();\n\n editForm: FormGroup;\n selectedTags = [];\n allTags = [];\n tagsSuggestion = [];\n subscriptionId: number;\n userLoggedIn: boolean;\n buttonBusy = false;\n // Uploads go to the subscription the post is saved under (#4272).\n editorConfig = QuillHelper.getEditorConfig(\n [],\n editorImageUpload(() => this.subscriptionId)\n );\n\n constructor() {\n super();\n QuillHelper.init();\n this.editForm = resourceEditForm(this.fb);\n }\n\n ngOnInit(): void {\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 }\n this.cdr.markForCheck();\n });\n }\n\n navigateToResourceEdit() {\n const basePath = `/admin/resources/${this.resourceData?.slug}`;\n const fullUrl = `${location.origin}${basePath}`;\n window.open(fullUrl, '_blank');\n }\n\n openModal(modalTemplate): void {\n if (this.resourceData) {\n this.editForm.setValue(resourceFormValue(this.resourceData));\n this.image = this.resourceData.picture?.url ?? '';\n this.selectedTags = this.resourceData?.tags?.length ? [...this.resourceData.tags] : [];\n this.rectangularImage = this.resourceData.rectangular_picture?.url ?? '';\n }\n this.modalService.open(modalTemplate, { centered: true, size: 'lg' });\n this.getPostTags();\n }\n\n search(event) {\n this.tagsSuggestion = filterTags(this.allTags, event.query);\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId)\n .subscribe(response => {\n this.allTags = response.tags;\n this.cdr.markForCheck();\n });\n }\n\n saveResource(): void {\n this.buttonBusy = true;\n this.saveTags(this.id);\n const payload = buildResourcePayload(this.editForm, this.subscriptionId, this);\n\n this.resourceService.updatePost(payload, this.id).subscribe({\n next: () =>\n this.settleSave(() => {\n this.toast.success('Blog Post Updated');\n this.updated.emit();\n this.modalService.dismissAll();\n }),\n error: () => this.settleSave()\n });\n }\n\n // NG0100: Toastr + dismissAll can run CD in the same macrotask as clearing [buttonBusy].\n // Clear busy in one task; toast/emit/modal in the next so dev-mode \"verify\" sees a stable binding.\n private settleSave(afterSuccess?: () => void): void {\n setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n if (afterSuccess) {\n setTimeout(() => {\n afterSuccess();\n this.cdr.markForCheck();\n }, 0);\n }\n }, 0);\n }\n\n private saveTags(id: number | string): void {\n if (this.selectedTags.length) {\n const data = postTagsPayload(this.selectedTags, id);\n this.tagService.addTags(data, this.subscriptionId).subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n }\n}\n","<div class=\"edit-card\">\n <i class=\"fa fa-edit cursor-pointer text-dark in-page-edit-icon d-flex justify-content-center mb-2\"\n (click)=\"openModal(editResourceModal)\"\n (keydown.enter)=\"openModal(editResourceModal)\"\n (keydown.space)=\"openModal(editResourceModal)\"\n title=\"Edit Resource\"></i>\n</div>\n\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resource</h5>\n <i class=\"fa fa-edit cursor-pointer text-dark in-page-edit-icon d-flex justify-content-center ms-3\"\n (click)=\"navigateToResourceEdit()\"\n (keydown.enter)=\"navigateToResourceEdit()\"\n (keydown.space)=\"navigateToResourceEdit()\"\n title=\"Go to the main edit page\"></i>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <form [formGroup]=\"editForm\">\n <div class=\"row\">\n\n\n <div class=\"col-12\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" id=\"input_title_1\" name=\"input_title_1\"\n aria-label=\"Title\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 row\">\n <pw-input-container label=\"CTA Text\" name=\"cta_text\" class=\"col-md-6\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.CtaText' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cta_text\" id=\"input_cta_text_2\" name=\"input_cta_text_2\"\n aria-label=\"Cta Text\"/>\n </pw-input-container>\n\n <pw-input-container label=\"External URL\" name=\"external_url\" class=\"col-md-6\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.ExternalUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"external_url\" id=\"input_external_url_3\" name=\"input_external_url_3\"\n [attr.aria-label]=\"'Resource.Posts.Body' | transloco\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container\n [label]=\"'Resource.Posts.Body' | transloco\"\n name=\"body\"\n errorMsg=\"Resource.Posts.Validation.Body\">\n <quill-editor\n [styles]=\"{ height: '300px' }\"\n class=\"quillEditor\"\n [modules]=\"editorConfig\"\n formControlName=\"body\"\n [ngClass]=\"{\n 'w-100': true,\n 'quill-container': true,\n 'is-invalid': submitted && f['body'].errors\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-3 col-sm-6\">\n <pw-input-container\n [label]=\"'Resource.Posts.When' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.When' | transloco\"\n name=\"when\">\n <p-datepicker inputId=\"resource-edit-card-when\" formControlName=\"when\"\n [ariaLabel]=\"'Resource.Posts.When' | transloco\"\n [showIcon]=\"true\"\n dateFormat=\"dd-M-yy\"\n [placeholder]=\"'Select Date'\"\n [ngClass]=\"{ 'is-invalid': submitted && f['when'].errors }\">\n </p-datepicker>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-8\">\n <pw-input-container\n [label]=\"'Resource.Posts.Tags' | transloco\"\n class=\"ui-fluid skills-modal tags\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.CtaText' | transloco\"\n name=\"cta_text\">\n <p-auto-complete appendTo=\"body\" [(ngModel)]=\"selectedTags\"\n [ariaLabel]=\"'Resource.Posts.Tags' | transloco\"\n class=\"body-bg w-100\"\n [suggestions]=\"tagsSuggestion\"\n dataKey=\"id\"\n optionLabel=\"name\"\n (completeMethod)=\"search($event)\"\n [minLength]=\"1\"\n [maxlength]=\"10\"\n [dropdown]=\"true\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"Tags\"\n [multiple]=\"true\">\n </p-auto-complete>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 row\">\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'SHOWCASE'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Mark as showcase post'\"\n name=\"showcase\">\n <ui-switch formControlName=\"showcase\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'PUBLISHED'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Set to publish the post'\"\n name=\"published_at\">\n <ui-switch formControlName=\"published_at\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'ACCEPTED BY ADMIN'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Indicates approval by admin'\"\n name=\"accepted_at\">\n <ui-switch formControlName=\"accepted_at\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"col-12 col-md-4 col-sm-4 my-4 ms-3\">\n <div class=\"text-center mb-4\">\n <span id=\"resource-edit-cover-picture-label\" class=\"pw-label-style\">{{ 'Resource.Posts.CoverPicture' | transloco }}</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img [src]=\"(image && !image.includes('default-photo.jpg')) ? image : 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100\"\n alt=\"Modal\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <button type=\"button\" class=\"btn btn-link p-0 d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image && !image.includes('default-photo.jpg')) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (click)=\"removeImage()\"\n (keydown.enter)=\"removeImage()\"></i>\n }\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"col-12 col-md-4 col-sm-4 my-4 ms-3\">\n <div class=\"text-center mb-4\">\n <span id=\"resource-edit-rectangular-picture-label\" class=\"pw-label-style\">Rectangular Picture</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img [src]=\"(rectangularImage && !rectangularImage.includes('default-photo.jpg')) ? rectangularImage : 'assets/img/resource/blog.png'\"\n (click)=\"openRectModal(rectContent)\"\n (keydown.enter)=\"openRectModal(rectContent)\"\n class=\"image w-100\"\n alt=\"Uploaded rectangular media preview\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <button type=\"button\" class=\"btn btn-link p-0 d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </button>\n @if (rectangularImage && !rectangularImage.includes('default-photo.jpg')) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (click)=\"deleteRectangularImage()\"\n (keydown.enter)=\"deleteRectangularImage()\"></i>\n }\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </form>\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\" [buttonBusy]=\"buttonBusy\" (click)=\"saveResource()\">Save</button>\n </div>\n</ng-template>\n\n<ng-template #imageCropContent let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Picture</h5>\n <button type=\"button\" class=\"btn-close\" [attr.aria-label]=\"'Common.Close' | transloco\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload a JPG, GIF, or PNG file. (Do not upload pictures containing celebrities,\n nudity, artwork or copyrighted images.)</small>\n <pw-image-cropper\n [aspectRatio]=\"'dynamic'\"\n (imageSelectionEvent)=\"onImageSelected($event)\"\n (closeEvent)=\"modal.close()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n\n<ng-template #rectContent let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Picture</h5>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload a JPG, GIF, or PNG file. (Do not upload pictures containing celebrities,\n nudity, artwork or copyrighted images.)</small>\n <pw-image-cropper\n #profile\n [aspectRatio]=\"'dynamic'\"\n (imageSelectionEvent)=\"onRectangularImageSelection($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-events.module-D8mxidoP.mjs","names":[],"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 inject,\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 { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { ResourceService } from '../../../resource.service';\nimport { ResourceTopBannerEditComponent } from '../resource-top-banner-edit/resource-top-banner-edit.component';\n\nimport { UpcomingEventCardComponent } from './upcoming-event-cards/upcoming-event-cards.component';\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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceTopBannerEditComponent,\n LazyImgDirective,\n UpcomingEventCardComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceWebinarComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly titleService = inject(Title);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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<main>\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</main>\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 imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceWebinarComponent]\n})\nexport class ResourceEventsModule {}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-hub.module-DklN3KeA.mjs","names":["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 { DatePipe, NgClass, UpperCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, Tag, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { RemoveHtmlPipe, TextTruncatePipe } from '@posiwise/pipes';\nimport { NoDataComponent } from '@posiwise/shared-components';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { Bind } from 'primeng/bind';\nimport { IconField } from 'primeng/iconfield';\nimport { InputIcon } from 'primeng/inputicon';\nimport { InputText } from 'primeng/inputtext';\nimport { ProgressSpinner } from 'primeng/progressspinner';\nimport { forkJoin, Subscription } from 'rxjs';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../resource.service';\nimport { RESOURCE_PAGE_SIZE } from '../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../resource-edit-card-lazy/resource-edit-card-lazy.component';\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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n Bind,\n IconField,\n InputIcon,\n FormsModule,\n InputText,\n ProgressSpinner,\n ResourceEditCardLazyComponent,\n RouterLink,\n LazyImgDirective,\n NgClass,\n NoDataComponent,\n UpperCasePipe,\n DatePipe,\n RemoveHtmlPipe,\n TextTruncatePipe,\n TranslocoPipe\n ]\n})\nexport class ResourceHubComponent extends AppBaseComponent implements OnInit, OnDestroy {\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\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 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<main>\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</main>\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 imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceHubComponent]\n})\nexport class ResourceHubModule {}\n"],"mappings":"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"}