@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.
|
|
18532
|
+
this.onboarding.getFamilies(this.subscriptionId).pipe(finalize(() => this.cdr.markForCheck())).subscribe({
|
|
18523
18533
|
next: ({ families }) => {
|
|
18524
|
-
this.families = families.
|
|
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((
|
|
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(() =>
|
|
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(() =>
|
|
18603
|
-
const steps = response
|
|
18604
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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 ({{ 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 ({{ 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 ({{ 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 ({{ 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 ({{ 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 ({{ 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 ({{ 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 ({{ 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.
|
|
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).
|
|
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
|
}],
|