@posiwise/resource-module 0.0.184 → 0.0.186

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 (105) hide show
  1. package/fesm2022/{posiwise-resource-module-base-top-banner.component-DwVBOTwY.mjs → posiwise-resource-module-base-top-banner.component-BxV9TVG1.mjs} +15 -7
  2. package/fesm2022/posiwise-resource-module-base-top-banner.component-BxV9TVG1.mjs.map +1 -0
  3. package/fesm2022/posiwise-resource-module-posiwise-resource-module-DfgyQYhP.mjs +1870 -0
  4. package/fesm2022/posiwise-resource-module-posiwise-resource-module-DfgyQYhP.mjs.map +1 -0
  5. package/fesm2022/posiwise-resource-module-resource-blogs.module-DHqU4Ypf.mjs +68 -0
  6. package/fesm2022/posiwise-resource-module-resource-blogs.module-DHqU4Ypf.mjs.map +1 -0
  7. package/fesm2022/posiwise-resource-module-resource-case-studies.module-DghO167h.mjs +134 -0
  8. package/fesm2022/posiwise-resource-module-resource-case-studies.module-DghO167h.mjs.map +1 -0
  9. package/fesm2022/posiwise-resource-module-resource-events.module-DtZaPh7n.mjs +240 -0
  10. package/fesm2022/posiwise-resource-module-resource-events.module-DtZaPh7n.mjs.map +1 -0
  11. package/fesm2022/posiwise-resource-module-resource-hub.module-jxpqriFN.mjs +241 -0
  12. package/fesm2022/posiwise-resource-module-resource-hub.module-jxpqriFN.mjs.map +1 -0
  13. package/fesm2022/posiwise-resource-module-resource-integrations.module-xg0Ziiw8.mjs +294 -0
  14. package/fesm2022/posiwise-resource-module-resource-integrations.module-xg0Ziiw8.mjs.map +1 -0
  15. package/fesm2022/posiwise-resource-module-resource-post.module-DcudivrB.mjs +314 -0
  16. package/fesm2022/posiwise-resource-module-resource-post.module-DcudivrB.mjs.map +1 -0
  17. package/fesm2022/posiwise-resource-module-resource-release-notes.module-CuQLcCDR.mjs +109 -0
  18. package/fesm2022/posiwise-resource-module-resource-release-notes.module-CuQLcCDR.mjs.map +1 -0
  19. package/fesm2022/posiwise-resource-module-resource-root.module-gVu6s-NV.mjs +398 -0
  20. package/fesm2022/posiwise-resource-module-resource-root.module-gVu6s-NV.mjs.map +1 -0
  21. package/fesm2022/posiwise-resource-module-resource-videos.module-xt6vq-z-.mjs +68 -0
  22. package/fesm2022/posiwise-resource-module-resource-videos.module-xt6vq-z-.mjs.map +1 -0
  23. package/fesm2022/posiwise-resource-module-resource-white-papers.module-Bm2M2II6.mjs +69 -0
  24. package/fesm2022/posiwise-resource-module-resource-white-papers.module-Bm2M2II6.mjs.map +1 -0
  25. package/fesm2022/posiwise-resource-module.mjs +1 -1
  26. package/package.json +7 -7
  27. package/types/posiwise-resource-module.d.ts +521 -0
  28. package/fesm2022/posiwise-resource-module-base-top-banner.component-DwVBOTwY.mjs.map +0 -1
  29. package/fesm2022/posiwise-resource-module-posiwise-resource-module-CBgwfoFQ.mjs +0 -1802
  30. package/fesm2022/posiwise-resource-module-posiwise-resource-module-CBgwfoFQ.mjs.map +0 -1
  31. package/fesm2022/posiwise-resource-module-resource-blogs.module-B4QePTqE.mjs +0 -69
  32. package/fesm2022/posiwise-resource-module-resource-blogs.module-B4QePTqE.mjs.map +0 -1
  33. package/fesm2022/posiwise-resource-module-resource-case-studies.module-FVdm2xZg.mjs +0 -133
  34. package/fesm2022/posiwise-resource-module-resource-case-studies.module-FVdm2xZg.mjs.map +0 -1
  35. package/fesm2022/posiwise-resource-module-resource-events.module-D39_eKV0.mjs +0 -228
  36. package/fesm2022/posiwise-resource-module-resource-events.module-D39_eKV0.mjs.map +0 -1
  37. package/fesm2022/posiwise-resource-module-resource-hub.module-BtDEZ2Bi.mjs +0 -233
  38. package/fesm2022/posiwise-resource-module-resource-hub.module-BtDEZ2Bi.mjs.map +0 -1
  39. package/fesm2022/posiwise-resource-module-resource-integrations.module-Ccc_gL-v.mjs +0 -284
  40. package/fesm2022/posiwise-resource-module-resource-integrations.module-Ccc_gL-v.mjs.map +0 -1
  41. package/fesm2022/posiwise-resource-module-resource-post.module-DK-IjPjS.mjs +0 -294
  42. package/fesm2022/posiwise-resource-module-resource-post.module-DK-IjPjS.mjs.map +0 -1
  43. package/fesm2022/posiwise-resource-module-resource-release-notes.module-BCZ7rBO3.mjs +0 -104
  44. package/fesm2022/posiwise-resource-module-resource-release-notes.module-BCZ7rBO3.mjs.map +0 -1
  45. package/fesm2022/posiwise-resource-module-resource-root.module-XqP-FANH.mjs +0 -392
  46. package/fesm2022/posiwise-resource-module-resource-root.module-XqP-FANH.mjs.map +0 -1
  47. package/fesm2022/posiwise-resource-module-resource-videos.module-CVimxK4w.mjs +0 -69
  48. package/fesm2022/posiwise-resource-module-resource-videos.module-CVimxK4w.mjs.map +0 -1
  49. package/fesm2022/posiwise-resource-module-resource-white-papers.module-0VUIWx4N.mjs +0 -70
  50. package/fesm2022/posiwise-resource-module-resource-white-papers.module-0VUIWx4N.mjs.map +0 -1
  51. package/index.d.ts +0 -19
  52. package/lib/public/components/base/base-resource.component.d.ts +0 -43
  53. package/lib/public/components/base/base-top-banner.component.d.ts +0 -38
  54. package/lib/public/components/reslease-note-card/release-note-card.component.d.ts +0 -57
  55. package/lib/public/components/resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.d.ts +0 -12
  56. package/lib/public/components/resource-blogs/resource-blog.component.d.ts +0 -11
  57. package/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.d.ts +0 -40
  58. package/lib/public/components/resource-case-studies/resource-case-studies.component.d.ts +0 -20
  59. package/lib/public/components/resource-company-card/resource-company-card.component.d.ts +0 -39
  60. package/lib/public/components/resource-contact-us/resource-contact-us.module.d.ts +0 -7
  61. package/lib/public/components/resource-edit-card/resource-edit-card.component.d.ts +0 -52
  62. package/lib/public/components/resource-edit-card-lazy/resource-edit-card-lazy.component.d.ts +0 -19
  63. package/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.d.ts +0 -12
  64. package/lib/public/components/resource-integration/resource-integration.component.d.ts +0 -89
  65. package/lib/public/components/resource-post/related-resources/related-resources.component.d.ts +0 -46
  66. package/lib/public/components/resource-post/related-resources/resource-cards/resource-cards.component.d.ts +0 -40
  67. package/lib/public/components/resource-post/resource-post-details/resource-post-details.component.d.ts +0 -71
  68. package/lib/public/components/resource-post/resource-post.component.d.ts +0 -17
  69. package/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.d.ts +0 -12
  70. package/lib/public/components/resource-release-notes/resource-release-notes.component.d.ts +0 -23
  71. package/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.d.ts +0 -37
  72. package/lib/public/components/resource-vault/resource-vault.component.d.ts +0 -23
  73. package/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.d.ts +0 -48
  74. package/lib/public/components/resource-videos/resource-videos-top-banner/resource-videos-top-banner.component.d.ts +0 -12
  75. package/lib/public/components/resource-videos/resource-videos.component.d.ts +0 -11
  76. package/lib/public/components/resource-webinars/replay-event-cards/replay-event-cards.component.d.ts +0 -33
  77. package/lib/public/components/resource-webinars/resource-webinars.component.d.ts +0 -36
  78. package/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.d.ts +0 -44
  79. package/lib/public/components/resources/resource-tags/resource-tags.component.d.ts +0 -31
  80. package/lib/public/components/resources/resources.component.d.ts +0 -24
  81. package/lib/public/components/resources/vault-section/vault-section.component.d.ts +0 -54
  82. package/lib/public/components/resources-hub/resources-hub.component.d.ts +0 -52
  83. package/lib/public/components/testimonial-card/testimonial-card.component.d.ts +0 -14
  84. package/lib/public/components/white-papers/white-papers-top-banner/white-papers-top-banner.component.d.ts +0 -12
  85. package/lib/public/components/white-papers/white-papers.component.d.ts +0 -11
  86. package/lib/public/modules/blogs/resource-blogs.module.d.ts +0 -10
  87. package/lib/public/modules/case-studies/resource-case-studies.module.d.ts +0 -10
  88. package/lib/public/modules/events/resource-events.module.d.ts +0 -10
  89. package/lib/public/modules/hub/resource-hub.module.d.ts +0 -9
  90. package/lib/public/modules/integrations/resource-integrations.module.d.ts +0 -10
  91. package/lib/public/modules/post/resource-post.module.d.ts +0 -11
  92. package/lib/public/modules/release-notes/resource-release-notes.module.d.ts +0 -10
  93. package/lib/public/modules/root/resource-root-shared.module.d.ts +0 -17
  94. package/lib/public/modules/root/resource-root.module.d.ts +0 -11
  95. package/lib/public/modules/videos/resource-videos.module.d.ts +0 -10
  96. package/lib/public/modules/white-papers/resource-white-papers.module.d.ts +0 -10
  97. package/lib/public/resource-public.module.d.ts +0 -7
  98. package/lib/public/resource-public.routing.module.d.ts +0 -7
  99. package/lib/public/shared/resource-cards.module.d.ts +0 -32
  100. package/lib/public/shared/resource-edit.module.d.ts +0 -22
  101. package/lib/public/shared/resource-shared.module.d.ts +0 -20
  102. package/lib/resource.module.d.ts +0 -7
  103. package/lib/resource.service.d.ts +0 -21
  104. package/lib/shared/models/resource.model.d.ts +0 -3
  105. package/lib/shared/resource-modal.interface.d.ts +0 -6
