@posiwise/resource-module 0.0.201 → 0.0.202
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.
|
@@ -1026,7 +1026,7 @@ var ResourceEditCardComponent = class ResourceEditCardComponent extends AppBaseC
|
|
|
1026
1026
|
outputs: { updated: "updated" },
|
|
1027
1027
|
usesInheritance: true,
|
|
1028
1028
|
ngImport: i0,
|
|
1029
|
-
template: "<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' | transloco\">\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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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",
|
|
1029
|
+
template: "<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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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",
|
|
1030
1030
|
styles: ["::ng-deep .modal-content{margin-top:5rem!important}\n"],
|
|
1031
1031
|
dependencies: [
|
|
1032
1032
|
{
|
|
@@ -1349,7 +1349,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1349
1349
|
selector: "pw-resource-edit-card",
|
|
1350
1350
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1351
1351
|
standalone: false,
|
|
1352
|
-
template: "<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' | transloco\">\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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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",
|
|
1352
|
+
template: "<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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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",
|
|
1353
1353
|
styles: ["::ng-deep .modal-content{margin-top:5rem!important}\n"]
|
|
1354
1354
|
}]
|
|
1355
1355
|
}],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posiwise-resource-module.mjs","names":["i1","i1","i2","i3","i4.ResourceEditCardLazyComponent","i6","i5","i6","i3.ResourceService","i4","i5","i8","i9","i10","i13","i1","i1","i2.ResourceEditCardLazyComponent","i3","i4"],"sources":["../../../../libs/resource-module/src/lib/public/resource-public.routing.module.ts","../../../../libs/resource-module/src/lib/public/resource-public.module.ts","../../../../libs/resource-module/src/lib/resource.module.ts","../../../../libs/resource-module/src/lib/public/components/resource-company-card/resource-company-card.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-company-card/resource-company-card.component.html","../../../../libs/resource-module/src/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.html","../../../../libs/resource-module/src/lib/public/shared/resource-shared.module.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","../../../../libs/resource-module/src/lib/public/shared/resource-edit.module.ts","../../../../libs/resource-module/src/lib/public/components/testimonial-card/testimonial-card.component.ts","../../../../libs/resource-module/src/lib/public/components/testimonial-card/testimonial-card.component.html"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\n// Lazy loaded routes - each route now loads its own module with only the components it needs\nconst routes: Routes = [\n {\n path: '',\n pathMatch: 'full',\n loadChildren: () =>\n import('./modules/root/resource-root.module').then(m => m.ResourceRootModule)\n },\n {\n path: 'hub',\n loadChildren: () =>\n import('./modules/hub/resource-hub.module').then(m => m.ResourceHubModule)\n },\n {\n path: 'blogs',\n loadChildren: () =>\n import('./modules/blogs/resource-blogs.module').then(m => m.ResourceBlogsModule)\n },\n {\n path: 'videos',\n loadChildren: () =>\n import('./modules/videos/resource-videos.module').then(m => m.ResourceVideosModule)\n },\n {\n path: 'integrations',\n loadChildren: () =>\n import('./modules/integrations/resource-integrations.module').then(\n m => m.ResourceIntegrationsModule\n )\n },\n {\n path: 'release-notes',\n loadChildren: () =>\n import('./modules/release-notes/resource-release-notes.module').then(\n m => m.ResourceReleaseNotesModule\n )\n },\n {\n path: 'events',\n loadChildren: () =>\n import('./modules/events/resource-events.module').then(m => m.ResourceEventsModule)\n },\n {\n path: 'white-papers',\n loadChildren: () =>\n import('./modules/white-papers/resource-white-papers.module').then(\n m => m.ResourceWhitePapersModule\n )\n },\n {\n path: 'case-studies',\n loadChildren: () =>\n import('./modules/case-studies/resource-case-studies.module').then(\n m => m.ResourceCaseStudiesModule\n )\n },\n {\n path: 'view/:slug',\n loadChildren: () =>\n import('./modules/post/resource-post.module').then(m => m.ResourcePostModule)\n }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class BlogPublicRoutingModule {}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\n\nimport { ResourceService } from '../resource.service';\n\nimport { BlogPublicRoutingModule } from './resource-public.routing.module';\n\n@NgModule({\n imports: [BlogPublicRoutingModule],\n providers: [ResourceService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePublicModule {}\n","import { NgModule } from '@angular/core';\n\nimport { ResourcePublicModule } from './public/resource-public.module';\n\n@NgModule({\n imports: [ResourcePublicModule]\n})\nexport class ResourceModule {}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { ResourcePost, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { Subject } from 'rxjs';\n\ninterface PageEvent {\n first: number;\n rows: number;\n page: number;\n pageCount: number;\n}\n@Component({\n selector: 'pw-resource-company-card',\n templateUrl: './resource-company-card.component.html',\n styleUrl: './resource-company-card.component.scss',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceCompanyCardComponent\n extends AppBaseComponent\n implements OnChanges, OnInit, OnDestroy\n{\n @Output() getPosts = new EventEmitter<ResourcePost[]>();\n private readonly destroy$ = new Subject<void>();\n\n canEditResourcesValue = false;\n @Input() header = '';\n @Input() data = [];\n @Input() integrationCountDisplay;\n @Input() vendor = false;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n postData = false;\n filteredData = [];\n first = 0;\n rows = 12;\n subscriptionId: string;\n\n constructor(\n injector: Injector,\n private readonly cdr: ChangeDetectorRef\n ) {\n super(injector);\n }\n\n ngOnChanges(): void {\n this.search();\n }\n ngOnInit() {\n if (this.userLoggedIn) {\n this.updateCanEditResourcesValue();\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 }\n search(keywords?) {\n if (keywords) {\n this.filteredData = this.data.filter(x =>\n x.title.toLowerCase().includes(keywords.toLowerCase())\n );\n if (this.filteredData.length === 0) {\n this.postData = true;\n } else {\n this.postData = false;\n }\n } else {\n this.filteredData = [...this.data];\n this.postData = false;\n }\n }\n onPageChange(event: PageEvent) {\n this.first = event.first;\n this.rows = event.rows;\n }\n\n override ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n\n /** Show no-data when there is integration count but no posts (postData is false, filteredData empty). */\n get showNoPostsMessage(): boolean {\n return (\n this.integrationCountDisplay > 0 &&\n !this.postData &&\n (!this.filteredData || this.filteredData.length === 0)\n );\n }\n}\n","<div [ngClass]=\"{ 'vendors-distributor-wrapper': !vendor }\">\n <div class=\"d-flex justify-content-between align-items-center mb-3 search-container\">\n <div>\n <span class=\"int-span\">{{header}}</span>\n </div>\n @if (integrationCountDisplay > 0) {\n <div class=\"search-wrapper position-relative\">\n <i class=\"fa fa-search search-icon\"></i>\n <input type=\"text\"\n (keyup)=\"search($event.target.value)\"\n placeholder=\"Search eg security\"\n class=\"search-input top-search-input\" id=\"input_search_eg_security_9712\" name=\"input_search_eg_security_9712\"\n aria-label=\"Search eg security\" />\n </div>\n }\n\n </div>\n\n @if (postData) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n }\n\n @if (showNoPostsMessage) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n\n @if (!postData && integrationCountDisplay > 0 && filteredData.length > 0) {\n <div class=\"row\">\n @for (img of filteredData | slice:first:(first + rows); track img) {\n <div class=\"col-md-3 mt-4\"\n >\n <div class=\"boxes d-flex align-items-center justify-content-center\">\n @if (img?.companyImg) {\n <img [src]=\"img.companyImg\" alt=\"Vendor Company Icon\" class=\"vendor-icon\" />\n } @else {\n @if (img?.rectangular_picture?.url) {\n @if (!img.rectangular_picture.url.includes('default-photo')) {\n @if (img?.showcase) {\n <a class=\"vendor-link\" [href]=\"img.external_url || ('/resources/view/' + img.slug)\">\n <img [src]=\"img.rectangular_picture.url\" alt=\"Vendor Rectangular Company Icon\" class=\"vendor-icon\" />\n </a>\n } @else {\n <img [src]=\"img.rectangular_picture.url\" alt=\"Vendor Rectangular Company Icon\" class=\"vendor-icon\" />\n }\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"img?.id\"\n [resourceData]=\"img\"\n (updated)=\"getPosts.emit()\">\n </pw-resource-edit-card-lazy>\n } @else {\n @if (img?.showcase) {\n <a class=\"vendor-link\" [href]=\"img.external_url || ('/resources/view/' + img.slug)\">\n <span class=\"vendor-name text-center mt-2\">{{ img?.title }}</span>\n </a>\n } @else {\n <span class=\"vendor-name text-center\">{{ img?.title }}</span>\n }\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"img?.id\"\n [resourceData]=\"img\"\n (updated)=\"getPosts.emit()\">\n </pw-resource-edit-card-lazy>\n }\n } @else {\n <ng-template [ngTemplateOutlet]=\"noImage\"></ng-template>\n }\n }\n </div>\n </div>\n }\n @if (filteredData.length > 0) {\n <div class=\"customPaginator d-flex align-items-center mt-5 justify-content-center\"\n >\n <p-paginator\n [first]=\"first\"\n [rows]=\"rows\"\n [totalRecords]=\"filteredData.length\"\n (onPageChange)=\"onPageChange($event)\"></p-paginator>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { CustomUploaderComponent } from '@posiwise/utils';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\n@Component({\n selector: 'pw-resource-top-banner-edit',\n templateUrl: './resource-top-banner-edit.component.html',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceTopBannerEditComponent extends AppBaseComponent implements OnInit {\n @Input() blogPostTag;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n @Output() getUpdatedTag = new EventEmitter();\n @ViewChild('editModal') editModal: TemplateRef<CustomUploaderComponent>;\n @ViewChild('imageCropContent') imageCropContent: TemplateRef<CustomUploaderComponent>;\n\n form: FormGroup;\n image: string | null = null;\n defaultImage = 'assets/img/resource/blog.png';\n file: File;\n subscriptionId: string;\n imageModalRef;\n buttonBusy: boolean;\n\n constructor(\n private readonly fb: FormBuilder,\n private readonly modalService: NgbModal,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.form = this.fb.group({\n title: [this.blogPostTag?.title ?? ''],\n description: [this.blogPostTag?.description ?? ''],\n meta_title: [this.blogPostTag?.meta_title ?? ''],\n meta_description: [this.blogPostTag?.meta_description ?? '']\n });\n\n this.image = this.blogPostTag?.image?.url ?? null;\n }\n\n openEditModal() {\n this.modalService.open(this.editModal, { centered: true, size: 'lg' });\n }\n\n openImageModal(modalRef) {\n this.imageModalRef = this.modalService.open(modalRef, { centered: true });\n }\n\n onImageSelected(base64: string): void {\n this.image = base64;\n this.file = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n onClose() {\n this.imageModalRef?.close();\n }\n\n removeImage() {\n this.image = null;\n }\n\n handleImageError(event: Event) {\n (event.target as HTMLImageElement).src = this.defaultImage;\n }\n\n save() {\n this.buttonBusy = true;\n const payload = {\n title: this.form.value.title ?? this.blogPostTag?.title,\n description: this.form.value.description ?? this.blogPostTag?.description,\n meta_title: this.form.value.meta_title ?? this.blogPostTag?.meta_title,\n meta_description:\n this.form.value.meta_description ?? this.blogPostTag?.meta_description,\n tag_category_id: this.blogPostTag?.tag_category_id,\n tag_type: this.blogPostTag?.tag_type,\n subscription_id: this.subscriptionId,\n name: this.blogPostTag?.name\n };\n\n if (this.file) {\n payload['image'] = this.file;\n } else if (!this.image) {\n payload['remove_image'] = true;\n }\n\n this.tagService.updateTagById(this.blogPostTag?.id, payload).subscribe(() => {\n this.buttonBusy = false;\n this.toast.success('Tag Updated');\n this.getUpdatedTag.emit();\n this.modalService.dismissAll();\n this.cdr.markForCheck();\n });\n }\n}\n","<div class=\"edit-card\">\n <i class=\"fa fa-edit cursor-pointer text-black in-page-edit-icon mb-1 ms-3\"\n (click)=\"openEditModal()\"\n (keydown.enter)=\"openEditModal()\"\n (keydown.space)=\"openEditModal()\"\n title=\"Edit Blog Tag\"></i>\n</div>\n\n<ng-template #editModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Blog Post Tag</h5>\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]=\"form\">\n <div class=\"row\">\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\">\n <pw-input-container label=\"Description\" name=\"description\" controlId=\"resource-top-banner-description\">\n <textarea id=\"resource-top-banner-description\" name=\"description\" class=\"form-control\" rows=\"4\" formControlName=\"description\"\n aria-label=\"Description\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Meta Title\" name=\"meta_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"meta_title\" placeholder=\"Meta Title for SEO\" id=\"input_meta_title_2\" name=\"input_meta_title_2\"\n aria-label=\"Meta Title for SEO\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Meta Description\" name=\"meta_description\" controlId=\"resource-top-banner-meta_description\">\n <textarea id=\"resource-top-banner-meta_description\" name=\"meta_description\" class=\"form-control\" rows=\"3\" formControlName=\"meta_description\" placeholder=\"Meta Description for SEO\"\n aria-label=\"Meta Description for SEO\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 my-4\">\n <span id=\"resource-top-banner-tag-image-label\" class=\"pw-label-style\">Blog Tag Image</span>\n <div class=\"text-center d-flex flex-column align-items-center col-6\">\n <img [src]=\"image || defaultImage\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n (keydown.space)=\"openImageModal(imageCropContent)\"\n class=\"image w-100\"\n alt=\"Blog\"\n (error)=\"handleImageError($event)\"\n />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <a class=\"d-inline-block mt-2\"\n (click)=\"openImageModal(imageCropContent)\">\n {{ image ? 'Update' : 'Add' }} Image\n </a>\n @if (image) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (keydown.enter)=\"removeImage()\"\n (keydown.space)=\"removeImage()\"\n (click)=\"removeImage()\"></i>\n }\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)=\"save()\">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 Image</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. Avoid artwork, celebrities, or copyrighted images.</small>\n <pw-image-cropper\n #cropper\n aspectRatio=\"dynamic\"\n (imageSelectionEvent)=\"onImageSelected($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\nimport { HubSpotMeetingsSharedModule } from '@posiwise/alpha-module';\nimport { CoreTranslocoModule } from '@posiwise/core-transloco';\nimport { DirectivesModule } from '@posiwise/directives';\nimport { PipesModule } from '@posiwise/pipes';\nimport { ResourceSharedComponentsModule } from '@posiwise/shared-components';\n\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TextareaModule } from 'primeng/textarea';\n\nimport { TranslocoModule } from '@jsverse/transloco';\n\nimport { ResourceCompanyCardComponent } from '../components/resource-company-card/resource-company-card.component';\nimport { ResourceTopBannerEditComponent } from '../components/resource-top-banner-edit/resource-top-banner-edit.component';\n\nimport { ResourceCardsModule } from './resource-cards.module';\n\n// Shared components used across multiple resource routes\n// Note: Most heavy modules (Quill, Calendar, UiSwitch, etc.) are now in ResourceCardsModule\n@NgModule({\n declarations: [ResourceCompanyCardComponent, ResourceTopBannerEditComponent],\n imports: [\n CommonModule,\n RouterModule,\n FormsModule,\n ReactiveFormsModule,\n PipesModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n InputTextModule,\n IconFieldModule,\n InputIconModule,\n TextareaModule,\n ResourceCardsModule,\n HubSpotMeetingsSharedModule // For pw-book-a-demo component (HubSpotMeetingsComponent)\n ],\n exports: [\n // Export the 2 components specific to this module\n ResourceCompanyCardComponent,\n ResourceTopBannerEditComponent,\n // Export card components module (includes all heavy modules + card components)\n ResourceCardsModule,\n // Export HubSpotMeetingsSharedModule to make pw-book-a-demo component available\n HubSpotMeetingsSharedModule,\n // Export common lightweight modules\n CommonModule,\n RouterModule,\n FormsModule,\n ReactiveFormsModule,\n PipesModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n InputTextModule,\n IconFieldModule,\n InputIconModule,\n TextareaModule\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceSharedModule {}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport moment from 'moment';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\nimport { ResourceService } from '../../../resource.service';\n\n@Component({\n selector: 'pw-resource-edit-card',\n templateUrl: './resource-edit-card.component.html',\n styleUrl: './resource-edit-card.component.scss',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceEditCardComponent extends AppBaseComponent implements OnInit {\n @Input() id!: number;\n @Input() resourceData;\n @Output() updated = new EventEmitter<void>();\n\n editForm: FormGroup;\n image = '';\n rectangularImage = '';\n file: File | null = null;\n rectangularFile: File | null = null;\n\n imageModalRef;\n selectedTags = [];\n allTags = [];\n tagsSuggestion = [];\n subscriptionId: number;\n userLoggedIn: boolean;\n buttonBusy = false;\n\n constructor(\n private readonly fb: FormBuilder,\n private readonly modalService: NgbModal,\n private readonly resourceService: ResourceService,\n private readonly authService: AuthService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n this.editForm = this.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 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 const when = this.resourceData.when ? new Date(this.resourceData.when) : null;\n this.editForm.setValue({\n title: this.resourceData.title ?? '',\n external_url: this.resourceData.external_url ?? '',\n cta_text: this.resourceData.cta_text ?? '',\n when: when ?? '',\n showcase: !!this.resourceData.showcase,\n published_at: !!this.resourceData.published_at,\n accepted_at: !!this.resourceData.accepted_at,\n body: this.resourceData.body\n });\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 let values = [];\n if (event.query) {\n values = this.allTags.filter(x =>\n x.name.toLowerCase().includes(event.query.toLowerCase())\n );\n } else {\n this.allTags.forEach(element => {\n values.push(element);\n });\n }\n this.tagsSuggestion = values;\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId)\n .subscribe(response => {\n this.allTags = response.tags;\n this.cdr.markForCheck();\n });\n }\n\n deleteRectangularImage() {\n this.rectangularImage = null;\n this.rectangularFile = null;\n }\n openImageModal(modalTemplate): void {\n this.imageModalRef = this.modalService.open(modalTemplate, { centered: true, size: 'md' });\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 saveResource(): void {\n this.buttonBusy = true;\n this.saveTags(this.id);\n const payload = {\n ...this.editForm.value,\n subscription_id: this.subscriptionId\n };\n\n this.handlePicture(payload);\n this.handlePublishedAt(payload);\n this.handleAcceptedAt(payload);\n this.handleAcceptedAt(payload);\n this.handleOptionalFields(payload);\n this.handleRectangularPicture(payload);\n this.handleRemovals(payload);\n\n this.resourceService.updatePost(payload, this.id).subscribe({\n next: () => {\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 setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.toast.success('Blog Post Updated');\n this.updated.emit();\n this.modalService.dismissAll();\n this.cdr.markForCheck();\n }, 0);\n }, 0);\n },\n error: () => {\n setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n }, 0);\n }\n });\n }\n\n private saveTags(id: number | string): void {\n if (this.selectedTags.length) {\n const data = {\n entity_tags: this.selectedTags.map(tag => ({ tag_id: tag.id })),\n slug: id,\n tag_entity: 'Post' // or use TAG_ENTITY.POST if you imported it\n };\n\n this.tagService.addTags(data, this.subscriptionId).subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n }\n\n private handlePicture(data) {\n if (this.file) {\n data.picture = this.file;\n } else {\n delete data.picture;\n }\n }\n\n private handlePublishedAt(data) {\n const control = this.editForm.get('published_at');\n if (control?.dirty) {\n data.published_at = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data.published_at;\n }\n }\n\n private handleAcceptedAt(data) {\n const control = this.editForm.get('accepted_at');\n if (control?.dirty) {\n data.accepted_at = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data.accepted_at;\n }\n }\n\n private handleOptionalFields(data) {\n if (!this.editForm.get('when')?.value) {\n data.when = '';\n }\n if (!this.editForm.get('showcase')?.value) {\n data.showcase = '';\n }\n }\n\n private handleRectangularPicture(data) {\n if (this.rectangularFile) {\n data.rectangular_picture = this.rectangularFile;\n } else {\n delete data.rectangular_picture;\n }\n }\n\n private handleRemovals(data) {\n if (!this.file && !this.image) {\n data.remove_picture = true;\n }\n if (!this.rectangularFile && !this.rectangularImage) {\n data.remove_rectangular_picture = true;\n }\n }\n\n openRectModal(content) {\n this.imageModalRef = this.modalService.open(content, {\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n handleImageError(event: Event, fallbackPath): void {\n HelperService.handleImageFallbackPath(event, fallbackPath);\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' | transloco\">\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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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","import { CommonModule } from '@angular/common';\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { CoreTranslocoModule } from '@posiwise/core-transloco';\nimport { DirectivesModule } from '@posiwise/directives';\nimport { ResourceSharedComponentsModule } from '@posiwise/shared-components';\n\nimport { QuillModule } from 'ngx-quill';\nimport { UiSwitchModule } from 'ngx-ui-switch';\nimport { AutoCompleteModule } from 'primeng/autocomplete';\nimport { DatePickerModule } from 'primeng/datepicker';\n\nimport { TranslocoModule } from '@jsverse/transloco';\n\nimport { ResourceEditCardComponent } from '../components/resource-edit-card/resource-edit-card.component';\n\n/**\n * Lazy-loadable module for ResourceEditCard\n * Contains heavy dependencies (Quill, Calendar, etc.) that are only needed for admins\n * This module is dynamically imported when edit button is clicked\n */\n@NgModule({\n declarations: [ResourceEditCardComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n DatePickerModule,\n AutoCompleteModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n QuillModule.forRoot(),\n UiSwitchModule\n ],\n exports: [ResourceEditCardComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceEditModule {}\n","import { ChangeDetectionStrategy,\n Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';\n\nimport { Resource } from '@posiwise/common-utilities';\n\n@Component({\n selector: 'pw-testimonial-card',\n templateUrl: './testimonial-card.component.html',\n styleUrls: [\n './testimonial-card.component.scss',\n '../resource-post/related-resources/related-resources.component.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class TestimonialCardListComponent implements OnChanges {\n @Output() editPost: EventEmitter<object> = new EventEmitter();\n\n @Input() posts: Resource[] = [];\n @Input() postHeader = '';\n @Input() canEdit = false;\n swiper;\n\n ngOnChanges(changes): void {\n if (changes.posts && this.posts?.length) {\n setTimeout(() => this.initSwiper(), 0); // Wait for DOM to render\n }\n }\n\n private async initSwiper() {\n // Dynamically import Swiper only when needed (lazy-load ~150KB library)\n const { default: Swiper } = await import('swiper');\n const { Navigation, Pagination } = await import('swiper/modules');\n\n this.swiper = new Swiper('.swiper-container', {\n modules: [Navigation, Pagination],\n slidesPerView: 1,\n spaceBetween: 24,\n centeredSlides: true,\n touchRatio: 1,\n touchAngle: 45,\n grabCursor: true,\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev'\n },\n pagination: {\n el: '.swiper-pagination',\n clickable: true\n },\n breakpoints: {\n 425: {\n slidesPerView: 1.05,\n centeredSlides: true\n },\n 470: {\n slidesPerView: 1.25,\n centeredSlides: true\n },\n 564: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 640: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 768: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 1024: {\n slidesPerView: 2, // Allow room between cards\n centeredSlides: false\n },\n 1200: {\n slidesPerView: 3,\n centeredSlides: false\n }\n }\n });\n }\n}\n","<section class=\"resource-section section-outer bg-white\">\n <div class=\"container\">\n @if (postHeader) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap mb-3\">\n <h2 class=\"section-heading\">{{postHeader}}</h2>\n </div>\n }\n @if (posts.length === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n <div [hidden]=\"posts.length === 0\">\n <div class=\"swiper-container\">\n <div class=\"swiper-wrapper\">\n @for (post of posts; track post) {\n <div class=\"swiper-slide\">\n <div class=\"testimonial-box\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"editPost.emit(1, 100)\">\n </pw-resource-edit-card-lazy>\n <div class=\"stars mb-5\">★★★★★</div>\n <div class=\"testimonial-content\">\n <div class=\"ql-container ql-snow ql-res\">\n <div class=\"ql-editor\"\n [innerHTML]=\"post?.body\">\n </div>\n </div>\n </div>\n <!-- THIS STAYS AT BOTTOM -->\n <div class=\"avatar-container\">\n @if (!post.rectangular_picture.url.includes('default-photo.jpg') ) {\n <img\n [src]=\"post.rectangular_picture.url\"\n alt=\"Logo\"\n class=\"testimonial-logo mt-4\"\n />\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div class=\"swiper-pagination\"></div>\n <div class=\"swiper-button-prev\"></div>\n <div class=\"swiper-button-next\"></div>\n </div>\n </div>\n </div>\n</section>"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"posiwise-resource-module.mjs","names":["i1","i1","i2","i3","i4.ResourceEditCardLazyComponent","i6","i5","i6","i3.ResourceService","i4","i5","i8","i9","i10","i13","i1","i1","i2.ResourceEditCardLazyComponent","i3","i4"],"sources":["../../../../libs/resource-module/src/lib/public/resource-public.routing.module.ts","../../../../libs/resource-module/src/lib/public/resource-public.module.ts","../../../../libs/resource-module/src/lib/resource.module.ts","../../../../libs/resource-module/src/lib/public/components/resource-company-card/resource-company-card.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-company-card/resource-company-card.component.html","../../../../libs/resource-module/src/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.ts","../../../../libs/resource-module/src/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.html","../../../../libs/resource-module/src/lib/public/shared/resource-shared.module.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","../../../../libs/resource-module/src/lib/public/shared/resource-edit.module.ts","../../../../libs/resource-module/src/lib/public/components/testimonial-card/testimonial-card.component.ts","../../../../libs/resource-module/src/lib/public/components/testimonial-card/testimonial-card.component.html"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\n// Lazy loaded routes - each route now loads its own module with only the components it needs\nconst routes: Routes = [\n {\n path: '',\n pathMatch: 'full',\n loadChildren: () =>\n import('./modules/root/resource-root.module').then(m => m.ResourceRootModule)\n },\n {\n path: 'hub',\n loadChildren: () =>\n import('./modules/hub/resource-hub.module').then(m => m.ResourceHubModule)\n },\n {\n path: 'blogs',\n loadChildren: () =>\n import('./modules/blogs/resource-blogs.module').then(m => m.ResourceBlogsModule)\n },\n {\n path: 'videos',\n loadChildren: () =>\n import('./modules/videos/resource-videos.module').then(m => m.ResourceVideosModule)\n },\n {\n path: 'integrations',\n loadChildren: () =>\n import('./modules/integrations/resource-integrations.module').then(\n m => m.ResourceIntegrationsModule\n )\n },\n {\n path: 'release-notes',\n loadChildren: () =>\n import('./modules/release-notes/resource-release-notes.module').then(\n m => m.ResourceReleaseNotesModule\n )\n },\n {\n path: 'events',\n loadChildren: () =>\n import('./modules/events/resource-events.module').then(m => m.ResourceEventsModule)\n },\n {\n path: 'white-papers',\n loadChildren: () =>\n import('./modules/white-papers/resource-white-papers.module').then(\n m => m.ResourceWhitePapersModule\n )\n },\n {\n path: 'case-studies',\n loadChildren: () =>\n import('./modules/case-studies/resource-case-studies.module').then(\n m => m.ResourceCaseStudiesModule\n )\n },\n {\n path: 'view/:slug',\n loadChildren: () =>\n import('./modules/post/resource-post.module').then(m => m.ResourcePostModule)\n }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class BlogPublicRoutingModule {}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\n\nimport { ResourceService } from '../resource.service';\n\nimport { BlogPublicRoutingModule } from './resource-public.routing.module';\n\n@NgModule({\n imports: [BlogPublicRoutingModule],\n providers: [ResourceService],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourcePublicModule {}\n","import { NgModule } from '@angular/core';\n\nimport { ResourcePublicModule } from './public/resource-public.module';\n\n@NgModule({\n imports: [ResourcePublicModule]\n})\nexport class ResourceModule {}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output\n} from '@angular/core';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { ResourcePost, User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport { Subject } from 'rxjs';\n\ninterface PageEvent {\n first: number;\n rows: number;\n page: number;\n pageCount: number;\n}\n@Component({\n selector: 'pw-resource-company-card',\n templateUrl: './resource-company-card.component.html',\n styleUrl: './resource-company-card.component.scss',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceCompanyCardComponent\n extends AppBaseComponent\n implements OnChanges, OnInit, OnDestroy\n{\n @Output() getPosts = new EventEmitter<ResourcePost[]>();\n private readonly destroy$ = new Subject<void>();\n\n canEditResourcesValue = false;\n @Input() header = '';\n @Input() data = [];\n @Input() integrationCountDisplay;\n @Input() vendor = false;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n\n postData = false;\n filteredData = [];\n first = 0;\n rows = 12;\n subscriptionId: string;\n\n constructor(\n injector: Injector,\n private readonly cdr: ChangeDetectorRef\n ) {\n super(injector);\n }\n\n ngOnChanges(): void {\n this.search();\n }\n ngOnInit() {\n if (this.userLoggedIn) {\n this.updateCanEditResourcesValue();\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 }\n search(keywords?) {\n if (keywords) {\n this.filteredData = this.data.filter(x =>\n x.title.toLowerCase().includes(keywords.toLowerCase())\n );\n if (this.filteredData.length === 0) {\n this.postData = true;\n } else {\n this.postData = false;\n }\n } else {\n this.filteredData = [...this.data];\n this.postData = false;\n }\n }\n onPageChange(event: PageEvent) {\n this.first = event.first;\n this.rows = event.rows;\n }\n\n override ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n private updateCanEditResourcesValue(): void {\n this.canEditResourcesValue = HelperService.canEditResources(\n this.user,\n this.userLoggedIn,\n this.permissionService\n );\n }\n\n canEditResources(): boolean {\n return this.canEditResourcesValue;\n }\n\n /** Show no-data when there is integration count but no posts (postData is false, filteredData empty). */\n get showNoPostsMessage(): boolean {\n return (\n this.integrationCountDisplay > 0 &&\n !this.postData &&\n (!this.filteredData || this.filteredData.length === 0)\n );\n }\n}\n","<div [ngClass]=\"{ 'vendors-distributor-wrapper': !vendor }\">\n <div class=\"d-flex justify-content-between align-items-center mb-3 search-container\">\n <div>\n <span class=\"int-span\">{{header}}</span>\n </div>\n @if (integrationCountDisplay > 0) {\n <div class=\"search-wrapper position-relative\">\n <i class=\"fa fa-search search-icon\"></i>\n <input type=\"text\"\n (keyup)=\"search($event.target.value)\"\n placeholder=\"Search eg security\"\n class=\"search-input top-search-input\" id=\"input_search_eg_security_9712\" name=\"input_search_eg_security_9712\"\n aria-label=\"Search eg security\" />\n </div>\n }\n\n </div>\n\n @if (postData) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n }\n\n @if (showNoPostsMessage) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"></pw-no-data>\n </div>\n }\n\n @if (!postData && integrationCountDisplay > 0 && filteredData.length > 0) {\n <div class=\"row\">\n @for (img of filteredData | slice:first:(first + rows); track img) {\n <div class=\"col-md-3 mt-4\"\n >\n <div class=\"boxes d-flex align-items-center justify-content-center\">\n @if (img?.companyImg) {\n <img [src]=\"img.companyImg\" alt=\"Vendor Company Icon\" class=\"vendor-icon\" />\n } @else {\n @if (img?.rectangular_picture?.url) {\n @if (!img.rectangular_picture.url.includes('default-photo')) {\n @if (img?.showcase) {\n <a class=\"vendor-link\" [href]=\"img.external_url || ('/resources/view/' + img.slug)\">\n <img [src]=\"img.rectangular_picture.url\" alt=\"Vendor Rectangular Company Icon\" class=\"vendor-icon\" />\n </a>\n } @else {\n <img [src]=\"img.rectangular_picture.url\" alt=\"Vendor Rectangular Company Icon\" class=\"vendor-icon\" />\n }\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"img?.id\"\n [resourceData]=\"img\"\n (updated)=\"getPosts.emit()\">\n </pw-resource-edit-card-lazy>\n } @else {\n @if (img?.showcase) {\n <a class=\"vendor-link\" [href]=\"img.external_url || ('/resources/view/' + img.slug)\">\n <span class=\"vendor-name text-center mt-2\">{{ img?.title }}</span>\n </a>\n } @else {\n <span class=\"vendor-name text-center\">{{ img?.title }}</span>\n }\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEditResourcesValue\"\n [id]=\"img?.id\"\n [resourceData]=\"img\"\n (updated)=\"getPosts.emit()\">\n </pw-resource-edit-card-lazy>\n }\n } @else {\n <ng-template [ngTemplateOutlet]=\"noImage\"></ng-template>\n }\n }\n </div>\n </div>\n }\n @if (filteredData.length > 0) {\n <div class=\"customPaginator d-flex align-items-center mt-5 justify-content-center\"\n >\n <p-paginator\n [first]=\"first\"\n [rows]=\"rows\"\n [totalRecords]=\"filteredData.length\"\n (onPageChange)=\"onPageChange($event)\"></p-paginator>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { TagService } from '@posiwise/common-services';\nimport { User } from '@posiwise/common-utilities';\nimport { HelperService } from '@posiwise/helper-service';\nimport { CustomUploaderComponent } from '@posiwise/utils';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\n@Component({\n selector: 'pw-resource-top-banner-edit',\n templateUrl: './resource-top-banner-edit.component.html',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceTopBannerEditComponent extends AppBaseComponent implements OnInit {\n @Input() blogPostTag;\n @Input() user: User;\n @Input() userLoggedIn: boolean;\n @Output() getUpdatedTag = new EventEmitter();\n @ViewChild('editModal') editModal: TemplateRef<CustomUploaderComponent>;\n @ViewChild('imageCropContent') imageCropContent: TemplateRef<CustomUploaderComponent>;\n\n form: FormGroup;\n image: string | null = null;\n defaultImage = 'assets/img/resource/blog.png';\n file: File;\n subscriptionId: string;\n imageModalRef;\n buttonBusy: boolean;\n\n constructor(\n private readonly fb: FormBuilder,\n private readonly modalService: NgbModal,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n }\n\n ngOnInit(): void {\n if (this.userLoggedIn) {\n this.localStorage.getItem$('product').subscribe(res => {\n const data = res ? JSON.parse(res) : null;\n this.subscriptionId = data?.subscriptionId;\n this.cdr.markForCheck();\n });\n }\n this.form = this.fb.group({\n title: [this.blogPostTag?.title ?? ''],\n description: [this.blogPostTag?.description ?? ''],\n meta_title: [this.blogPostTag?.meta_title ?? ''],\n meta_description: [this.blogPostTag?.meta_description ?? '']\n });\n\n this.image = this.blogPostTag?.image?.url ?? null;\n }\n\n openEditModal() {\n this.modalService.open(this.editModal, { centered: true, size: 'lg' });\n }\n\n openImageModal(modalRef) {\n this.imageModalRef = this.modalService.open(modalRef, { centered: true });\n }\n\n onImageSelected(base64: string): void {\n this.image = base64;\n this.file = HelperService.convertBase64ToFile(base64);\n this.imageModalRef?.close();\n }\n\n onClose() {\n this.imageModalRef?.close();\n }\n\n removeImage() {\n this.image = null;\n }\n\n handleImageError(event: Event) {\n (event.target as HTMLImageElement).src = this.defaultImage;\n }\n\n save() {\n this.buttonBusy = true;\n const payload = {\n title: this.form.value.title ?? this.blogPostTag?.title,\n description: this.form.value.description ?? this.blogPostTag?.description,\n meta_title: this.form.value.meta_title ?? this.blogPostTag?.meta_title,\n meta_description:\n this.form.value.meta_description ?? this.blogPostTag?.meta_description,\n tag_category_id: this.blogPostTag?.tag_category_id,\n tag_type: this.blogPostTag?.tag_type,\n subscription_id: this.subscriptionId,\n name: this.blogPostTag?.name\n };\n\n if (this.file) {\n payload['image'] = this.file;\n } else if (!this.image) {\n payload['remove_image'] = true;\n }\n\n this.tagService.updateTagById(this.blogPostTag?.id, payload).subscribe(() => {\n this.buttonBusy = false;\n this.toast.success('Tag Updated');\n this.getUpdatedTag.emit();\n this.modalService.dismissAll();\n this.cdr.markForCheck();\n });\n }\n}\n","<div class=\"edit-card\">\n <i class=\"fa fa-edit cursor-pointer text-black in-page-edit-icon mb-1 ms-3\"\n (click)=\"openEditModal()\"\n (keydown.enter)=\"openEditModal()\"\n (keydown.space)=\"openEditModal()\"\n title=\"Edit Blog Tag\"></i>\n</div>\n\n<ng-template #editModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Blog Post Tag</h5>\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]=\"form\">\n <div class=\"row\">\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\">\n <pw-input-container label=\"Description\" name=\"description\" controlId=\"resource-top-banner-description\">\n <textarea id=\"resource-top-banner-description\" name=\"description\" class=\"form-control\" rows=\"4\" formControlName=\"description\"\n aria-label=\"Description\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Meta Title\" name=\"meta_title\">\n <input type=\"text\" class=\"form-control\" formControlName=\"meta_title\" placeholder=\"Meta Title for SEO\" id=\"input_meta_title_2\" name=\"input_meta_title_2\"\n aria-label=\"Meta Title for SEO\"/>\n </pw-input-container>\n </div>\n\n <div class=\"col-12\">\n <pw-input-container label=\"Meta Description\" name=\"meta_description\" controlId=\"resource-top-banner-meta_description\">\n <textarea id=\"resource-top-banner-meta_description\" name=\"meta_description\" class=\"form-control\" rows=\"3\" formControlName=\"meta_description\" placeholder=\"Meta Description for SEO\"\n aria-label=\"Meta Description for SEO\"></textarea>\n </pw-input-container>\n </div>\n\n <div class=\"col-12 my-4\">\n <span id=\"resource-top-banner-tag-image-label\" class=\"pw-label-style\">Blog Tag Image</span>\n <div class=\"text-center d-flex flex-column align-items-center col-6\">\n <img [src]=\"image || defaultImage\"\n (click)=\"openImageModal(imageCropContent)\"\n (keydown.enter)=\"openImageModal(imageCropContent)\"\n (keydown.space)=\"openImageModal(imageCropContent)\"\n class=\"image w-100\"\n alt=\"Blog\"\n (error)=\"handleImageError($event)\"\n />\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\n <a class=\"d-inline-block mt-2\"\n (click)=\"openImageModal(imageCropContent)\">\n {{ image ? 'Update' : 'Add' }} Image\n </a>\n @if (image) {\n <i\n class=\"fa fa-trash delete-icon text-danger ms-2 cursor-pointer\"\n title=\"Remove Image\"\n (keydown.enter)=\"removeImage()\"\n (keydown.space)=\"removeImage()\"\n (click)=\"removeImage()\"></i>\n }\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)=\"save()\">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 Image</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. Avoid artwork, celebrities, or copyrighted images.</small>\n <pw-image-cropper\n #cropper\n aspectRatio=\"dynamic\"\n (imageSelectionEvent)=\"onImageSelected($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\nimport { HubSpotMeetingsSharedModule } from '@posiwise/alpha-module';\nimport { CoreTranslocoModule } from '@posiwise/core-transloco';\nimport { DirectivesModule } from '@posiwise/directives';\nimport { PipesModule } from '@posiwise/pipes';\nimport { ResourceSharedComponentsModule } from '@posiwise/shared-components';\n\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TextareaModule } from 'primeng/textarea';\n\nimport { TranslocoModule } from '@jsverse/transloco';\n\nimport { ResourceCompanyCardComponent } from '../components/resource-company-card/resource-company-card.component';\nimport { ResourceTopBannerEditComponent } from '../components/resource-top-banner-edit/resource-top-banner-edit.component';\n\nimport { ResourceCardsModule } from './resource-cards.module';\n\n// Shared components used across multiple resource routes\n// Note: Most heavy modules (Quill, Calendar, UiSwitch, etc.) are now in ResourceCardsModule\n@NgModule({\n declarations: [ResourceCompanyCardComponent, ResourceTopBannerEditComponent],\n imports: [\n CommonModule,\n RouterModule,\n FormsModule,\n ReactiveFormsModule,\n PipesModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n InputTextModule,\n IconFieldModule,\n InputIconModule,\n TextareaModule,\n ResourceCardsModule,\n HubSpotMeetingsSharedModule // For pw-book-a-demo component (HubSpotMeetingsComponent)\n ],\n exports: [\n // Export the 2 components specific to this module\n ResourceCompanyCardComponent,\n ResourceTopBannerEditComponent,\n // Export card components module (includes all heavy modules + card components)\n ResourceCardsModule,\n // Export HubSpotMeetingsSharedModule to make pw-book-a-demo component available\n HubSpotMeetingsSharedModule,\n // Export common lightweight modules\n CommonModule,\n RouterModule,\n FormsModule,\n ReactiveFormsModule,\n PipesModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n InputTextModule,\n IconFieldModule,\n InputIconModule,\n TextareaModule\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceSharedModule {}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\n\nimport { AppBaseComponent } from '@posiwise/app-base-component';\nimport { AuthService, TagService } from '@posiwise/common-services';\nimport { HelperService } from '@posiwise/helper-service';\n\nimport moment from 'moment';\n\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\n\nimport { ResourceService } from '../../../resource.service';\n\n@Component({\n selector: 'pw-resource-edit-card',\n templateUrl: './resource-edit-card.component.html',\n styleUrl: './resource-edit-card.component.scss',\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class ResourceEditCardComponent extends AppBaseComponent implements OnInit {\n @Input() id!: number;\n @Input() resourceData;\n @Output() updated = new EventEmitter<void>();\n\n editForm: FormGroup;\n image = '';\n rectangularImage = '';\n file: File | null = null;\n rectangularFile: File | null = null;\n\n imageModalRef;\n selectedTags = [];\n allTags = [];\n tagsSuggestion = [];\n subscriptionId: number;\n userLoggedIn: boolean;\n buttonBusy = false;\n\n constructor(\n private readonly fb: FormBuilder,\n private readonly modalService: NgbModal,\n private readonly resourceService: ResourceService,\n private readonly authService: AuthService,\n private readonly tagService: TagService,\n private readonly cdr: ChangeDetectorRef,\n injector: Injector\n ) {\n super(injector);\n this.editForm = this.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 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 const when = this.resourceData.when ? new Date(this.resourceData.when) : null;\n this.editForm.setValue({\n title: this.resourceData.title ?? '',\n external_url: this.resourceData.external_url ?? '',\n cta_text: this.resourceData.cta_text ?? '',\n when: when ?? '',\n showcase: !!this.resourceData.showcase,\n published_at: !!this.resourceData.published_at,\n accepted_at: !!this.resourceData.accepted_at,\n body: this.resourceData.body\n });\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 let values = [];\n if (event.query) {\n values = this.allTags.filter(x =>\n x.name.toLowerCase().includes(event.query.toLowerCase())\n );\n } else {\n this.allTags.forEach(element => {\n values.push(element);\n });\n }\n this.tagsSuggestion = values;\n }\n\n private getPostTags() {\n this.tagService\n .getTagsByType('post_categories', {}, this.subscriptionId)\n .subscribe(response => {\n this.allTags = response.tags;\n this.cdr.markForCheck();\n });\n }\n\n deleteRectangularImage() {\n this.rectangularImage = null;\n this.rectangularFile = null;\n }\n openImageModal(modalTemplate): void {\n this.imageModalRef = this.modalService.open(modalTemplate, { centered: true, size: 'md' });\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 saveResource(): void {\n this.buttonBusy = true;\n this.saveTags(this.id);\n const payload = {\n ...this.editForm.value,\n subscription_id: this.subscriptionId\n };\n\n this.handlePicture(payload);\n this.handlePublishedAt(payload);\n this.handleAcceptedAt(payload);\n this.handleAcceptedAt(payload);\n this.handleOptionalFields(payload);\n this.handleRectangularPicture(payload);\n this.handleRemovals(payload);\n\n this.resourceService.updatePost(payload, this.id).subscribe({\n next: () => {\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 setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.toast.success('Blog Post Updated');\n this.updated.emit();\n this.modalService.dismissAll();\n this.cdr.markForCheck();\n }, 0);\n }, 0);\n },\n error: () => {\n setTimeout(() => {\n this.buttonBusy = false;\n this.cdr.markForCheck();\n }, 0);\n }\n });\n }\n\n private saveTags(id: number | string): void {\n if (this.selectedTags.length) {\n const data = {\n entity_tags: this.selectedTags.map(tag => ({ tag_id: tag.id })),\n slug: id,\n tag_entity: 'Post' // or use TAG_ENTITY.POST if you imported it\n };\n\n this.tagService.addTags(data, this.subscriptionId).subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n }\n\n private handlePicture(data) {\n if (this.file) {\n data.picture = this.file;\n } else {\n delete data.picture;\n }\n }\n\n private handlePublishedAt(data) {\n const control = this.editForm.get('published_at');\n if (control?.dirty) {\n data.published_at = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data.published_at;\n }\n }\n\n private handleAcceptedAt(data) {\n const control = this.editForm.get('accepted_at');\n if (control?.dirty) {\n data.accepted_at = control.value ? moment().format('DD-MMM-YYYY') : '';\n } else {\n delete data.accepted_at;\n }\n }\n\n private handleOptionalFields(data) {\n if (!this.editForm.get('when')?.value) {\n data.when = '';\n }\n if (!this.editForm.get('showcase')?.value) {\n data.showcase = '';\n }\n }\n\n private handleRectangularPicture(data) {\n if (this.rectangularFile) {\n data.rectangular_picture = this.rectangularFile;\n } else {\n delete data.rectangular_picture;\n }\n }\n\n private handleRemovals(data) {\n if (!this.file && !this.image) {\n data.remove_picture = true;\n }\n if (!this.rectangularFile && !this.rectangularImage) {\n data.remove_rectangular_picture = true;\n }\n }\n\n openRectModal(content) {\n this.imageModalRef = this.modalService.open(content, {\n centered: true,\n windowClass: 'modal-holder'\n });\n }\n\n handleImageError(event: Event, fallbackPath): void {\n HelperService.handleImageFallbackPath(event, fallbackPath);\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 [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 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 <a class=\"d-inline-block\" (click)=\"openImageModal(imageCropContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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 <a class=\"d-inline-block\" (click)=\"openRectModal(rectContent)\">\n {{ slug !== 'create' ? 'Edit' : 'Add' }} Picture\n </a>\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\" (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","import { CommonModule } from '@angular/common';\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { CoreTranslocoModule } from '@posiwise/core-transloco';\nimport { DirectivesModule } from '@posiwise/directives';\nimport { ResourceSharedComponentsModule } from '@posiwise/shared-components';\n\nimport { QuillModule } from 'ngx-quill';\nimport { UiSwitchModule } from 'ngx-ui-switch';\nimport { AutoCompleteModule } from 'primeng/autocomplete';\nimport { DatePickerModule } from 'primeng/datepicker';\n\nimport { TranslocoModule } from '@jsverse/transloco';\n\nimport { ResourceEditCardComponent } from '../components/resource-edit-card/resource-edit-card.component';\n\n/**\n * Lazy-loadable module for ResourceEditCard\n * Contains heavy dependencies (Quill, Calendar, etc.) that are only needed for admins\n * This module is dynamically imported when edit button is clicked\n */\n@NgModule({\n declarations: [ResourceEditCardComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n DatePickerModule,\n AutoCompleteModule,\n ResourceSharedComponentsModule,\n CoreTranslocoModule,\n TranslocoModule,\n DirectivesModule,\n QuillModule.forRoot(),\n UiSwitchModule\n ],\n exports: [ResourceEditCardComponent],\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class ResourceEditModule {}\n","import { ChangeDetectionStrategy,\n Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';\n\nimport { Resource } from '@posiwise/common-utilities';\n\n@Component({\n selector: 'pw-testimonial-card',\n templateUrl: './testimonial-card.component.html',\n styleUrls: [\n './testimonial-card.component.scss',\n '../resource-post/related-resources/related-resources.component.scss'\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class TestimonialCardListComponent implements OnChanges {\n @Output() editPost: EventEmitter<object> = new EventEmitter();\n\n @Input() posts: Resource[] = [];\n @Input() postHeader = '';\n @Input() canEdit = false;\n swiper;\n\n ngOnChanges(changes): void {\n if (changes.posts && this.posts?.length) {\n setTimeout(() => this.initSwiper(), 0); // Wait for DOM to render\n }\n }\n\n private async initSwiper() {\n // Dynamically import Swiper only when needed (lazy-load ~150KB library)\n const { default: Swiper } = await import('swiper');\n const { Navigation, Pagination } = await import('swiper/modules');\n\n this.swiper = new Swiper('.swiper-container', {\n modules: [Navigation, Pagination],\n slidesPerView: 1,\n spaceBetween: 24,\n centeredSlides: true,\n touchRatio: 1,\n touchAngle: 45,\n grabCursor: true,\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev'\n },\n pagination: {\n el: '.swiper-pagination',\n clickable: true\n },\n breakpoints: {\n 425: {\n slidesPerView: 1.05,\n centeredSlides: true\n },\n 470: {\n slidesPerView: 1.25,\n centeredSlides: true\n },\n 564: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 640: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 768: {\n slidesPerView: 1.5,\n centeredSlides: true\n },\n 1024: {\n slidesPerView: 2, // Allow room between cards\n centeredSlides: false\n },\n 1200: {\n slidesPerView: 3,\n centeredSlides: false\n }\n }\n });\n }\n}\n","<section class=\"resource-section section-outer bg-white\">\n <div class=\"container\">\n @if (postHeader) {\n <div class=\"d-flex justify-content-between align-items-center flex-wrap mb-3\">\n <h2 class=\"section-heading\">{{postHeader}}</h2>\n </div>\n }\n @if (posts.length === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Resource.NoDataMessage' | transloco\"/>\n </div>\n }\n <div [hidden]=\"posts.length === 0\">\n <div class=\"swiper-container\">\n <div class=\"swiper-wrapper\">\n @for (post of posts; track post) {\n <div class=\"swiper-slide\">\n <div class=\"testimonial-box\">\n <pw-resource-edit-card-lazy\n [canEdit]=\"canEdit\"\n [id]=\"post.id\"\n [resourceData]=\"post\"\n (updated)=\"editPost.emit(1, 100)\">\n </pw-resource-edit-card-lazy>\n <div class=\"stars mb-5\">★★★★★</div>\n <div class=\"testimonial-content\">\n <div class=\"ql-container ql-snow ql-res\">\n <div class=\"ql-editor\"\n [innerHTML]=\"post?.body\">\n </div>\n </div>\n </div>\n <!-- THIS STAYS AT BOTTOM -->\n <div class=\"avatar-container\">\n @if (!post.rectangular_picture.url.includes('default-photo.jpg') ) {\n <img\n [src]=\"post.rectangular_picture.url\"\n alt=\"Logo\"\n class=\"testimonial-logo mt-4\"\n />\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div class=\"swiper-pagination\"></div>\n <div class=\"swiper-button-prev\"></div>\n <div class=\"swiper-button-next\"></div>\n </div>\n </div>\n </div>\n</section>"],"mappings":"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"}
|