@posiwise/resource-module 0.0.163 → 0.0.165

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 (108) hide show
  1. package/fesm2022/{posiwise-resource-module-base-top-banner.component-Cxeoyf5z.mjs → posiwise-resource-module-base-top-banner.component-qdYdb5Le.mjs} +7 -6
  2. package/fesm2022/posiwise-resource-module-base-top-banner.component-qdYdb5Le.mjs.map +1 -0
  3. package/fesm2022/posiwise-resource-module-posiwise-resource-module-DlOc6owW.mjs +1795 -0
  4. package/fesm2022/posiwise-resource-module-posiwise-resource-module-DlOc6owW.mjs.map +1 -0
  5. package/fesm2022/posiwise-resource-module-resource-blogs.module-BY02aMCz.mjs +69 -0
  6. package/fesm2022/posiwise-resource-module-resource-blogs.module-BY02aMCz.mjs.map +1 -0
  7. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CP7-pHth.mjs +133 -0
  8. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CP7-pHth.mjs.map +1 -0
  9. package/fesm2022/posiwise-resource-module-resource-events.module-CXAhiCS6.mjs +228 -0
  10. package/fesm2022/posiwise-resource-module-resource-events.module-CXAhiCS6.mjs.map +1 -0
  11. package/fesm2022/posiwise-resource-module-resource-hub.module-a6qHwXRb.mjs +233 -0
  12. package/fesm2022/posiwise-resource-module-resource-hub.module-a6qHwXRb.mjs.map +1 -0
  13. package/fesm2022/posiwise-resource-module-resource-integrations.module-WfJfGko9.mjs +274 -0
  14. package/fesm2022/posiwise-resource-module-resource-integrations.module-WfJfGko9.mjs.map +1 -0
  15. package/fesm2022/posiwise-resource-module-resource-post.module-DvTdeeQt.mjs +304 -0
  16. package/fesm2022/posiwise-resource-module-resource-post.module-DvTdeeQt.mjs.map +1 -0
  17. package/fesm2022/posiwise-resource-module-resource-release-notes.module-CxAh59AL.mjs +104 -0
  18. package/fesm2022/posiwise-resource-module-resource-release-notes.module-CxAh59AL.mjs.map +1 -0
  19. package/fesm2022/posiwise-resource-module-resource-root.module-BHGO5PqT.mjs +393 -0
  20. package/fesm2022/posiwise-resource-module-resource-root.module-BHGO5PqT.mjs.map +1 -0
  21. package/fesm2022/posiwise-resource-module-resource-videos.module-BJxrv9JZ.mjs +69 -0
  22. package/fesm2022/posiwise-resource-module-resource-videos.module-BJxrv9JZ.mjs.map +1 -0
  23. package/fesm2022/posiwise-resource-module-resource-white-papers.module-iWQ29ue6.mjs +70 -0
  24. package/fesm2022/posiwise-resource-module-resource-white-papers.module-iWQ29ue6.mjs.map +1 -0
  25. package/fesm2022/posiwise-resource-module.mjs +1 -31
  26. package/fesm2022/posiwise-resource-module.mjs.map +1 -1
  27. package/lib/public/components/resource-case-studies/resource-case-studies.component.d.ts +1 -0
  28. package/lib/public/shared/resource-shared.module.d.ts +1 -1
  29. package/package.json +4 -6
  30. package/esm2022/index.mjs +0 -25
  31. package/esm2022/lib/public/components/base/base-resource.component.mjs +0 -144
  32. package/esm2022/lib/public/components/base/base-top-banner.component.mjs +0 -111
  33. package/esm2022/lib/public/components/reslease-note-card/release-note-card.component.mjs +0 -174
  34. package/esm2022/lib/public/components/resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.mjs +0 -27
  35. package/esm2022/lib/public/components/resource-blogs/resource-blog.component.mjs +0 -27
  36. package/esm2022/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.mjs +0 -108
  37. package/esm2022/lib/public/components/resource-case-studies/resource-case-studies.component.mjs +0 -78
  38. package/esm2022/lib/public/components/resource-company-card/resource-company-card.component.mjs +0 -88
  39. package/esm2022/lib/public/components/resource-contact-us/resource-contact-us.module.mjs +0 -16
  40. package/esm2022/lib/public/components/resource-edit-card/resource-edit-card.component.mjs +0 -230
  41. package/esm2022/lib/public/components/resource-edit-card-lazy/resource-edit-card-lazy.component.mjs +0 -75
  42. package/esm2022/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.mjs +0 -27
  43. package/esm2022/lib/public/components/resource-integration/resource-integration.component.mjs +0 -237
  44. package/esm2022/lib/public/components/resource-post/related-resources/related-resources.component.mjs +0 -124
  45. package/esm2022/lib/public/components/resource-post/related-resources/resource-cards/resource-cards.component.mjs +0 -107
  46. package/esm2022/lib/public/components/resource-post/resource-post-details/resource-post-details.component.mjs +0 -128
  47. package/esm2022/lib/public/components/resource-post/resource-post.component.mjs +0 -39
  48. package/esm2022/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.mjs +0 -27
  49. package/esm2022/lib/public/components/resource-release-notes/resource-release-notes.component.mjs +0 -59
  50. package/esm2022/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.mjs +0 -106
  51. package/esm2022/lib/public/components/resource-vault/resource-vault.component.mjs +0 -76
  52. package/esm2022/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.mjs +0 -130
  53. package/esm2022/lib/public/components/resource-videos/resource-videos-top-banner/resource-videos-top-banner.component.mjs +0 -27
  54. package/esm2022/lib/public/components/resource-videos/resource-videos.component.mjs +0 -27
  55. package/esm2022/lib/public/components/resource-webinars/replay-event-cards/replay-event-cards.component.mjs +0 -101
  56. package/esm2022/lib/public/components/resource-webinars/resource-webinars.component.mjs +0 -115
  57. package/esm2022/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.mjs +0 -148
  58. package/esm2022/lib/public/components/resources/resource-tags/resource-tags.component.mjs +0 -84
  59. package/esm2022/lib/public/components/resources/resources.component.mjs +0 -84
  60. package/esm2022/lib/public/components/resources/vault-section/vault-section.component.mjs +0 -160
  61. package/esm2022/lib/public/components/resources-hub/resources-hub.component.mjs +0 -208
  62. package/esm2022/lib/public/components/testimonial-card/testimonial-card.component.mjs +0 -86
  63. package/esm2022/lib/public/components/white-papers/white-papers-top-banner/white-papers-top-banner.component.mjs +0 -27
  64. package/esm2022/lib/public/components/white-papers/white-papers.component.mjs +0 -27
  65. package/esm2022/lib/public/modules/blogs/resource-blogs.module.mjs +0 -31
  66. package/esm2022/lib/public/modules/case-studies/resource-case-studies.module.mjs +0 -36
  67. package/esm2022/lib/public/modules/events/resource-events.module.mjs +0 -31
  68. package/esm2022/lib/public/modules/hub/resource-hub.module.mjs +0 -30
  69. package/esm2022/lib/public/modules/integrations/resource-integrations.module.mjs +0 -31
  70. package/esm2022/lib/public/modules/post/resource-post.module.mjs +0 -33
  71. package/esm2022/lib/public/modules/release-notes/resource-release-notes.module.mjs +0 -31
  72. package/esm2022/lib/public/modules/root/resource-root-shared.module.mjs +0 -61
  73. package/esm2022/lib/public/modules/root/resource-root.module.mjs +0 -33
  74. package/esm2022/lib/public/modules/videos/resource-videos.module.mjs +0 -31
  75. package/esm2022/lib/public/modules/white-papers/resource-white-papers.module.mjs +0 -32
  76. package/esm2022/lib/public/resource-public.module.mjs +0 -18
  77. package/esm2022/lib/public/resource-public.routing.module.mjs +0 -61
  78. package/esm2022/lib/public/shared/resource-cards.module.mjs +0 -121
  79. package/esm2022/lib/public/shared/resource-edit.module.mjs +0 -64
  80. package/esm2022/lib/public/shared/resource-shared.module.mjs +0 -128
  81. package/esm2022/lib/resource.module.mjs +0 -15
  82. package/esm2022/lib/resource.service.mjs +0 -79
  83. package/esm2022/lib/shared/models/resource.model.mjs +0 -12
  84. package/esm2022/lib/shared/resource-modal.interface.mjs +0 -2
  85. package/esm2022/posiwise-resource-module.mjs +0 -5
  86. package/fesm2022/posiwise-resource-module-base-top-banner.component-Cxeoyf5z.mjs.map +0 -1
  87. package/fesm2022/posiwise-resource-module-posiwise-resource-module-B1G5qNj1.mjs +0 -1795
  88. package/fesm2022/posiwise-resource-module-posiwise-resource-module-B1G5qNj1.mjs.map +0 -1
  89. package/fesm2022/posiwise-resource-module-resource-blogs.module-CTYKg3kh.mjs +0 -91
  90. package/fesm2022/posiwise-resource-module-resource-blogs.module-CTYKg3kh.mjs.map +0 -1
  91. package/fesm2022/posiwise-resource-module-resource-case-studies.module-Dov1BAfF.mjs +0 -127
  92. package/fesm2022/posiwise-resource-module-resource-case-studies.module-Dov1BAfF.mjs.map +0 -1
  93. package/fesm2022/posiwise-resource-module-resource-events.module-K3sH1mdv.mjs +0 -245
  94. package/fesm2022/posiwise-resource-module-resource-events.module-K3sH1mdv.mjs.map +0 -1
  95. package/fesm2022/posiwise-resource-module-resource-hub.module-C5t2KeqW.mjs +0 -249
  96. package/fesm2022/posiwise-resource-module-resource-hub.module-C5t2KeqW.mjs.map +0 -1
  97. package/fesm2022/posiwise-resource-module-resource-integrations.module-CN_tWJV2.mjs +0 -287
  98. package/fesm2022/posiwise-resource-module-resource-integrations.module-CN_tWJV2.mjs.map +0 -1
  99. package/fesm2022/posiwise-resource-module-resource-post.module-PsfJSV3t.mjs +0 -318
  100. package/fesm2022/posiwise-resource-module-resource-post.module-PsfJSV3t.mjs.map +0 -1
  101. package/fesm2022/posiwise-resource-module-resource-release-notes.module-TR3GIX0u.mjs +0 -124
  102. package/fesm2022/posiwise-resource-module-resource-release-notes.module-TR3GIX0u.mjs.map +0 -1
  103. package/fesm2022/posiwise-resource-module-resource-root.module-Bm5Wv4mP.mjs +0 -408
  104. package/fesm2022/posiwise-resource-module-resource-root.module-Bm5Wv4mP.mjs.map +0 -1
  105. package/fesm2022/posiwise-resource-module-resource-videos.module-CDBHydlX.mjs +0 -91
  106. package/fesm2022/posiwise-resource-module-resource-videos.module-CDBHydlX.mjs.map +0 -1
  107. package/fesm2022/posiwise-resource-module-resource-white-papers.module-DVDuexfj.mjs +0 -92
  108. package/fesm2022/posiwise-resource-module-resource-white-papers.module-DVDuexfj.mjs.map +0 -1