@@ -1,294 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Component, CUSTOM_ELEMENTS_SCHEMA, NgModule } 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-CBgwfoFQ.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
-
23
- class ResourceBlog {
24
- static getResourcePostsForm() {
25
- return new UntypedFormBuilder().group({
26
- related_entity_id: [''],
27
- related_entity_type: [''],
28
- comment: [null, Validators.required],
29
- user_id: ['']
30
- });
31
- }
32
- }
33
-
34
- class RelatedResourcesComponent extends AppBaseComponent {
35
- constructor(resourceService, injector, sanitizer, tagService, authService, toastr) {
36
- super(injector);
37
- this.resourceService = resourceService;
38
- this.sanitizer = sanitizer;
39
- this.tagService = tagService;
40
- this.authService = authService;
41
- this.toastr = toastr;
42
- this.resourceCards = [
43
- {
44
- title: 'BLOG: Here’s why you should QA your distributor invoices',
45
- image: '/assets/img/resource/resource-qa.png',
46
- alt: 'QA distributor invoices',
47
- url: '/resources/view/here-s-why-you-should-be-seeking-independent-qa-of-all-distributor-inv'
48
- },
49
- {
50
- title: 'BLOG: 4 instant hacks to uplift your MSP’s monthly billing',
51
- image: '/assets/img/resource/resource-hacks.png',
52
- alt: 'Monthly billing hacks',
53
- url: '/resources/view/4-instant-hacks-to-uplift-your-msp-s-monthly-billing'
54
- },
55
- {
56
- title: 'BLOG: The trivial detail that will either future-proof or sabotage your PSA.',
57
- image: '/assets/img/resource/resource-psa.png',
58
- alt: 'PSA future-proof',
59
- url: '/resources/view/the-trivial-detail-that-will-either-future-proof-or-sabotage-your-psa'
60
- }
61
- ];
62
- this.postComments = [];
63
- this.demoLinks = this.appConfig?.pages_config?.book_demo?.items;
64
- this.linkedInUrl = this.appConfig?.social?.linkedin_url;
65
- this.company_email = this.appConfig.company.email;
66
- this.commentForm = ResourceBlog.getResourcePostsForm();
67
- }
68
- ngOnInit() {
69
- this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
70
- this.route.params.subscribe(params => {
71
- this.slug = params['slug'] ?? '';
72
- this.getBlogItem(this.slug);
73
- });
74
- this.authService.getToken$().subscribe(res => {
75
- this.userLoggedIn = !!res;
76
- if (this.userLoggedIn) {
77
- this.localStorage.getItem$('product').subscribe(res => {
78
- const data = res ? JSON.parse(res) : null;
79
- this.subscriptionId = data?.subscriptionId;
80
- });
81
- this.userService.getUserInfo().subscribe(data => {
82
- this.user = data;
83
- this.getPostTags();
84
- });
85
- }
86
- else {
87
- this.getPostTags();
88
- }
89
- });
90
- }
91
- get hasValidDemoLinks() {
92
- return (Array.isArray(this.demoLinks) && this.demoLinks.some(link => link?.title ?? link?.url));
93
- }
94
- getPostTags() {
95
- this.tagService
96
- .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())
97
- .subscribe(response => {
98
- this.blogPostTag = response.tags.find(tag => tag.name === 'Blog Posts');
99
- });
100
- }
101
- getBlogItem(slug) {
102
- this.resourceService.getPostBySlug(slug).subscribe(response => {
103
- let blogBody;
104
- if (response?.body) {
105
- blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);
106
- }
107
- const date = new Date(response?.when);
108
- const formatted = date.toISOString().split('T')[0];
109
- this.postComments = response.entity_comments;
110
- this.post = { ...response, body: blogBody, when: formatted };
111
- });
112
- }
113
- onComment() {
114
- const data = { ...this.commentForm.value };
115
- data.related_entity_id = this.post?.id;
116
- data.related_entity_type = 'Post';
117
- data.user_id = this.user?.id;
118
- this.resourceService.postComments(data).subscribe(() => {
119
- this.getBlogItem(this.slug);
120
- this.commentForm.reset();
121
- this.toastr.success(this.translation.translate('Resource.Posts.CommentAdded'));
122
- });
123
- }
124
- trackByComment(_index, item) {
125
- return item.id;
126
- }
127
- /** Helper method to get effective subscription ID */
128
- getEffectiveSubscriptionId() {
129
- return HelperService.getEffectiveSubscriptionId(this.user, this.subscriptionId, this.masterSubscriptionId);
130
- }
131
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", 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 }); }
132
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: RelatedResourcesComponent, isStandalone: false, 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=\"related-resources-comment\" class=\"font-bold text-lg mb-4 comment-label\">\uD83D\uDCAC 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 ></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-textarea{border-radius:.5rem;border:1px solid #ced4da;font-size:1rem!important}.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", "fluid"], outputs: ["onResize"] }, { kind: "pipe", type: i3$1.DatePipe, name: "date" }, { kind: "pipe", type: i10$1.TranslocoPipe, name: "transloco" }] }); }
133
- }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RelatedResourcesComponent, decorators: [{
135
- type: Component,
136
- args: [{ selector: 'pw-related-resources', standalone: false, 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=\"related-resources-comment\" class=\"font-bold text-lg mb-4 comment-label\">\uD83D\uDCAC 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 ></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-textarea{border-radius:.5rem;border:1px solid #ced4da;font-size:1rem!important}.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"] }]
137
- }], ctorParameters: () => [{ type: ResourceService }, { type: i0.Injector }, { type: i3.DomSanitizer }, { type: i2.TagService }, { type: i2.AuthService }, { type: i2.CustomToastService }] });
138
-
139
- class ResourcePostDetailsComponent extends AppBaseComponent {
140
- constructor(resourceService, tagService, authService, titleService, meta, injector, sanitizer) {
141
- super(injector);
142
- this.resourceService = resourceService;
143
- this.tagService = tagService;
144
- this.authService = authService;
145
- this.titleService = titleService;
146
- this.meta = meta;
147
- this.sanitizer = sanitizer;
148
- this.routers = ADMIN_ROUTERS;
149
- this.isLoaded = false;
150
- }
151
- ngOnInit() {
152
- this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
153
- this.getUserSubscriptionId().subscribe(response => {
154
- this.subscriptionId = response;
155
- });
156
- this.route.params.subscribe(params => {
157
- this.slug = params['slug'] ?? '';
158
- this.getBlogItem(this.slug);
159
- });
160
- this.authService.getToken$().subscribe(res => {
161
- this.userLoggedIn = !!res;
162
- if (res) {
163
- this.userService.getUserInfo().subscribe(data => {
164
- this.user = data;
165
- this.hasBlogAccess = HelperService.checkBlogPermission(this.user);
166
- });
167
- }
168
- this.getPostTags();
169
- });
170
- }
171
- getPostTags() {
172
- this.tagService
173
- .getTagsByType('post_categories', {}, this.subscriptionId || this.masterSubscriptionId)
174
- .subscribe(response => {
175
- this.blogPostTag = response.tags.find(tag => tag.name === 'Blog Posts');
176
- // Update SEO metadata again now that blogPostTag is available
177
- if (this.post) {
178
- this.setOpenGraphMetaTags();
179
- }
180
- })
181
- .add(() => {
182
- this.isLoaded = true;
183
- });
184
- }
185
- getBlogItem(slug) {
186
- this.resourceService.getPostBySlug(slug).subscribe(response => {
187
- let blogBody;
188
- if (response?.body) {
189
- blogBody = HelperService.sanitizeQuillBody(response.body, this.sanitizer);
190
- }
191
- this.post = { ...response, body: blogBody };
192
- });
193
- }
194
- setOpenGraphMetaTags() {
195
- if (this.post.title) {
196
- this.meta.updateTag({ property: 'og:title', content: this.post.title });
197
- this.meta.updateTag({ name: 'twitter:title', content: this.post.title });
198
- }
199
- if (this.post.blurb) {
200
- this.meta.updateTag({ property: 'og:description', content: this.post.blurb });
201
- this.meta.updateTag({ name: 'twitter:description', content: this.post.blurb });
202
- }
203
- let imageUrl = null;
204
- if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {
205
- imageUrl = this.post.picture.url;
206
- }
207
- else if (this.blogPostTag?.image?.url &&
208
- !this.blogPostTag.image.url.includes('no_image_uploaded_squared')) {
209
- imageUrl = this.blogPostTag.image.url;
210
- }
211
- if (imageUrl) {
212
- this.meta.updateTag({ property: 'og:image', content: imageUrl });
213
- this.meta.updateTag({ name: 'twitter:image', content: imageUrl });
214
- }
215
- this.meta.updateTag({ property: 'og:type', content: 'article' });
216
- this.meta.updateTag({ property: 'og:url', content: window.location.href });
217
- this.meta.updateTag({ property: 'og:site_name', content: 'PosiWise' });
218
- // Twitter Card properties
219
- this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });
220
- this.meta.updateTag({ name: 'twitter:site', content: '@posiwise' });
221
- }
222
- getImageUrl() {
223
- if (this.post?.picture?.url && !this.post.picture.url.includes('default-photo.jpg')) {
224
- return this.post.picture.url;
225
- }
226
- else if (this.blogPostTag?.image?.url &&
227
- !this.blogPostTag.image.url.includes('no_image_uploaded_squared')) {
228
- return this.blogPostTag.image.url;
229
- }
230
- return null;
231
- }
232
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", 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 }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: ResourcePostDetailsComponent, isStandalone: false, 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" }] }); }
234
- }
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostDetailsComponent, decorators: [{
236
- type: Component,
237
- args: [{ selector: 'pw-resource-post-details', standalone: false, 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"] }]
238
- }], ctorParameters: () => [{ type: ResourceService }, { type: i2.TagService }, { type: i2.AuthService }, { type: i3.Title }, { type: i3.Meta }, { type: i0.Injector }, { type: i3.DomSanitizer }] });
239
-
240
- class ResourcePostComponent extends AppBaseComponent {
241
- constructor(titleService, authService, injector) {
242
- super(injector);
243
- this.titleService = titleService;
244
- this.authService = authService;
245
- this.userLoggedIn = undefined;
246
- }
247
- ngOnInit() {
248
- this.route.params.subscribe(params => {
249
- this.slug = params['slug'] ?? 'Default';
250
- });
251
- this.authService.getToken$().subscribe(res => {
252
- this.userLoggedIn = !!res;
253
- if (this.userLoggedIn) {
254
- this.userService.getUserInfo().subscribe(data => {
255
- this.user = data;
256
- });
257
- }
258
- });
259
- }
260
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostComponent, deps: [{ token: i3.Title }, { token: i2.AuthService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
261
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: ResourcePostComponent, isStandalone: false, 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" }] }); }
262
- }
263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostComponent, decorators: [{
264
- type: Component,
265
- args: [{ selector: 'app-resource-post', standalone: false, 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"] }]
266
- }], ctorParameters: () => [{ type: i3.Title }, { type: i2.AuthService }, { type: i0.Injector }] });
267
-
268
- const routes = [
269
- {
270
- path: '',
271
- component: ResourcePostComponent,
272
- data: {
273
- title: 'Resources - Post',
274
- permission: 'Pages.Blog',
275
- preload: false
276
- }
277
- }
278
- ];
279
- class ResourcePostModule {
280
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
281
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostModule, declarations: [ResourcePostComponent, ResourcePostDetailsComponent, RelatedResourcesComponent], imports: [ResourceSharedModule, i1$1.RouterModule] }); }
282
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostModule, imports: [ResourceSharedModule, RouterModule.forChild(routes)] }); }
283
- }
284
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourcePostModule, decorators: [{
285
- type: NgModule,
286
- args: [{
287
- declarations: [ResourcePostComponent, ResourcePostDetailsComponent, RelatedResourcesComponent],
288
- imports: [ResourceSharedModule, RouterModule.forChild(routes)],
289
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
290
- }]
291
- }] });
292
-
293
- export { ResourcePostModule };
294
- //# sourceMappingURL=posiwise-resource-module-resource-post.module-DK-IjPjS.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-post.module-DK-IjPjS.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\n standalone: false\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=\"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 ></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\n standalone: false\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 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\">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\n standalone: false\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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"}