@posiwise/admin-module 0.0.256 → 0.0.257

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.
@@ -18151,7 +18151,7 @@ var OnboardingStepFormComponent = class OnboardingStepFormComponent {
18151
18151
  isStandalone: false,
18152
18152
  selector: "pw-onboarding-step-form",
18153
18153
  ngImport: i0,
18154
- template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18154
+ template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18155
18155
  styles: [":host form h3{display:block;border-top:1px solid #e2e5ea;margin-top:1.5rem;padding-top:1rem}:host form .modal-body>h3:first-child{border-top:0;margin-top:0;padding-top:0}.pw-onboarding-step-form__toggles{row-gap:10px}.pw-onboarding-step-form__toggles .info-circle{margin-right:20px}\n"],
18156
18156
  dependencies: [
18157
18157
  {
@@ -18463,7 +18463,7 @@ i0.ɵɵngDeclareClassMetadata({
18463
18463
  args: [{
18464
18464
  selector: "pw-onboarding-step-form",
18465
18465
  standalone: false,
18466
- template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18466
+ template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18467
18467
  styles: [":host form h3{display:block;border-top:1px solid #e2e5ea;margin-top:1.5rem;padding-top:1rem}:host form .modal-body>h3:first-child{border-top:0;margin-top:0;padding-top:0}.pw-onboarding-step-form__toggles{row-gap:10px}.pw-onboarding-step-form__toggles .info-circle{margin-right:20px}\n"]
18468
18468
  }]
18469
18469
  }]
@@ -18493,6 +18493,16 @@ function loadFaqs(commonService, subscriptionId) {
18493
18493
  };
18494
18494
  return commonService.getFaq(params).pipe(map((response) => response?.faqs ?? []), catchError(() => of([])));
18495
18495
  }
18496
+ function labelledFamilies(families, sources) {
18497
+ const labelOf = (key) => sources?.find((source) => source.permissionKey === key)?.label;
18498
+ return families.map((family) => ({
18499
+ ...family,
18500
+ label: labelOf(family.permission_key) ?? ""
18501
+ })).filter((family) => !!family.label);
18502
+ }
18503
+ function stepsIn(response) {
18504
+ return response?.onboarding_steps;
18505
+ }
18496
18506
  var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseComponent {
18497
18507
  constructor(injector, onboarding, commonService, confirmDialog, modal, cdr, sources) {
18498
18508
  super(injector);
@@ -18519,19 +18529,16 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18519
18529
  return PermissionService.selectedSubscription?.id;
18520
18530
  }
18521
18531
  ngOnInit() {
18522
- this.onboarding.getFamilies(this.subscriptionId).pipe(finalize(() => this.refresh())).subscribe({
18532
+ this.onboarding.getFamilies(this.subscriptionId).pipe(finalize(() => this.cdr.markForCheck())).subscribe({
18523
18533
  next: ({ families }) => {
18524
- this.families = families.map((family) => ({
18525
- ...family,
18526
- label: this.source(family.permission_key)?.label ?? ""
18527
- })).filter((family) => !!family.label);
18534
+ this.families = labelledFamilies(families, this.sources);
18528
18535
  this.selectFamily(this.families[0]?.permission_key ?? null);
18529
18536
  },
18530
18537
  error: () => this.loadFailed = true
18531
18538
  });
18532
18539
  }
18533
18540
  get plans() {
18534
- return this.families.find((family) => family.permission_key === this.permissionKey)?.plans ?? [];
18541
+ return this.families.find((item) => item.permission_key === this.permissionKey)?.plans ?? [];
18535
18542
  }
18536
18543
  get visibleSteps() {
18537
18544
  return stepsForPlan(this.steps, this.planFilter);
@@ -18549,7 +18556,7 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18549
18556
  steps: this.onboarding.getSteps(this.subscriptionId, permissionKey),
18550
18557
  catalogue: this.source(permissionKey).load(),
18551
18558
  faqs: loadFaqs(this.commonService, this.subscriptionId)
18552
- }).pipe(finalize(() => (this.loading = false, this.refresh()))).subscribe({
18559
+ }).pipe(finalize(() => this.settle("loading"))).subscribe({
18553
18560
  next: ({ steps, catalogue, faqs }) => {
18554
18561
  this.steps = steps.onboarding_steps;
18555
18562
  this.catalogue = catalogue;
@@ -18599,15 +18606,17 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18599
18606
  }
18600
18607
  run(request) {
18601
18608
  this.busy = true;
18602
- request.pipe(finalize(() => (this.busy = false, this.refresh()))).subscribe({ next: (response) => {
18603
- const steps = response?.onboarding_steps;
18604
- return steps ? this.steps = steps : this.selectFamily(this.permissionKey);
18605
- } });
18609
+ request.pipe(finalize(() => this.settle("busy"))).subscribe((response) => {
18610
+ const steps = stepsIn(response);
18611
+ if (steps) this.steps = steps;
18612
+ else this.selectFamily(this.permissionKey);
18613
+ });
18606
18614
  }
18607
18615
  source(permissionKey) {
18608
18616
  return (this.sources ?? []).find((source) => source.permissionKey === permissionKey);
18609
18617
  }
18610
- refresh() {
18618
+ settle(flag) {
18619
+ this[flag] = false;
18611
18620
  this.cdr.markForCheck();
18612
18621
  }
18613
18622
  static {
@@ -18640,8 +18649,8 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18640
18649
  selector: "pw-onboarding-steps",
18641
18650
  usesInheritance: true,
18642
18651
  ngImport: i0,
18643
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, -1)\" (keydown.enter)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, 1)\" (keydown.enter)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [pTooltip]=\"'Button.Edit' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"edit(step)\" (keydown.enter)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li [pTooltip]=\"'Button.Delete' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"remove(step)\" (keydown.enter)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18644
- styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}\n"],
18652
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n (click)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n (click)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Edit' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Edit' | transloco\" (click)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li>\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Delete' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Delete' | transloco\" (click)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18653
+ styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}.pw-onboarding-admin__action{padding:0;border:0;background:none;color:inherit;font-size:inherit;line-height:inherit}\n"],
18645
18654
  dependencies: [
18646
18655
  {
18647
18656
  kind: "component",
@@ -18974,8 +18983,8 @@ i0.ɵɵngDeclareClassMetadata({
18974
18983
  args: [{
18975
18984
  selector: "pw-onboarding-steps",
18976
18985
  standalone: false,
18977
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, -1)\" (keydown.enter)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, 1)\" (keydown.enter)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [pTooltip]=\"'Button.Edit' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"edit(step)\" (keydown.enter)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li [pTooltip]=\"'Button.Delete' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"remove(step)\" (keydown.enter)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18978
- styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}\n"]
18986
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n (click)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n (click)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Edit' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Edit' | transloco\" (click)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li>\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Delete' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Delete' | transloco\" (click)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18987
+ styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}.pw-onboarding-admin__action{padding:0;border:0;background:none;color:inherit;font-size:inherit;line-height:inherit}\n"]
18979
18988
  }]
18980
18989
  }],
18981
18990
  ctorParameters: () => [
@@ -21205,7 +21214,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21205
21214
  }
21206
21215
  ngOnInit() {
21207
21216
  this.filterData = history.state;
21208
- this.isBlogAdmin = this.permissionService.evaluatePermissions(`${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog.Admin`);
21217
+ this.isBlogAdmin = this.permissionService.evaluatePermissions(PermissionService.productPermission("Blog", "Admin"));
21209
21218
  this.isSubscriptionSuperAdmin = this.permissionService.isUserSubscriptionSuperAdmin();
21210
21219
  if (!this.isSubscriptionSuperAdmin) this.form.get("author_id").disable();
21211
21220
  if (!this.isBlogAdmin) this.form.get("accepted_at").disable();
@@ -21951,6 +21960,12 @@ i0.ɵɵngDeclareClassMetadata({
21951
21960
  ctorParameters: () => [{ type: i0.Injector }]
21952
21961
  });
21953
21962
  var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseComponent {
21963
+ get blogPermission() {
21964
+ return PermissionService.productPermission("Blog");
21965
+ }
21966
+ get isBlogAdmin() {
21967
+ return PermissionService.productPermission("Blog", "Admin");
21968
+ }
21954
21969
  constructor(adminService, tagService, injector, cdr, confirmDialog) {
21955
21970
  super(injector);
21956
21971
  this.adminService = adminService;
@@ -21978,8 +21993,6 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
21978
21993
  this.searchTextItems = typeof state.searchTextItems === "string" ? state.searchTextItems : "";
21979
21994
  }
21980
21995
  this.getUserSubscriptionId().subscribe((_) => {
21981
- this.blogPermission = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog`;
21982
- this.isBlogAdmin = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog.Admin`;
21983
21996
  this.cdr.markForCheck();
21984
21997
  });
21985
21998
  this.getUserSubscription().subscribe((response) => {
@@ -24353,7 +24366,7 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24353
24366
  ],
24354
24367
  usesInheritance: true,
24355
24368
  ngImport: i0,
24356
- template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <li></li>\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n } @else {\n <li class=\"mx-3\"></li>\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24369
+ template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24357
24370
  styles: [".hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.info-icon{vertical-align:middle;margin-left:5px}.first-name{margin-right:5px}\n"],
24358
24371
  dependencies: [
24359
24372
  {
@@ -24683,7 +24696,7 @@ i0.ɵɵngDeclareClassMetadata({
24683
24696
  args: [{
24684
24697
  selector: "pw-subscription-users",
24685
24698
  standalone: false,
24686
- template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <li></li>\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n } @else {\n <li class=\"mx-3\"></li>\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24699
+ template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24687
24700
  styles: [".hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.info-icon{vertical-align:middle;margin-left:5px}.first-name{margin-right:5px}\n"]
24688
24701
  }]
24689
24702
  }],
@@ -37180,7 +37193,7 @@ var UsersListBaseComponent = class extends AppBaseComponent {
37180
37193
  });
37181
37194
  }
37182
37195
  getUsers(paging) {
37183
- this.isLoaded = false;
37196
+ this.loading = true;
37184
37197
  const params = {
37185
37198
  product_ids: this.filterByProducts.join() || "",
37186
37199
  role_ids: this.filterByRoles.join() || "",
@@ -37190,18 +37203,22 @@ var UsersListBaseComponent = class extends AppBaseComponent {
37190
37203
  if (this.filterByAlphaBeta.includes("alpha")) params.alpha = true;
37191
37204
  if (this.filterByAlphaBeta.includes("beta")) params.beta = true;
37192
37205
  if (this.showAmbassadorsOnly) params.is_ambassador = true;
37193
- this.adminService.getUsers(paging, params).subscribe((response) => {
37206
+ this.adminService.getUsers(paging, params).pipe(finalize(() => {
37207
+ this.loading = false;
37208
+ this.isLoaded = true;
37209
+ this.cdr.markForCheck();
37210
+ })).subscribe((response) => {
37194
37211
  this.users = response.users;
37195
37212
  this.allUsers = [...this.users];
37196
37213
  this.totalRecords = response.object_count;
37197
37214
  this.totalRecordsUnFiltered = response?.unfiltered_count;
37198
- this.loading = false;
37199
- this.isLoaded = true;
37200
- this.cdr.markForCheck();
37201
37215
  });
37202
37216
  }
37203
37217
  };
37204
37218
  var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37219
+ get chatPermission() {
37220
+ return PermissionService.productPermission("Chat");
37221
+ }
37205
37222
  constructor(adminService, toaster, productService, injector, authService, cdr, windowService, sidebarService) {
37206
37223
  super(adminService, productService, injector, cdr, sidebarService);
37207
37224
  this.toaster = toaster;
@@ -37211,7 +37228,6 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37211
37228
  }
37212
37229
  ngOnInit() {
37213
37230
  this.subscriptionId = PermissionService.selectedSubscription?.id;
37214
- this.chatPermission = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}`;
37215
37231
  this.getRoles();
37216
37232
  this.getProducts();
37217
37233
  this.userStore().subscribe((response) => {
@@ -37366,7 +37382,7 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37366
37382
  ],
37367
37383
  usesInheritance: true,
37368
37384
  ngImport: i0,
37369
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner> </p-progress-spinner>\n }\n</div>\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37385
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n@if (!isLoaded) {\n <div class=\"w-100 mt-0\">\n <pw-skeleton-table [rows]=\"8\" [columns]=\"10\" [showCaption]=\"true\"></pw-skeleton-table>\n </div>\n}\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.d-none]=\"!isLoaded\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37370
37386
  styles: ["@charset \"UTF-8\";:root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: color-mix(in srgb, var(--first, rgb(23 105 225)) 85%, #000000);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255);--dashboard_bg: rgb(255 255 255);--public-btn-radius: 24px}.search-input input{width:100%}.w-150{width:150px}.table-responsive td[data-head=id]{font-variant-numeric:tabular-nums;color:#7c8696}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.ambassadors-only-toggle{display:inline-flex;align-items:center}.ambassadors-only-toggle ::ng-deep .switch small{display:flex;align-items:center;justify-content:center}.ambassadors-only-toggle ::ng-deep .switch small:after{content:\"\\f2b5\";font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900;font-size:12px;line-height:1;color:var(--first)}\n"],
37371
37387
  dependencies: [
37372
37388
  {
@@ -37639,6 +37655,19 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37639
37655
  selector: "p-inputicon",
37640
37656
  inputs: ["hostName"]
37641
37657
  },
37658
+ {
37659
+ kind: "component",
37660
+ type: i4$3.SkeletonTableComponent,
37661
+ selector: "pw-skeleton-table",
37662
+ inputs: [
37663
+ "rows",
37664
+ "columns",
37665
+ "showHeader",
37666
+ "showCaption",
37667
+ "density",
37668
+ "delay"
37669
+ ]
37670
+ },
37642
37671
  {
37643
37672
  kind: "directive",
37644
37673
  type: i5$2.NgClass,
@@ -37703,20 +37732,6 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37703
37732
  inputs: ["confirmMessage", "destructive"],
37704
37733
  outputs: ["successEvent"]
37705
37734
  },
37706
- {
37707
- kind: "component",
37708
- type: i11.ProgressSpinner,
37709
- selector: "p-progress-spinner, p-progressspinner",
37710
- inputs: [
37711
- "value",
37712
- "strokeWidth",
37713
- "animationDuration",
37714
- "min",
37715
- "max",
37716
- "ariaLabel",
37717
- "fill"
37718
- ]
37719
- },
37720
37735
  {
37721
37736
  kind: "component",
37722
37737
  type: i6$2.OnlineIndicatorComponent,
@@ -37804,7 +37819,7 @@ i0.ɵɵngDeclareClassMetadata({
37804
37819
  args: [{
37805
37820
  selector: "pw-admin-user-list",
37806
37821
  standalone: false,
37807
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner> </p-progress-spinner>\n }\n</div>\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37822
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n@if (!isLoaded) {\n <div class=\"w-100 mt-0\">\n <pw-skeleton-table [rows]=\"8\" [columns]=\"10\" [showCaption]=\"true\"></pw-skeleton-table>\n </div>\n}\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.d-none]=\"!isLoaded\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37808
37823
  styles: ["@charset \"UTF-8\";:root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: color-mix(in srgb, var(--first, rgb(23 105 225)) 85%, #000000);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255);--dashboard_bg: rgb(255 255 255);--public-btn-radius: 24px}.search-input input{width:100%}.w-150{width:150px}.table-responsive td[data-head=id]{font-variant-numeric:tabular-nums;color:#7c8696}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.ambassadors-only-toggle{display:inline-flex;align-items:center}.ambassadors-only-toggle ::ng-deep .switch small{display:flex;align-items:center;justify-content:center}.ambassadors-only-toggle ::ng-deep .switch small:after{content:\"\\f2b5\";font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900;font-size:12px;line-height:1;color:var(--first)}\n"]
37809
37824
  }]
37810
37825
  }],