@posiwise/resource-module 0.0.205 → 0.0.207

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/fesm2022/{posiwise-resource-module-base-top-banner.component-BwujN_up.mjs → posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs} +4 -4
  2. package/fesm2022/posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs.map +1 -0
  3. package/fesm2022/{posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs → posiwise-resource-module-resource-blogs.module-LKr-SjAo.mjs} +3 -3
  4. package/fesm2022/{posiwise-resource-module-resource-blogs.module-C_sTQ0w2.mjs.map → posiwise-resource-module-resource-blogs.module-LKr-SjAo.mjs.map} +1 -1
  5. package/fesm2022/{posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs → posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs} +15 -15
  6. package/fesm2022/posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs.map +1 -0
  7. package/fesm2022/{posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs → posiwise-resource-module-resource-case-studies.module-CzB9wtnf.mjs} +4 -4
  8. package/fesm2022/posiwise-resource-module-resource-case-studies.module-CzB9wtnf.mjs.map +1 -0
  9. package/fesm2022/posiwise-resource-module-resource-edit-card.component-d9cDJUJf.mjs +632 -0
  10. package/fesm2022/posiwise-resource-module-resource-edit-card.component-d9cDJUJf.mjs.map +1 -0
  11. package/fesm2022/{posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs → posiwise-resource-module-resource-events.module-BO9CcIFp.mjs} +5 -5
  12. package/fesm2022/posiwise-resource-module-resource-events.module-BO9CcIFp.mjs.map +1 -0
  13. package/fesm2022/{posiwise-resource-module-resource-hub.module-alVvQLvR.mjs → posiwise-resource-module-resource-hub.module-B3EZao2L.mjs} +10 -10
  14. package/fesm2022/posiwise-resource-module-resource-hub.module-B3EZao2L.mjs.map +1 -0
  15. package/fesm2022/{posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs → posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs} +16 -13
  16. package/fesm2022/posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs.map +1 -0
  17. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs → posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs} +4 -4
  18. package/fesm2022/{posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs.map → posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs.map} +1 -1
  19. package/fesm2022/{posiwise-resource-module-resource-post.module-CGxj27dN.mjs → posiwise-resource-module-resource-post.module-C343zv-t.mjs} +13 -13
  20. package/fesm2022/posiwise-resource-module-resource-post.module-C343zv-t.mjs.map +1 -0
  21. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs → posiwise-resource-module-resource-release-notes.module-CE21Yiss.mjs} +9 -6
  22. package/fesm2022/{posiwise-resource-module-resource-release-notes.module-CLry1QNC.mjs.map → posiwise-resource-module-resource-release-notes.module-CE21Yiss.mjs.map} +1 -1
  23. package/fesm2022/{posiwise-resource-module-resource-root.module-x4TYntdq.mjs → posiwise-resource-module-resource-root.module-BzvAo30C.mjs} +12 -9
  24. package/fesm2022/posiwise-resource-module-resource-root.module-BzvAo30C.mjs.map +1 -0
  25. package/fesm2022/{posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs → posiwise-resource-module-resource-videos.module-OJpXslFg.mjs} +3 -3
  26. package/fesm2022/{posiwise-resource-module-resource-videos.module-2ugtK7wA.mjs.map → posiwise-resource-module-resource-videos.module-OJpXslFg.mjs.map} +1 -1
  27. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs → posiwise-resource-module-resource-white-papers.module-rr8wWULi.mjs} +3 -3
  28. package/fesm2022/{posiwise-resource-module-resource-white-papers.module-pn6rtDc3.mjs.map → posiwise-resource-module-resource-white-papers.module-rr8wWULi.mjs.map} +1 -1
  29. package/fesm2022/{posiwise-resource-module-resource.service-DAXsq-WG.mjs → posiwise-resource-module-resource.service-BBvcVvWN.mjs} +10 -10
  30. package/fesm2022/posiwise-resource-module-resource.service-BBvcVvWN.mjs.map +1 -0
  31. package/fesm2022/posiwise-resource-module.mjs +24 -734
  32. package/fesm2022/posiwise-resource-module.mjs.map +1 -1
  33. package/package.json +1 -1
  34. package/types/posiwise-resource-module.d.ts +25 -144
  35. package/fesm2022/posiwise-resource-module-base-top-banner.component-BwujN_up.mjs.map +0 -1
  36. package/fesm2022/posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs.map +0 -1
  37. package/fesm2022/posiwise-resource-module-resource-case-studies.module-D1hCU5_H.mjs.map +0 -1
  38. package/fesm2022/posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs.map +0 -1
  39. package/fesm2022/posiwise-resource-module-resource-hub.module-alVvQLvR.mjs.map +0 -1
  40. package/fesm2022/posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs.map +0 -1
  41. package/fesm2022/posiwise-resource-module-resource-post.module-CGxj27dN.mjs.map +0 -1
  42. package/fesm2022/posiwise-resource-module-resource-root.module-x4TYntdq.mjs.map +0 -1
  43. package/fesm2022/posiwise-resource-module-resource.service-DAXsq-WG.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posiwise-resource-module-resource-edit-card.component-d9cDJUJf.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card-images.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-payload.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-edit-card/resource-edit-card.component.html"],"sourcesContent":["import { Component, inject } from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\n/** The two cover pictures of the resource edit card: square and rectangular. */\n@Component({\n template: ''\n})\nexport abstract class ResourceEditCardImages extends AppBaseComponent {\n protected readonly modalService = inject(NgbModal);\n\n image = '';\n rectangularImage = '';\n file: File | null = null;\n rectangularFile: File | null = null;\n imageModalRef;\n\n openImageModal(modalTemplate): void {\n this.imageModalRef = this.modalService.open(modalTemplate, { centered: true, size: 'md' });\n }\n\n openRectModal(content) {\n this.imageModalRef = this.modalService.open(content, {\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n onImageSelected(base64: string): void {\n this.image = base64;\n this.file = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n onRectangularImageSelection(base64: string) {\n this.rectangularImage = base64;\n this.rectangularFile = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n removeImage(): void {\n this.image = null;\n this.file = null;\n }\n\n deleteRectangularImage() {\n this.rectangularImage = null;\n this.rectangularFile = null;\n }\n\n handleImageError(event: Event, fallbackPath): void {\n HelperService.handleImageFallbackPath(event, fallbackPath);\n }\n}\n","import { FormBuilder, FormGroup } from '@angular/forms';\n\nimport moment from 'moment';\n\n/** The cover images as the edit card holds them: a new file, or the current URL, or nothing. */\nexport interface ResourceEditImages {\n file: File | null;\n image: string | null;\n rectangularFile: File | null;\n rectangularImage: string | null;\n}\n\nexport function resourceEditForm(fb: FormBuilder): FormGroup {\n return fb.group({\n title: [''],\n external_url: [''],\n cta_text: [''],\n when: [''],\n showcase: [false],\n published_at: [false],\n accepted_at: [false],\n body: ['']\n });\n}\n\n/** The form's values for a post, with blanks where the post has no value yet. */\nexport function resourceFormValue(resource) {\n return {\n title: resource.title ?? '',\n external_url: resource.external_url ?? '',\n cta_text: resource.cta_text ?? '',\n when: resource.when ? new Date(resource.when) : '',\n showcase: !!resource.showcase,\n published_at: !!resource.published_at,\n accepted_at: !!resource.accepted_at,\n body: resource.body\n };\n}\n\n/** The update payload: the form's values plus the cover-image changes and the toggled dates. */\nexport function buildResourcePayload(\n form: FormGroup,\n subscriptionId: number,\n images: ResourceEditImages\n) {\n const data = { ...form.value, subscription_id: subscriptionId };\n setFile(data, 'picture', images.file);\n setFile(data, 'rectangular_picture', images.rectangularFile);\n setToggledDate(form, data, 'published_at');\n setToggledDate(form, data, 'accepted_at');\n if (!form.get('when')?.value) {\n data.when = '';\n }\n if (!form.get('showcase')?.value) {\n data.showcase = '';\n }\n if (!images.file && !images.image) {\n data.remove_picture = true;\n }\n if (!images.rectangularFile && !images.rectangularImage) {\n data.remove_rectangular_picture = true;\n }\n return data;\n}\n\nfunction setFile(data, key: string, file: File | null): void {\n if (file) {\n data[key] = file;\n } else {\n delete data[key];\n }\n}\n\n/** A date sent only when its switch was touched: today when on, blank when off. */\nfunction setToggledDate(form: FormGroup, data, key: string): void {\n const control = form.get(key);\n if (control?.dirty) {\n data[key] = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data[key];\n }\n}\n\n/** Tags whose name contains the query; all tags when the query is empty. */\nexport function filterTags<T extends { name: string }>(tags: T[], query: string): T[] {\n if (!query) {\n return [...tags];\n }\n const needle = query.toLowerCase();\n return tags.filter(tag => tag.name.toLowerCase().includes(needle));\n}\n\n/** The request that links the selected tags to the post. */\nexport function postTagsPayload(tags: { id: number }[], postId: number | string) {\n return {\n entity_tags: tags.map(tag => ({ tag_id: tag.id })),\n slug: postId,\n tag_entity: 'Post'\n };\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { ButtonBusyDirective, LazyImgDirective } from '@posiwise/directives';\nimport { InputContainerComponent } from '@posiwise/shared-components';\nimport { ProfileImageCropperComponent } from '@posiwise/utils';\nimport { editorImageUpload, QuillHelper } from '@posiwise/utils/quill';\n\nimport { QuillEditorComponent } from 'ngx-quill';\nimport { UiSwitchModule } from 'ngx-ui-switch';\nimport { AutoComplete } from 'primeng/autocomplete';\nimport { Bind } from 'primeng/bind';\nimport { DatePicker } from 'primeng/datepicker';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../resource.service';\n\nimport { ResourceEditCardImages } from './resource-edit-card-images';\nimport {\n buildResourcePayload,\n filterTags,\n postTagsPayload,\n resourceEditForm,\n resourceFormValue\n} from './resource-edit-payload';\n\n@Component({\n selector: 'pw-resource-edit-card',\n templateUrl: './resource-edit-card.component.html',\n styleUrl: './resource-edit-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n InputContainerComponent,\n QuillEditorComponent,\n NgClass,\n Bind,\n DatePicker,\n AutoComplete,\n UiSwitchModule,\n LazyImgDirective,\n ButtonBusyDirective,\n ProfileImageCropperComponent,\n TranslocoPipe\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceEditCardComponent extends ResourceEditCardImages implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input() id!: number;\n @Input() resourceData;\n @Output() updated = new EventEmitter<void>();\n\n editForm: FormGroup;\n selectedTags = [];\n allTags = [];\n tagsSuggestion = [];\n subscriptionId: number;\n userLoggedIn: boolean;\n buttonBusy = false;\n // Uploads go to the subscription the post is saved under (#4272).\n editorConfig = QuillHelper.getEditorConfig(\n [],\n editorImageUpload(() => this.subscriptionId)\n );\n\n constructor() {\n super();\n QuillHelper.init();\n this.editForm = resourceEditForm(this.fb);\n }\n\n ngOnInit(): void {\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.cdr.markForCheck();\n });\n }\n\n navigateToResourceEdit() {\n const basePath = `/admin/resources/${this.resourceData?.slug}`;\n const fullUrl = `${location.origin}${basePath}`;\n window.open(fullUrl, '_blank');\n }\n\n openModal(modalTemplate): void {\n if (this.resourceData) {\n this.editForm.setValue(resourceFormValue(this.resourceData));\n this.image = this.resourceData.picture?.url ?? '';\n this.selectedTags = this.resourceData?.tags?.length ? [...this.resourceData.tags] : [];\n this.rectangularImage = this.resourceData.rectangular_picture?.url ?? '';\n }\n this.modalService.open(modalTemplate, { centered: true, size: 'lg' });\n this.getPostTags();\n }\n\n search(event) {\n this.tagsSuggestion = filterTags(this.allTags, event.query);\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId)\n .subscribe(response => {\n this.allTags = response.result;\n this.cdr.markForCheck();\n });\n }\n\n saveResource(): void {\n this.buttonBusy = true;\n this.saveTags(this.id);\n const payload = buildResourcePayload(this.editForm, this.subscriptionId, this);\n\n this.resourceService.updatePost(payload, this.id).subscribe({\n next: () =>\n this.settleSave(() => {\n this.toast.success('Blog Post Updated');\n this.updated.emit();\n this.modalService.dismissAll();\n }),\n error: () => this.settleSave()\n });\n }\n\n // NG0100: Toastr + dismissAll can run CD in the same macrotask as clearing [buttonBusy].\n // Clear busy in one task; toast/emit/modal in the next so dev-mode \"verify\" sees a stable binding.\n private settleSave(afterSuccess?: () => void): void {\n setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n if (afterSuccess) {\n setTimeout(() => {\n afterSuccess();\n this.cdr.markForCheck();\n }, 0);\n }\n }, 0);\n }\n\n private saveTags(id: number | string): void {\n if (this.selectedTags.length) {\n const data = postTagsPayload(this.selectedTags, id);\n this.tagService.addTags(data, this.subscriptionId).subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n }\n}\n","<div class=\"edit-card\">\n <i class=\"fa fa-edit cursor-pointer text-dark in-page-edit-icon d-flex justify-content-center mb-2\"\n (click)=\"openModal(editResourceModal)\"\n (keydown.enter)=\"openModal(editResourceModal)\"\n (keydown.space)=\"openModal(editResourceModal)\"\n title=\"Edit Resource\"></i>\n</div>\n\n<ng-template #editResourceModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Resource</h5>\n <i class=\"fa fa-edit cursor-pointer text-dark in-page-edit-icon d-flex justify-content-center ms-3\"\n (click)=\"navigateToResourceEdit()\"\n (keydown.enter)=\"navigateToResourceEdit()\"\n (keydown.space)=\"navigateToResourceEdit()\"\n title=\"Go to the main edit page\"></i>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <form [formGroup]=\"editForm\">\n <div class=\"row\">\n\n\n <div class=\"col-12\">\n <pw-input-container label=\"Title\" name=\"title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" id=\"input_title_1\" name=\"input_title_1\"\n aria-label=\"Title\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 row\">\n <pw-input-container label=\"CTA Text\" name=\"cta_text\" class=\"col-md-6\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.CtaText' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"cta_text\" id=\"input_cta_text_2\" name=\"input_cta_text_2\"\n aria-label=\"Cta Text\"/>\n </pw-input-container>\n\n <pw-input-container label=\"External URL\" name=\"external_url\" class=\"col-md-6\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.ExternalUrl' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"external_url\" id=\"input_external_url_3\" name=\"input_external_url_3\"\n [attr.aria-label]=\"'Resource.Posts.Body' | transloco\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container\n [label]=\"'Resource.Posts.Body' | transloco\"\n name=\"body\"\n errorMsg=\"Resource.Posts.Validation.Body\">\n <quill-editor\n [styles]=\"{ height: '300px' }\"\n class=\"quillEditor\"\n [modules]=\"editorConfig\"\n formControlName=\"body\"\n [ngClass]=\"{\n 'w-100': true,\n 'quill-container': true,\n 'is-invalid': submitted && f['body'].errors\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-3 col-sm-6\">\n <pw-input-container\n [label]=\"'Resource.Posts.When' | transloco\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.When' | transloco\"\n name=\"when\">\n <p-datepicker inputId=\"resource-edit-card-when\" formControlName=\"when\"\n [ariaLabel]=\"'Resource.Posts.When' | transloco\"\n [showIcon]=\"true\"\n dateFormat=\"dd-M-yy\"\n [placeholder]=\"'Select Date'\"\n [ngClass]=\"{ 'is-invalid': submitted && f['when'].errors }\">\n </p-datepicker>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 col-md-8\">\n <pw-input-container\n [label]=\"'Resource.Posts.Tags' | transloco\"\n class=\"ui-fluid skills-modal tags\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Resource.Posts.Tooltip.CtaText' | transloco\"\n name=\"cta_text\">\n <p-auto-complete appendTo=\"body\" [(ngModel)]=\"selectedTags\"\n [ariaLabel]=\"'Resource.Posts.Tags' | transloco\"\n class=\"body-bg w-100\"\n [suggestions]=\"tagsSuggestion\"\n dataKey=\"id\"\n optionLabel=\"name\"\n (completeMethod)=\"search($event)\"\n [minLength]=\"1\"\n [maxlength]=\"10\"\n [dropdown]=\"true\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"Tags\"\n [multiple]=\"true\">\n </p-auto-complete>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 row\">\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'SHOWCASE'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Mark as showcase post'\"\n name=\"showcase\">\n <ui-switch formControlName=\"showcase\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'PUBLISHED'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Set to publish the post'\"\n name=\"published_at\">\n <ui-switch formControlName=\"published_at\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n\n <div class=\"col-md-4 col-sm-6\">\n <pw-input-container\n [label]=\"'ACCEPTED BY ADMIN'\"\n [showTooltip]=\"true\"\n [tooltipText]=\"'Indicates approval by admin'\"\n name=\"accepted_at\">\n <ui-switch formControlName=\"accepted_at\" class=\"d-block\"></ui-switch>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"col-12 col-md-4 col-sm-4 my-4 ms-3\">\n <div class=\"text-center mb-4\">\n <span id=\"resource-edit-cover-picture-label\" class=\"pw-label-style\">{{ 'Resource.Posts.CoverPicture' | transloco }}</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img [src]=\"(image && !image.includes('default-photo.jpg')) ? image : 'assets/img/resource/blog.png'\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n class=\"image w-100\"\n alt=\"Modal\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <button type=\"button\" class=\"btn btn-link p-0 d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </button>\n @if (image && !image.includes('default-photo.jpg')) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (click)=\"removeImage()\"\n (keydown.enter)=\"removeImage()\"></i>\n }\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"col-12 col-md-4 col-sm-4 my-4 ms-3\">\n <div class=\"text-center mb-4\">\n <span id=\"resource-edit-rectangular-picture-label\" class=\"pw-label-style\">Rectangular Picture</span>\n <div class=\"text-center d-flex flex-column align-items-center\">\n <img [src]=\"(rectangularImage && !rectangularImage.includes('default-photo.jpg')) ? rectangularImage : 'assets/img/resource/blog.png'\"\n (click)=\"openRectModal(rectContent)\"\n (keydown.enter)=\"openRectModal(rectContent)\"\n class=\"image w-100\"\n alt=\"Uploaded rectangular media preview\"\n (error)=\"handleImageError($event, 'assets/img/resource/blog.png')\" />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <button type=\"button\" class=\"btn btn-link p-0 d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </button>\n @if (rectangularImage && !rectangularImage.includes('default-photo.jpg')) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (click)=\"deleteRectangularImage()\"\n (keydown.enter)=\"deleteRectangularImage()\"></i>\n }\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </form>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" [buttonBusy]=\"buttonBusy\" (click)=\"saveResource()\">Save</button>\n </div>\n</ng-template>\n\n<ng-template #imageCropContent let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Picture</h5>\n <button type=\"button\" class=\"btn-close\" [attr.aria-label]=\"'Common.Close' | transloco\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload a JPG, GIF, or PNG file. (Do not upload pictures containing celebrities,\n nudity, artwork or copyrighted images.)</small>\n <pw-image-cropper\n [aspectRatio]=\"'dynamic'\"\n (imageSelectionEvent)=\"onImageSelected($event)\"\n (closeEvent)=\"modal.close()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n\n<ng-template #rectContent let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Picture</h5>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <small>You can upload a JPG, GIF, or PNG file. (Do not upload pictures containing celebrities,\n nudity, artwork or copyrighted images.)</small>\n <pw-image-cropper\n #profile\n [aspectRatio]=\"'dynamic'\"\n (imageSelectionEvent)=\"onRectangularImageSelection($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWA,IAAsB,yBAAtB,MAAsB,+BAA+B,iBAAgB;CAHrE,cAAA;;EAIuB,KAAA,eAAe,OAAO,QAAQ;EAEjD,KAAA,QAAQ;EACR,KAAA,mBAAmB;EACnB,KAAA,OAAoB;EACpB,KAAA,kBAA+B;CAuClC;CApCG,eAAe,eAAa;EACxB,KAAK,gBAAgB,KAAK,aAAa,KAAK,eAAe;GAAE,UAAU;GAAM,MAAM;EAAI,CAAE;CAC7F;CAEA,cAAc,SAAO;EACjB,KAAK,gBAAgB,KAAK,aAAa,KAAK,SAAS;GACjD,UAAU;GACV,aAAa;EAChB,CAAA;CACL;CAEA,gBAAgB,QAAc;EAC1B,KAAK,QAAQ;EACb,KAAK,OAAO,cAAc,oBAAoB,MAAM;EACpD,KAAK,eAAe,MAAK;CAC7B;CAEA,4BAA4B,QAAc;EACtC,KAAK,mBAAmB;EACxB,KAAK,kBAAkB,cAAc,oBAAoB,MAAM;EAC/D,KAAK,eAAe,MAAK;CAC7B;CAEA,cAAW;EACP,KAAK,QAAQ;EACb,KAAK,OAAO;CAChB;CAEA,yBAAsB;EAClB,KAAK,mBAAmB;EACxB,KAAK,kBAAkB;CAC3B;CAEA,iBAAiB,OAAc,cAAY;EACvC,cAAc,wBAAwB,OAAO,YAAY;CAC7D;CA5CkB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAsB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAtB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAsB,cAAA;GAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UAF9B;GAAE,UAAA;EAAA,CAAA;CAAA;;AAEM,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EAH3C,MAAA;EAAU,MAAA,CAAA,EACP,UAAU,GACb,CAAA;;;ACED,SAAgB,iBAAiB,IAAe;CAC5C,OAAO,GAAG,MAAM;EACZ,OAAO,CAAC,EAAE;EACV,cAAc,CAAC,EAAE;EACjB,UAAU,CAAC,EAAE;EACb,MAAM,CAAC,EAAE;EACT,UAAU,CAAC,KAAK;EAChB,cAAc,CAAC,KAAK;EACpB,aAAa,CAAC,KAAK;EACnB,MAAM,CAAC,EAAE;CACZ,CAAA;AACL;AAGA,SAAgB,kBAAkB,UAAQ;CACtC,OAAO;EACH,OAAO,SAAS,SAAS;EACzB,cAAc,SAAS,gBAAgB;EACvC,UAAU,SAAS,YAAY;EAC/B,MAAM,SAAS,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI;EAChD,UAAU,CAAC,CAAC,SAAS;EACrB,cAAc,CAAC,CAAC,SAAS;EACzB,aAAa,CAAC,CAAC,SAAS;EACxB,MAAM,SAAS;CAClB;AACL;AAGA,SAAgB,qBACZ,MACA,gBACA,QAA0B;CAE1B,MAAM,OAAO;EAAE,GAAG,KAAK;EAAO,iBAAiB;CAAc;CAC7D,QAAQ,MAAM,WAAW,OAAO,IAAI;CACpC,QAAQ,MAAM,uBAAuB,OAAO,eAAe;CAC3D,eAAe,MAAM,MAAM,cAAc;CACzC,eAAe,MAAM,MAAM,aAAa;CACxC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,OACnB,KAAK,OAAO;CAEhB,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,EAAE,OACvB,KAAK,WAAW;CAEpB,IAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,OACxB,KAAK,iBAAiB;CAE1B,IAAI,CAAC,OAAO,mBAAmB,CAAC,OAAO,kBACnC,KAAK,6BAA6B;CAEtC,OAAO;AACX;AAEA,SAAS,QAAQ,MAAM,KAAa,MAAiB;CACjD,IAAI,MACA,KAAK,OAAO;MAEZ,OAAO,KAAK;AAEpB;AAGA,SAAS,eAAe,MAAiB,MAAM,KAAW;CACtD,MAAM,UAAU,KAAK,IAAI,GAAG;CAC5B,IAAI,SAAS,OACT,KAAK,OAAO,QAAQ,QAAQ,OAAM,CAAE,CAAC,OAAO,aAAa,IAAI;MAE7D,OAAO,KAAK;AAEpB;AAGA,SAAgB,WAAuC,MAAW,OAAa;CAC3E,IAAI,CAAC,OACD,OAAO,CAAC,GAAG,IAAI;CAEnB,MAAM,SAAS,MAAM,YAAW;CAChC,OAAO,KAAK,QAAO,QAAO,IAAI,KAAK,YAAW,CAAE,CAAC,SAAS,MAAM,CAAC;AACrE;AAGA,SAAgB,gBAAgB,MAAwB,QAAuB;CAC3E,OAAO;EACH,aAAa,KAAK,KAAI,SAAQ,EAAE,QAAQ,IAAI,GAAE,EAAG;EACjD,MAAM;EACN,YAAY;CACf;AACL;ACtCA,IAAa,4BAAb,MAAa,kCAAkC,uBAAsB;CAwBjE,cAAA;EACI,MAAK;EAxBQ,KAAA,KAAK,OAAO,WAAW;EACvB,KAAA,kBAAkB,OAAO,eAAe;EACxC,KAAA,cAAc,OAAO,WAAW;EAChC,KAAA,aAAa,OAAO,UAAU;EAC9B,KAAA,MAAM,OAAO,iBAAiB;EAIrC,KAAA,UAAU,IAAI,aAAY;EAGpC,KAAA,eAAe,CAAA;EACf,KAAA,UAAU,CAAA;EACV,KAAA,iBAAiB,CAAA;EAGjB,KAAA,aAAa;EAEb,KAAA,eAAe,YAAY,gBACvB,CAAA,GACA,wBAAwB,KAAK,cAAc,CAAC;EAK5C,YAAY,KAAI;EAChB,KAAK,WAAW,iBAAiB,KAAK,EAAE;CAC5C;CAEA,WAAQ;EACJ,KAAK,YAAY,UAAS,CAAE,CAAC,WAAU,QAAM;GACzC,KAAK,eAAe,CAAC,CAAC;GACtB,IAAI,KAAK,cACL,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,WAAU,QAAM;IAClD,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI;IACrC,KAAK,iBAAiB,MAAM;IAC5B,KAAK,IAAI,aAAY;GACzB,CAAC;GAEL,KAAK,IAAI,aAAY;EACzB,CAAC;CACL;CAEA,yBAAsB;EAClB,MAAM,WAAW,oBAAoB,KAAK,cAAc;EACxD,MAAM,UAAU,GAAG,SAAS,SAAS;EACrC,OAAO,KAAK,SAAS,QAAQ;CACjC;CAEA,UAAU,eAAa;EACnB,IAAI,KAAK,cAAc;GACnB,KAAK,SAAS,SAAS,kBAAkB,KAAK,YAAY,CAAC;GAC3D,KAAK,QAAQ,KAAK,aAAa,SAAS,OAAO;GAC/C,KAAK,eAAe,KAAK,cAAc,MAAM,SAAS,CAAC,GAAG,KAAK,aAAa,IAAI,IAAI,CAAA;GACpF,KAAK,mBAAmB,KAAK,aAAa,qBAAqB,OAAO;EAC1E;EACA,KAAK,aAAa,KAAK,eAAe;GAAE,UAAU;GAAM,MAAM;EAAI,CAAE;EACpE,KAAK,YAAW;CACpB;CAEA,OAAO,OAAK;EACR,KAAK,iBAAiB,WAAW,KAAK,SAAS,MAAM,KAAK;CAC9D;CAEQ,cAAW;EACf,KAAK,WACA,cAAc,mBAAmB,CAAA,GAAI,KAAK,cAAc,CAAC,CACzD,WAAU,aAAW;GAClB,KAAK,UAAU,SAAS;GACxB,KAAK,IAAI,aAAY;EACzB,CAAC;CACT;CAEA,eAAY;EACR,KAAK,aAAa;EAClB,KAAK,SAAS,KAAK,EAAE;EACrB,MAAM,UAAU,qBAAqB,KAAK,UAAU,KAAK,gBAAgB,IAAI;EAE7E,KAAK,gBAAgB,WAAW,SAAS,KAAK,EAAE,CAAC,CAAC,UAAU;GACxD,YACI,KAAK,iBAAgB;IACjB,KAAK,MAAM,QAAQ,mBAAmB;IACtC,KAAK,QAAQ,KAAI;IACjB,KAAK,aAAa,WAAU;GAChC,CAAC;GACL,aAAa,KAAK,WAAU;EAC/B,CAAA;CACL;CAIQ,WAAW,cAAyB;EACxC,iBAAgB;GACZ,KAAK,aAAa;GAClB,KAAK,IAAI,aAAY;GACrB,IAAI,cACA,iBAAgB;IACZ,aAAY;IACZ,KAAK,IAAI,aAAY;GACzB,GAAG,CAAC;EAEZ,GAAG,CAAC;CACR;CAEQ,SAAS,IAAmB;EAChC,IAAI,KAAK,aAAa,QAAQ;GAC1B,MAAM,OAAO,gBAAgB,KAAK,cAAc,EAAE;GAClD,KAAK,WAAW,QAAQ,MAAM,KAAK,cAAc,CAAC,CAAC,gBAAe;IAC9D,KAAK,IAAI,aAAY;GACzB,CAAC;EACL;CACJ;CAhHS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAzB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAyB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,IAAA;IAAA,cAAA;GAAA;GAAA,SAAA,EAAA,SAAA,UAAA;GAAA,iBAAA;GAAA,UAAA;GAAA,UC7DtC;GAwOA,QAAA,CAAA,uDAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MD3LQ;IAAW;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA,CAAA,WAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA;KAAA,UAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACX;IAAmB;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA,CAAA,WAAA;KAAA,SAAA,CAAA,UAAA;KAAA,UAAA,CAAA,QAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACnB;KAAuB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACvB;KAAoB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACpB;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAEP;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;KAAY,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACZ;IAAc;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAgB,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAChB;KAAmB,UAAA;KAAA,QAAA,CAAA,cAAA,UAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACnB;KAA4B,UAAA;KAAA,QAAA,CAAA,eAAA,aAAA;KAAA,SAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC5B;KAAa,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAIR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAtBrC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAuB,iBAGhB,wBAAwB;GAAM,SACtC;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,SACQ,CAAC,sBAAsB;GAAC,UAAA;GAAA,QAAA,CAAA,uDAAA;EAAA,CAAA;;;;EAShC,IAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,cAAA,CAAA,EAAA,MAAA,MAAA,CAAA;EACA,SAAA,CAAA,EAAA,MAAA,OAAA,CAAA"}
@@ -1,5 +1,5 @@
1
- import { t as ResourceService } from "./posiwise-resource-module-resource.service-DAXsq-WG.mjs";
2
- import { n as UpcomingEventCardComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { t as ResourceService } from "./posiwise-resource-module-resource.service-BBvcVvWN.mjs";
2
+ import { n as UpcomingEventCardComponent } from "./posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs";
3
3
  import { ResourceSharedModule, ResourceTopBannerEditComponent } from "./posiwise-resource-module.mjs";
4
4
  import * as i0 from "@angular/core";
5
5
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, inject } from "@angular/core";
@@ -53,14 +53,14 @@ var ResourceWebinarComponent = class ResourceWebinarComponent extends AppBaseCom
53
53
  getTags() {
54
54
  this.isLoaded = false;
55
55
  this.tagService.getAllTagCategories({ search: "Events" }, this.getEffectiveSubscriptionId()).subscribe((response) => {
56
- this.tagCategory = response?.tag_categories?.[0];
56
+ this.tagCategory = response?.result?.[0];
57
57
  this.getPostTags();
58
58
  this.cdr.markForCheck();
59
59
  });
60
60
  }
61
61
  getPostTags() {
62
62
  this.tagService.getTagsByType("post_categories", {}, this.getEffectiveSubscriptionId()).subscribe((response) => {
63
- this.blogPostTag = response.tags.find((tag) => tag.tag_category_id === this.tagCategory?.id);
63
+ this.blogPostTag = response.result.find((tag) => tag.tag_category_id === this.tagCategory?.id);
64
64
  this.updateSEOMetadata();
65
65
  this.cdr.markForCheck();
66
66
  }).add(() => {
@@ -264,4 +264,4 @@ i0.ɵɵngDeclareClassMetadata({
264
264
  });
265
265
  export { ResourceEventsModule };
266
266
 
267
- //# sourceMappingURL=posiwise-resource-module-resource-events.module-D7yC0Sqt.mjs.map
267
+ //# sourceMappingURL=posiwise-resource-module-resource-events.module-BO9CcIFp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posiwise-resource-module-resource-events.module-BO9CcIFp.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-webinars/resource-webinars.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-webinars/resource-webinars.component.html","../../../../libs/resource-module/src/lib/public/modules/events/resource-events.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n OnInit\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, Tag, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { ResourceService } from '../../../resource.service';\nimport { ResourceTopBannerEditComponent } from '../resource-top-banner-edit/resource-top-banner-edit.component';\n\nimport { UpcomingEventCardComponent } from './upcoming-event-cards/upcoming-event-cards.component';\n\n@Component({\n selector: 'pw-resource-webinars',\n templateUrl: './resource-webinars.component.html',\n styleUrls: [\n './resource-webinars.component.scss',\n '../resource-case-studies/resource-case-studies.component.scss',\n '../resources/resources-shared.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceTopBannerEditComponent,\n LazyImgDirective,\n UpcomingEventCardComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceWebinarComponent extends AppBaseComponent implements OnInit {\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly titleService = inject(Title);\n private readonly cdr = inject(ChangeDetectorRef);\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n upcomingPosts = [];\n tagCategory;\n userLoggedIn: boolean;\n blogPostTag;\n isLoaded = false;\n\n canEditResourcesValue = false;\n\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n user: User;\n isMasterSubscription;\n\n ngOnInit() {\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.getTags();\n this.updateCanEditResourcesValue();\n this.cdr.markForCheck();\n });\n } else {\n this.getTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n private getTags() {\n this.isLoaded = false;\n this.tagService\n .getAllTagCategories({ search: 'Events' }, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.tagCategory = response?.result?.[0];\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.blogPostTag = response.result.find(\n tag => tag.tag_category_id === this.tagCategory?.id\n );\n this.updateSEOMetadata();\n this.cdr.markForCheck();\n })\n .add(() => {\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n }\n\n private updateSEOMetadata() {\n if (this.blogPostTag) {\n // Update page title if meta_title is available\n if ((this.blogPostTag as Tag).meta_title) {\n this.titleService.setTitle((this.blogPostTag as Tag).meta_title);\n }\n\n // Update meta description if meta_description is available\n if ((this.blogPostTag as Tag).meta_description) {\n this.updateMetaDescription((this.blogPostTag as Tag).meta_description);\n }\n }\n }\n\n private updateMetaDescription(description: string) {\n let metaDescription = document.querySelector('meta[name=\"description\"]');\n if (!metaDescription) {\n metaDescription = document.createElement('meta');\n metaDescription.setAttribute('name', 'description');\n document.head.appendChild(metaDescription);\n }\n metaDescription.setAttribute('content', description);\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<section class=\"bg-white\">\n <div class=\"resource-banner resource-section\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Events & Webinars'\"></span>\n @if (canEditResourcesValue) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getPostTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension\">\n @if (!blogPostTag?.description || blogPostTag.description === 'null') {\n <p class=\"intro\">\n We&rsquo;re big on community and even bigger on sharing what works.\n </p>\n } @else {\n <p class=\"intro\" [innerHTML]=\"blogPostTag.description\"></p>\n }\n <div class=\"cta-buttons d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img\"\n [src]=\"(blogPostTag?.image?.url !== null && !blogPostTag?.image?.url?.includes('default-photo.jpg') && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared')) ) ? blogPostTag?.image?.url : 'assets/img/resource/events-women.png'\"\n alt=\"Events and webinars banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n\n<section class=\"bg-white\">\n <pw-upcoming-event-card [tag]=\"blogPostTag\" [categoryId]=\"blogPostTag?.tag_category_id\" [resourceTitle]=\"blogPostTag?.title\" [postSlice]=\"true\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-upcoming-event-card>\n</section>\n\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceWebinarComponent } from '../../components/resource-webinars/resource-webinars.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceWebinarComponent,\n data: {\n title: 'Resources - Events',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceWebinarComponent]\n})\nexport class ResourceEventsModule {}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as ResourceService } from "./posiwise-resource-module-resource.service-DAXsq-WG.mjs";
2
- import { u as ResourceEditCardLazyComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { t as ResourceService } from "./posiwise-resource-module-resource.service-BBvcVvWN.mjs";
2
+ import { u as ResourceEditCardLazyComponent } from "./posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs";
3
3
  import { ResourceSharedModule } from "./posiwise-resource-module.mjs";
4
4
  import * as i0 from "@angular/core";
5
5
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, NgModule, ViewEncapsulation, inject } from "@angular/core";
@@ -82,15 +82,15 @@ var ResourceHubComponent = class ResourceHubComponent extends AppBaseComponent {
82
82
  resPosts: this.resourceService.getPublicPosts(this.getEffectiveSubscriptionId(), this.currentPage, this.pageSize, this.searchTextItems),
83
83
  resTags: this.tagService.getTagsByType("post_categories", {}, this.getEffectiveSubscriptionId())
84
84
  }).subscribe((res) => {
85
- this.posts = res?.resPosts?.posts;
86
- this.objectCount = res?.resPosts.object_count;
87
- this.data = res?.resPosts?.posts;
88
- this.data = res?.resPosts?.posts.map((post) => ({
85
+ this.posts = res?.resPosts?.result;
86
+ this.objectCount = res?.resPosts.page_info?.total_count;
87
+ this.data = res?.resPosts?.result;
88
+ this.data = res?.resPosts?.result.map((post) => ({
89
89
  ...post,
90
90
  expandedTags: false
91
91
  }));
92
92
  this.totalRecords = this.posts?.length;
93
- this.tags = res?.resTags?.tags?.filter((tag) => tag.visible_in_resources);
93
+ this.tags = res?.resTags?.result?.filter((tag) => tag.visible_in_resources);
94
94
  this.tags = this.tags.map((tag) => ({ ...tag }));
95
95
  this.cdr.markForCheck();
96
96
  }).add(() => {
@@ -111,8 +111,8 @@ var ResourceHubComponent = class ResourceHubComponent extends AppBaseComponent {
111
111
  }
112
112
  const tagCategoryParam = this.selectedTags.map((tag) => tag.tag_category_id).join(",");
113
113
  this.resourceService.getPublicPosts(this.getEffectiveSubscriptionId(), page, pageSize, this.searchTextItems, tagCategoryParam).subscribe((response) => {
114
- this.objectCount = response.object_count;
115
- this.posts = append ? [...this.posts, ...response.posts] : response.posts;
114
+ this.objectCount = response.page_info?.total_count;
115
+ this.posts = append ? [...this.posts, ...response.result] : response.result;
116
116
  this.data = [...this.posts];
117
117
  this.totalRecords = this.posts?.length;
118
118
  this.cdr.markForCheck();
@@ -459,4 +459,4 @@ i0.ɵɵngDeclareClassMetadata({
459
459
  });
460
460
  export { ResourceHubModule };
461
461
 
462
- //# sourceMappingURL=posiwise-resource-module-resource-hub.module-alVvQLvR.mjs.map
462
+ //# sourceMappingURL=posiwise-resource-module-resource-hub.module-B3EZao2L.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posiwise-resource-module-resource-hub.module-B3EZao2L.mjs","names":["i1"],"sources":["../../../../libs/resource-module/src/lib/public/components/resources-hub/resources-hub.component.ts","../../../../libs/resource-module/src/lib/public/components/resources-hub/resources-hub.component.html","../../../../libs/resource-module/src/lib/public/modules/hub/resource-hub.module.ts"],"sourcesContent":["import { DatePipe, NgClass, UpperCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { Resource, Tag, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { RemoveHtmlPipe, TextTruncatePipe } from '@posiwise/pipes';\nimport { NoDataComponent } from '@posiwise/shared-components';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { Bind } from 'primeng/bind';\nimport { IconField } from 'primeng/iconfield';\nimport { InputIcon } from 'primeng/inputicon';\nimport { InputText } from 'primeng/inputtext';\nimport { ProgressSpinner } from 'primeng/progressspinner';\nimport { forkJoin, Subscription } from 'rxjs';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../resource.service';\nimport { RESOURCE_PAGE_SIZE } from '../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../resource-edit-card-lazy/resource-edit-card-lazy.component';\n\n@Component({\n selector: 'pw-posts-list',\n templateUrl: './resources-hub.component.html',\n styleUrls: [\n './resources-hub.component.scss',\n '../resource-company-card/resource-company-card.component.scss'\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n Bind,\n IconField,\n InputIcon,\n FormsModule,\n InputText,\n ProgressSpinner,\n ResourceEditCardLazyComponent,\n RouterLink,\n LazyImgDirective,\n NgClass,\n NoDataComponent,\n UpperCasePipe,\n DatePipe,\n RemoveHtmlPipe,\n TextTruncatePipe,\n TranslocoPipe\n ]\n})\nexport class ResourceHubComponent extends AppBaseComponent implements OnInit, OnDestroy {\n private readonly resourceService = inject(ResourceService);\n private readonly authService = inject(AuthService);\n private readonly tagService = inject(TagService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private delayTimeout: ReturnType<typeof setTimeout> | null = null;\n private userSub: Subscription;\n\n data = [];\n\n posts: Resource[] = [];\n tags: Tag[] = [];\n\n selectedTags = [];\n\n currentPage = 1;\n pageSize = RESOURCE_PAGE_SIZE;\n objectCount = 0;\n\n searchTextItems = '';\n searchInput = false;\n\n readingTime: number;\n\n totalRecords: number;\n\n loading = true;\n loaded = false;\n\n masterSubscriptionId: number;\n subscriptionId;\n userLoggedIn: boolean;\n isMasterSubscription;\n\n scrollLocked = false;\n\n iconClasses: string[] = [\n 'fa-lightbulb',\n 'fa-rocket',\n 'fa-file-alt',\n 'fa-users',\n 'fa-video',\n 'fa-pencil-alt',\n 'fa-book-open',\n 'fa-cogs'\n ];\n user: User;\n\n canEditResourcesValue = false;\n\n ngOnInit() {\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userSub = this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n this.updateCanEditResourcesValue();\n this.getPostsAndTags();\n this.cdr.markForCheck();\n });\n } else {\n this.getPostsAndTags();\n }\n this.cdr.markForCheck();\n });\n this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n this.readingTime = 0;\n }\n\n getPostsAndTags() {\n this.loading = true;\n this.loaded = false;\n forkJoin({\n resPosts: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n this.currentPage,\n this.pageSize,\n this.searchTextItems\n ),\n resTags: this.tagService.getTagsByType(\n 'post_categories',\n {},\n this.getEffectiveSubscriptionId()\n )\n })\n .subscribe(res => {\n this.posts = res?.resPosts?.result;\n this.objectCount = res?.resPosts.page_info?.total_count;\n this.data = res?.resPosts?.result;\n this.data = res?.resPosts?.result.map(post => ({\n ...post,\n expandedTags: false\n }));\n this.totalRecords = this.posts?.length;\n\n this.tags = res?.resTags?.result?.filter(tag => tag.visible_in_resources);\n this.tags = this.tags.map(tag => ({\n ...tag\n }));\n this.cdr.markForCheck();\n })\n .add(() => {\n this.loading = false;\n this.loaded = true;\n this.cdr.markForCheck();\n });\n }\n\n toggleDropdown(event: Event, post): void {\n event.stopPropagation();\n post.showDropdown = !post.showDropdown;\n }\n\n getPosts(page: number, pageSize: number, fetchAll = false, append = false) {\n if (fetchAll) this.selectedTags = [];\n\n if (!append) {\n this.loading = true;\n this.loaded = false;\n }\n\n const tagCategoryParam = this.selectedTags.map(tag => tag.tag_category_id).join(',');\n\n this.resourceService\n .getPublicPosts(\n this.getEffectiveSubscriptionId(),\n page,\n pageSize,\n this.searchTextItems,\n tagCategoryParam\n )\n .subscribe(response => {\n this.objectCount = response.page_info?.total_count;\n this.posts = append ? [...this.posts, ...response.result] : response.result;\n this.data = [...this.posts];\n this.totalRecords = this.posts?.length;\n this.cdr.markForCheck();\n })\n .add(() => {\n this.loading = false;\n this.loaded = true;\n this.cdr.markForCheck();\n });\n }\n\n onSearch(seconds: number) {\n let delay = 0;\n delay = seconds * 1000;\n clearTimeout(this.delayTimeout);\n const delayTimeout = setTimeout(() => {\n this.currentPage = 1;\n this.getPosts(1, this.pageSize);\n }, delay);\n\n this.delayTimeout = delayTimeout;\n }\n\n navigateToTagList(): void {\n HelperService.navigateToTagList();\n }\n\n @HostListener('window:scroll', [])\n onWindowScroll(): void {\n const scrollPosition = window.scrollY + window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n\n const nearBottom = scrollPosition >= pageHeight - 100;\n\n if (\n nearBottom &&\n this.posts.length < this.objectCount &&\n !this.loading &&\n !this.scrollLocked\n ) {\n this.scrollLocked = true;\n this.currentPage += 1;\n\n this.getPosts(this.currentPage, this.pageSize, false, true);\n\n setTimeout(() => {\n this.scrollLocked = false;\n }, 500);\n }\n }\n\n isSelected(tagId: number): boolean {\n return this.selectedTags.map(tag => tag.id).includes(tagId);\n }\n\n tagPost(selectedTag) {\n const index = this.selectedTags.findIndex(\n tag => tag.tag_category_id === selectedTag?.tag_category_id && tag.id === selectedTag.id\n );\n\n if (index === -1) {\n this.selectedTags.push({\n tag_category_id: selectedTag?.tag_category_id,\n id: selectedTag.id\n });\n } else {\n this.selectedTags.splice(index, 1);\n }\n\n this.currentPage = 1;\n this.getPosts(1, this.pageSize);\n }\n\n thisPostReadingTime(text: string): string {\n if (text) {\n const wordsPerMinute = 200;\n const noOfWords = text.split(/\\s/g).length;\n const minutes = noOfWords / wordsPerMinute;\n const readTime = Math.ceil(minutes);\n\n return `${readTime} minute read`;\n }\n\n return '';\n }\n\n override ngOnDestroy() {\n this.userSub?.unsubscribe();\n super.ngOnDestroy();\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.appConfig.master_subscription.subscription_id\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<div class=\"hub-page\">\n<section class=\"hub-hero\" aria-labelledby=\"hub-hero-title\">\n <div class=\"hub-hero__glow\" aria-hidden=\"true\"></div>\n <div class=\"hub-hero__grid\" aria-hidden=\"true\"></div>\n <div class=\"hub-hero__inner\">\n <p class=\"hub-hero__eyebrow\">{{ 'Resource.Posts.Title' | transloco | uppercase }}</p>\n <h1 id=\"hub-hero-title\" class=\"hub-hero__title\">\n Stories, guides, and notes <br class=\"hub-hero__br\" />from the team.\n </h1>\n <p class=\"hub-hero__subtitle\">{{ 'Resource.Hub.Subtitle' | transloco }}</p>\n <div class=\"hub-hero__search\">\n <p-iconfield class=\"hub-hero__search-field\" iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\" id=\"resources-hub-search\" name=\"resources-hub-search\"\n [(ngModel)]=\"searchTextItems\" pInputText\n [placeholder]=\"'Resource.Hub.SearchPlaceholder' | transloco\"\n (input)=\"onSearch(1)\" class=\"hub-hero__search-input\"\n aria-label=\"Resources Hub Search\" />\n </p-iconfield>\n @if (userLoggedIn && user?.auth?.granted['Pages.Admin']) {\n <button type=\"button\" class=\"hub-hero__edit\"\n [title]=\"'Resource.Hub.EditTagsTooltip' | transloco\"\n [attr.aria-label]=\"'Resource.Hub.EditTagsTooltip' | transloco\"\n (click)=\"navigateToTagList()\" (keydown.enter)=\"navigateToTagList()\">\n <i class=\"fa fa-edit\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n</section>\n\n<div class=\"hub-shell\">\n <nav class=\"hub-chips\" aria-label=\"Resource categories\">\n <button type=\"button\" class=\"hub-chip hub-chip--all\"\n [class.hub-chip--selected]=\"selectedTags.length === 0\"\n (click)=\"getPosts(1, pageSize, true)\" (keydown.enter)=\"getPosts(1, pageSize, true)\">\n <span class=\"hub-chip__dot\" aria-hidden=\"true\"></span>\n <span class=\"hub-chip__label\">{{ 'Resource.Hub.AllResources' | transloco }}</span>\n @if (objectCount) { <span class=\"hub-chip__count\">{{ objectCount }}</span> }\n </button>\n @for (tag of tags; track tag.id) {\n <button type=\"button\" class=\"hub-chip\"\n [class.hub-chip--selected]=\"isSelected(tag.id)\"\n (click)=\"tagPost(tag)\" (keydown.enter)=\"tagPost(tag)\">\n <span class=\"hub-chip__dot\" [attr.data-cat]=\"tag.id % 6\" aria-hidden=\"true\"></span>\n <span class=\"hub-chip__label\">{{ tag.name }}</span>\n </button>\n }\n </nav>\n\n @if (loading && !loaded) {\n <div class=\"hub-loading\"><p-progress-spinner strokeWidth=\"2\"></p-progress-spinner></div>\n }\n\n @if (posts?.length && !loading) {\n <ul class=\"hub-grid\" role=\"list\">\n @for (post of data; track post.id; let i = $index) {\n <li class=\"hub-post\" [style.--reveal-delay.ms]=\"i * 40\">\n <pw-resource-edit-card-lazy [canEdit]=\"canEditResourcesValue\" [id]=\"post?.id\"\n [resourceData]=\"post\" (updated)=\"getPosts(1, pageSize)\"></pw-resource-edit-card-lazy>\n\n <a class=\"hub-post__media\" [routerLink]=\"['/resources/view', post.slug]\"\n [attr.aria-label]=\"post.title\"\n [attr.data-cat]=\"(post?.tags?.[0]?.id || 0) % 6\">\n @if (post.picture?.url && !post.picture.url.includes('default-photo')) {\n <img [src]=\"post.picture?.url\" alt=\"\" loading=\"lazy\" class=\"hub-post__image\" />\n } @else {\n <span class=\"hub-post__glyph\" aria-hidden=\"true\">\n {{ (post.title?.[0] || '?').toUpperCase() }}\n </span>\n @if (post?.tags?.[0]?.icon_name) {\n <i class=\"fa hub-post__icon\" [ngClass]=\"post.tags[0].icon_name\" aria-hidden=\"true\"></i>\n }\n }\n </a>\n\n <div class=\"hub-post__body\">\n @if (post?.tags?.[0]) {\n <p class=\"hub-post__eyebrow\" [attr.data-cat]=\"post.tags[0].id % 6\">\n <span class=\"hub-post__dot\" aria-hidden=\"true\"></span>\n {{ post.tags[0].name }}\n </p>\n }\n <h2 class=\"hub-post__title\" [routerLink]=\"['/resources/view', post.slug]\">{{ post.title }}</h2>\n <p class=\"hub-post__excerpt\">{{ post.blurb || (post.body | removeHtml: 'quill' | textTruncate: 140) }}</p>\n <div class=\"hub-post__foot\">\n @if (post.author?.avatar?.[0]?.url) {\n <img class=\"hub-post__avatar\" [src]=\"post.author.avatar[0].url\" alt=\"\" />\n } @else {\n <span class=\"hub-post__avatar hub-post__avatar--text\" aria-hidden=\"true\">{{ (post.author?.first_name?.[0] || '?').toUpperCase() }}</span>\n }\n <div class=\"hub-post__author-meta\">\n <span class=\"hub-post__author-name\">{{ post.author?.first_name }}</span>\n <span class=\"hub-post__author-sub\">\n <time [attr.datetime]=\"post.published_at\">{{ post.published_at | date: 'd MMM' }}</time>\n <span class=\"hub-post__sep\" aria-hidden=\"true\">·</span>\n <span class=\"hub-post__rt\">{{ thisPostReadingTime(post.body) }}</span>\n </span>\n </div>\n <span class=\"hub-post__views\" [title]=\"'Resource.Hub.ViewCount' | transloco: { count: post.view ?? 0 }\">\n {{ post.view ?? 0 }}\n </span>\n </div>\n </div>\n </li>\n }\n </ul>\n }\n\n @if (!posts?.length && loaded) {\n <div class=\"hub-empty\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n</div>\n</div>\n</main>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceHubComponent } from '../../components/resources-hub/resources-hub.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceHubComponent,\n data: {\n title: 'Resources - Hub',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceHubComponent]\n})\nexport class ResourceHubModule {}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { t as ResourceService } from "./posiwise-resource-module-resource.service-DAXsq-WG.mjs";
2
- import { c as ResourceNoteCardComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { t as ResourceService } from "./posiwise-resource-module-resource.service-BBvcVvWN.mjs";
2
+ import { c as ResourceNoteCardComponent } from "./posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs";
3
3
  import { ResourceCompanyCardComponent, ResourceSharedModule, ResourceTopBannerEditComponent } from "./posiwise-resource-module.mjs";
4
- import { t as BaseTopBannerComponent } from "./posiwise-resource-module-base-top-banner.component-BwujN_up.mjs";
4
+ import { t as BaseTopBannerComponent } from "./posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs";
5
5
  import * as i0 from "@angular/core";
6
6
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, ViewChild, inject } from "@angular/core";
7
7
  import { AuthService, TagService } from "@posiwise/common-services";
@@ -23,6 +23,7 @@ import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
23
23
  import { CdkDrag, CdkDragHandle, CdkDropList, moveItemInArray } from "@angular/cdk/drag-drop";
24
24
  import { ProgressSpinner } from "primeng/progressspinner";
25
25
  import { DomSanitizer } from "@angular/platform-browser";
26
+ import { SeoGuard } from "@posiwise/core-guards";
26
27
  import { AdminService } from "@posiwise/admin-module-utils";
27
28
  import { CompanyData } from "@posiwise/common-utilities";
28
29
  var IntegrationTopBannerComponent = class IntegrationTopBannerComponent extends BaseTopBannerComponent {
@@ -158,7 +159,7 @@ var ResourceIntegrationComponent = class ResourceIntegrationComponent extends Ap
158
159
  getTags() {
159
160
  this.isLoaded = false;
160
161
  this.tagService.getAllTagCategories({ search: "Integrations" }, this.getEffectiveSubscriptionId()).subscribe((response) => {
161
- this.tagCategory = response?.tag_categories?.[0];
162
+ this.tagCategory = response?.result?.[0];
162
163
  this.getPostTags();
163
164
  this.cdr.markForCheck();
164
165
  });
@@ -181,18 +182,18 @@ var ResourceIntegrationComponent = class ResourceIntegrationComponent extends Ap
181
182
  }
182
183
  getPostTags() {
183
184
  this.tagService.getTagsByType("post_categories", {}, this.getEffectiveSubscriptionId()).subscribe((response) => {
184
- this.resourcePostTag = response.tags.find((tag) => tag.name === "Product Release Notes");
185
- this.blogPostTag = response.tags.find((tag) => tag.name === "Integrated Distributors" && tag.tag_category_id === this.tagCategory?.id);
186
- this.blogPostVendorTag = response.tags.find((tag) => tag.name === "Integrated Vendors" && tag.tag_category_id === this.tagCategory?.id);
185
+ this.resourcePostTag = response.result.find((tag) => tag.name === "Product Release Notes");
186
+ this.blogPostTag = response.result.find((tag) => tag.name === "Integrated Distributors" && tag.tag_category_id === this.tagCategory?.id);
187
+ this.blogPostVendorTag = response.result.find((tag) => tag.name === "Integrated Vendors" && tag.tag_category_id === this.tagCategory?.id);
187
188
  forkJoin({
188
189
  vendorResponse: this.resourceService.getPublicPosts(this.getEffectiveSubscriptionId(), 1, 100, "", "", this.blogPostVendorTag?.id),
189
190
  distributorResponse: this.resourceService.getPublicPosts(this.getEffectiveSubscriptionId(), 1, 100, "", "", this.blogPostTag?.id)
190
191
  }).subscribe(({ vendorResponse, distributorResponse }) => {
191
- const sortedVendors = vendorResponse.posts.sort((a, b) => new Date(b.published_at).getTime() - new Date(a.published_at).getTime());
192
- const sortedDistributors = distributorResponse.posts.sort((a, b) => new Date(b.published_at).getTime() - new Date(a.published_at).getTime());
192
+ const sortedVendors = vendorResponse.result.sort((a, b) => new Date(b.published_at).getTime() - new Date(a.published_at).getTime());
193
+ const sortedDistributors = distributorResponse.result.sort((a, b) => new Date(b.published_at).getTime() - new Date(a.published_at).getTime());
193
194
  this.posts = sortedVendors.filter((post) => this.hasDisplayableImage(post));
194
195
  this.distributerPosts = sortedDistributors.filter((post) => this.hasDisplayableImage(post));
195
- const total = (vendorResponse?.object_count ?? 0) + (distributorResponse?.object_count ?? 0);
196
+ const total = (vendorResponse?.page_info?.total_count ?? 0) + (distributorResponse?.page_info?.total_count ?? 0);
196
197
  this.integrationCountDisplay = total === 0 ? 0 : Math.ceil(total / 10) * 10;
197
198
  this.isLoaded = true;
198
199
  this.cdr.markForCheck();
@@ -538,10 +539,12 @@ const routes = [{
538
539
  path: "",
539
540
  component: ResourceIntegrationComponent,
540
541
  data: {
541
- title: "Resources - Integrations",
542
+ title: "Integrations: Supported Vendors and Tools",
543
+ description: "See every integration the platform supports, how each one connects and what it keeps in sync.",
542
544
  permission: "Pages.Blog",
543
545
  preload: false
544
- }
546
+ },
547
+ canActivate: [SeoGuard]
545
548
  }];
546
549
  var ResourceIntegrationsModule = class ResourceIntegrationsModule {
547
550
  static {
@@ -600,4 +603,4 @@ i0.ɵɵngDeclareClassMetadata({
600
603
  });
601
604
  export { ResourceIntegrationsModule };
602
605
 
603
- //# sourceMappingURL=posiwise-resource-module-resource-integrations.module-G4XvMMYf.mjs.map
606
+ //# sourceMappingURL=posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posiwise-resource-module-resource-integrations.module-Djkoz9EF.mjs","names":["i1"],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-integration/resource-integration.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-integration/resource-integration.component.html","../../../../libs/resource-module/src/lib/public/modules/integrations/resource-integrations.module.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { LazyImgDirective } from '@posiwise/directives';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\n@Component({\n selector: 'pw-integration-top-banner',\n templateUrl: './integration-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, LazyImgDirective]\n})\nexport class IntegrationTopBannerComponent extends BaseTopBannerComponent {\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n\n protected getSearchTerm(): string {\n return 'Integrations';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n <span [innerHTML]=\"blogPostTag?.title || 'Integrated vendors'\"></span>\n @if (canEditResourcesValue) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n <span class=\"blue-text\"></span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension mt-4\">\n <div class=\"cta-buttons d-flex flex-column justify-between h-100\">\n <div class=\"flex-grow-1\">\n @if (blogPostTag?.description && blogPostTag.description !== 'null' ) {\n <p class=\"intro\" [innerHTML]=\"blogPostTag.description\"></p>\n } @else {\n <p class=\"intro\">\n Browse below the vendor integrations<br />\n we support.\n </p>\n }\n </div>\n <div class=\"d-flex gap-3 flex-wrap mt-3\">\n <a [href]=\"contactUsUrl\" target=\"_blank\" rel=\"noopener noreferrer\"\n class=\"cta-btn filled\">Talk to us <i class=\"fa fa-chevron-right cta-btn__icon\" aria-hidden=\"true\"></i></a>\n </div>\n </div>\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <img class=\"resource-laptop-img dyn-img\"\n [src]=\"(blogPostTag?.image?.url && !(blogPostTag?.image?.url.includes('no_image_uploaded_squared'))) ? blogPostTag?.image?.url : '/assets/img/resource/men.webp'\"\n alt=\"Integrated vendors banner\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </div>\n </div>\n }\n </div>\n</section>\n","import {\n CdkDrag,\n CdkDragDrop,\n CdkDragHandle,\n CdkDropList,\n moveItemInArray\n} from '@angular/cdk/drag-drop';\nimport { DOCUMENT, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n OnInit,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { AdminService } from '@posiwise/admin-module-utils';\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { CompanyData, Resource, User } from '@posiwise/common-utilities';\nimport { LazyImgDirective } from '@posiwise/directives';\nimport { HelperService } from '@posiwise/helper-service';\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { NoDataComponent } from '@posiwise/shared-components';\nimport { CustomUploaderComponent, ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { Bind } from 'primeng/bind';\nimport { ProgressSpinner } from 'primeng/progressspinner';\nimport { forkJoin } from 'rxjs';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\nimport { ResourceService } from '../../../resource.service';\nimport { ResourceNoteCardComponent } from '../reslease-note-card/release-note-card.component';\nimport { ResourceCompanyCardComponent } from '../resource-company-card/resource-company-card.component';\n\nimport { IntegrationTopBannerComponent } from './integration-top-banner/integration-top-banner.component';\n\n@Component({\n selector: 'pw-resource-integration',\n templateUrl: './resource-integration.component.html',\n styleUrls: [\n './resource-integration.component.scss',\n '../resources/resources-shared.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n IntegrationTopBannerComponent,\n ResourceCompanyCardComponent,\n Bind,\n ProgressSpinner,\n NoDataComponent,\n NgClass,\n LazyImgDirective,\n ResourceNoteCardComponent,\n Trial4ContactUsComponent,\n FormsModule,\n CdkDropList,\n CdkDrag,\n CdkDragHandle,\n TranslocoPipe\n ]\n})\nexport class ResourceIntegrationComponent extends AppBaseComponent implements OnInit {\n private readonly sanitizer = inject(DomSanitizer);\n private readonly resourceService = inject(ResourceService);\n private readonly modalService = inject(NgbModal);\n private readonly tagService = inject(TagService);\n private readonly authService = inject(AuthService);\n private readonly adminService = inject(AdminService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private readonly doc = inject(DOCUMENT);\n\n @ViewChild('editIntegrationsModal') editIntegrationsModal: TemplateRef<CustomUploaderComponent>;\n editingIntegrations;\n distributorsData = CompanyData?.distributorsData;\n vendorsData = CompanyData?.vendorsData;\n\n textColor = this.appConfig?.color_codes?.text;\n\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n posts: Resource[] = [];\n distributerPosts = [];\n userLoggedIn: boolean;\n blogPostTag;\n isLoaded = false;\n resourcePostTag;\n blogPostVendorTag;\n isMasterSubscription;\n\n integrations = this.appConfig?.pages_config?.integrations;\n\n releaseNotesLink = '/resources/product-release-notes';\n q1NotesLink = '/resources/product-release-q1-2025';\n q3NotesLink = '/resources/product-release-q3-2024';\n q4NotesLink = '/resources/product-release-q4-2024';\n companyName;\n\n videoWebinarLoaded = false;\n videoDemoLoaded = false;\n youtubeVideoId = 'R7Vk219zbhA';\n videoTitle = 'CloudOlive Overview';\n sanitizedMicrosoftVideoUrl: SafeResourceUrl;\n sanitizedKesyaVideoUrl: SafeResourceUrl;\n integrationCountDisplay: number;\n contactUsUrl = this.appConfig?.pages_config?.contact_us?.url;\n tagCategory;\n totalPosts: number;\n\n guideData = this.appConfig?.pages_config?.guides;\n editingGuides = { items: [] };\n user: User;\n\n canEditResourcesValue = false;\n domainId = this.appConfig.domain_id;\n\n ngOnInit() {\n this.companyName = this.appConfig.company.name;\n\n this.doc.documentElement.style.setProperty('--text-color', this.textColor);\n this.getUserSubscriptionId().subscribe(response => {\n this.subscriptionId = response;\n this.cdr.markForCheck();\n });\n this.authService.getToken$().subscribe(res => {\n this.userLoggedIn = !!res;\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n this.userService.getUserInfo().subscribe(data => {\n this.user = data;\n\n this.getTags();\n this.updateCanEditResourcesValue();\n this.cdr.markForCheck();\n });\n } else {\n this.getTags();\n }\n this.cdr.markForCheck();\n });\n }\n\n private getTags() {\n this.isLoaded = false;\n this.tagService\n .getAllTagCategories({ search: 'Integrations' }, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.tagCategory = response?.result?.[0];\n this.getPostTags();\n this.cdr.markForCheck();\n });\n }\n\n openEditIntegrationsModal(modalRef) {\n this.editingIntegrations = structuredClone(this.integrations);\n this.modalService.open(modalRef, {\n size: 'lg',\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n showIntegrations(): boolean {\n if (this.userLoggedIn) {\n return true;\n }\n\n if (Array.isArray(this.guideData?.items) && this.guideData.items.length) {\n const item = this.guideData.items[0];\n return (\n !!item?.title ||\n !!item?.description ||\n !!item?.guide_url ||\n (!!item?.image_url && !item.image_url.includes('default-image.png'))\n );\n }\n\n return false;\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.getEffectiveSubscriptionId())\n .subscribe(response => {\n this.resourcePostTag = response.result.find(\n tag => tag.name === 'Product Release Notes'\n );\n this.blogPostTag = response.result.find(\n tag =>\n tag.name === 'Integrated Distributors' &&\n tag.tag_category_id === this.tagCategory?.id\n );\n this.blogPostVendorTag = response.result.find(\n tag =>\n tag.name === 'Integrated Vendors' &&\n tag.tag_category_id === this.tagCategory?.id\n );\n\n // use forkJoin to fetch both sets of posts in parallel\n forkJoin({\n vendorResponse: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n 1,\n 100,\n '',\n '',\n this.blogPostVendorTag?.id\n ),\n distributorResponse: this.resourceService.getPublicPosts(\n this.getEffectiveSubscriptionId(),\n 1,\n 100,\n '',\n '',\n this.blogPostTag?.id\n )\n }).subscribe(({ vendorResponse, distributorResponse }) => {\n const sortedVendors = vendorResponse.result.sort(\n (a, b) =>\n new Date(b.published_at).getTime() - new Date(a.published_at).getTime()\n );\n const sortedDistributors = distributorResponse.result.sort(\n (a, b) =>\n new Date(b.published_at).getTime() - new Date(a.published_at).getTime()\n );\n\n // Show only integrations that have an image; count still includes all\n this.posts = sortedVendors.filter(post => this.hasDisplayableImage(post));\n this.distributerPosts = sortedDistributors.filter(post =>\n this.hasDisplayableImage(post)\n );\n\n const vendorCount = vendorResponse?.page_info?.total_count ?? 0;\n const distributorCount = distributorResponse?.page_info?.total_count ?? 0;\n const total = vendorCount + distributorCount;\n\n this.integrationCountDisplay = total === 0 ? 0 : Math.ceil(total / 10) * 10;\n this.isLoaded = true;\n this.cdr.markForCheck();\n });\n this.cdr.markForCheck();\n });\n }\n\n loadMicrosoftVideo(videoUrl) {\n window.open(videoUrl, '_blank', 'noopener,noreferrer');\n }\n\n loadKeseyaVideo(): void {\n const baseUrl = `https://www.youtube.com/embed/${this.youtubeVideoId}?autoplay=1`;\n // baseUrl is a trusted internal source (e.g. YouTube embed URL)\n this.sanitizedKesyaVideoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(baseUrl); // NOSONAR\n this.videoWebinarLoaded = true;\n }\n\n addIntegrationItem() {\n this.editingIntegrations.items.push({\n title: '',\n description: '',\n blog_url: '',\n image_url: '',\n video_url: ''\n });\n }\n\n removeIntegrationItem(index: number) {\n this.editingIntegrations.items.splice(index, 1);\n }\n\n dropIntegrationItems(event) {\n moveItemInArray(this.editingIntegrations.items, event.previousIndex, event.currentIndex);\n }\n\n saveIntegrations(modalRef) {\n const updatedIntegrations = {\n ...this.editingIntegrations\n };\n\n this.adminService\n .updateDomainConfig(this.domainId, {\n integrations: updatedIntegrations,\n subscription_id: this.getEffectiveSubscriptionId()\n })\n .subscribe(() => {\n this.integrations = updatedIntegrations;\n this.toast.success('Integrations updated');\n modalRef.close();\n this.cdr.markForCheck();\n });\n }\n\n saveGuides(modalRef) {\n const updatedGuides = {\n ...this.editingGuides\n };\n\n this.adminService\n .updateDomainConfig(this.domainId, {\n guides: updatedGuides,\n subscription_id: this.getEffectiveSubscriptionId()\n })\n .subscribe(() => {\n this.guideData = updatedGuides;\n this.toast.success('Guides updated');\n modalRef.close();\n this.cdr.markForCheck();\n });\n }\n\n openGuidesModal(template) {\n this.editingGuides = structuredClone(this.guideData ?? { items: [] });\n this.modalService.open(template, { size: 'xl' });\n }\n\n addGuide() {\n this.editingGuides.items.push({\n title: '',\n button_text: '',\n image_url: '',\n guide_url: '',\n description: ''\n });\n }\n\n removeGuide(index: number) {\n this.editingGuides.items.splice(index, 1);\n }\n\n dropGuides(event: CdkDragDrop<string[]>) {\n moveItemInArray(this.editingGuides.items, event.previousIndex, event.currentIndex);\n }\n\n private hasDisplayableImage(post: {\n companyImg?: string;\n rectangular_picture?: { url?: string };\n }): boolean {\n if (post?.companyImg) {\n return true;\n }\n const url = post?.rectangular_picture?.url;\n return !!url && !url.includes('default-photo');\n }\n\n /** Helper method to get effective subscription ID */\n private getEffectiveSubscriptionId(): number {\n return HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n );\n }\n\n private updateCanEditResourcesValue(): void {\n if (this.userLoggedIn && this.user) {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n } else {\n this.canEditResourcesValue = false;\n }\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n<pw-integration-top-banner></pw-integration-top-banner>\n<div class=\"bg-white\">\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container sec-container\">\n @if (isLoaded && (posts.length + distributerPosts.length) > 0) {\n <div>\n <h1 class=\"int-title mb-0\">{{ integrationCountDisplay }}+ integrations <span class=\"int-title__sub\">(&amp; counting)</span></h1>\n <p class=\"int-text\">Search the current list of {{ companyName }} vendor and distributor integrations below.</p>\n </div>\n }\n @if (isLoaded) {\n <pw-resource-company-card [header]=\"'integrated vendors'\"\n (getPosts)=\"getPostTags()\"\n [integrationCountDisplay]=\"integrationCountDisplay\"\n [data]=\"posts\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"></pw-resource-company-card>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\"\n >\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (integrationCountDisplay === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n @if (isLoaded && (posts.length + distributerPosts.length) > 0) {\n <div class=\"text-center pt-3 mt-4\">\n <p class=\"see-span\">Don&rsquo;t see what you&rsquo;re after? <a [href]=\"contactUsUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"int-span team-span\">Speak with our team to request a connection <i class=\"fa fa-chevron-right team-span__icon\" aria-hidden=\"true\"></i></a>\n </p>\n </div>\n }\n </div>\n\n</section>\n<section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n @if (isLoaded) {\n <pw-resource-company-card [header]=\"'integrated Distributors'\"\n [integrationCountDisplay]=\"integrationCountDisplay\"\n [vendor]=\"true\"\n (getPosts)=\"getPostTags()\"\n [data]=\"distributerPosts\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"></pw-resource-company-card>\n }\n @if (!isLoaded) {\n <div class=\"w-100 text-center mt-3\"\n >\n <p-progress-spinner strokeWidth=\"2\"> </p-progress-spinner>\n </div>\n }\n @if (integrationCountDisplay === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n </div>\n\n</section>\n@if (integrations) {\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n <div class=\"how-it-works-wrapper\">\n <div class=\"d-flex\">\n <h2 class=\"it-works-title mb-0\">{{ integrations?.title || 'How it works' }}</h2>\n @if (canEditResourcesValue) {\n <i\n class=\"fa fa-edit in-page-edit-icon text-black ms-4 mt-3 cursor-pointer\"\n (click)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n (keydown.enter)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n (keydown.space)=\"openEditIntegrationsModal(editIntegrationsModal)\"\n title=\"Edit Integrations Section\"></i>\n }\n </div>\n <p class=\"pb-20\" [innerHTML]=\"integrations?.description || 'View short example videos to understand how these integrations can work for you:'\"></p>\n <div class=\"row section-row\" [ngClass]=\"{ 'justify-content-center': integrations?.items?.length === 1 }\">\n @if (integrations?.items?.length > 0) {\n @for (integration of integrations?.items; track integration) {\n @if (integration?.image_url || integration?.title || integration?.description) {\n <div\n class=\"col-md-6\"\n >\n @if (integration?.video_url && integration?.video_url.includes('https')) {\n <div class=\"d-flex justify-content-center cursor-pointer\">\n @if (integration?.video_url) {\n <img\n [src]=\"integration?.image_url\"\n (click)=\"loadMicrosoftVideo(integration?.video_url)\"\n (keydown.enter)=\"loadMicrosoftVideo(integration?.video_url)\"\n class=\"how-it-works-img\"\n alt=\"Integration Video Thumbnail\"\n />\n }\n </div>\n } @else {\n <div class=\"d-flex justify-content-center\">\n <div class=\"w-100\">\n <pw-no-data [withImage]=\"true\" [message]=\"'No video found' | transloco\">\n </pw-no-data>\n </div>\n </div>\n }\n </div>\n }\n }\n } @else {\n <div class=\"w-100 text-center\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Integration.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n </div>\n </div>\n </div>\n </section>\n}\n@if (showIntegrations()) {\n <section class=\"guide-section bg-white py-5 section-outer\">\n <div class=\"container\">\n <div class=\"row align-items-start\">\n <div class=\"col-md-6 text-md-start text-center\">\n <div class=\"d-flex\">\n <h2 class=\"guide-title mb-3\">{{ guideData?.items?.[0]?.title || 'Featured guide' }}</h2>\n @if (canEditResourcesValue) {\n <button type=\"button\"\n class=\"in-page-edit-icon text-black ms-4 mt-3 cursor-pointer\"\n (click)=\"openGuidesModal(guidesEditModal)\"\n title=\"Edit featured guide\"\n aria-label=\"Edit featured guide\">\n <i class=\"fa fa-edit\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <p class=\"guide-subtext\"\n [innerHTML]=\"guideData?.items?.[0]?.description || (canEditResourcesValue ? 'Add a featured guide via Admin &rarr; Domain config &rarr; Integrations.' : 'A practical walkthrough of how to get the most from your integrations.')\">\n </p>\n @if (guideData?.items?.[0]?.guide_url) {\n <a class=\"vault-btn\"\n [href]=\"guideData?.items?.[0]?.guide_url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n {{ guideData?.items?.[0]?.button_text || 'View the guide' }} <i class=\"fa fa-chevron-right vault-btn__icon\" aria-hidden=\"true\"></i>\n </a>\n }\n </div>\n <div class=\"col-md-6 text-center\">\n @if (guideData?.items?.[0]?.image_url && !guideData?.items?.[0]?.image_url?.includes('default-photo.jpg')) {\n <img\n [src]=\"guideData?.items?.[0]?.image_url\"\n alt=\"\"\n class=\"guide-img\"\n loading=\"lazy\" />\n }\n </div>\n </div>\n </div>\n </section>\n}\n</div>\n\n@if (resourcePostTag?.tag_category_id) {\n <pw-resource-note-card [categoryId]=\"resourcePostTag?.tag_category_id\" [tag]=\"resourcePostTag\" [releaseHeader]=\"true\" [resourceTitle]=\"resourcePostTag?.title\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-note-card>\n}\n\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n\n\n\n<ng-template #editIntegrationsModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Integrations Section</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label class=\"form-label\" for=\"integration-title\">Title</label>\n <input class=\"form-control\" id=\"integration-title\" [(ngModel)]=\"editingIntegrations.title\"\n aria-label=\"Integration Title\" />\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label\" for=\"integration-description\">Description</label>\n <textarea class=\"form-control\" id=\"integration-description\" rows=\"3\" [(ngModel)]=\"editingIntegrations.description\"\n aria-label=\"Integration Description\"></textarea>\n </div>\n\n <div cdkDropList (cdkDropListDropped)=\"dropIntegrationItems($event)\">\n @for (integration of editingIntegrations.items; track integration; let i = $index) {\n <div class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span class=\"pw-label-style form-label mb-0\" id=\"integration-item-label\">Integration Item</span>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-title-' + i\">Title</label>\n <input class=\"form-control\" [id]=\"'integration-item-title-' + i\" [(ngModel)]=\"integration.title\" id=\"input_integration.title_7712\" name=\"input_integration.title_7712\"\n aria-label=\"Input Integration.title 7712\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-description-' + i\">Description</label>\n <input class=\"form-control\" [id]=\"'integration-item-description-' + i\" [(ngModel)]=\"integration.description\" id=\"input_integration.description_9056\" name=\"input_integration.description_9056\"\n aria-label=\"Input Integration.description 9056\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-blog-url-' + i\">Blog URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-blog-url-' + i\" [(ngModel)]=\"integration.blog_url\" id=\"input_integration.blog_url_7856\" name=\"input_integration.blog_url_7856\"\n aria-label=\"Input Integration.blog Url 7856\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-image-url-' + i\">Image URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-image-url-' + i\" [(ngModel)]=\"integration.image_url\" id=\"input_integration.image_url_9056\" name=\"input_integration.image_url_9056\"\n aria-label=\"Input Integration.image Url 9056\" />\n </div>\n <div class=\"col-md-12 mb-2\">\n <label class=\"form-label\" [for]=\"'integration-item-video-url-' + i\">Video URL</label>\n <input class=\"form-control\" [id]=\"'integration-item-video-url-' + i\" [(ngModel)]=\"integration.video_url\" id=\"input_integration.video_url_9056\" name=\"input_integration.video_url_9056\"\n aria-label=\"Input Integration.video Url 9056\" />\n </div>\n </div>\n <div class=\"d-flex justify-content-end\">\n <i class=\"fa fa-trash text-danger cursor-pointer\" (click)=\"removeIntegrationItem(i)\" (keydown.enter)=\"removeIntegrationItem(i)\"\n (keydown.space)=\"removeIntegrationItem(i)\"></i>\n </div>\n </div>\n }\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm\" (click)=\"addIntegrationItem()\">+ Add Integration</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveIntegrations(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #guidesEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Guides</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Guides Section</h4>\n\n <div cdkDropList (cdkDropListDropped)=\"dropGuides($event)\">\n @for (guide of editingGuides.items; track guide; let i = $index) {\n <div class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-title-' + i\">Title</label>\n <input class=\"form-control\" [id]=\"'guide-title-' + i\" [(ngModel)]=\"guide.title\" id=\"input_guide.title_7072\" name=\"input_guide.title_7072\"\n aria-label=\"Input Guide.title 7072\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-button-text-' + i\">Button Text</label>\n <input class=\"form-control\" [id]=\"'guide-button-text-' + i\" [(ngModel)]=\"guide.button_text\" id=\"input_guide.button_text_7712\" name=\"input_guide.button_text_7712\"\n aria-label=\"Input Guide.button Text 7712\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-image-url-' + i\">Image URL</label>\n <input class=\"form-control\" [id]=\"'guide-image-url-' + i\" [(ngModel)]=\"guide.image_url\" id=\"input_guide.image_url_7856\" name=\"input_guide.image_url_7856\"\n aria-label=\"Input Guide.image Url 7856\" />\n </div>\n <div class=\"col-md-6 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-url-' + i\">Guide URL</label>\n <input class=\"form-control\" [id]=\"'guide-url-' + i\" [(ngModel)]=\"guide.guide_url\" id=\"input_guide.guide_url_6944\" name=\"input_guide.guide_url_6944\"\n aria-label=\"Input Guide.guide Url 6944\" />\n </div>\n <div class=\"col-12 mb-2\">\n <label class=\"form-label\" [for]=\"'guide-description-' + i\">Description</label>\n <textarea class=\"form-control\" [id]=\"'guide-description-' + i\" [name]=\"'guide-description-' + i\" rows=\"3\" [(ngModel)]=\"guide.description\"></textarea>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <i class=\"fa fa-trash text-danger cursor-pointer\" (click)=\"removeGuide(i)\" (keydown.enter)=\"removeGuide(i)\" (keydown.space)=\"removeGuide(i)\"></i>\n <i class=\"fa fa-bars cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n }\n </div>\n\n <button class=\"btn btn-primary mt-2\" (click)=\"addGuide()\">+ Add Guide</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveGuides(modal)\">Save</button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { SeoGuard } from '@posiwise/core-guards';\n\nimport { IntegrationTopBannerComponent } from '../../components/resource-integration/integration-top-banner/integration-top-banner.component';\nimport { ResourceIntegrationComponent } from '../../components/resource-integration/resource-integration.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceIntegrationComponent,\n data: {\n title: 'Integrations: Supported Vendors and Tools',\n description:\n 'See every integration the platform supports, how each one connects and what it keeps in sync.',\n permission: 'Pages.Blog',\n preload: false\n },\n canActivate: [SeoGuard]\n }\n];\n\n@NgModule({\n imports: [\n ResourceSharedModule,\n RouterModule.forChild(routes),\n ResourceIntegrationComponent,\n IntegrationTopBannerComponent\n ]\n})\nexport class ResourceIntegrationsModule {}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { t as ResourceService } from "./posiwise-resource-module-resource.service-DAXsq-WG.mjs";
2
- import { i as BaseResourceComponent, l as ResourcePager, u as ResourceEditCardLazyComponent } from "./posiwise-resource-module-resource-cards.module-BSJpkk9V.mjs";
1
+ import { t as ResourceService } from "./posiwise-resource-module-resource.service-BBvcVvWN.mjs";
2
+ import { i as BaseResourceComponent, l as ResourcePager, u as ResourceEditCardLazyComponent } from "./posiwise-resource-module-resource-cards.module-DOpH-f0N.mjs";
3
3
  import { ResourceSharedModule, ResourceTopBannerEditComponent } from "./posiwise-resource-module.mjs";
4
- import { t as BaseTopBannerComponent } from "./posiwise-resource-module-base-top-banner.component-BwujN_up.mjs";
4
+ import { t as BaseTopBannerComponent } from "./posiwise-resource-module-base-top-banner.component-DvZKkqPA.mjs";
5
5
  import * as i0 from "@angular/core";
6
6
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Input, NgModule, inject } from "@angular/core";
7
7
  import { HelperService } from "@posiwise/helper-service";
@@ -396,4 +396,4 @@ i0.ɵɵngDeclareClassMetadata({
396
396
  });
397
397
  export { ResourceJobsModule };
398
398
 
399
- //# sourceMappingURL=posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs.map
399
+ //# sourceMappingURL=posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"posiwise-resource-module-resource-jobs.module-DOdaBrZi.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.html","../../../../libs/resource-module/src/lib/public/modules/jobs/resource-jobs.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AppLoaderComponent } from '@posiwise/app-loader';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\n\nexport type JobPost = PublicPost & { blurb?: string; cta_text?: string; published_at?: string };\n\n/** Open positions for one tag category, paged on scroll. */\n@Component({\n selector: 'pw-resource-job-cards',\n templateUrl: './job-cards.component.html',\n styleUrls: ['./job-cards.component.scss', './job-cards-states.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DateFormatPipe, TranslocoPipe, AppLoaderComponent, ResourceEditCardLazyComponent]\n})\nexport class ResourceJobCardsComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) categoryId!: number;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n pager: ResourcePager<JobPost>;\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n canEdit = false;\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n this.subscriptionId = res ? JSON.parse(res)?.subscriptionId : undefined;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['user'] || changes['userLoggedIn']) && this.userLoggedIn && this.user) {\n this.canEdit = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n }\n\n get posts(): JobPost[] {\n return this.pager?.items ?? [];\n }\n\n get isLoaded(): boolean {\n return this.pager?.isLoaded ?? false;\n }\n\n get isLoadingMore(): boolean {\n return this.pager?.isLoadingMore ?? false;\n }\n\n /** The open positions could not be loaded; never shown as \"no open positions\". */\n get hasError(): boolean {\n return !!this.pager?.hasError && this.posts.length === 0;\n }\n\n get total(): number {\n return this.pager?.totalCount ?? 0;\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n ),\n tagCategoryIds: String(this.categoryId)\n }),\n () => this.cdr.markForCheck(),\n () => true\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n this.pager?.loadMoreIfNearBottom();\n }\n\n /** An off-site apply link when the post has one, otherwise the post's own page. */\n jobLink(post: JobPost): string {\n return post.external_url || `/resources/view/${post.slug}`;\n }\n}\n","<section class=\"jobs-section\">\n <div class=\"container\">\n @if (!isLoaded) {\n <div class=\"jobs-loading\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n } @else if (hasError) {\n <div class=\"jobs-state jobs-error\" role=\"alert\">\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.LoadError' | transloco }}</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"loadPosts()\">\n {{ 'Resource.Jobs.Retry' | transloco }}\n </button>\n </div>\n } @else if (posts.length === 0) {\n <div class=\"jobs-state jobs-empty\">\n <span class=\"jobs-state__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.Empty' | transloco }}</p>\n </div>\n } @else {\n <p class=\"jobs-count\">\n {{ (total === 1 ? 'Resource.Jobs.CountOne' : 'Resource.Jobs.CountMany') | transloco: { count: total } }}\n </p>\n <ul class=\"jobs-grid\">\n @for (post of posts; track post.id) {\n <li class=\"job-card\">\n <pw-resource-edit-card-lazy\n class=\"job-card__edit\"\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\" />\n <span class=\"job-card__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <h2 class=\"job-card__title\">\n <a\n class=\"job-card__link\"\n [href]=\"jobLink(post)\"\n [attr.target]=\"post.external_url ? '_blank' : null\"\n [attr.rel]=\"post.external_url ? 'noopener noreferrer' : null\">\n {{ post.title }}\n @if (post.external_url) {\n <span class=\"visually-hidden\">{{ 'Resource.Jobs.OpensInNewTab' | transloco }}</span>\n }\n </a>\n </h2>\n @if (post.blurb) {\n <p class=\"job-card__blurb\">{{ post.blurb }}</p>\n }\n <div class=\"job-card__footer\">\n @if (post.published_at) {\n <span class=\"job-card__date\">\n {{ 'Resource.Jobs.Posted' | transloco: { date: (post.published_at | dateFormat) } }}\n </span>\n }\n <span class=\"job-card__cta\" aria-hidden=\"true\">\n {{ post.cta_text || ('Resource.Jobs.ViewRole' | transloco) }}\n <i class=\"fa fa-arrow-right\"></i>\n </span>\n </div>\n </li>\n }\n </ul>\n @if (isLoadingMore) {\n <div class=\"jobs-loading jobs-loading--more\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n }\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\nconst FALLBACK_IMAGE = '/assets/img/resource/careers-team.svg';\nconst FALLBACK_IMAGE_STILL = '/assets/img/resource/careers-team-static.svg';\n\n@Component({\n selector: 'pw-resource-jobs-top-banner',\n templateUrl: './resource-jobs-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss',\n './resource-jobs-top-banner.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, TranslocoPipe]\n})\nexport class ResourceJobsTopBannerComponent extends BaseTopBannerComponent {\n /** The master's uploaded banner, or the default when none was uploaded. */\n get bannerImage(): string {\n return this.hasUploadedImage ? this.blogPostTag.image.url : FALLBACK_IMAGE;\n }\n\n /** The default art animates; this still copy is served when the visitor asks for reduced motion. */\n readonly stillBannerImage = FALLBACK_IMAGE_STILL;\n\n get hasUploadedImage(): boolean {\n const url = this.blogPostTag?.image?.url;\n return !!url && !url.includes('no_image_uploaded_squared');\n }\n\n get hasDescription(): boolean {\n const description = this.blogPostTag?.description;\n return !!description && description !== 'null';\n }\n\n protected getSearchTerm(): string {\n return 'Jobs';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n @if (blogPostTag?.title) {\n <span>{{ blogPostTag.title }}</span>\n } @else {\n <span>{{ 'Resource.Jobs.DefaultTitle' | transloco }}</span>\n }\n @if (canEditResourcesValue && blogPostTag) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension mt-4\">\n @if (hasDescription) {\n <p class=\"intro jobs-banner-intro\">{{ blogPostTag.description }}</p>\n } @else {\n <p class=\"intro\">{{ 'Resource.Jobs.DefaultIntro' | transloco }}</p>\n }\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <picture class=\"jobs-banner-picture\">\n @if (!hasUploadedImage) {\n <source media=\"(prefers-reduced-motion: reduce)\" [srcset]=\"stillBannerImage\" />\n }\n <img class=\"resource-laptop-img dyn-img jobs-banner-art\"\n [src]=\"bannerImage\"\n [alt]=\"'Resource.Jobs.BannerAlt' | transloco\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </picture>\n </div>\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\nimport { ResourceJobCardsComponent } from './job-cards/job-cards.component';\nimport { ResourceJobsTopBannerComponent } from './resource-jobs-top-banner/resource-jobs-top-banner.component';\n\n/** `/resources/careers`: every published post tagged Jobs, as job cards. */\n@Component({\n selector: 'pw-resource-jobs',\n templateUrl: './resource-jobs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceJobsTopBannerComponent,\n ResourceJobCardsComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceJobsComponent extends BaseResourceComponent {\n protected getResourceType(): string {\n return 'Jobs';\n }\n\n // The job cards page through the posts themselves; the base class would fetch them a second time.\n protected override getPosts(): void {\n return;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<pw-resource-jobs-top-banner />\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-job-cards [categoryId]=\"blogPostTag.tag_category_id\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\" />\n}\n\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceJobsComponent } from '../../components/resource-jobs/resource-jobs.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceJobsComponent,\n data: {\n title: 'Resources - Careers',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceJobsComponent]\n})\nexport class ResourceJobsModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"posiwise-resource-module-resource-jobs.module-Dw-7KbET.mjs","names":[],"sources":["../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/job-cards/job-cards.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs-top-banner/resource-jobs-top-banner.component.html","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-jobs/resource-jobs.component.html","../../../../libs/resource-module/src/lib/public/modules/jobs/resource-jobs.module.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n type SimpleChanges\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AppLoaderComponent } from '@posiwise/app-loader';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { DateFormatPipe } from '@posiwise/pipes';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ResourceService } from '../../../../resource.service';\nimport { PublicPost, ResourcePager } from '../../../shared/resource-pager';\nimport { ResourceEditCardLazyComponent } from '../../resource-edit-card-lazy/resource-edit-card-lazy.component';\n\nexport type JobPost = PublicPost & { blurb?: string; cta_text?: string; published_at?: string };\n\n/** Open positions for one tag category, paged on scroll. */\n@Component({\n selector: 'pw-resource-job-cards',\n templateUrl: './job-cards.component.html',\n styleUrls: ['./job-cards.component.scss', './job-cards-states.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DateFormatPipe, TranslocoPipe, AppLoaderComponent, ResourceEditCardLazyComponent]\n})\nexport class ResourceJobCardsComponent extends AppBaseComponent implements OnInit, OnChanges {\n private readonly resourceService = inject(ResourceService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) categoryId!: number;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n pager: ResourcePager<JobPost>;\n subscriptionId: number;\n masterSubscriptionId = this.appConfig.master_subscription.subscription_id;\n canEdit = false;\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n this.subscriptionId = res ? JSON.parse(res)?.subscriptionId : undefined;\n this.cdr.markForCheck();\n });\n }\n this.loadPosts();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['user'] || changes['userLoggedIn']) && this.userLoggedIn && this.user) {\n this.canEdit = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n }\n\n get posts(): JobPost[] {\n return this.pager?.items ?? [];\n }\n\n get isLoaded(): boolean {\n return this.pager?.isLoaded ?? false;\n }\n\n get isLoadingMore(): boolean {\n return this.pager?.isLoadingMore ?? false;\n }\n\n /** The open positions could not be loaded; never shown as \"no open positions\". */\n get hasError(): boolean {\n return !!this.pager?.hasError && this.posts.length === 0;\n }\n\n get total(): number {\n return this.pager?.totalCount ?? 0;\n }\n\n loadPosts(): void {\n this.pager = ResourcePager.forPublicPosts(\n this.resourceService,\n () => ({\n subscriptionId: HelperService.getEffectiveSubscriptionId(\n this.user,\n this.subscriptionId,\n this.masterSubscriptionId\n ),\n tagCategoryIds: String(this.categoryId)\n }),\n () => this.cdr.markForCheck(),\n () => true\n );\n this.pager.reset();\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n this.pager?.loadMoreIfNearBottom();\n }\n\n /** An off-site apply link when the post has one, otherwise the post's own page. */\n jobLink(post: JobPost): string {\n return post.external_url || `/resources/view/${post.slug}`;\n }\n}\n","<section class=\"jobs-section\">\n <div class=\"container\">\n @if (!isLoaded) {\n <div class=\"jobs-loading\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n } @else if (hasError) {\n <div class=\"jobs-state jobs-error\" role=\"alert\">\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.LoadError' | transloco }}</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"loadPosts()\">\n {{ 'Resource.Jobs.Retry' | transloco }}\n </button>\n </div>\n } @else if (posts.length === 0) {\n <div class=\"jobs-state jobs-empty\">\n <span class=\"jobs-state__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <p class=\"jobs-state__message\">{{ 'Resource.Jobs.Empty' | transloco }}</p>\n </div>\n } @else {\n <p class=\"jobs-count\">\n {{ (total === 1 ? 'Resource.Jobs.CountOne' : 'Resource.Jobs.CountMany') | transloco: { count: total } }}\n </p>\n <ul class=\"jobs-grid\">\n @for (post of posts; track post.id) {\n <li class=\"job-card\">\n <pw-resource-edit-card-lazy\n class=\"job-card__edit\"\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"loadPosts()\" />\n <span class=\"job-card__icon\" aria-hidden=\"true\"><i class=\"fa fa-briefcase\"></i></span>\n <h2 class=\"job-card__title\">\n <a\n class=\"job-card__link\"\n [href]=\"jobLink(post)\"\n [attr.target]=\"post.external_url ? '_blank' : null\"\n [attr.rel]=\"post.external_url ? 'noopener noreferrer' : null\">\n {{ post.title }}\n @if (post.external_url) {\n <span class=\"visually-hidden\">{{ 'Resource.Jobs.OpensInNewTab' | transloco }}</span>\n }\n </a>\n </h2>\n @if (post.blurb) {\n <p class=\"job-card__blurb\">{{ post.blurb }}</p>\n }\n <div class=\"job-card__footer\">\n @if (post.published_at) {\n <span class=\"job-card__date\">\n {{ 'Resource.Jobs.Posted' | transloco: { date: (post.published_at | dateFormat) } }}\n </span>\n }\n <span class=\"job-card__cta\" aria-hidden=\"true\">\n {{ post.cta_text || ('Resource.Jobs.ViewRole' | transloco) }}\n <i class=\"fa fa-arrow-right\"></i>\n </span>\n </div>\n </li>\n }\n </ul>\n @if (isLoadingMore) {\n <div class=\"jobs-loading jobs-loading--more\">\n <pw-loader [isVisible]=\"true\" />\n </div>\n }\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BaseTopBannerComponent } from '../../base/base-top-banner.component';\nimport { ResourceTopBannerEditComponent } from '../../resource-top-banner-edit/resource-top-banner-edit.component';\n\nconst FALLBACK_IMAGE = '/assets/img/resource/careers-team.svg';\nconst FALLBACK_IMAGE_STILL = '/assets/img/resource/careers-team-static.svg';\n\n@Component({\n selector: 'pw-resource-jobs-top-banner',\n templateUrl: './resource-jobs-top-banner.component.html',\n styleUrls: [\n '../../resource-case-studies/resource-case-studies.component.scss',\n '../../resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.scss',\n '../../resources/resources-shared.component.scss',\n '../../resource-post/related-resources/related-resources.component.scss',\n './resource-jobs-top-banner.component.scss'\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ResourceTopBannerEditComponent, TranslocoPipe]\n})\nexport class ResourceJobsTopBannerComponent extends BaseTopBannerComponent {\n /** The master's uploaded banner, or the default when none was uploaded. */\n get bannerImage(): string {\n return this.hasUploadedImage ? this.blogPostTag.image.url : FALLBACK_IMAGE;\n }\n\n /** The default art animates; this still copy is served when the visitor asks for reduced motion. */\n readonly stillBannerImage = FALLBACK_IMAGE_STILL;\n\n get hasUploadedImage(): boolean {\n const url = this.blogPostTag?.image?.url;\n return !!url && !url.includes('no_image_uploaded_squared');\n }\n\n get hasDescription(): boolean {\n const description = this.blogPostTag?.description;\n return !!description && description !== 'null';\n }\n\n protected getSearchTerm(): string {\n return 'Jobs';\n }\n}\n","<section class=\"bg-white pricing-section\">\n <div class=\"resource-banner\">\n @if (isLoaded) {\n <div class=\"container d-flex flex-column flex-lg-row align-items-center justify-content-between\">\n <div class=\"text-content\">\n <div class=\"resource-heading\">\n <h1 class=\"resource-header-text mb-4\">\n <span class=\"d-inline-flex align-items-center gap-2 flex-wrap\">\n @if (blogPostTag?.title) {\n <span>{{ blogPostTag.title }}</span>\n } @else {\n <span>{{ 'Resource.Jobs.DefaultTitle' | transloco }}</span>\n }\n @if (canEditResourcesValue && blogPostTag) {\n <pw-resource-top-banner-edit\n [blogPostTag]=\"blogPostTag\"\n [user]=\"user\"\n [userLoggedIn]=\"userLoggedIn\"\n (getUpdatedTag)=\"getTags()\"\n ></pw-resource-top-banner-edit>\n }\n </span>\n </h1>\n </div>\n </div>\n <div class=\"text-extension mt-4\">\n @if (hasDescription) {\n <p class=\"intro jobs-banner-intro\">{{ blogPostTag.description }}</p>\n } @else {\n <p class=\"intro\">{{ 'Resource.Jobs.DefaultIntro' | transloco }}</p>\n }\n </div>\n <div class=\"image-content ms-lg-5 mt-5 mt-lg-0\">\n <div class=\"resource-math-img\"></div>\n <picture class=\"jobs-banner-picture\">\n @if (!hasUploadedImage) {\n <source media=\"(prefers-reduced-motion: reduce)\" [srcset]=\"stillBannerImage\" />\n }\n <img class=\"resource-laptop-img dyn-img jobs-banner-art\"\n [src]=\"bannerImage\"\n [alt]=\"'Resource.Jobs.BannerAlt' | transloco\"\n width=\"600\"\n height=\"450\"\n loading=\"eager\"\n fetchpriority=\"high\" />\n </picture>\n </div>\n </div>\n }\n </div>\n</section>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nimport { Trial4ContactUsComponent } from '@posiwise/resource-contact-us';\nimport { ResourceHeaderComponent } from '@posiwise/utils';\n\nimport { BaseResourceComponent } from '../base/base-resource.component';\n\nimport { ResourceJobCardsComponent } from './job-cards/job-cards.component';\nimport { ResourceJobsTopBannerComponent } from './resource-jobs-top-banner/resource-jobs-top-banner.component';\n\n/** `/resources/careers`: every published post tagged Jobs, as job cards. */\n@Component({\n selector: 'pw-resource-jobs',\n templateUrl: './resource-jobs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ResourceHeaderComponent,\n ResourceJobsTopBannerComponent,\n ResourceJobCardsComponent,\n Trial4ContactUsComponent\n ]\n})\nexport class ResourceJobsComponent extends BaseResourceComponent {\n protected getResourceType(): string {\n return 'Jobs';\n }\n\n // The job cards page through the posts themselves; the base class would fetch them a second time.\n protected override getPosts(): void {\n return;\n }\n}\n","<pw-resource-header [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-resource-header>\n<main>\n\n<pw-resource-jobs-top-banner />\n\n@if (blogPostTag?.tag_category_id) {\n <pw-resource-job-cards [categoryId]=\"blogPostTag.tag_category_id\" [user]=\"user\" [userLoggedIn]=\"userLoggedIn\" />\n}\n\n</main>\n<pw-trial-4-contact-us [user]=\"user\" [userLoggedIn]=\"userLoggedIn\"></pw-trial-4-contact-us>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ResourceJobsComponent } from '../../components/resource-jobs/resource-jobs.component';\nimport { ResourceSharedModule } from '../../shared/resource-shared.module';\n\nconst routes: Routes = [\n {\n path: '',\n component: ResourceJobsComponent,\n data: {\n title: 'Resources - Careers',\n permission: 'Pages.Blog',\n preload: false\n }\n }\n];\n\n@NgModule({\n imports: [ResourceSharedModule, RouterModule.forChild(routes), ResourceJobsComponent]\n})\nexport class ResourceJobsModule {}\n"],"mappings":"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"}