@posiwise/resource-module 0.0.204 → 0.0.206

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 (30) hide show
  1. package/fesm2022/{posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs → posiwise-resource-module-resource-blogs.module-DEXimOOY.mjs} +2 -2
  2. package/fesm2022/{posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs.map → posiwise-resource-module-resource-blogs.module-DEXimOOY.mjs.map} +1 -1
  3. package/fesm2022/{posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs → posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs} +2 -2
  4. package/fesm2022/{posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs.map → posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs.map} +1 -1
  5. package/fesm2022/{posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs → posiwise-resource-module-resource-case-studies.module-CQHAhbsv.mjs} +2 -2
  6. package/fesm2022/{posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs.map → posiwise-resource-module-resource-case-studies.module-CQHAhbsv.mjs.map} +1 -1
  7. package/fesm2022/posiwise-resource-module-resource-edit-card.component-2VvTki2u.mjs +632 -0
  8. package/fesm2022/posiwise-resource-module-resource-edit-card.component-2VvTki2u.mjs.map +1 -0
  9. package/fesm2022/{posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs → posiwise-resource-module-resource-events.module-D8mxidoP.mjs} +2 -2
  10. package/fesm2022/{posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs.map → posiwise-resource-module-resource-events.module-D8mxidoP.mjs.map} +1 -1
  11. package/fesm2022/{posiwise-resource-module-resource-hub.module-alVvQLvR.mjs → posiwise-resource-module-resource-hub.module-DklN3KeA.mjs} +2 -2
  12. package/fesm2022/{posiwise-resource-module-resource-hub.module-alVvQLvR.mjs.map → posiwise-resource-module-resource-hub.module-DklN3KeA.mjs.map} +1 -1
  13. package/fesm2022/{posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs → posiwise-resource-module-resource-integrations.module-iTlhrAYt.mjs} +7 -4
  14. package/fesm2022/{posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs.map → posiwise-resource-module-resource-integrations.module-iTlhrAYt.mjs.map} +1 -1
  15. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs → posiwise-resource-module-resource-jobs.module-DpTqKqS9.mjs} +2 -2
  16. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs.map → posiwise-resource-module-resource-jobs.module-DpTqKqS9.mjs.map} +1 -1
  17. package/fesm2022/{posiwise-resource-module-resource-post.module-CGxj27dN.mjs → posiwise-resource-module-resource-post.module-PU-KBg_G.mjs} +2 -2
  18. package/fesm2022/{posiwise-resource-module-resource-post.module-CGxj27dN.mjs.map → posiwise-resource-module-resource-post.module-PU-KBg_G.mjs.map} +1 -1
  19. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs → posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs} +7 -4
  20. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs.map → posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs.map} +1 -1
  21. package/fesm2022/{posiwise-resource-module-resource-root.module-x4TYntdq.mjs → posiwise-resource-module-resource-root.module-TMvR1c1H.mjs} +11 -8
  22. package/fesm2022/{posiwise-resource-module-resource-root.module-x4TYntdq.mjs.map → posiwise-resource-module-resource-root.module-TMvR1c1H.mjs.map} +1 -1
  23. package/fesm2022/{posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs → posiwise-resource-module-resource-videos.module-BCDet6S9.mjs} +2 -2
  24. package/fesm2022/{posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs.map → posiwise-resource-module-resource-videos.module-BCDet6S9.mjs.map} +1 -1
  25. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs → posiwise-resource-module-resource-white-papers.module-DtxUgC_Z.mjs} +2 -2
  26. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs.map → posiwise-resource-module-resource-white-papers.module-DtxUgC_Z.mjs.map} +1 -1
  27. package/fesm2022/posiwise-resource-module.mjs +23 -698
  28. package/fesm2022/posiwise-resource-module.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/types/posiwise-resource-module.d.ts +8 -82