@@ -1,318 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Component, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
- import * as i1$1 from '@angular/router';
4
- import { RouterModule } from '@angular/router';
5
- import * as i3 from '@angular/platform-browser';
6
- import { AppBaseComponent } from '@posiwise/app-base-component';
7
- import * as i2 from '@posiwise/common-services';
8
- import { HelperService } from '@posiwise/helper-service';
9
- import { e as ResourceService, a as ResourceCardComponent, g as ResourceSharedModule } from './posiwise-resource-module-posiwise-resource-module-B1G5qNj1.mjs';
10
- import * as i1 from '@angular/forms';
11
- import { UntypedFormBuilder, Validators } from '@angular/forms';
12
- import * as i3$1 from '@angular/common';
13
- import * as i8 from '@posiwise/directives';
14
- import * as i9 from '@posiwise/alpha-module';
15
- import * as i10 from 'primeng/inputtextarea';
16
- import * as i10$1 from '@jsverse/transloco';
17
- import * as i4 from '@posiwise/resource-contact-us';
18
- import * as i6$1 from '@posiwise/utils';
19
- import { ADMIN_ROUTERS } from '@posiwise/common-utilities';
20
- import * as i6 from '@posiwise/shared-components';
21
- import * as i12 from '@posiwise/pipes';
22
- import '@posiwise/core-transloco';
23
- import 'primeng/inputtext';
24
- import 'rxjs';
25
- import 'primeng/paginator';
26
- import '@ng-bootstrap/ng-bootstrap';
27
- import '@angular/cdk/drag-drop';
28
- import 'ngx-captcha';
29
- import 'primeng/dropdown';
30
- import 'primeng/progressspinner';
31
- import 'ngx-quill';
32
- import 'ngx-ui-switch';
33
- import 'primeng/autocomplete';
34
- import 'primeng/calendar';
35
- import 'moment';
36
-
37
- class ResourceBlog {
38
- static getResourcePostsForm() {
39
- return new UntypedFormBuilder().group({
40
- related_entity_id: [''],
41
- related_entity_type: [''],
42
- comment: [null, Validators.required],
43
- user_id: ['']
44
- });
45
- }
46
- }
47
-
48
- class RelatedResourcesComponent extends AppBaseComponent {
49
- constructor(resourceService, injector, sanitizer, tagService, authService, toastr) {
50
- super(injector);
51
- this.resourceService = resourceService;
52
- this.sanitizer = sanitizer;
53
- this.tagService = tagService;
54
- this.authService = authService;
55
- this.toastr = toastr;
56
- this.resourceCards = [
57
- {
58
- title: 'BLOG: Here’s why you should QA your distributor invoices',
59
- image: '/assets/img/resource/resource-qa.png',
60
- alt: 'QA distributor invoices',
61
- url: '/resources/view/here-s-why-you-should-be-seeking-independent-qa-of-all-distributor-inv'
62
- },
63
- {
64
- title: 'BLOG: 4 instant hacks to uplift your MSP’s monthly billing',
65
- image: '/assets/img/resource/resource-hacks.png',
66
- alt: 'Monthly billing hacks',
67
- url: '/resources/view/4-instant-hacks-to-uplift-your-msp-s-monthly-billing'
68
- },
69
- {
70
- title: 'BLOG: The trivial detail that will either future-proof or sabotage your PSA.',
71
- image: '/assets/img/resource/resource-psa.png',
72
- alt: 'PSA future-proof',
73
- url: '/resources/view/the-trivial-detail-that-will-either-future-proof-or-sabotage-your-psa'
74
- }
75
- ];
76
- this.postComments = [];
77
- this.demoLinks = this.appConfig?.pages_config?.book_demo?.items;
78
- this.linkedInUrl = this.appConfig?.social?.linkedin_url;
79
- this.company_email = this.appConfig.company.email;
80
- this.commentForm = ResourceBlog.getResourcePostsForm();
81
- }
82
- ngOnInit() {
83
- this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
84
- this.route.params.subscribe(params => {
85
- this.slug = params['slug'] ?? '';
86
- this.getBlogItem(this.slug);
87
- });
88
- this.authService.getToken$().subscribe(res => {
89
- this.userLoggedIn = !!res;
90
- if (this.userLoggedIn) {
91
- this.localStorage.getItem$('product').subscribe(res => {
92
- const data = res ? JSON.parse(res) : null;
93
- this.subscriptionId = data?.subscriptionId;
94
- });
95
- this.userService.getUserInfo().subscribe(data => {
96
- this.user = data;
97
- this.getPostTags();
98
- });
99
- }
100
- else {
101
- this.getPostTags();
102
- }
103
- });
104
- }
105
- get hasValidDemoLinks() {
106
- return (Array.isArray(this.demoLinks) && this.demoLinks.some(link => link?.title ?? link?.url));
107
- }
108
- getPostTags() {
109
- this.tagService
110
- .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())
111
- .subscribe(response => {
112
- this.blogPostTag = response.tags.find(tag => tag.name === 'Blog Posts');
113
- });
114
- }
115
- getBlogItem(slug) {
116
- this.resourceService.getPostBySlug(slug).subscribe(response => {
117
- let blogBody;
118
- if (response?.body) {
119
- blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);
120
- }
121
- const date = new Date(response?.when);
122
- const formatted = date.toISOString().split('T')[0];
123
- this.postComments = response.entity_comments;
124
- this.post = { ...response, body: blogBody, when: formatted };
125
- });
126
- }
127
- onComment() {
128
- const data = { ...this.commentForm.value };
129
- data.related_entity_id = this.post?.id;
130
- data.related_entity_type = 'Post';
131
- data.user_id = this.user?.id;
132
- this.resourceService.postComments(data).subscribe(() => {
133
- this.getBlogItem(this.slug);
134
- this.commentForm.reset();
135
- this.toastr.success(this.translation.translate('Resource.Posts.CommentAdded'));
136
- });
137
- }
138
- trackByComment(_index, item) {
139
- return item.id;
140
- }
141
- /** Helper method to get effective subscription ID */
142
- getEffectiveSubscriptionId() {
143
- return HelperService.getEffectiveSubscriptionId(this.user, this.subscriptionId, this.masterSubscriptionId);
144
- }
145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RelatedResourcesComponent, deps: [{ token: ResourceService }, { token: i0.Injector }, { token: i3.DomSanitizer }, { token: i2.TagService }, { token: i2.AuthService }, { token: i2.CustomToastService }], target: i0.ɵɵFactoryTarget.Component }); }
146
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: RelatedResourcesComponent, selector: "pw-related-resources", usesInheritance: true, ngImport: i0, template: "\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 <form\n class=\"p-fluid mb-5\"\n [formGroup]=\"commentForm\"\n (ngSubmit)=\"onComment()\"\n *ngIf=\"userLoggedIn; else userLoggedOut\"\n >\n <div class=\"card shadow-sm no-border p-4\">\n <div class=\"field\">\n <label for=\"comment\" class=\"font-bold text-lg mb-4 comment-label\">\uD83D\uDCAC Leave a comment</label>\n <textarea\n pInputTextarea\n formControlName=\"comment\"\n rows=\"6\"\n autoResize=\"true\"\n class=\"p-inputtext p-component p-inputtextarea\"\n placeholder=\"What's on your mind?\"\n ></textarea>\n <small\n class=\"text-danger\"\n *ngIf=\"commentForm.get('comment')?.invalid && commentForm.get('comment')?.touched\"\n >Please enter comment</small\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 <ng-template #userLoggedOut>\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 </ng-template>\n </div>\n </div>\n\n <div class=\"row mt-5 comment-row\" *ngIf=\"postComments.length > 0\">\n <div class=\"col-12\" *ngFor=\"let comment of postComments; trackBy: trackByComment\">\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 </div>\n\n\n </section>\n </div>\n <hr class=\"resource-divider\" />\n</section>\n\n<section class=\"resource-book-section\" *ngIf=\"hasValidDemoLinks\">\n <div class=\"container\">\n\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<pw-resource-cards *ngIf=\"blogPostTag?.tag_category_id\" [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", styles: [".video-row{gap:5.5rem!important;margin-top:3rem!important}::ng-deep .resource-section{box-shadow:0 4px 32px -14px #40576d4d!important}.release-icon{height:auto;margin:0 11px 1.9rem;display:block;align-self:center}@media (width >= 768px) and (width <= 1200px){.resource-title{font-size:1.4rem!important}}textarea{font-size:1.4rem!important}@media (width <= 768px){.resource-title{font-size:1.2rem!important}.container{padding:1rem!important}}@media (width >= 768px) and (width <= 1200px){.container{padding:1rem 3rem!important}}@media (width <= 1200px){.resource-vault-section .vault-heading{font-size:3.5rem}.resource-vault-section .vault-description{margin-top:1.35rem}.resource-vault-section .vault-card{width:100%!important}.resource-vault-section .vault-btn{margin-left:0!important;width:100%!important}}@media (width >= 991px){::ng-deep .trial-meeting-section:before{top:600px!important}::ng-deep .dashboard{margin-bottom:1rem!important}section.bg-white.text-center.extra-top-padding{position:relative;overflow:hidden}section.bg-white.text-center.extra-top-padding .banner-header{margin-bottom:4rem!important}section.bg-white.text-center.extra-top-padding:before,section.bg-white.text-center.extra-top-padding:after{content:\"\";position:absolute;background:url(/assets/img/logos/background-banner.png) no-repeat;background-size:contain;width:160px;height:450px;z-index:0;opacity:.8}section.bg-white.text-center.extra-top-padding:before{top:500px;left:0}section.bg-white.text-center.extra-top-padding:after{top:90px;right:0}}.vault-header{text-align:left}@media (width >= 768px) and (width <= 1200px){.container{padding:0 6rem!important}}@media (width <= 1200px){.resource-card{width:100%!important}.release-notes-section{padding:7rem 0!important}}@media (width >= 768px) and (width <= 1200px){.resource-hero-section{padding:0 6rem!important}.cards-row{justify-content:center}}.resource-body-section{background-color:#fff}.resource-body-section .container{padding:0 1.5rem;padding-bottom:4rem!important;padding-top:7rem!important;max-width:850px;margin:0 auto;text-align:left}.user-not-logged-in{background:#f7f7f7;border:1px solid rgb(238,238,238);font-weight:400}.user-not-logged-in a{color:var(--first)!important;text-decoration:none;font-weight:500}.resource-book-section{background:#fff;padding-top:7rem;padding-bottom:0}.resource-book-section .container{max-width:850px;margin:0 auto;padding:0 2rem!important;text-align:left}.resource-book-section .resource-contact{line-height:1.6;font-size:1.5rem}.resource-book-section .resource-contact a{text-decoration:underline;color:#000;margin:0 .2rem}.resource-book-section .resource-contact a:hover{color:var(--first)!important}.resource-offer-section{background:#fff;padding-top:2rem}.resource-offer-section .container{max-width:850px;margin:0 auto;padding:0 1.5rem;text-align:left}.resource-offer-section .resource-title{font-size:2rem;font-weight:700;color:#000;margin-bottom:.25em!important}.resource-offer-section .resource-title strong{font-weight:700}.resource-offer-section .resource-description{font-size:1.5rem;line-height:1.8rem;color:#333;margin-bottom:1.5rem}.resource-offer-section .resource-offer-list{font-size:1.1rem;line-height:1.5rem;margin-bottom:2.5rem;margin-top:2.5rem}.resource-offer-section .resource-offer-list p{font-size:1.5rem;margin:.5rem 0;font-weight:400}.resource-offer-section .resource-signup{margin-bottom:2.5rem}.resource-offer-section .resource-signup .signup-link{font-size:1.5rem;font-weight:400;text-decoration:underline;color:#000}@media (width <= 768px){.resource-offer-section .resource-book-section{padding-top:2rem!important}.resource-offer-section .container{text-align:left}.resource-offer-section .resource-title{font-size:1.5rem}.resource-offer-section .resource-description,.resource-offer-section .resource-offer-list,.resource-offer-section .resource-signup,.resource-offer-section .signup-link,.resource-offer-section .resource-contact,.resource-offer-section .resource-offer-list p{font-size:1.2rem!important}}.resource-offer-intro{font-size:1.5rem;font-weight:400}.outer-section-fadeout{position:absolute;top:139rem;height:40px;width:100%;background:linear-gradient(to bottom,#fff0,#f8f9fa)}.body-divider{border:0;height:40px;width:100%;background:linear-gradient(to bottom,#0000,#00000026);margin:0}@media (width <= 768px){.resource-book-section{padding-top:2rem!important}.resource-contact{font-size:1.2rem!important}}::ng-deep .body-quill{border-width:0!important;max-width:900px;display:block;margin-left:auto;margin-right:auto}::ng-deep .p-inputtextarea{border-radius:.5rem;border-color:#ced4da;font-size:1rem}.card{background-color:#fff;border-radius:12px}.comment-row{gap:2rem;padding-bottom:5rem;max-width:1000px;display:block;margin-left:auto;margin-right:auto}.comment-label{font-size:1.5rem!important}.response-row{max-width:1000px;display:block;margin-left:auto;margin-right:auto;margin-top:3rem!important}\n"], dependencies: [{ kind: "component", type: ResourceCardComponent, selector: "pw-resource-cards", inputs: ["categoryId", "isHeaderVisible", "isRelated", "resourceTitle", "postSlice", "header", "tag", "resourceLink", "user", "userLoggedIn"] }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i8.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i8.LazyImgDirective, selector: "img" }, { kind: "component", type: i9.HubSpotMeetingsComponent, selector: "pw-book-a-demo", inputs: ["isBlog", "user", "userLoggedIn"] }, { kind: "directive", type: i10.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "pipe", type: i3$1.DatePipe, name: "date" }, { kind: "pipe", type: i10$1.TranslocoPipe, name: "transloco" }] }); }
147
- }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RelatedResourcesComponent, decorators: [{
149
- type: Component,
150
- args: [{ selector: 'pw-related-resources', template: "\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 <form\n class=\"p-fluid mb-5\"\n [formGroup]=\"commentForm\"\n (ngSubmit)=\"onComment()\"\n *ngIf=\"userLoggedIn; else userLoggedOut\"\n >\n <div class=\"card shadow-sm no-border p-4\">\n <div class=\"field\">\n <label for=\"comment\" class=\"font-bold text-lg mb-4 comment-label\">\uD83D\uDCAC Leave a comment</label>\n <textarea\n pInputTextarea\n formControlName=\"comment\"\n rows=\"6\"\n autoResize=\"true\"\n class=\"p-inputtext p-component p-inputtextarea\"\n placeholder=\"What's on your mind?\"\n ></textarea>\n <small\n class=\"text-danger\"\n *ngIf=\"commentForm.get('comment')?.invalid && commentForm.get('comment')?.touched\"\n >Please enter comment</small\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 <ng-template #userLoggedOut>\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 </ng-template>\n </div>\n </div>\n\n <div class=\"row mt-5 comment-row\" *ngIf=\"postComments.length > 0\">\n <div class=\"col-12\" *ngFor=\"let comment of postComments; trackBy: trackByComment\">\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 </div>\n\n\n </section>\n </div>\n <hr class=\"resource-divider\" />\n</section>\n\n<section class=\"resource-book-section\" *ngIf=\"hasValidDemoLinks\">\n <div class=\"container\">\n\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<pw-resource-cards *ngIf=\"blogPostTag?.tag_category_id\" [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", styles: [".video-row{gap:5.5rem!important;margin-top:3rem!important}::ng-deep .resource-section{box-shadow:0 4px 32px -14px #40576d4d!important}.release-icon{height:auto;margin:0 11px 1.9rem;display:block;align-self:center}@media (width >= 768px) and (width <= 1200px){.resource-title{font-size:1.4rem!important}}textarea{font-size:1.4rem!important}@media (width <= 768px){.resource-title{font-size:1.2rem!important}.container{padding:1rem!important}}@media (width >= 768px) and (width <= 1200px){.container{padding:1rem 3rem!important}}@media (width <= 1200px){.resource-vault-section .vault-heading{font-size:3.5rem}.resource-vault-section .vault-description{margin-top:1.35rem}.resource-vault-section .vault-card{width:100%!important}.resource-vault-section .vault-btn{margin-left:0!important;width:100%!important}}@media (width >= 991px){::ng-deep .trial-meeting-section:before{top:600px!important}::ng-deep .dashboard{margin-bottom:1rem!important}section.bg-white.text-center.extra-top-padding{position:relative;overflow:hidden}section.bg-white.text-center.extra-top-padding .banner-header{margin-bottom:4rem!important}section.bg-white.text-center.extra-top-padding:before,section.bg-white.text-center.extra-top-padding:after{content:\"\";position:absolute;background:url(/assets/img/logos/background-banner.png) no-repeat;background-size:contain;width:160px;height:450px;z-index:0;opacity:.8}section.bg-white.text-center.extra-top-padding:before{top:500px;left:0}section.bg-white.text-center.extra-top-padding:after{top:90px;right:0}}.vault-header{text-align:left}@media (width >= 768px) and (width <= 1200px){.container{padding:0 6rem!important}}@media (width <= 1200px){.resource-card{width:100%!important}.release-notes-section{padding:7rem 0!important}}@media (width >= 768px) and (width <= 1200px){.resource-hero-section{padding:0 6rem!important}.cards-row{justify-content:center}}.resource-body-section{background-color:#fff}.resource-body-section .container{padding:0 1.5rem;padding-bottom:4rem!important;padding-top:7rem!important;max-width:850px;margin:0 auto;text-align:left}.user-not-logged-in{background:#f7f7f7;border:1px solid rgb(238,238,238);font-weight:400}.user-not-logged-in a{color:var(--first)!important;text-decoration:none;font-weight:500}.resource-book-section{background:#fff;padding-top:7rem;padding-bottom:0}.resource-book-section .container{max-width:850px;margin:0 auto;padding:0 2rem!important;text-align:left}.resource-book-section .resource-contact{line-height:1.6;font-size:1.5rem}.resource-book-section .resource-contact a{text-decoration:underline;color:#000;margin:0 .2rem}.resource-book-section .resource-contact a:hover{color:var(--first)!important}.resource-offer-section{background:#fff;padding-top:2rem}.resource-offer-section .container{max-width:850px;margin:0 auto;padding:0 1.5rem;text-align:left}.resource-offer-section .resource-title{font-size:2rem;font-weight:700;color:#000;margin-bottom:.25em!important}.resource-offer-section .resource-title strong{font-weight:700}.resource-offer-section .resource-description{font-size:1.5rem;line-height:1.8rem;color:#333;margin-bottom:1.5rem}.resource-offer-section .resource-offer-list{font-size:1.1rem;line-height:1.5rem;margin-bottom:2.5rem;margin-top:2.5rem}.resource-offer-section .resource-offer-list p{font-size:1.5rem;margin:.5rem 0;font-weight:400}.resource-offer-section .resource-signup{margin-bottom:2.5rem}.resource-offer-section .resource-signup .signup-link{font-size:1.5rem;font-weight:400;text-decoration:underline;color:#000}@media (width <= 768px){.resource-offer-section .resource-book-section{padding-top:2rem!important}.resource-offer-section .container{text-align:left}.resource-offer-section .resource-title{font-size:1.5rem}.resource-offer-section .resource-description,.resource-offer-section .resource-offer-list,.resource-offer-section .resource-signup,.resource-offer-section .signup-link,.resource-offer-section .resource-contact,.resource-offer-section .resource-offer-list p{font-size:1.2rem!important}}.resource-offer-intro{font-size:1.5rem;font-weight:400}.outer-section-fadeout{position:absolute;top:139rem;height:40px;width:100%;background:linear-gradient(to bottom,#fff0,#f8f9fa)}.body-divider{border:0;height:40px;width:100%;background:linear-gradient(to bottom,#0000,#00000026);margin:0}@media (width <= 768px){.resource-book-section{padding-top:2rem!important}.resource-contact{font-size:1.2rem!important}}::ng-deep .body-quill{border-width:0!important;max-width:900px;display:block;margin-left:auto;margin-right:auto}::ng-deep .p-inputtextarea{border-radius:.5rem;border-color:#ced4da;font-size:1rem}.card{background-color:#fff;border-radius:12px}.comment-row{gap:2rem;padding-bottom:5rem;max-width:1000px;display:block;margin-left:auto;margin-right:auto}.comment-label{font-size:1.5rem!important}.response-row{max-width:1000px;display:block;margin-left:auto;margin-right:auto;margin-top:3rem!important}\n"] }]
151
- }], ctorParameters: () => [{ type: ResourceService }, { type: i0.Injector }, { type: i3.DomSanitizer }, { type: i2.TagService }, { type: i2.AuthService }, { type: i2.CustomToastService }] });
152
-
153
- class ResourcePostDetailsComponent extends AppBaseComponent {
154
- constructor(resourceService, tagService, authService, titleService, meta, injector, sanitizer) {
155
- super(injector);
156
- this.resourceService = resourceService;
157
- this.tagService = tagService;
158
- this.authService = authService;
159
- this.titleService = titleService;
160
- this.meta = meta;
161
- this.sanitizer = sanitizer;
162
- this.routers = ADMIN_ROUTERS;
163
- this.isLoaded = false;
164
- }
165
- ngOnInit() {
166
- this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
167
- this.getUserSubscriptionId().subscribe(response => {
168
- this.subscriptionId = response;
169
- });
170
- this.route.params.subscribe(params => {
171
- this.slug = params['slug'] ?? '';
172
- this.getBlogItem(this.slug);
173
- });
174
- this.authService.getToken$().subscribe(res => {
175
- this.userLoggedIn = !!res;
176
- if (res) {
177
- this.userService.getUserInfo().subscribe(data => {
178
- this.user = data;
179
- this.hasBlogAccess = HelperService.checkBlogPermission(this.user);
180
- });
181
- }
182
- this.getPostTags();
183
- });
184
- }
185
- getPostTags() {
186
- this.tagService
187
- .getTagsByType('post_categories', {}, this.subscriptionId || this.masterSubscriptionId)
188
- .subscribe(response => {
189
- this.blogPostTag = response.tags.find(tag => tag.name === 'Blog Posts');
190
- // Update SEO metadata again now that blogPostTag is available
191
- if (this.post) {
192
- this.setOpenGraphMetaTags();
193
- }
194
- })
195
- .add(() => {
196
- this.isLoaded = true;
197
- });
198
- }
199
- getBlogItem(slug) {
200
- this.resourceService.getPostBySlug(slug).subscribe(response => {
201
- let blogBody;
202
- if (response?.body) {
203
- blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);
204
- }
205
- this.post = { ...response, body: blogBody };
206
- });
207
- }
208
- setOpenGraphMetaTags() {
209
- console.log('Post', this.post);
210
- if (this.post.title) {
211
- // Debug: Log the title being set
212
- console.log('Setting og:title to:', this.post.title);
213
- // Check if title is generic placeholder
214
- if (this.post.title === 'Updated Trial Title') {
215
- console.warn('Using generic title "Updated Trial Title" - consider updating the resource title');
216
- }
217
- this.meta.updateTag({ property: 'og:title', content: this.post.title });
218
- this.meta.updateTag({ name: 'twitter:title', content: this.post.title });
219
- }
220
- else {
221
- console.warn('No title found in post data');
222
- }
223
- if (this.post.blurb) {
224
- this.meta.updateTag({ property: 'og:description', content: this.post.blurb });
225
- this.meta.updateTag({ name: 'twitter:description', content: this.post.blurb });
226
- }
227
- let imageUrl = null;
228
- if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {
229
- imageUrl = this.post.picture.url;
230
- }
231
- else if (this.blogPostTag?.image?.url &&
232
- !this.blogPostTag.image.url.includes('no_image_uploaded_squared')) {
233
- imageUrl = this.blogPostTag.image.url;
234
- }
235
- if (imageUrl) {
236
- this.meta.updateTag({ property: 'og:image', content: imageUrl });
237
- this.meta.updateTag({ name: 'twitter:image', content: imageUrl });
238
- }
239
- this.meta.updateTag({ property: 'og:type', content: 'article' });
240
- this.meta.updateTag({ property: 'og:url', content: window.location.href });
241
- this.meta.updateTag({ property: 'og:site_name', content: 'PosiWise' });
242
- // Twitter Card properties
243
- this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });
244
- this.meta.updateTag({ name: 'twitter:site', content: '@posiwise' });
245
- }
246
- getImageUrl() {
247
- if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {
248
- return this.post.picture.url;
249
- }
250
- else if (this.blogPostTag?.image?.url &&
251
- !this.blogPostTag.image.url.includes('no_image_uploaded_squared')) {
252
- return this.blogPostTag.image.url;
253
- }
254
- return null;
255
- }
256
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostDetailsComponent, deps: [{ token: ResourceService }, { token: i2.TagService }, { token: i2.AuthService }, { token: i3.Title }, { token: i3.Meta }, { token: i0.Injector }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
257
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ResourcePostDetailsComponent, selector: "pw-resource-post-details", usesInheritance: true, ngImport: i0, template: "<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\">BLOG</p>\n\n <h1 class=\"hero-title\">\n <span *ngIf=\"post?.title; else emptySpace\" [innerHTML]=\"post.title\"></span>\n <ng-template #emptySpace>\n &nbsp;\n </ng-template>\n <a *ngIf=\"userLoggedIn && hasBlogAccess\"\n class=\"ms-3 text-decoration-none\"\n ngbTooltip=\"Edit this post\"\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 </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 <div class=\"hero-right\" *ngIf=\"isLoaded\">\n <img\n *ngIf=\"getImageUrl(); else noImage\"\n [src]=\"getImageUrl()\"\n alt=\"Blog Post\"\n class=\"hero-image\"\n />\n\n <ng-template #noImage>\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 </ng-template>\n </div>\n </div>\n </section>\n", styles: [".outer-section-fadeout{position:absolute;top:46rem;height:40px;width:100%;background:linear-gradient(to bottom,#fff0,#f8f9fa)}.container-top{padding-top:6rem!important}.container-no-image{padding-top:15rem!important}.container{padding-bottom:2.5rem!important}.edit-icon{vertical-align:middle!important}.resource-hero-section{background:#fff;box-shadow:0 4px 32px -14px #40576d4d!important;position:relative}.resource-hero-section .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}.resource-hero-section .blog-label{font-weight:700;font-size:1.7rem;margin-bottom:3rem}.resource-hero-section .hero-title{font-size:3.75rem;font-weight:300;line-height:1.3;color:#000;margin-bottom:2rem}.resource-hero-section .hero-title strong{font-weight:800}.resource-hero-section .hero-left{max-width:700px}.resource-hero-section .author-info{display:flex;align-items:center;gap:1rem;max-width:100%;overflow:hidden}.resource-hero-section .author-info .mobile-math-image{margin-right:0!important;margin-bottom:1rem;height:100px!important}.resource-hero-section .author-info .author-img{width:60px;height:60px;border-radius:50%;object-fit:cover}.resource-hero-section .author-info .author-meta p{font-size:1.2rem;margin-bottom:0!important}.resource-hero-section .author-info .author-meta .date{font-size:.95rem;color:#333}.resource-hero-section .hero-right{flex-shrink:0;width:40%}.resource-hero-section .hero-right .hero-image{height:auto}@media (width <= 768px){.resource-hero-section .hero-title{font-size:2rem}.resource-hero-section .hero-right{margin-top:2rem;text-align:center;width:100%}.resource-hero-section .hero-right .data-image{width:100%}.resource-hero-section .hero-right .hero-image{max-width:300px;width:100%;position:relative;z-index:3;left:4%;height:auto!important;top:2rem}.resource-hero-section .author-info{flex-direction:row;justify-content:flex-start}}@media (width >= 1200px){.hero-image{max-width:500px!important;max-height:500px!important;height:auto;position:relative!important;top:2.5rem}}@media (width >= 1020px) and (width <= 1200px){.outer-section-fadeout{top:34rem!important}}@media (width >= 768px) and (width <= 869px){.hero-image{width:320px!important;height:auto;position:relative;top:7.7rem}.hero-left{max-width:500px!important}.resource-hero-section .container{flex-wrap:nowrap!important}}@media (width >= 869px) and (width <= 1199px){.hero-image{left:3%;position:relative;width:100%;max-width:600px!important;top:6.1rem;height:auto}.hero-left{max-width:500px!important}.resource-hero-section .container{flex-wrap:nowrap!important}}@media (width >= 768px) and (width <= 991px){.container{padding:18rem 6rem 6rem!important}}@media (width >= 991px) and (width <= 1200px){.container{padding:14rem 6rem 6rem!important}}@media (width >= 768px) and (width <= 1200px){.resource-hero-section{padding:0!important}.outer-section-fadeout{top:53rem}.hero-title{font-size:2.75rem!important}.hero-right{text-align:center;width:40%}}@media (width <= 768px){.container{padding:8rem 2rem 2rem!important}.outer-section-fadeout{top:50rem}}@media (width <= 400px){.mobile-math-image{margin-left:-1rem!important}}\n"], dependencies: [{ kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i8.LazyImgDirective, selector: "img" }, { kind: "component", type: i6.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i12.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i10$1.TranslocoPipe, name: "transloco" }] }); }
258
- }
259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostDetailsComponent, decorators: [{
260
- type: Component,
261
- args: [{ selector: 'pw-resource-post-details', template: "<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\">BLOG</p>\n\n <h1 class=\"hero-title\">\n <span *ngIf=\"post?.title; else emptySpace\" [innerHTML]=\"post.title\"></span>\n <ng-template #emptySpace>\n &nbsp;\n </ng-template>\n <a *ngIf=\"userLoggedIn && hasBlogAccess\"\n class=\"ms-3 text-decoration-none\"\n ngbTooltip=\"Edit this post\"\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 </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 <div class=\"hero-right\" *ngIf=\"isLoaded\">\n <img\n *ngIf=\"getImageUrl(); else noImage\"\n [src]=\"getImageUrl()\"\n alt=\"Blog Post\"\n class=\"hero-image\"\n />\n\n <ng-template #noImage>\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 </ng-template>\n </div>\n </div>\n </section>\n", styles: [".outer-section-fadeout{position:absolute;top:46rem;height:40px;width:100%;background:linear-gradient(to bottom,#fff0,#f8f9fa)}.container-top{padding-top:6rem!important}.container-no-image{padding-top:15rem!important}.container{padding-bottom:2.5rem!important}.edit-icon{vertical-align:middle!important}.resource-hero-section{background:#fff;box-shadow:0 4px 32px -14px #40576d4d!important;position:relative}.resource-hero-section .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}.resource-hero-section .blog-label{font-weight:700;font-size:1.7rem;margin-bottom:3rem}.resource-hero-section .hero-title{font-size:3.75rem;font-weight:300;line-height:1.3;color:#000;margin-bottom:2rem}.resource-hero-section .hero-title strong{font-weight:800}.resource-hero-section .hero-left{max-width:700px}.resource-hero-section .author-info{display:flex;align-items:center;gap:1rem;max-width:100%;overflow:hidden}.resource-hero-section .author-info .mobile-math-image{margin-right:0!important;margin-bottom:1rem;height:100px!important}.resource-hero-section .author-info .author-img{width:60px;height:60px;border-radius:50%;object-fit:cover}.resource-hero-section .author-info .author-meta p{font-size:1.2rem;margin-bottom:0!important}.resource-hero-section .author-info .author-meta .date{font-size:.95rem;color:#333}.resource-hero-section .hero-right{flex-shrink:0;width:40%}.resource-hero-section .hero-right .hero-image{height:auto}@media (width <= 768px){.resource-hero-section .hero-title{font-size:2rem}.resource-hero-section .hero-right{margin-top:2rem;text-align:center;width:100%}.resource-hero-section .hero-right .data-image{width:100%}.resource-hero-section .hero-right .hero-image{max-width:300px;width:100%;position:relative;z-index:3;left:4%;height:auto!important;top:2rem}.resource-hero-section .author-info{flex-direction:row;justify-content:flex-start}}@media (width >= 1200px){.hero-image{max-width:500px!important;max-height:500px!important;height:auto;position:relative!important;top:2.5rem}}@media (width >= 1020px) and (width <= 1200px){.outer-section-fadeout{top:34rem!important}}@media (width >= 768px) and (width <= 869px){.hero-image{width:320px!important;height:auto;position:relative;top:7.7rem}.hero-left{max-width:500px!important}.resource-hero-section .container{flex-wrap:nowrap!important}}@media (width >= 869px) and (width <= 1199px){.hero-image{left:3%;position:relative;width:100%;max-width:600px!important;top:6.1rem;height:auto}.hero-left{max-width:500px!important}.resource-hero-section .container{flex-wrap:nowrap!important}}@media (width >= 768px) and (width <= 991px){.container{padding:18rem 6rem 6rem!important}}@media (width >= 991px) and (width <= 1200px){.container{padding:14rem 6rem 6rem!important}}@media (width >= 768px) and (width <= 1200px){.resource-hero-section{padding:0!important}.outer-section-fadeout{top:53rem}.hero-title{font-size:2.75rem!important}.hero-right{text-align:center;width:40%}}@media (width <= 768px){.container{padding:8rem 2rem 2rem!important}.outer-section-fadeout{top:50rem}}@media (width <= 400px){.mobile-math-image{margin-left:-1rem!important}}\n"] }]
262
- }], ctorParameters: () => [{ type: ResourceService }, { type: i2.TagService }, { type: i2.AuthService }, { type: i3.Title }, { type: i3.Meta }, { type: i0.Injector }, { type: i3.DomSanitizer }] });
263
-
264
- class ResourcePostComponent extends AppBaseComponent {
265
- constructor(titleService, authService, injector) {
266
- super(injector);
267
- this.titleService = titleService;
268
- this.authService = authService;
269
- this.userLoggedIn = undefined;
270
- }
271
- ngOnInit() {
272
- this.route.params.subscribe(params => {
273
- this.slug = params['slug'] ?? 'Default';
274
- });
275
- this.authService.getToken$().subscribe(res => {
276
- this.userLoggedIn = !!res;
277
- if (this.userLoggedIn) {
278
- this.userService.getUserInfo().subscribe(data => {
279
- this.user = data;
280
- });
281
- }
282
- });
283
- }
284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostComponent, deps: [{ token: i3.Title }, { token: i2.AuthService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ResourcePostComponent, selector: "app-resource-post", usesInheritance: true, ngImport: i0, template: "<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<pw-resource-post-details></pw-resource-post-details>\n<pw-related-resources></pw-related-resources>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>", styles: ["::ng-deep .resource-header .navbar-nav .nav-item .nav-link{color:#000!important}\n"], dependencies: [{ kind: "component", type: i4.Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: ["subscriptionId", "sourceId", "masterSubscriptionId", "experimentName", "microserviceName", "shardName", "user", "userLoggedIn"] }, { kind: "component", type: i6$1.ResourceHeaderComponent, selector: "pw-resource-header", inputs: ["user", "userLoggedIn"] }, { kind: "component", type: ResourcePostDetailsComponent, selector: "pw-resource-post-details" }, { kind: "component", type: RelatedResourcesComponent, selector: "pw-related-resources" }] }); }
286
- }
287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostComponent, decorators: [{
288
- type: Component,
289
- args: [{ selector: 'app-resource-post', template: "<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<pw-resource-post-details></pw-resource-post-details>\n<pw-related-resources></pw-related-resources>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>", styles: ["::ng-deep .resource-header .navbar-nav .nav-item .nav-link{color:#000!important}\n"] }]
290
- }], ctorParameters: () => [{ type: i3.Title }, { type: i2.AuthService }, { type: i0.Injector }] });
291
-
292
- const routes = [
293
- {
294
- path: '',
295
- component: ResourcePostComponent,
296
- data: {
297
- title: 'Resources - Post',
298
- permission: 'Pages.Blog',
299
- preload: false
300
- }
301
- }
302
- ];
303
- class ResourcePostModule {
304
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
305
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostModule, declarations: [ResourcePostComponent, ResourcePostDetailsComponent, RelatedResourcesComponent], imports: [ResourceSharedModule, i1$1.RouterModule] }); }
306
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostModule, imports: [ResourceSharedModule, RouterModule.forChild(routes)] }); }
307
- }
308
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourcePostModule, decorators: [{
309
- type: NgModule,
310
- args: [{
311
- declarations: [ResourcePostComponent, ResourcePostDetailsComponent, RelatedResourcesComponent],
312
- imports: [ResourceSharedModule, RouterModule.forChild(routes)],
313
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
314
- }]
315
- }] });
316
-
317
- export { ResourcePostModule };
318
- //# sourceMappingURL=posiwise-resource-module-resource-post.module-PsfJSV3t.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-post.module-PsfJSV3t.mjs","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 { UntypedFormBuilder, Validators } from '@angular/forms';\n\nexport class ResourceBlog {\n static getResourcePostsForm() {\n return new UntypedFormBuilder().group({\n related_entity_id: [''],\n related_entity_type: [''],\n comment: [null, Validators.required],\n user_id: ['']\n });\n }\n}\n","import { Component, Injector, OnInit } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, CustomToastService, TagService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { ResourceBlog } from '../../../../shared/models/resource.model';\n\n@Component({\n selector: 'pw-related-resources',\n templateUrl: './related-resources.component.html',\n styleUrls: ['./related-resources.component.scss']\n})\nexport class RelatedResourcesComponent extends AppBaseComponent implements OnInit {\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 private readonly resourceService: ResourceService,\n injector: Injector,\n private readonly sanitizer: DomSanitizer,\n private readonly tagService: TagService,\n private readonly authService: AuthService,\n private readonly toastr: CustomToastService\n ) {\n super(injector);\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 });\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 });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n\n this.getPostTags();\n });\n } else {\n this.getPostTags();\n }\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 });\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 });\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 });\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 <form\n class=\"p-fluid mb-5\"\n [formGroup]=\"commentForm\"\n (ngSubmit)=\"onComment()\"\n *ngIf=\"userLoggedIn; else userLoggedOut\"\n >\n <div class=\"card shadow-sm no-border p-4\">\n <div class=\"field\">\n <label for=\"comment\" class=\"font-bold text-lg mb-4 comment-label\">💬 Leave a comment</label>\n <textarea\n pInputTextarea\n formControlName=\"comment\"\n rows=\"6\"\n autoResize=\"true\"\n class=\"p-inputtext p-component p-inputtextarea\"\n placeholder=\"What's on your mind?\"\n ></textarea>\n <small\n class=\"text-danger\"\n *ngIf=\"commentForm.get('comment')?.invalid && commentForm.get('comment')?.touched\"\n >Please enter comment</small\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 <ng-template #userLoggedOut>\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 </ng-template>\n </div>\n </div>\n\n <div class=\"row mt-5 comment-row\" *ngIf=\"postComments.length > 0\">\n <div class=\"col-12\" *ngFor=\"let comment of postComments; trackBy: trackByComment\">\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 </div>\n\n\n </section>\n </div>\n <hr class=\"resource-divider\" />\n</section>\n\n<section class=\"resource-book-section\" *ngIf=\"hasValidDemoLinks\">\n <div class=\"container\">\n\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<pw-resource-cards *ngIf=\"blogPostTag?.tag_category_id\" [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","import { Component, Injector, OnInit } from '@angular/core';\nimport { DomSanitizer, Meta, Title } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { ADMIN_ROUTERS, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\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})\nexport class ResourcePostDetailsComponent extends AppBaseComponent implements OnInit {\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 isLoaded = false;\n\n constructor(\n private readonly resourceService: ResourceService,\n private readonly tagService: TagService,\n private readonly authService: AuthService,\n private readonly titleService: Title,\n private readonly meta: Meta,\n injector: Injector,\n private readonly sanitizer: DomSanitizer\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n });\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? '';\n this.getBlogItem(this.slug);\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 });\n }\n\n this.getPostTags();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId || this.masterSubscriptionId)\n .subscribe(response => {\n this.blogPostTag = response.tags.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 })\n .add(() => {\n this.isLoaded = true;\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 });\n }\n\n private setOpenGraphMetaTags() {\n console.log('Post', this.post);\n if (this.post.title) {\n // Debug: Log the title being set\n console.log('Setting og:title to:', this.post.title);\n\n // Check if title is generic placeholder\n if (this.post.title === 'Updated Trial Title') {\n console.warn(\n 'Using generic title \"Updated Trial Title\" - consider updating the resource title'\n );\n }\n\n this.meta.updateTag({ property: 'og:title', content: this.post.title });\n this.meta.updateTag({ name: 'twitter:title', content: this.post.title });\n } else {\n console.warn('No title found in post data');\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\">BLOG</p>\n\n <h1 class=\"hero-title\">\n <span *ngIf=\"post?.title; else emptySpace\" [innerHTML]=\"post.title\"></span>\n <ng-template #emptySpace>\n &nbsp;\n </ng-template>\n <a *ngIf=\"userLoggedIn && hasBlogAccess\"\n class=\"ms-3 text-decoration-none\"\n ngbTooltip=\"Edit this post\"\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 </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 <div class=\"hero-right\" *ngIf=\"isLoaded\">\n <img\n *ngIf=\"getImageUrl(); else noImage\"\n [src]=\"getImageUrl()\"\n alt=\"Blog Post\"\n class=\"hero-image\"\n />\n\n <ng-template #noImage>\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 </ng-template>\n </div>\n </div>\n </section>\n","import { Component, Injector, OnInit } 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';\n\n@Component({\n selector: 'app-resource-post',\n templateUrl: './resource-post.component.html',\n styleUrl: './resource-post.component.scss'\n})\nexport class ResourcePostComponent extends AppBaseComponent implements OnInit {\n slug: string;\n user: User;\n userLoggedIn: boolean | undefined = undefined;\n\n constructor(\n private readonly titleService: Title,\n private readonly authService: AuthService,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n this.route.params.subscribe(params => {\n this.slug = params['slug'] ?? 'Default';\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 });\n }\n });\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<pw-resource-post-details></pw-resource-post-details>\n<pw-related-resources></pw-related-resources>\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 { 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 declarations: [ResourcePostComponent, ResourcePostDetailsComponent, RelatedResourcesComponent],\n imports: [ResourceSharedModule, RouterModule.forChild(routes)],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePostModule {}\n"],"names":["i1.ResourceService","i2","i3","i4.ResourceCardComponent","i5","i6","i7","i11","i4","i8","i9","i1","i5.ResourcePostDetailsComponent","i6.RelatedResourcesComponent"],"mappings":"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"}