@@ -1 +1 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.html","../../../../libs/resource-module/src/lib/public/modules/jobs/resource-jobs.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AppLoaderComponent } from '@posiwise/app-loader';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\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\nexport type JobPost = PublicPost & { blurb?: string; cta_text?: string; published_at?: string };\n\n/** Open positions for one tag category, paged on scroll. */\n@Component({\n selector: 'pw-resource-job-cards',\n templateUrl: './job-cards.component.html',\n styleUrls: ['./job-cards.component.scss', './job-cards-states.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DateFormatPipe, TranslocoPipe, AppLoaderComponent, ResourceEditCardLazyComponent]\n})\nexport class ResourceJobCardsComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) categoryId!: number;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n pager: ResourcePager<JobPost>;\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n canEdit = false;\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n this.subscriptionId = res ? JSON.parse(res)?.subscriptionId : undefined;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['user'] || changes['userLoggedIn']) && this.userLoggedIn && this.user) {\n this.canEdit = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n }\n\n get posts(): JobPost[] {\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 /** The open positions could not be loaded; never shown as \"no open positions\". */\n get hasError(): boolean {\n return !!this.pager?.hasError && this.posts.length === 0;\n }\n\n get total(): number {\n return this.pager?.totalCount ?? 0;\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n ),\n tagCategoryIds: String(this.categoryId)\n }),\n () => this.cdr.markForCheck(),\n () => true\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n this.pager?.loadMoreIfNearBottom();\n }\n\n /** An off-site apply link when the post has one, otherwise the post's own page. */\n jobLink(post: JobPost): string {\n return post.external_url || `/resources/view/${post.slug}`;\n }\n}\n","<section class=\"jobs-section\">\n <div class=\"container\">\n @if (!isLoaded) {\n <div class=\"jobs-loading\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n } @else if (hasError) {\n <div class=\"jobs-state jobs-error\" role=\"alert\">\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.LoadError' | transloco }}</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"loadPosts()\">\n {{ 'Resource.Jobs.Retry' | transloco }}\n </button>\n </div>\n } @else if (posts.length === 0) {\n <div class=\"jobs-state jobs-empty\">\n <span class=\"jobs-state__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.Empty' | transloco }}</p>\n </div>\n } @else {\n <p class=\"jobs-count\">\n {{ (total === 1 ? 'Resource.Jobs.CountOne' : 'Resource.Jobs.CountMany') | transloco: { count: total } }}\n </p>\n <ul class=\"jobs-grid\">\n @for (post of posts; track post.id) {\n <li class=\"job-card\">\n <pw-resource-edit-card-lazy\n class=\"job-card__edit\"\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\" />\n <span class=\"job-card__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <h2 class=\"job-card__title\">\n <a\n class=\"job-card__link\"\n [href]=\"jobLink(post)\"\n [attr.target]=\"post.external_url ? '_blank' : null\"\n [attr.rel]=\"post.external_url ? 'noopener noreferrer' : null\">\n {{ post.title }}\n @if (post.external_url) {\n <span class=\"visually-hidden\">{{ 'Resource.Jobs.OpensInNewTab' | transloco }}</span>\n }\n </a>\n </h2>\n @if (post.blurb) {\n <p class=\"job-card__blurb\">{{ post.blurb }}</p>\n }\n <div class=\"job-card__footer\">\n @if (post.published_at) {\n <span class=\"job-card__date\">\n {{ 'Resource.Jobs.Posted' | transloco: { date: (post.published_at | dateFormat) } }}\n </span>\n }\n <span class=\"job-card__cta\" aria-hidden=\"true\">\n {{ post.cta_text || ('Resource.Jobs.ViewRole' | transloco) }}\n <i class=\"fa fa-arrow-right\"></i>\n </span>\n </div>\n </li>\n }\n </ul>\n @if (isLoadingMore) {\n <div class=\"jobs-loading jobs-loading--more\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n }\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\nconst FALLBACK_IMAGE = '/assets/img/resource/careers-team.svg';\nconst FALLBACK_IMAGE_STILL = '/assets/img/resource/careers-team-static.svg';\n\n@Component({\n selector: 'pw-resource-jobs-top-banner',\n templateUrl: './resource-jobs-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss',\n './resource-jobs-top-banner.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, TranslocoPipe]\n})\nexport class ResourceJobsTopBannerComponent extends BaseTopBannerComponent {\n /** The master's uploaded banner, or the default when none was uploaded. */\n get bannerImage(): string {\n return this.hasUploadedImage ? this.blogPostTag.image.url : FALLBACK_IMAGE;\n }\n\n /** The default art animates; this still copy is served when the visitor asks for reduced motion. */\n readonly stillBannerImage = FALLBACK_IMAGE_STILL;\n\n get hasUploadedImage(): boolean {\n const url = this.blogPostTag?.image?.url;\n return !!url && !url.includes('no_image_uploaded_squared');\n }\n\n get hasDescription(): boolean {\n const description = this.blogPostTag?.description;\n return !!description && description !== 'null';\n }\n\n protected getSearchTerm(): string {\n return 'Jobs';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n @if (blogPostTag?.title) {\n <span>{{ blogPostTag.title }}</span>\n } @else {\n <span>{{ 'Resource.Jobs.DefaultTitle' | transloco }}</span>\n }\n @if (canEditResourcesValue && blogPostTag) {\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 @if (hasDescription) {\n <p class=\"intro jobs-banner-intro\">{{ blogPostTag.description }}</p>\n } @else {\n <p class=\"intro\">{{ 'Resource.Jobs.DefaultIntro' | transloco }}</p>\n }\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <picture class=\"jobs-banner-picture\">\n @if (!hasUploadedImage) {\n <source media=\"(prefers-reduced-motion: reduce)\" [srcset]=\"stillBannerImage\" />\n }\n <img class=\"resource-laptop-img dyn-img jobs-banner-art\"\n [src]=\"bannerImage\"\n [alt]=\"'Resource.Jobs.BannerAlt' | transloco\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </picture>\n </div>\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\nimport { ResourceJobCardsComponent } from './job-cards/job-cards.component';\nimport { ResourceJobsTopBannerComponent } from './resource-jobs-top-banner/resource-jobs-top-banner.component';\n\n/** `/resources/careers`: every published post tagged Jobs, as job cards. */\n@Component({\n selector: 'pw-resource-jobs',\n templateUrl: './resource-jobs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceJobsTopBannerComponent,\n ResourceJobCardsComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceJobsComponent extends BaseResourceComponent {\n protected getResourceType(): string {\n return 'Jobs';\n }\n\n // The job cards page through the posts themselves; the base class would fetch them a second time.\n protected override getPosts(): void {\n return;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<pw-resource-jobs-top-banner />\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-job-cards [categoryId]=\"blogPostTag.tag_category_id\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\" />\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 { ResourceJobsComponent } from '../../components/resource-jobs/resource-jobs.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceJobsComponent,\n data: {\n title: 'Resources - Careers',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceJobsComponent]\n})\nexport class ResourceJobsModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"posiwise-resource-module-resource-jobs.module-DpTqKqS9.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.html","../../../../libs/resource-module/src/lib/public/modules/jobs/resource-jobs.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AppLoaderComponent } from '@posiwise/app-loader';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\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\nexport type JobPost = PublicPost & { blurb?: string; cta_text?: string; published_at?: string };\n\n/** Open positions for one tag category, paged on scroll. */\n@Component({\n selector: 'pw-resource-job-cards',\n templateUrl: './job-cards.component.html',\n styleUrls: ['./job-cards.component.scss', './job-cards-states.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DateFormatPipe, TranslocoPipe, AppLoaderComponent, ResourceEditCardLazyComponent]\n})\nexport class ResourceJobCardsComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) categoryId!: number;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n pager: ResourcePager<JobPost>;\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n canEdit = false;\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n this.subscriptionId = res ? JSON.parse(res)?.subscriptionId : undefined;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['user'] || changes['userLoggedIn']) && this.userLoggedIn && this.user) {\n this.canEdit = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n }\n\n get posts(): JobPost[] {\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 /** The open positions could not be loaded; never shown as \"no open positions\". */\n get hasError(): boolean {\n return !!this.pager?.hasError && this.posts.length === 0;\n }\n\n get total(): number {\n return this.pager?.totalCount ?? 0;\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n ),\n tagCategoryIds: String(this.categoryId)\n }),\n () => this.cdr.markForCheck(),\n () => true\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n this.pager?.loadMoreIfNearBottom();\n }\n\n /** An off-site apply link when the post has one, otherwise the post's own page. */\n jobLink(post: JobPost): string {\n return post.external_url || `/resources/view/${post.slug}`;\n }\n}\n","<section class=\"jobs-section\">\n <div class=\"container\">\n @if (!isLoaded) {\n <div class=\"jobs-loading\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n } @else if (hasError) {\n <div class=\"jobs-state jobs-error\" role=\"alert\">\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.LoadError' | transloco }}</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"loadPosts()\">\n {{ 'Resource.Jobs.Retry' | transloco }}\n </button>\n </div>\n } @else if (posts.length === 0) {\n <div class=\"jobs-state jobs-empty\">\n <span class=\"jobs-state__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.Empty' | transloco }}</p>\n </div>\n } @else {\n <p class=\"jobs-count\">\n {{ (total === 1 ? 'Resource.Jobs.CountOne' : 'Resource.Jobs.CountMany') | transloco: { count: total } }}\n </p>\n <ul class=\"jobs-grid\">\n @for (post of posts; track post.id) {\n <li class=\"job-card\">\n <pw-resource-edit-card-lazy\n class=\"job-card__edit\"\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\" />\n <span class=\"job-card__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <h2 class=\"job-card__title\">\n <a\n class=\"job-card__link\"\n [href]=\"jobLink(post)\"\n [attr.target]=\"post.external_url ? '_blank' : null\"\n [attr.rel]=\"post.external_url ? 'noopener noreferrer' : null\">\n {{ post.title }}\n @if (post.external_url) {\n <span class=\"visually-hidden\">{{ 'Resource.Jobs.OpensInNewTab' | transloco }}</span>\n }\n </a>\n </h2>\n @if (post.blurb) {\n <p class=\"job-card__blurb\">{{ post.blurb }}</p>\n }\n <div class=\"job-card__footer\">\n @if (post.published_at) {\n <span class=\"job-card__date\">\n {{ 'Resource.Jobs.Posted' | transloco: { date: (post.published_at | dateFormat) } }}\n </span>\n }\n <span class=\"job-card__cta\" aria-hidden=\"true\">\n {{ post.cta_text || ('Resource.Jobs.ViewRole' | transloco) }}\n <i class=\"fa fa-arrow-right\"></i>\n </span>\n </div>\n </li>\n }\n </ul>\n @if (isLoadingMore) {\n <div class=\"jobs-loading jobs-loading--more\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n }\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\nconst FALLBACK_IMAGE = '/assets/img/resource/careers-team.svg';\nconst FALLBACK_IMAGE_STILL = '/assets/img/resource/careers-team-static.svg';\n\n@Component({\n selector: 'pw-resource-jobs-top-banner',\n templateUrl: './resource-jobs-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss',\n './resource-jobs-top-banner.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, TranslocoPipe]\n})\nexport class ResourceJobsTopBannerComponent extends BaseTopBannerComponent {\n /** The master's uploaded banner, or the default when none was uploaded. */\n get bannerImage(): string {\n return this.hasUploadedImage ? this.blogPostTag.image.url : FALLBACK_IMAGE;\n }\n\n /** The default art animates; this still copy is served when the visitor asks for reduced motion. */\n readonly stillBannerImage = FALLBACK_IMAGE_STILL;\n\n get hasUploadedImage(): boolean {\n const url = this.blogPostTag?.image?.url;\n return !!url && !url.includes('no_image_uploaded_squared');\n }\n\n get hasDescription(): boolean {\n const description = this.blogPostTag?.description;\n return !!description && description !== 'null';\n }\n\n protected getSearchTerm(): string {\n return 'Jobs';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n @if (blogPostTag?.title) {\n <span>{{ blogPostTag.title }}</span>\n } @else {\n <span>{{ 'Resource.Jobs.DefaultTitle' | transloco }}</span>\n }\n @if (canEditResourcesValue && blogPostTag) {\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 @if (hasDescription) {\n <p class=\"intro jobs-banner-intro\">{{ blogPostTag.description }}</p>\n } @else {\n <p class=\"intro\">{{ 'Resource.Jobs.DefaultIntro' | transloco }}</p>\n }\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <picture class=\"jobs-banner-picture\">\n @if (!hasUploadedImage) {\n <source media=\"(prefers-reduced-motion: reduce)\" [srcset]=\"stillBannerImage\" />\n }\n <img class=\"resource-laptop-img dyn-img jobs-banner-art\"\n [src]=\"bannerImage\"\n [alt]=\"'Resource.Jobs.BannerAlt' | transloco\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </picture>\n </div>\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\nimport { ResourceJobCardsComponent } from './job-cards/job-cards.component';\nimport { ResourceJobsTopBannerComponent } from './resource-jobs-top-banner/resource-jobs-top-banner.component';\n\n/** `/resources/careers`: every published post tagged Jobs, as job cards. */\n@Component({\n selector: 'pw-resource-jobs',\n templateUrl: './resource-jobs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceJobsTopBannerComponent,\n ResourceJobCardsComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceJobsComponent extends BaseResourceComponent {\n protected getResourceType(): string {\n return 'Jobs';\n }\n\n // The job cards page through the posts themselves; the base class would fetch them a second time.\n protected override getPosts(): void {\n return;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<pw-resource-jobs-top-banner />\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-job-cards [categoryId]=\"blogPostTag.tag_category_id\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\" />\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 { ResourceJobsComponent } from '../../components/resource-jobs/resource-jobs.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceJobsComponent,\n data: {\n title: 'Resources - Careers',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceJobsComponent]\n})\nexport class ResourceJobsModule {}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as ResourceService } from "./posiwise-resource-module-resource.service-DAXsq-WG.mjs";
2
- import { a as ResourceCardComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
2
+ import { a as ResourceCardComponent } from "./posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs";
3
3
  import { ResourceSharedModule } from "./posiwise-resource-module.mjs";
4
4
  import * as i0 from "@angular/core";
5
5
  import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, inject } from "@angular/core";
@@ -768,4 +768,4 @@ i0.ɵɵngDeclareClassMetadata({
768
768
  });
769
769
  export { ResourcePostModule };
770
770
 
771
- //# sourceMappingURL=posiwise-resource-module-resource-post.module-CGxj27dN.mjs.map
771
+ //# sourceMappingURL=posiwise-resource-module-resource-post.module-PU-KBg_G.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-post.module-CGxj27dN.mjs","names":["i1"],"sources":["../../../../libs/resource-module/src/lib/shared/models/resource.model.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/related-resources.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/related-resources.component.html","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post-details/resource-post-details.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post-details/resource-post-details.component.html","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post.component.html","../../../../libs/resource-module/src/lib/public/modules/post/resource-post.module.ts"],"sourcesContent":["import { FormBuilder, Validators } from '@angular/forms';\n\nexport class ResourceBlog {\n static getResourcePostsForm() {\n return new FormBuilder().group({\n related_entity_id: [''],\n related_entity_type: [''],\n comment: [null, Validators.required],\n user_id: ['']\n });\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\n\nimport { HubSpotMeetingsSharedModule } from '@posiwise/alpha-module';\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, CustomToastService, TagService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { ButtonBusyDirective, LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { Bind } from 'primeng/bind';\nimport { Textarea } from 'primeng/textarea';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { ResourceBlog } from '../../../../shared/models/resource.model';\n\nimport { ResourceCardComponent } from './resource-cards/resource-cards.component';\n\n@Component({\n selector: 'pw-related-resources',\n templateUrl: './related-resources.component.html',\n styleUrls: ['./related-resources.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n Bind,\n Textarea,\n ButtonBusyDirective,\n RouterLink,\n LazyImgDirective,\n HubSpotMeetingsSharedModule,\n ResourceCardComponent,\n DatePipe,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class RelatedResourcesComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n private readonly toastr = inject(CustomToastService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n resourceCards = [\n {\n title: 'BLOG: Here’s why you should QA your distributor invoices',\n image: '/assets/img/resource/resource-qa.png',\n alt: 'QA distributor invoices',\n url: '/resources/view/here-s-why-you-should-be-seeking-independent-qa-of-all-distributor-inv'\n },\n {\n title: 'BLOG: 4 instant hacks to uplift your MSP’s monthly billing',\n image: '/assets/img/resource/resource-hacks.png',\n alt: 'Monthly billing hacks',\n url: '/resources/view/4-instant-hacks-to-uplift-your-msp-s-monthly-billing'\n },\n {\n title: 'BLOG: The trivial detail that will either future-proof or sabotage your PSA.',\n image: '/assets/img/resource/resource-psa.png',\n alt: 'PSA future-proof',\n url: '/resources/view/the-trivial-detail-that-will-either-future-proof-or-sabotage-your-psa'\n }\n ];\n\n post;\n masterSubscriptionId;\n slug;\n\n postComments = [];\n commentForm;\n\n userLoggedIn: boolean;\n\n demoLinks = this.appConfig?.pages_config?.book_demo?.items;\n\n user: User;\n blogPostTag;\n subscriptionId;\n isMasterSubscription;\n linkedInUrl = this.appConfig?.social?.linkedin_url;\n company_email = this.appConfig.company.email;\n\n constructor() {\n super();\n this.commentForm = ResourceBlog.getResourcePostsForm();\n }\n\n ngOnInit(): void {\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? '';\n this.getBlogItem(this.slug);\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n\n this.getPostTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n get hasValidDemoLinks(): boolean {\n return (\n Array.isArray(this.demoLinks) && this.demoLinks.some(link => link?.title ?? link?.url)\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 === 'Blog Posts');\n this.cdr.markForCheck();\n });\n }\n\n private getBlogItem(slug: string) {\n this.resourceService.getPostBySlug(slug).subscribe(response => {\n let blogBody;\n if (response?.body) {\n blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);\n }\n const date = new Date(response?.when);\n const formatted = date.toISOString().split('T')[0];\n this.postComments = response.entity_comments;\n this.post = { ...response, body: blogBody, when: formatted };\n this.cdr.markForCheck();\n });\n }\n\n onComment() {\n const data = { ...this.commentForm.value };\n data.related_entity_id = this.post?.id;\n data.related_entity_type = 'Post';\n data.user_id = this.user?.id;\n this.resourceService.postComments(data).subscribe(() => {\n this.getBlogItem(this.slug);\n this.commentForm.reset();\n this.toastr.success(this.translation.translate('Resource.Posts.CommentAdded'));\n this.cdr.markForCheck();\n });\n }\n\n trackByComment(_index: number, item: { id: number }) {\n return item.id;\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","\n\n<section class=\"resource-body-section\">\n <div class=\"container\">\n <div class=\"ql-snow body-quill\"\n >\n <div class=\"ql-editor body post-body-text\"\n [innerHTML]=\"post?.body\">\n </div>\n </div>\n <section class=\"resource-offer-section\">\n\n <div class=\"row mt-5 mb-4 response-row\">\n <div class=\"col-12\">\n @if (userLoggedIn) {\n <form\n class=\"p-fluid mb-5\"\n [formGroup]=\"commentForm\"\n (ngSubmit)=\"onComment()\"\n >\n <div class=\"card shadow-sm no-border p-4\">\n <div class=\"field\">\n <label for=\"related-resources-comment\" class=\"font-bold text-lg mb-4 comment-label\">💬 LEAVE A COMMENT</label>\n <textarea\n id=\"related-resources-comment\"\n pInputTextarea\n formControlName=\"comment\"\n rows=\"6\"\n fluid\n placeholder=\"What's on your mind?\"\n\n aria-label=\"What's on your mind?\" ></textarea>\n @if (commentForm.get('comment')?.invalid && commentForm.get('comment')?.touched) {\n <small\n class=\"text-danger\"\n >Please enter comment</small\n >\n }\n </div>\n <div class=\"text-end mt-3\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n class=\"sign-btn sign-header-btn\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </form>\n } @else {\n <p class=\"text-center pt-3 pb-3 user-not-logged-in text-muted shadow-sm mb-5\">\n <a [routerLink]=\"['/login']\" class=\"text-primary fw-bold\">Log in</a> to leave a comment!\n </p>\n }\n </div>\n </div>\n\n @if (postComments.length > 0) {\n <div class=\"row mt-5 comment-row\">\n @for (comment of postComments; track trackByComment($index, comment)) {\n <div class=\"col-12\">\n <div class=\"card no-border shadow-sm p-3 mb-3\">\n <div class=\"d-flex align-items-start\">\n <img\n [src]=\"comment?.author?.avatar?.[0]?.url || 'assets/img/icons/male.png'\"\n alt=\"avatar\"\n class=\"rounded-circle me-3\"\n width=\"50\"\n height=\"50\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n <div class=\"flex-grow-1\">\n <div class=\"fw-bold text-dark\">\n {{ comment.user?.first_name || '' }} {{ comment.user?.last_name || '' }}\n </div>\n <div class=\"text-muted small mb-2\">{{ comment.created_at | date: 'dd MMM yyyy, h:mm a' }}</div>\n <div class=\"text-body\">\n {{ comment.comment }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n\n </section>\n </div>\n <hr class=\"resource-divider\" />\n </section>\n\n @if (hasValidDemoLinks) {\n <section class=\"resource-book-section\">\n <div class=\"container\">\n <p class=\"resource-contact\">\n Any questions, get in touch <a href=\"mailto:{{ company_email }}\">here</a>,\n <a [href]=\"linkedInUrl\" target=\"_blank\">connect on LinkedIn</a>, or book a meeting below:\n </p>\n </div>\n <pw-book-a-demo [isBlog]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-book-a-demo>\n <hr class=\"resource-divider\" />\n </section>\n }\n\n\n @if (blogPostTag?.tag_category_id) {\n <pw-resource-cards [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [resourceTitle]=\"blogPostTag?.title\" [isHeaderVisible]=\"true\" resourceLink=\"/resources/blogs\" [isRelated]=\"true\" [resourceTitle]=\"'Other resources you may be interested in:'\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-cards>\n }\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { DomSanitizer, Meta, Title } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { ADMIN_ROUTERS, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Tooltip } from 'primeng/tooltip';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\n@Component({\n selector: 'pw-resource-post-details',\n templateUrl: './resource-post-details.component.html',\n styleUrls: ['./resource-post-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n Tooltip,\n RouterLink,\n LazyImgDirective,\n NoDataComponent,\n DateFormatPipe,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostDetailsComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n private readonly titleService = inject(Title);\n private readonly meta = inject(Meta);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly cdr = inject(ChangeDetectorRef);\n\n post;\n masterSubscriptionId;\n slug;\n blogPermission: string;\n userLoggedIn: boolean;\n routers = ADMIN_ROUTERS;\n hasBlogAccess: boolean;\n user: User;\n subscriptionId: number;\n blogPostTag;\n postCategoryTags = [];\n isLoaded = false;\n\n private static readonly CATEGORY_LABEL_KEYS: Record<string, string> = {\n 'Blog Posts': 'Resource.Posts.Category.BlogPosts',\n 'Case Studies': 'Resource.Posts.Category.CaseStudies',\n Webinars: 'Resource.Posts.Category.Webinars',\n Videos: 'Resource.Posts.Category.Videos',\n Events: 'Resource.Posts.Category.Events',\n 'White Papers': 'Resource.Posts.Category.WhitePapers',\n 'Product Release Notes': 'Resource.Posts.Category.ProductReleaseNotes'\n };\n private static readonly DEFAULT_CATEGORY_LABEL_KEY = 'Resource.Posts.Category.Default';\n\n ngOnInit(): void {\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? '';\n this.getBlogItem(this.slug);\n this.cdr.markForCheck();\n });\n\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n\n if (res) {\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.hasBlogAccess = HelperService.checkBlogPermission(this.user);\n this.cdr.markForCheck();\n });\n }\n\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId || this.masterSubscriptionId)\n .subscribe(response => {\n this.postCategoryTags = response.tags ?? [];\n this.blogPostTag = this.postCategoryTags.find(tag => tag.name === 'Blog Posts');\n // Update SEO metadata again now that blogPostTag is available\n if (this.post) {\n this.setOpenGraphMetaTags();\n }\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n get postCategoryLabelKey(): string {\n const categoryIds = new Set(this.postCategoryTags.map(t => t.id));\n const match = this.post?.tags?.find(t => categoryIds.has(t.id));\n return (\n ResourcePostDetailsComponent.CATEGORY_LABEL_KEYS[match?.name] ??\n ResourcePostDetailsComponent.DEFAULT_CATEGORY_LABEL_KEY\n );\n }\n\n private getBlogItem(slug: string) {\n this.resourceService.getPostBySlug(slug).subscribe(response => {\n let blogBody;\n if (response?.body) {\n blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);\n }\n this.post = { ...response, body: blogBody };\n this.cdr.markForCheck();\n });\n }\n\n private setOpenGraphMetaTags() {\n if (this.post.title) {\n this.meta.updateTag({ property: 'og:title', content: this.post.title });\n this.meta.updateTag({ name: 'twitter:title', content: this.post.title });\n }\n\n if (this.post.blurb) {\n this.meta.updateTag({ property: 'og:description', content: this.post.blurb });\n this.meta.updateTag({ name: 'twitter:description', content: this.post.blurb });\n }\n\n let imageUrl = null;\n if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {\n imageUrl = this.post.picture.url;\n } else if (\n this.blogPostTag?.image?.url &&\n !this.blogPostTag.image.url.includes('no_image_uploaded_squared')\n ) {\n imageUrl = this.blogPostTag.image.url;\n }\n\n if (imageUrl) {\n this.meta.updateTag({ property: 'og:image', content: imageUrl });\n this.meta.updateTag({ name: 'twitter:image', content: imageUrl });\n }\n\n this.meta.updateTag({ property: 'og:type', content: 'article' });\n this.meta.updateTag({ property: 'og:url', content: window.location.href });\n this.meta.updateTag({ property: 'og:site_name', content: 'PosiWise' });\n\n // Twitter Card properties\n this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });\n this.meta.updateTag({ name: 'twitter:site', content: '@posiwise' });\n }\n\n getImageUrl(): string | null {\n if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {\n return this.post.picture.url;\n } else if (\n this.blogPostTag?.image?.url &&\n !this.blogPostTag.image.url.includes('no_image_uploaded_squared')\n ) {\n return this.blogPostTag.image.url;\n }\n return null;\n }\n}\n","<section class=\"resource-hero-section\">\n <div class=\"container d-flex flex-wrap\" [ngClass]=\"getImageUrl() ? 'container-top' : 'container-no-image'\">\n <div class=\"hero-left\">\n <p class=\"blog-label\">{{ postCategoryLabelKey | transloco }}</p>\n\n <h1 class=\"hero-title\">\n @if (post?.title) {\n <span [innerHTML]=\"post.title\"></span>\n } @else {\n &nbsp;\n }\n @if (userLoggedIn && hasBlogAccess) {\n <a\n class=\"ms-3 text-decoration-none\"\n pTooltip=\"Edit this post\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n aria-label=\"Edit this blog post\"\n [routerLink]=\"['/admin/resources/', post?.slug]\"\n target=\"_blank\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </a>\n }\n </h1>\n\n\n <div class=\"author-info\">\n <img [src]=\"post?.author?.avatar?.[0]?.url || 'assets/img/icons/male.png'\" alt=\"User Profile Logo\" class=\"author-img\" />\n <div class=\"author-meta\">\n <p>Article by {{ post?.author?.first_name }} {{ post?.author?.last_name }}</p>\n <p class=\"date\">{{post?.published_at | dateFormat}}</p>\n </div>\n </div>\n </div>\n\n @if (isLoaded) {\n <div class=\"hero-right\">\n @if (getImageUrl()) {\n <img\n [src]=\"getImageUrl()\"\n alt=\"Blog Post\"\n class=\"hero-image\"\n />\n } @else {\n <pw-no-data\n class=\"data-image\"\n [withImage]=\"true\"\n [message]=\"'Resource.Tag.NoImageMessage' | transloco\"\n [description]=\"'Resource.Tag.NoDataMessage' | transloco\"\n ></pw-no-data>\n }\n </div>\n }\n </div>\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { RelatedResourcesComponent } from './related-resources/related-resources.component';\nimport { ResourcePostDetailsComponent } from './resource-post-details/resource-post-details.component';\n\n@Component({\n selector: 'app-resource-post',\n templateUrl: './resource-post.component.html',\n styleUrl: './resource-post.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourcePostDetailsComponent,\n RelatedResourcesComponent,\n Trial4ContactUsComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostComponent extends AppBaseComponent implements OnInit {\n private readonly titleService = inject(Title);\n private readonly authService = inject(AuthService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n slug: string;\n user: User;\n userLoggedIn: boolean | undefined = undefined;\n\n ngOnInit(): void {\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? 'Default';\n this.cdr.markForCheck();\n });\n\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.cdr.markForCheck();\n });\n }\n this.cdr.markForCheck();\n });\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n<pw-resource-post-details></pw-resource-post-details>\n<pw-related-resources></pw-related-resources>\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { RelatedResourcesComponent } from '../../components/resource-post/related-resources/related-resources.component';\nimport { ResourcePostComponent } from '../../components/resource-post/resource-post.component';\nimport { ResourcePostDetailsComponent } from '../../components/resource-post/resource-post-details/resource-post-details.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourcePostComponent,\n data: {\n title: 'Resources - Post',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [\n ResourceSharedModule,\n TooltipModule,\n RouterModule.forChild(routes),\n ResourcePostComponent,\n ResourcePostDetailsComponent,\n RelatedResourcesComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostModule {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAa,eAAb,MAAyB;CACrB,OAAO,uBAAoB;EACvB,OAAO,IAAI,YAAW,CAAE,CAAC,MAAM;GAC3B,mBAAmB,CAAC,EAAE;GACtB,qBAAqB,CAAC,EAAE;GACxB,SAAS,CAAC,MAAM,WAAW,QAAQ;GACnC,SAAS,CAAC,EAAE;EACf,CAAA;CACL;AACH;ACuCD,IAAa,4BAAb,MAAa,kCAAkC,iBAAgB;CA+C3D,cAAA;EACI,MAAK;EA/CQ,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,YAAY,OAAO,YAAY;EAC/B,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,cAAc,OAAO,WAAW;EAChC,KAAA,SAAS,OAAO,kBAAkB;EAClC,KAAA,MAAM,OAAO,iBAAiB;EAE/C,KAAA,gBAAgB;GACZ;IACI,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;GACR;GACD;IACI,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;GACR;GACD;IACI,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;GACR;EACJ;EAMD,KAAA,eAAe,CAAA;EAKf,KAAA,YAAY,KAAK,WAAW,cAAc,WAAW;EAMrD,KAAA,cAAc,KAAK,WAAW,QAAQ;EACtC,KAAA,gBAAgB,KAAK,UAAU,QAAQ;EAInC,KAAK,cAAc,aAAa,qBAAoB;CACxD;CAEA,WAAQ;EACJ,KAAK,uBAAuB,KAAK,UAAU,oBAAoB;EAC/D,KAAK,MAAM,OAAO,WAAU,WAAS;GACjC,KAAK,OAAO,OAAO,WAAW;GAC9B,KAAK,YAAY,KAAK,IAAI;GAC1B,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;KAEZ,KAAK,YAAW;KAChB,KAAK,IAAI,aAAY;IACzB,CAAC;GACL,OACI,KAAK,YAAW;GAEpB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEA,IAAI,oBAAiB;EACjB,OACI,MAAM,QAAQ,KAAK,SAAS,KAAK,KAAK,UAAU,MAAK,SAAQ,MAAM,SAAS,MAAM,GAAG;CAE7F;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,YAAY;GACtE,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEQ,YAAY,MAAY;EAC5B,KAAK,gBAAgB,cAAc,IAAI,CAAC,CAAC,WAAU,aAAW;GAC1D,IAAI;GACJ,IAAI,UAAU,MACV,WAAW,cAAc,kBAAkB,SAAS,MAAM,KAAK,SAAS;GAG5E,MAAM,YAAY,IADD,KAAK,UAAU,IACd,CAAA,CAAK,YAAW,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;GAChD,KAAK,eAAe,SAAS;GAC7B,KAAK,OAAO;IAAE,GAAG;IAAU,MAAM;IAAU,MAAM;GAAS;GAC1D,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEA,YAAS;EACL,MAAM,OAAO,EAAE,GAAG,KAAK,YAAY,MAAK;EACxC,KAAK,oBAAoB,KAAK,MAAM;EACpC,KAAK,sBAAsB;EAC3B,KAAK,UAAU,KAAK,MAAM;EAC1B,KAAK,gBAAgB,aAAa,IAAI,CAAC,CAAC,gBAAe;GACnD,KAAK,YAAY,KAAK,IAAI;GAC1B,KAAK,YAAY,MAAK;GACtB,KAAK,OAAO,QAAQ,KAAK,YAAY,UAAU,6BAA6B,CAAC;GAC7E,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEA,eAAe,QAAgB,MAAoB;EAC/C,OAAO,KAAK;CAChB;CAGQ,6BAA0B;EAC9B,OAAO,cAAc,2BACjB,KAAK,MACL,KAAK,gBACL,KAAK,oBAAoB;CAEjC;CArIS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAzB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAyB,cAAA;GAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UClDtC;GA6GA,QAAA,CAAA,sjFAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDzEQ;IAAW;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;IAAmB;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;KAAA,QAAA,CAAA,WAAA;KAAA,SAAA,CAAA,UAAA;KAAA,UAAA,CAAA,QAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAAA,KAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEnB;KAAQ,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACR;KAAmB,UAAA;KAAA,QAAA,CAAA,cAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACnB;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;IAA2B;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC3B;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;KAAQ,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACR;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;EApBrC,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,sjFAAA;EAAA,CAAA;;;;AEPrC,IAAa,+BAAb,MAAa,qCAAqC,iBAAgB;CAhBlE,cAAA;;EAiBqB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,cAAc,OAAO,WAAW;EAChC,KAAA,eAAe,OAAO,KAAK;EAC3B,KAAA,OAAO,OAAO,IAAI;EAClB,KAAA,YAAY,OAAO,YAAY;EAC/B,KAAA,MAAM,OAAO,iBAAiB;EAO/C,KAAA,UAAU;EAKV,KAAA,mBAAmB,CAAA;EACnB,KAAA,WAAW;CA6Hd;CA3H2B;EAAA,KAAA,sBAA8C;GAClE,cAAc;GACd,gBAAgB;GAChB,UAAU;GACV,QAAQ;GACR,QAAQ;GACR,gBAAgB;GAChB,yBAAyB;EAC5B;CAAC;CACsB;EAAA,KAAA,6BAA6B;CAAkC;CAEvF,WAAQ;EACJ,KAAK,uBAAuB,KAAK,UAAU,oBAAoB;EAC/D,KAAK,sBAAqB,CAAE,CAAC,WAAU,aAAW;GAC9C,KAAK,iBAAiB;GACtB,KAAK,IAAI,aAAY;EACzB,CAAC;EACD,KAAK,MAAM,OAAO,WAAU,WAAS;GACjC,KAAK,OAAO,OAAO,WAAW;GAC9B,KAAK,YAAY,KAAK,IAAI;GAC1B,KAAK,IAAI,aAAY;EACzB,CAAC;EAED,KAAK,YAAY,UAAS,CAAE,CAAC,WAAU,QAAM;GACzC,KAAK,eAAe,CAAC,CAAC;GAEtB,IAAI,KACA,KAAK,YAAY,YAAW,CAAE,CAAC,WAAU,SAAO;IAC5C,KAAK,OAAO;IACZ,KAAK,gBAAgB,cAAc,oBAAoB,KAAK,IAAI;IAChE,KAAK,IAAI,aAAY;GACzB,CAAC;GAGL,KAAK,YAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEQ,cAAW;EACf,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,kBAAkB,KAAK,oBAAoB,CAAC,CACtF,WAAU,aAAW;GAClB,KAAK,mBAAmB,SAAS,QAAQ,CAAA;GACzC,KAAK,cAAc,KAAK,iBAAiB,MAAK,QAAO,IAAI,SAAS,YAAY;GAE9E,IAAI,KAAK,MACL,KAAK,qBAAoB;GAE7B,KAAK,IAAI,aAAY;EACzB,CAAC,CAAC,CACD,UAAS;GACN,KAAK,WAAW;GAChB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEA,IAAI,uBAAoB;EACpB,MAAM,cAAc,IAAI,IAAI,KAAK,iBAAiB,KAAI,MAAK,EAAE,EAAE,CAAC;EAChE,MAAM,QAAQ,KAAK,MAAM,MAAM,MAAK,MAAK,YAAY,IAAI,EAAE,EAAE,CAAC;EAC9D,OACI,6BAA6B,oBAAoB,OAAO,SACxD,6BAA6B;CAErC;CAEQ,YAAY,MAAY;EAC5B,KAAK,gBAAgB,cAAc,IAAI,CAAC,CAAC,WAAU,aAAW;GAC1D,IAAI;GACJ,IAAI,UAAU,MACV,WAAW,cAAc,kBAAkB,SAAS,MAAM,KAAK,SAAS;GAE5E,KAAK,OAAO;IAAE,GAAG;IAAU,MAAM;GAAQ;GACzC,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEQ,uBAAoB;EACxB,IAAI,KAAK,KAAK,OAAO;GACjB,KAAK,KAAK,UAAU;IAAE,UAAU;IAAY,SAAS,KAAK,KAAK;GAAK,CAAE;GACtE,KAAK,KAAK,UAAU;IAAE,MAAM;IAAiB,SAAS,KAAK,KAAK;GAAK,CAAE;EAC3E;EAEA,IAAI,KAAK,KAAK,OAAO;GACjB,KAAK,KAAK,UAAU;IAAE,UAAU;IAAkB,SAAS,KAAK,KAAK;GAAK,CAAE;GAC5E,KAAK,KAAK,UAAU;IAAE,MAAM;IAAuB,SAAS,KAAK,KAAK;GAAK,CAAE;EACjF;EAEA,IAAI,WAAW;EACf,IAAI,KAAK,MAAM,SAAS,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,SAAS,mBAAmB,GAC9E,WAAW,KAAK,KAAK,QAAQ;OAC1B,IACH,KAAK,aAAa,OAAO,OACzB,CAAC,KAAK,YAAY,MAAM,IAAI,SAAS,2BAA2B,GAEhE,WAAW,KAAK,YAAY,MAAM;EAGtC,IAAI,UAAU;GACV,KAAK,KAAK,UAAU;IAAE,UAAU;IAAY,SAAS;GAAQ,CAAE;GAC/D,KAAK,KAAK,UAAU;IAAE,MAAM;IAAiB,SAAS;GAAQ,CAAE;EACpE;EAEA,KAAK,KAAK,UAAU;GAAE,UAAU;GAAW,SAAS;EAAS,CAAE;EAC/D,KAAK,KAAK,UAAU;GAAE,UAAU;GAAU,SAAS,OAAO,SAAS;EAAI,CAAE;EACzE,KAAK,KAAK,UAAU;GAAE,UAAU;GAAgB,SAAS;EAAU,CAAE;EAGrE,KAAK,KAAK,UAAU;GAAE,MAAM;GAAgB,SAAS;EAAqB,CAAE;EAC5E,KAAK,KAAK,UAAU;GAAE,MAAM;GAAgB,SAAS;EAAW,CAAE;CACtE;CAEA,cAAW;EACP,IAAI,KAAK,MAAM,SAAS,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,SAAS,mBAAmB,GAC9E,OAAO,KAAK,KAAK,QAAQ;OACtB,IACH,KAAK,aAAa,OAAO,OACzB,CAAC,KAAK,YAAY,MAAM,IAAI,SAAS,2BAA2B,GAEhE,OAAO,KAAK,YAAY,MAAM;EAElC,OAAO;CACX;CAhJS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAA4B,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAA5B;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAA4B,cAAA;GAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UCzCzC;GAuDA,QAAA,CAAA,u/DAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDxBQ;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;KAAO,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACP;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAc,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA4B,YAAA,CAAA;EAhBxC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAA0B,iBAGnB,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,u/DAAA;EAAA,CAAA;;;AEPrC,IAAa,wBAAb,MAAa,8BAA8B,iBAAgB;CAb3D,cAAA;;EAcqB,KAAA,eAAe,OAAO,KAAK;EAC3B,KAAA,cAAc,OAAO,WAAW;EAChC,KAAA,MAAM,OAAO,iBAAiB;EAI/C,KAAA,eAAoC;CAmBvC;CAjBG,WAAQ;EACJ,KAAK,MAAM,OAAO,WAAU,WAAS;GACjC,KAAK,OAAO,OAAO,WAAW;GAC9B,KAAK,IAAI,aAAY;EACzB,CAAC;EAED,KAAK,YAAY,UAAS,CAAE,CAAC,WAAU,QAAM;GACzC,KAAK,eAAe,CAAC,CAAC;GACtB,IAAI,KAAK,cACL,KAAK,YAAY,YAAW,CAAE,CAAC,WAAU,SAAO;IAC5C,KAAK,OAAO;IACZ,KAAK,IAAI,aAAY;GACzB,CAAC;GAEL,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAzBS;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,UChClC;GAK2F,QAAA,CAAA,oFAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDoBnF;KAAuB,UAAA;KAAA,QAAA,CAAA,QAAA,cAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACvB;KAA4B,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC5B;KAAyB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACzB;KAAwB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAInB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAbjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAmB,iBAGZ,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,oFAAA;EAAA,CAAA;;;AEpBrC,MAAM,SAAiB,CACnB;CACI,MAAM;CACN,WAAW;CACX,MAAM;EACF,OAAO;EACP,YAAY;EACZ,SAAS;CACZ;AACJ,CACJ;AAaD,IAAa,qBAAb,MAAa,mBAAkB;CAAlB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAkB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAlB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAkB,SAAA;IATvB;IACA;IAAa,GAAA;IAEb;IACA;IACA;GAAyB;EAAA,CAAA;CAAA;CAIpB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAkB,SAAA;IATvB;IACA;IACA,aAAa,SAAS,MAAM;IAC5B;IACA;IACA;GAAyB;EAAA,CAAA;CAAA;;AAIpB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAX9B,MAAA;EAAS,MAAA,CAAA;GACN,SAAS;IACL;IACA;IACA,aAAa,SAAS,MAAM;IAC5B;IACA;IACA;GACH;GACD,SAAS,CAAC,sBAAsB;EACnC,CAAA"}
1
+ {"version":3,"file":"posiwise-resource-module-resource-post.module-PU-KBg_G.mjs","names":["i1"],"sources":["../../../../libs/resource-module/src/lib/shared/models/resource.model.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/related-resources.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/related-resources/related-resources.component.html","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post-details/resource-post-details.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post-details/resource-post-details.component.html","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-post/resource-post.component.html","../../../../libs/resource-module/src/lib/public/modules/post/resource-post.module.ts"],"sourcesContent":["import { FormBuilder, Validators } from '@angular/forms';\n\nexport class ResourceBlog {\n static getResourcePostsForm() {\n return new FormBuilder().group({\n related_entity_id: [''],\n related_entity_type: [''],\n comment: [null, Validators.required],\n user_id: ['']\n });\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\n\nimport { HubSpotMeetingsSharedModule } from '@posiwise/alpha-module';\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, CustomToastService, TagService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { ButtonBusyDirective, LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { Bind } from 'primeng/bind';\nimport { Textarea } from 'primeng/textarea';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { ResourceBlog } from '../../../../shared/models/resource.model';\n\nimport { ResourceCardComponent } from './resource-cards/resource-cards.component';\n\n@Component({\n selector: 'pw-related-resources',\n templateUrl: './related-resources.component.html',\n styleUrls: ['./related-resources.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n Bind,\n Textarea,\n ButtonBusyDirective,\n RouterLink,\n LazyImgDirective,\n HubSpotMeetingsSharedModule,\n ResourceCardComponent,\n DatePipe,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class RelatedResourcesComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n private readonly toastr = inject(CustomToastService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n resourceCards = [\n {\n title: 'BLOG: Here’s why you should QA your distributor invoices',\n image: '/assets/img/resource/resource-qa.png',\n alt: 'QA distributor invoices',\n url: '/resources/view/here-s-why-you-should-be-seeking-independent-qa-of-all-distributor-inv'\n },\n {\n title: 'BLOG: 4 instant hacks to uplift your MSP’s monthly billing',\n image: '/assets/img/resource/resource-hacks.png',\n alt: 'Monthly billing hacks',\n url: '/resources/view/4-instant-hacks-to-uplift-your-msp-s-monthly-billing'\n },\n {\n title: 'BLOG: The trivial detail that will either future-proof or sabotage your PSA.',\n image: '/assets/img/resource/resource-psa.png',\n alt: 'PSA future-proof',\n url: '/resources/view/the-trivial-detail-that-will-either-future-proof-or-sabotage-your-psa'\n }\n ];\n\n post;\n masterSubscriptionId;\n slug;\n\n postComments = [];\n commentForm;\n\n userLoggedIn: boolean;\n\n demoLinks = this.appConfig?.pages_config?.book_demo?.items;\n\n user: User;\n blogPostTag;\n subscriptionId;\n isMasterSubscription;\n linkedInUrl = this.appConfig?.social?.linkedin_url;\n company_email = this.appConfig.company.email;\n\n constructor() {\n super();\n this.commentForm = ResourceBlog.getResourcePostsForm();\n }\n\n ngOnInit(): void {\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? '';\n this.getBlogItem(this.slug);\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n\n this.getPostTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n get hasValidDemoLinks(): boolean {\n return (\n Array.isArray(this.demoLinks) && this.demoLinks.some(link => link?.title ?? link?.url)\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 === 'Blog Posts');\n this.cdr.markForCheck();\n });\n }\n\n private getBlogItem(slug: string) {\n this.resourceService.getPostBySlug(slug).subscribe(response => {\n let blogBody;\n if (response?.body) {\n blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);\n }\n const date = new Date(response?.when);\n const formatted = date.toISOString().split('T')[0];\n this.postComments = response.entity_comments;\n this.post = { ...response, body: blogBody, when: formatted };\n this.cdr.markForCheck();\n });\n }\n\n onComment() {\n const data = { ...this.commentForm.value };\n data.related_entity_id = this.post?.id;\n data.related_entity_type = 'Post';\n data.user_id = this.user?.id;\n this.resourceService.postComments(data).subscribe(() => {\n this.getBlogItem(this.slug);\n this.commentForm.reset();\n this.toastr.success(this.translation.translate('Resource.Posts.CommentAdded'));\n this.cdr.markForCheck();\n });\n }\n\n trackByComment(_index: number, item: { id: number }) {\n return item.id;\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","\n\n<section class=\"resource-body-section\">\n <div class=\"container\">\n <div class=\"ql-snow body-quill\"\n >\n <div class=\"ql-editor body post-body-text\"\n [innerHTML]=\"post?.body\">\n </div>\n </div>\n <section class=\"resource-offer-section\">\n\n <div class=\"row mt-5 mb-4 response-row\">\n <div class=\"col-12\">\n @if (userLoggedIn) {\n <form\n class=\"p-fluid mb-5\"\n [formGroup]=\"commentForm\"\n (ngSubmit)=\"onComment()\"\n >\n <div class=\"card shadow-sm no-border p-4\">\n <div class=\"field\">\n <label for=\"related-resources-comment\" class=\"font-bold text-lg mb-4 comment-label\">💬 LEAVE A COMMENT</label>\n <textarea\n id=\"related-resources-comment\"\n pInputTextarea\n formControlName=\"comment\"\n rows=\"6\"\n fluid\n placeholder=\"What's on your mind?\"\n\n aria-label=\"What's on your mind?\" ></textarea>\n @if (commentForm.get('comment')?.invalid && commentForm.get('comment')?.touched) {\n <small\n class=\"text-danger\"\n >Please enter comment</small\n >\n }\n </div>\n <div class=\"text-end mt-3\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n class=\"sign-btn sign-header-btn\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n </div>\n </form>\n } @else {\n <p class=\"text-center pt-3 pb-3 user-not-logged-in text-muted shadow-sm mb-5\">\n <a [routerLink]=\"['/login']\" class=\"text-primary fw-bold\">Log in</a> to leave a comment!\n </p>\n }\n </div>\n </div>\n\n @if (postComments.length > 0) {\n <div class=\"row mt-5 comment-row\">\n @for (comment of postComments; track trackByComment($index, comment)) {\n <div class=\"col-12\">\n <div class=\"card no-border shadow-sm p-3 mb-3\">\n <div class=\"d-flex align-items-start\">\n <img\n [src]=\"comment?.author?.avatar?.[0]?.url || 'assets/img/icons/male.png'\"\n alt=\"avatar\"\n class=\"rounded-circle me-3\"\n width=\"50\"\n height=\"50\"\n (error)=\"handleImageError($event, 'assets/img/icons/male.png')\"\n />\n <div class=\"flex-grow-1\">\n <div class=\"fw-bold text-dark\">\n {{ comment.user?.first_name || '' }} {{ comment.user?.last_name || '' }}\n </div>\n <div class=\"text-muted small mb-2\">{{ comment.created_at | date: 'dd MMM yyyy, h:mm a' }}</div>\n <div class=\"text-body\">\n {{ comment.comment }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n\n </section>\n </div>\n <hr class=\"resource-divider\" />\n </section>\n\n @if (hasValidDemoLinks) {\n <section class=\"resource-book-section\">\n <div class=\"container\">\n <p class=\"resource-contact\">\n Any questions, get in touch <a href=\"mailto:{{ company_email }}\">here</a>,\n <a [href]=\"linkedInUrl\" target=\"_blank\">connect on LinkedIn</a>, or book a meeting below:\n </p>\n </div>\n <pw-book-a-demo [isBlog]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-book-a-demo>\n <hr class=\"resource-divider\" />\n </section>\n }\n\n\n @if (blogPostTag?.tag_category_id) {\n <pw-resource-cards [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [resourceTitle]=\"blogPostTag?.title\" [isHeaderVisible]=\"true\" resourceLink=\"/resources/blogs\" [isRelated]=\"true\" [resourceTitle]=\"'Other resources you may be interested in:'\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-cards>\n }\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { DomSanitizer, Meta, Title } from '@angular/platform-browser';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { ADMIN_ROUTERS, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\nimport { NoDataComponent } from '@posiwise/shared-components';\n\nimport { Tooltip } from 'primeng/tooltip';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\n@Component({\n selector: 'pw-resource-post-details',\n templateUrl: './resource-post-details.component.html',\n styleUrls: ['./resource-post-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n Tooltip,\n RouterLink,\n LazyImgDirective,\n NoDataComponent,\n DateFormatPipe,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostDetailsComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n private readonly titleService = inject(Title);\n private readonly meta = inject(Meta);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly cdr = inject(ChangeDetectorRef);\n\n post;\n masterSubscriptionId;\n slug;\n blogPermission: string;\n userLoggedIn: boolean;\n routers = ADMIN_ROUTERS;\n hasBlogAccess: boolean;\n user: User;\n subscriptionId: number;\n blogPostTag;\n postCategoryTags = [];\n isLoaded = false;\n\n private static readonly CATEGORY_LABEL_KEYS: Record<string, string> = {\n 'Blog Posts': 'Resource.Posts.Category.BlogPosts',\n 'Case Studies': 'Resource.Posts.Category.CaseStudies',\n Webinars: 'Resource.Posts.Category.Webinars',\n Videos: 'Resource.Posts.Category.Videos',\n Events: 'Resource.Posts.Category.Events',\n 'White Papers': 'Resource.Posts.Category.WhitePapers',\n 'Product Release Notes': 'Resource.Posts.Category.ProductReleaseNotes'\n };\n private static readonly DEFAULT_CATEGORY_LABEL_KEY = 'Resource.Posts.Category.Default';\n\n ngOnInit(): void {\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? '';\n this.getBlogItem(this.slug);\n this.cdr.markForCheck();\n });\n\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n\n if (res) {\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.hasBlogAccess = HelperService.checkBlogPermission(this.user);\n this.cdr.markForCheck();\n });\n }\n\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId || this.masterSubscriptionId)\n .subscribe(response => {\n this.postCategoryTags = response.tags ?? [];\n this.blogPostTag = this.postCategoryTags.find(tag => tag.name === 'Blog Posts');\n // Update SEO metadata again now that blogPostTag is available\n if (this.post) {\n this.setOpenGraphMetaTags();\n }\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n get postCategoryLabelKey(): string {\n const categoryIds = new Set(this.postCategoryTags.map(t => t.id));\n const match = this.post?.tags?.find(t => categoryIds.has(t.id));\n return (\n ResourcePostDetailsComponent.CATEGORY_LABEL_KEYS[match?.name] ??\n ResourcePostDetailsComponent.DEFAULT_CATEGORY_LABEL_KEY\n );\n }\n\n private getBlogItem(slug: string) {\n this.resourceService.getPostBySlug(slug).subscribe(response => {\n let blogBody;\n if (response?.body) {\n blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);\n }\n this.post = { ...response, body: blogBody };\n this.cdr.markForCheck();\n });\n }\n\n private setOpenGraphMetaTags() {\n if (this.post.title) {\n this.meta.updateTag({ property: 'og:title', content: this.post.title });\n this.meta.updateTag({ name: 'twitter:title', content: this.post.title });\n }\n\n if (this.post.blurb) {\n this.meta.updateTag({ property: 'og:description', content: this.post.blurb });\n this.meta.updateTag({ name: 'twitter:description', content: this.post.blurb });\n }\n\n let imageUrl = null;\n if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {\n imageUrl = this.post.picture.url;\n } else if (\n this.blogPostTag?.image?.url &&\n !this.blogPostTag.image.url.includes('no_image_uploaded_squared')\n ) {\n imageUrl = this.blogPostTag.image.url;\n }\n\n if (imageUrl) {\n this.meta.updateTag({ property: 'og:image', content: imageUrl });\n this.meta.updateTag({ name: 'twitter:image', content: imageUrl });\n }\n\n this.meta.updateTag({ property: 'og:type', content: 'article' });\n this.meta.updateTag({ property: 'og:url', content: window.location.href });\n this.meta.updateTag({ property: 'og:site_name', content: 'PosiWise' });\n\n // Twitter Card properties\n this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });\n this.meta.updateTag({ name: 'twitter:site', content: '@posiwise' });\n }\n\n getImageUrl(): string | null {\n if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {\n return this.post.picture.url;\n } else if (\n this.blogPostTag?.image?.url &&\n !this.blogPostTag.image.url.includes('no_image_uploaded_squared')\n ) {\n return this.blogPostTag.image.url;\n }\n return null;\n }\n}\n","<section class=\"resource-hero-section\">\n <div class=\"container d-flex flex-wrap\" [ngClass]=\"getImageUrl() ? 'container-top' : 'container-no-image'\">\n <div class=\"hero-left\">\n <p class=\"blog-label\">{{ postCategoryLabelKey | transloco }}</p>\n\n <h1 class=\"hero-title\">\n @if (post?.title) {\n <span [innerHTML]=\"post.title\"></span>\n } @else {\n &nbsp;\n }\n @if (userLoggedIn && hasBlogAccess) {\n <a\n class=\"ms-3 text-decoration-none\"\n pTooltip=\"Edit this post\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n aria-label=\"Edit this blog post\"\n [routerLink]=\"['/admin/resources/', post?.slug]\"\n target=\"_blank\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </a>\n }\n </h1>\n\n\n <div class=\"author-info\">\n <img [src]=\"post?.author?.avatar?.[0]?.url || 'assets/img/icons/male.png'\" alt=\"User Profile Logo\" class=\"author-img\" />\n <div class=\"author-meta\">\n <p>Article by {{ post?.author?.first_name }} {{ post?.author?.last_name }}</p>\n <p class=\"date\">{{post?.published_at | dateFormat}}</p>\n </div>\n </div>\n </div>\n\n @if (isLoaded) {\n <div class=\"hero-right\">\n @if (getImageUrl()) {\n <img\n [src]=\"getImageUrl()\"\n alt=\"Blog Post\"\n class=\"hero-image\"\n />\n } @else {\n <pw-no-data\n class=\"data-image\"\n [withImage]=\"true\"\n [message]=\"'Resource.Tag.NoImageMessage' | transloco\"\n [description]=\"'Resource.Tag.NoDataMessage' | transloco\"\n ></pw-no-data>\n }\n </div>\n }\n </div>\n</section>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n OnInit\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { RelatedResourcesComponent } from './related-resources/related-resources.component';\nimport { ResourcePostDetailsComponent } from './resource-post-details/resource-post-details.component';\n\n@Component({\n selector: 'app-resource-post',\n templateUrl: './resource-post.component.html',\n styleUrl: './resource-post.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourcePostDetailsComponent,\n RelatedResourcesComponent,\n Trial4ContactUsComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostComponent extends AppBaseComponent implements OnInit {\n private readonly titleService = inject(Title);\n private readonly authService = inject(AuthService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n slug: string;\n user: User;\n userLoggedIn: boolean | undefined = undefined;\n\n ngOnInit(): void {\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? 'Default';\n this.cdr.markForCheck();\n });\n\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.cdr.markForCheck();\n });\n }\n this.cdr.markForCheck();\n });\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n<pw-resource-post-details></pw-resource-post-details>\n<pw-related-resources></pw-related-resources>\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { RelatedResourcesComponent } from '../../components/resource-post/related-resources/related-resources.component';\nimport { ResourcePostComponent } from '../../components/resource-post/resource-post.component';\nimport { ResourcePostDetailsComponent } from '../../components/resource-post/resource-post-details/resource-post-details.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourcePostComponent,\n data: {\n title: 'Resources - Post',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [\n ResourceSharedModule,\n TooltipModule,\n RouterModule.forChild(routes),\n ResourcePostComponent,\n ResourcePostDetailsComponent,\n RelatedResourcesComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostModule {}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { c as ResourceNoteCardComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { c as ResourceNoteCardComponent } from "./posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs";
2
2
  import { ResourceSharedModule, ResourceTopBannerEditComponent } from "./posiwise-resource-module.mjs";
3
3
  import { t as BaseTopBannerComponent } from "./posiwise-resource-module-base-top-banner.component-BwujN_up.mjs";
4
4
  import * as i0 from "@angular/core";
@@ -11,6 +11,7 @@ import { Trial4ContactUsComponent } from "@posiwise/resource-contact-us";
11
11
  import { LazyImgDirective } from "@posiwise/directives";
12
12
  import { AppBaseComponent } from "@posiwise/app-base-component";
13
13
  import { ResourceHeaderComponent } from "@posiwise/utils";
14
+ import { SeoGuard } from "@posiwise/core-guards";
14
15
  var ReleaseTopBannerComponent = class ReleaseTopBannerComponent extends BaseTopBannerComponent {
15
16
  constructor() {
16
17
  super(...arguments);
@@ -217,10 +218,12 @@ const routes = [{
217
218
  path: "",
218
219
  component: ResourceReleaseNoteComponent,
219
220
  data: {
220
- title: "Resources - Release Notes",
221
+ title: "Release Notes: Product Updates and New Features",
222
+ description: "Read the latest product updates, new features and fixes, with notes for every release.",
221
223
  permission: "Pages.Blog",
222
224
  preload: false
223
- }
225
+ },
226
+ canActivate: [SeoGuard]
224
227
  }];
225
228
  var ResourceReleaseNotesModule = class ResourceReleaseNotesModule {
226
229
  static {
@@ -279,4 +282,4 @@ i0.ɵɵngDeclareClassMetadata({
279
282
  });
280
283
  export { ResourceReleaseNotesModule };
281
284
 
282
- //# sourceMappingURL=posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs.map
285
+ //# sourceMappingURL=posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes.component.html","../../../../libs/resource-module/src/lib/public/modules/release-notes/resource-release-notes.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { LazyImgDirective } from '@posiwise/directives';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\n@Component({\n selector: 'pw-resource-release-notes-top-banner',\n templateUrl: './resource-release-notes-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n './resource-release-notes-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, LazyImgDirective]\n})\nexport class ReleaseTopBannerComponent extends BaseTopBannerComponent {\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n protected getSearchTerm(): string {\n return 'Release Notes';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Release Notes'\"></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\">\n We&rsquo;re obsessed with solving real problems for our customers.\n </p>\n }\n </div>\n <div class=\"d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img dyn-img\"\n [src]=\"(blogPostTag?.image?.url && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared'))) ? blogPostTag?.image?.url : '/assets/img/resource/release-person.webp'\"\n alt=\"Release notes banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n","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';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { ResourceNoteCardComponent } from '../reslease-note-card/release-note-card.component';\n\nimport { ReleaseTopBannerComponent } from './resource-release-notes-top-banner/resource-release-notes-top-banner.component';\n\n@Component({\n selector: 'pw-resource-release-notes',\n templateUrl: './resource-release-notes.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ReleaseTopBannerComponent,\n ResourceNoteCardComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceReleaseNoteComponent extends AppBaseComponent implements OnInit {\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n userLoggedIn: boolean;\n blogPostTag;\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.getPostTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostTags();\n }\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(tag => tag.name === 'Product Release Notes');\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}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n<pw-resource-release-notes-top-banner></pw-resource-release-notes-top-banner>\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-note-card [isReleasePress]=\"true\" [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [releaseHeader]=\"true\" [resourceTitle]=\"blogPostTag?.title\" [postSlice]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-note-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 { ResourceReleaseNoteComponent } from '../../components/resource-release-notes/resource-release-notes.component';\nimport { ReleaseTopBannerComponent } from '../../components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceReleaseNoteComponent,\n data: {\n title: 'Resources - Release Notes',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [\n ResourceSharedModule,\n RouterModule.forChild(routes),\n ResourceReleaseNoteComponent,\n ReleaseTopBannerComponent\n ]\n})\nexport class ResourceReleaseNotesModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"posiwise-resource-module-resource-release-notes.module-WESwTVu8.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-release-notes/resource-release-notes.component.html","../../../../libs/resource-module/src/lib/public/modules/release-notes/resource-release-notes.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { LazyImgDirective } from '@posiwise/directives';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\n@Component({\n selector: 'pw-resource-release-notes-top-banner',\n templateUrl: './resource-release-notes-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n './resource-release-notes-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, LazyImgDirective]\n})\nexport class ReleaseTopBannerComponent extends BaseTopBannerComponent {\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n protected getSearchTerm(): string {\n return 'Release Notes';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Release Notes'\"></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\">\n We&rsquo;re obsessed with solving real problems for our customers.\n </p>\n }\n </div>\n <div class=\"d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img dyn-img\"\n [src]=\"(blogPostTag?.image?.url && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared'))) ? blogPostTag?.image?.url : '/assets/img/resource/release-person.webp'\"\n alt=\"Release notes banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n","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';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { ResourceNoteCardComponent } from '../reslease-note-card/release-note-card.component';\n\nimport { ReleaseTopBannerComponent } from './resource-release-notes-top-banner/resource-release-notes-top-banner.component';\n\n@Component({\n selector: 'pw-resource-release-notes',\n templateUrl: './resource-release-notes.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ReleaseTopBannerComponent,\n ResourceNoteCardComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceReleaseNoteComponent extends AppBaseComponent implements OnInit {\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n userLoggedIn: boolean;\n blogPostTag;\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.getPostTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostTags();\n }\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(tag => tag.name === 'Product Release Notes');\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}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n<pw-resource-release-notes-top-banner></pw-resource-release-notes-top-banner>\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-note-card [isReleasePress]=\"true\" [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [releaseHeader]=\"true\" [resourceTitle]=\"blogPostTag?.title\" [postSlice]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-note-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 { SeoGuard } from '@posiwise/core-guards';\n\nimport { ResourceReleaseNoteComponent } from '../../components/resource-release-notes/resource-release-notes.component';\nimport { ReleaseTopBannerComponent } from '../../components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceReleaseNoteComponent,\n data: {\n title: 'Release Notes: Product Updates and New Features',\n description:\n 'Read the latest product updates, new features and fixes, with notes for every release.',\n permission: 'Pages.Blog',\n preload: false\n },\n canActivate: [SeoGuard]\n }\n];\n\n@NgModule({\n imports: [\n ResourceSharedModule,\n RouterModule.forChild(routes),\n ResourceReleaseNoteComponent,\n ReleaseTopBannerComponent\n ]\n})\nexport class ResourceReleaseNotesModule {}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as ResourceCardComponent, c as ResourceNoteCardComponent, n as UpcomingEventCardComponent, o as CaseStudyCardComponent, r as ResourceVaultComponent, s as ResourceVideoCardComponent, t as ResourceCardsModule } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { a as ResourceCardComponent, c as ResourceNoteCardComponent, n as UpcomingEventCardComponent, o as CaseStudyCardComponent, r as ResourceVaultComponent, s as ResourceVideoCardComponent, t as ResourceCardsModule } from "./posiwise-resource-module-resource-cards.module-DWV2LWdy.mjs";
2
2
  import * as i0 from "@angular/core";
3
3
  import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, NgModule, Output, ViewChild, inject } from "@angular/core";
4
4
  import { AuthService, TagService } from "@posiwise/common-services";
@@ -17,6 +17,7 @@ import { AppBaseComponent } from "@posiwise/app-base-component";
17
17
  import { ProfileImageCropperComponent, ResourceHeaderComponent } from "@posiwise/utils";
18
18
  import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
19
19
  import { Title } from "@angular/platform-browser";
20
+ import { SeoGuard } from "@posiwise/core-guards";
20
21
  import { AdminService } from "@posiwise/admin-module-utils";
21
22
  var ResourceTagComponent = class ResourceTagComponent extends AppBaseComponent {
22
23
  constructor() {
@@ -279,8 +280,8 @@ var VaultSectionComponent = class VaultSectionComponent extends AppBaseComponent
279
280
  usesInheritance: true,
280
281
  usesOnChanges: true,
281
282
  ngImport: i0,
282
- template: "<section class=\"vault-section\">\n <div class=\"skewed-bg\"></div>\n\n <!-- Edit Icon (top-right) -->\n\n <div class=\"container\">\n <div class=\"row align-items-center vault-row\">\n <!-- Left Content -->\n <div class=\"col-lg-6 col-12 text-content\">\n <div class=\"d-flex\">\n <h2 class=\"headline\">{{resourceTagLine || 'UPDATE ME ON ADMIN/DOMAINS MODULE'}}</h2>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit tag-edit-icon in-page-edit-icon mt-4 ms-3 cursor-pointer\"\n title=\"Edit Resource\"\n (click)=\"openEditResourceModal()\"\n (keydown.enter)=\"openEditResourceModal()\"\n (keydown.space)=\"openEditResourceModal()\"\n ></i>\n }\n </div>\n <div class=\"description-content\">\n <p class=\"description\" [innerHTML]=\"resourceDescription || 'UPDATE ME ON ADMIN/DOMAINS MODULE.'\">\n </p>\n </div>\n </div>\n\n <!-- Right Content -->\n <div class=\"col-lg-6 col-12 img-wrapper\">\n @if (resourceImage) {\n <img\n [src]=\"resourceImage\"\n alt=\"Vault Mockup\"\n class=\"img-fluid\"\n width=\"800\"\n height=\"600\"\n fetchpriority=\"high\"\n decoding=\"async\"\n loading=\"eager\" />\n } @else {\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n }\n\n <ng-template #noVideo>\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n<!-- Edit Modal -->\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resources</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"editTagline\" class=\"form-label\">Tagline</label>\n <input id=\"editTagline\" [(ngModel)]=\"editingTagline\" class=\"form-control\"\n aria-label=\"Edit Tagline\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"editDescription\" class=\"form-label\">Description</label>\n <textarea id=\"editDescription\" name=\"editingDescription\" [(ngModel)]=\"editingDescription\" rows=\"4\" class=\"form-control\"\n aria-label=\"Editing Description\"></textarea>\n </div>\n <div class=\"mb-3\">\n <span class=\"pw-label-style form-label\" id=\"vault-section-resource-image-label\">Resource Image</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img\n [src]=\"image || 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100 mb-2\"\n alt=\"Resource content\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n\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 {{ file || image ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image) {\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\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveResourceContent(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #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.</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",
283
- styles: [".vault-section{position:relative;padding:5rem 0;color:#fff;background:linear-gradient(90deg,var(--first) 0%,#a8e1fb 100%);overflow:hidden}.vault-section:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:61%;background:#fff;clip-path:polygon(0 18%,100% 0%,100% 100%,0% 100%);z-index:1}.vault-section .container{position:relative;z-index:2}.vault-section .row{min-height:600px;align-items:center}.vault-section .text-content{max-width:550px;height:100%;display:flex;flex-direction:column;justify-content:center}.vault-section .text-content .headline{font-weight:500;color:#fff!important;font-size:4.5rem!important}.vault-section .text-content .description{font-size:2rem;line-height:3rem;font-weight:400;color:var(--text-color, currentColor);margin-bottom:1rem}.vault-section .text-content .description strong{font-weight:700}.vault-section .text-content .cta-btn{display:inline-block;background:var(--text-color, black);color:#fff;padding:1rem 2rem;border-radius:40px;font-weight:500;text-decoration:none;font-size:1.4rem;border:1px solid;box-shadow:none!important;border-color:var(--text-color, textColor)}.vault-section .text-content .cta-btn:hover{background-color:#fff!important;color:var(--text-color, black)!important}.vault-section .img-wrapper{text-align:center;min-height:400px;display:flex;align-items:center;justify-content:center}@media(width>=991px){.vault-section .img-wrapper{min-height:600px}.vault-section .img-wrapper img,.vault-section .img-wrapper pw-no-data{max-width:800px;max-height:800px;height:auto;width:100%;object-fit:contain}}@media(width>=991px){.vault-section img,.vault-section pw-no-data{max-width:800px;width:100%;height:auto;position:relative;top:11.6rem}.vault-section .description-content{max-width:500px;position:absolute;margin-top:31rem!important}.vault-section .headline{margin-bottom:21rem!important}}@media(width>=1100px){.vault-section img,.vault-section pw-no-data{left:25%}}@media(width>=991px)and (width<=1100px){.vault-section img,.vault-section pw-no-data{top:12.9rem!important;left:19%}}@media(width<=991px){.vault-section .vault-row{text-align:center;justify-content:center}.vault-section img,.vault-section pw-no-data{top:5rem!important;position:relative}}@media(width<=768px){.vault-section .text-content{text-align:center;margin-bottom:2rem;margin-top:3rem!important}.vault-section .text-content .headline{font-size:3rem!important}.vault-section .text-content .description{font-size:1.5rem;line-height:2rem}}.tag-edit-icon{margin-top:2rem!important}\n"],
283
+ template: "<section class=\"vault-section\">\n <div class=\"skewed-bg\"></div>\n\n <!-- Edit Icon (top-right) -->\n\n <div class=\"container\">\n <div class=\"row align-items-center vault-row\">\n <!-- Left Content -->\n <div class=\"col-lg-6 col-12 text-content\">\n <div class=\"d-flex\">\n <h1 class=\"headline\">{{resourceTagLine || 'UPDATE ME ON ADMIN/DOMAINS MODULE'}}</h1>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit tag-edit-icon in-page-edit-icon mt-4 ms-3 cursor-pointer\"\n title=\"Edit Resource\"\n (click)=\"openEditResourceModal()\"\n (keydown.enter)=\"openEditResourceModal()\"\n (keydown.space)=\"openEditResourceModal()\"\n ></i>\n }\n </div>\n <div class=\"description-content\">\n <p class=\"description\" [innerHTML]=\"resourceDescription || 'UPDATE ME ON ADMIN/DOMAINS MODULE.'\">\n </p>\n </div>\n </div>\n\n <!-- Right Content -->\n <div class=\"col-lg-6 col-12 img-wrapper\">\n @if (resourceImage) {\n <img\n [src]=\"resourceImage\"\n alt=\"Vault Mockup\"\n class=\"img-fluid\"\n width=\"800\"\n height=\"600\"\n fetchpriority=\"high\"\n decoding=\"async\"\n loading=\"eager\" />\n } @else {\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n }\n\n <ng-template #noVideo>\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n<!-- Edit Modal -->\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resources</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"editTagline\" class=\"form-label\">Tagline</label>\n <input id=\"editTagline\" [(ngModel)]=\"editingTagline\" class=\"form-control\"\n aria-label=\"Edit Tagline\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"editDescription\" class=\"form-label\">Description</label>\n <textarea id=\"editDescription\" name=\"editingDescription\" [(ngModel)]=\"editingDescription\" rows=\"4\" class=\"form-control\"\n aria-label=\"Editing Description\"></textarea>\n </div>\n <div class=\"mb-3\">\n <span class=\"pw-label-style form-label\" id=\"vault-section-resource-image-label\">Resource Image</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img\n [src]=\"image || 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100 mb-2\"\n alt=\"Resource content\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n\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 {{ file || image ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image) {\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\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveResourceContent(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #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.</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",
284
+ styles: [".vault-section{position:relative;padding:5rem 0;color:#fff;background:linear-gradient(90deg,var(--first) 0%,#a8e1fb 100%);overflow:hidden}.vault-section:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:61%;background:#fff;clip-path:polygon(0 18%,100% 0%,100% 100%,0% 100%);z-index:1}.vault-section .container{position:relative;z-index:2}.vault-section .row{min-height:600px;align-items:center}.vault-section .text-content{max-width:550px;height:100%;display:flex;flex-direction:column;justify-content:center}.vault-section .text-content .headline{font-weight:500;color:#fff!important;font-size:4.5rem!important;letter-spacing:-.005em;padding-bottom:0}.vault-section .text-content .description{font-size:2rem;line-height:3rem;font-weight:400;color:var(--text-color, currentColor);margin-bottom:1rem}.vault-section .text-content .description strong{font-weight:700}.vault-section .text-content .cta-btn{display:inline-block;background:var(--text-color, black);color:#fff;padding:1rem 2rem;border-radius:40px;font-weight:500;text-decoration:none;font-size:1.4rem;border:1px solid;box-shadow:none!important;border-color:var(--text-color, textColor)}.vault-section .text-content .cta-btn:hover{background-color:#fff!important;color:var(--text-color, black)!important}.vault-section .img-wrapper{text-align:center;min-height:400px;display:flex;align-items:center;justify-content:center}@media(width>=991px){.vault-section .img-wrapper{min-height:600px}.vault-section .img-wrapper img,.vault-section .img-wrapper pw-no-data{max-width:800px;max-height:800px;height:auto;width:100%;object-fit:contain}}@media(width>=991px){.vault-section img,.vault-section pw-no-data{max-width:800px;width:100%;height:auto;position:relative;top:11.6rem}.vault-section .description-content{max-width:500px;position:absolute;margin-top:31rem!important}.vault-section .headline{margin-bottom:21rem!important}}@media(width>=1100px){.vault-section img,.vault-section pw-no-data{left:25%}}@media(width>=991px)and (width<=1100px){.vault-section img,.vault-section pw-no-data{top:12.9rem!important;left:19%}}@media(width<=991px){.vault-section .vault-row{text-align:center;justify-content:center}.vault-section img,.vault-section pw-no-data{top:5rem!important;position:relative}}@media(width<=768px){.vault-section .text-content{text-align:center;margin-bottom:2rem;margin-top:3rem!important}.vault-section .text-content .headline{font-size:3rem!important}.vault-section .text-content .description{font-size:1.5rem;line-height:2rem}}.tag-edit-icon{margin-top:2rem!important}\n"],
284
285
  dependencies: [
285
286
  {
286
287
  kind: "directive",
@@ -363,8 +364,8 @@ i0.ɵɵngDeclareClassMetadata({
363
364
  TranslocoPipe
364
365
  ],
365
366
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
366
- template: "<section class=\"vault-section\">\n <div class=\"skewed-bg\"></div>\n\n <!-- Edit Icon (top-right) -->\n\n <div class=\"container\">\n <div class=\"row align-items-center vault-row\">\n <!-- Left Content -->\n <div class=\"col-lg-6 col-12 text-content\">\n <div class=\"d-flex\">\n <h2 class=\"headline\">{{resourceTagLine || 'UPDATE ME ON ADMIN/DOMAINS MODULE'}}</h2>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit tag-edit-icon in-page-edit-icon mt-4 ms-3 cursor-pointer\"\n title=\"Edit Resource\"\n (click)=\"openEditResourceModal()\"\n (keydown.enter)=\"openEditResourceModal()\"\n (keydown.space)=\"openEditResourceModal()\"\n ></i>\n }\n </div>\n <div class=\"description-content\">\n <p class=\"description\" [innerHTML]=\"resourceDescription || 'UPDATE ME ON ADMIN/DOMAINS MODULE.'\">\n </p>\n </div>\n </div>\n\n <!-- Right Content -->\n <div class=\"col-lg-6 col-12 img-wrapper\">\n @if (resourceImage) {\n <img\n [src]=\"resourceImage\"\n alt=\"Vault Mockup\"\n class=\"img-fluid\"\n width=\"800\"\n height=\"600\"\n fetchpriority=\"high\"\n decoding=\"async\"\n loading=\"eager\" />\n } @else {\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n }\n\n <ng-template #noVideo>\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n<!-- Edit Modal -->\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resources</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"editTagline\" class=\"form-label\">Tagline</label>\n <input id=\"editTagline\" [(ngModel)]=\"editingTagline\" class=\"form-control\"\n aria-label=\"Edit Tagline\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"editDescription\" class=\"form-label\">Description</label>\n <textarea id=\"editDescription\" name=\"editingDescription\" [(ngModel)]=\"editingDescription\" rows=\"4\" class=\"form-control\"\n aria-label=\"Editing Description\"></textarea>\n </div>\n <div class=\"mb-3\">\n <span class=\"pw-label-style form-label\" id=\"vault-section-resource-image-label\">Resource Image</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img\n [src]=\"image || 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100 mb-2\"\n alt=\"Resource content\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n\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 {{ file || image ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image) {\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\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveResourceContent(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #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.</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",
367
- styles: [".vault-section{position:relative;padding:5rem 0;color:#fff;background:linear-gradient(90deg,var(--first) 0%,#a8e1fb 100%);overflow:hidden}.vault-section:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:61%;background:#fff;clip-path:polygon(0 18%,100% 0%,100% 100%,0% 100%);z-index:1}.vault-section .container{position:relative;z-index:2}.vault-section .row{min-height:600px;align-items:center}.vault-section .text-content{max-width:550px;height:100%;display:flex;flex-direction:column;justify-content:center}.vault-section .text-content .headline{font-weight:500;color:#fff!important;font-size:4.5rem!important}.vault-section .text-content .description{font-size:2rem;line-height:3rem;font-weight:400;color:var(--text-color, currentColor);margin-bottom:1rem}.vault-section .text-content .description strong{font-weight:700}.vault-section .text-content .cta-btn{display:inline-block;background:var(--text-color, black);color:#fff;padding:1rem 2rem;border-radius:40px;font-weight:500;text-decoration:none;font-size:1.4rem;border:1px solid;box-shadow:none!important;border-color:var(--text-color, textColor)}.vault-section .text-content .cta-btn:hover{background-color:#fff!important;color:var(--text-color, black)!important}.vault-section .img-wrapper{text-align:center;min-height:400px;display:flex;align-items:center;justify-content:center}@media(width>=991px){.vault-section .img-wrapper{min-height:600px}.vault-section .img-wrapper img,.vault-section .img-wrapper pw-no-data{max-width:800px;max-height:800px;height:auto;width:100%;object-fit:contain}}@media(width>=991px){.vault-section img,.vault-section pw-no-data{max-width:800px;width:100%;height:auto;position:relative;top:11.6rem}.vault-section .description-content{max-width:500px;position:absolute;margin-top:31rem!important}.vault-section .headline{margin-bottom:21rem!important}}@media(width>=1100px){.vault-section img,.vault-section pw-no-data{left:25%}}@media(width>=991px)and (width<=1100px){.vault-section img,.vault-section pw-no-data{top:12.9rem!important;left:19%}}@media(width<=991px){.vault-section .vault-row{text-align:center;justify-content:center}.vault-section img,.vault-section pw-no-data{top:5rem!important;position:relative}}@media(width<=768px){.vault-section .text-content{text-align:center;margin-bottom:2rem;margin-top:3rem!important}.vault-section .text-content .headline{font-size:3rem!important}.vault-section .text-content .description{font-size:1.5rem;line-height:2rem}}.tag-edit-icon{margin-top:2rem!important}\n"]
367
+ template: "<section class=\"vault-section\">\n <div class=\"skewed-bg\"></div>\n\n <!-- Edit Icon (top-right) -->\n\n <div class=\"container\">\n <div class=\"row align-items-center vault-row\">\n <!-- Left Content -->\n <div class=\"col-lg-6 col-12 text-content\">\n <div class=\"d-flex\">\n <h1 class=\"headline\">{{resourceTagLine || 'UPDATE ME ON ADMIN/DOMAINS MODULE'}}</h1>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit tag-edit-icon in-page-edit-icon mt-4 ms-3 cursor-pointer\"\n title=\"Edit Resource\"\n (click)=\"openEditResourceModal()\"\n (keydown.enter)=\"openEditResourceModal()\"\n (keydown.space)=\"openEditResourceModal()\"\n ></i>\n }\n </div>\n <div class=\"description-content\">\n <p class=\"description\" [innerHTML]=\"resourceDescription || 'UPDATE ME ON ADMIN/DOMAINS MODULE.'\">\n </p>\n </div>\n </div>\n\n <!-- Right Content -->\n <div class=\"col-lg-6 col-12 img-wrapper\">\n @if (resourceImage) {\n <img\n [src]=\"resourceImage\"\n alt=\"Vault Mockup\"\n class=\"img-fluid\"\n width=\"800\"\n height=\"600\"\n fetchpriority=\"high\"\n decoding=\"async\"\n loading=\"eager\" />\n } @else {\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n }\n\n <ng-template #noVideo>\n <pw-no-data [withImage]=\"true\" [message]=\"'ADD ME ON ADMIN/DOMAINS MODULE' | transloco\"></pw-no-data>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n<!-- Edit Modal -->\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resources</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"editTagline\" class=\"form-label\">Tagline</label>\n <input id=\"editTagline\" [(ngModel)]=\"editingTagline\" class=\"form-control\"\n aria-label=\"Edit Tagline\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"editDescription\" class=\"form-label\">Description</label>\n <textarea id=\"editDescription\" name=\"editingDescription\" [(ngModel)]=\"editingDescription\" rows=\"4\" class=\"form-control\"\n aria-label=\"Editing Description\"></textarea>\n </div>\n <div class=\"mb-3\">\n <span class=\"pw-label-style form-label\" id=\"vault-section-resource-image-label\">Resource Image</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img\n [src]=\"image || 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100 mb-2\"\n alt=\"Resource content\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n\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 {{ file || image ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image) {\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\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveResourceContent(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #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.</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",
368
+ styles: [".vault-section{position:relative;padding:5rem 0;color:#fff;background:linear-gradient(90deg,var(--first) 0%,#a8e1fb 100%);overflow:hidden}.vault-section:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:61%;background:#fff;clip-path:polygon(0 18%,100% 0%,100% 100%,0% 100%);z-index:1}.vault-section .container{position:relative;z-index:2}.vault-section .row{min-height:600px;align-items:center}.vault-section .text-content{max-width:550px;height:100%;display:flex;flex-direction:column;justify-content:center}.vault-section .text-content .headline{font-weight:500;color:#fff!important;font-size:4.5rem!important;letter-spacing:-.005em;padding-bottom:0}.vault-section .text-content .description{font-size:2rem;line-height:3rem;font-weight:400;color:var(--text-color, currentColor);margin-bottom:1rem}.vault-section .text-content .description strong{font-weight:700}.vault-section .text-content .cta-btn{display:inline-block;background:var(--text-color, black);color:#fff;padding:1rem 2rem;border-radius:40px;font-weight:500;text-decoration:none;font-size:1.4rem;border:1px solid;box-shadow:none!important;border-color:var(--text-color, textColor)}.vault-section .text-content .cta-btn:hover{background-color:#fff!important;color:var(--text-color, black)!important}.vault-section .img-wrapper{text-align:center;min-height:400px;display:flex;align-items:center;justify-content:center}@media(width>=991px){.vault-section .img-wrapper{min-height:600px}.vault-section .img-wrapper img,.vault-section .img-wrapper pw-no-data{max-width:800px;max-height:800px;height:auto;width:100%;object-fit:contain}}@media(width>=991px){.vault-section img,.vault-section pw-no-data{max-width:800px;width:100%;height:auto;position:relative;top:11.6rem}.vault-section .description-content{max-width:500px;position:absolute;margin-top:31rem!important}.vault-section .headline{margin-bottom:21rem!important}}@media(width>=1100px){.vault-section img,.vault-section pw-no-data{left:25%}}@media(width>=991px)and (width<=1100px){.vault-section img,.vault-section pw-no-data{top:12.9rem!important;left:19%}}@media(width<=991px){.vault-section .vault-row{text-align:center;justify-content:center}.vault-section img,.vault-section pw-no-data{top:5rem!important;position:relative}}@media(width<=768px){.vault-section .text-content{text-align:center;margin-bottom:2rem;margin-top:3rem!important}.vault-section .text-content .headline{font-size:3rem!important}.vault-section .text-content .description{font-size:1.5rem;line-height:2rem}}.tag-edit-icon{margin-top:2rem!important}\n"]
368
369
  }]
369
370
  }],
370
371
  propDecorators: {
@@ -696,10 +697,12 @@ const routes = [{
696
697
  path: "",
697
698
  component: ResourceComponent,
698
699
  data: {
699
- title: "Resources Library",
700
+ title: "Resources: Guides, Videos and Case Studies",
701
+ description: "Browse guides, videos, case studies, white papers, events and release notes to get more out of the platform.",
700
702
  permission: "Pages.Blog",
701
703
  preload: false
702
- }
704
+ },
705
+ canActivate: [SeoGuard]
703
706
  }];
704
707
  var ResourceRootModule = class ResourceRootModule {
705
708
  static {
@@ -763,4 +766,4 @@ i0.ɵɵngDeclareClassMetadata({
763
766
  });
764
767
  export { ResourceRootModule };
765
768
 
766
- //# sourceMappingURL=posiwise-resource-module-resource-root.module-x4TYntdq.mjs.map
769
+ //# sourceMappingURL=posiwise-resource-module-resource-root.module-TMvR1c1H.mjs.map