web: add flow and policy cache card
This commit is contained in:
		| @ -11,57 +11,7 @@ | |||||||
| </section> | </section> | ||||||
| <section class="pf-c-page__main-section"> | <section class="pf-c-page__main-section"> | ||||||
|     <div class="pf-l-gallery pf-m-gutter"> |     <div class="pf-l-gallery pf-m-gutter"> | ||||||
|         <div class="pf-c-card pf-c-card-aggregate pf-l-gallery__item pf-m-compact"> |  | ||||||
|             <div class="pf-c-card__header pf-l-flex pf-m-justify-content-space-between"> |  | ||||||
|                 <div class="pf-c-card__header-main"> |  | ||||||
|                     <i class="pf-icon pf-icon-server"></i> {% trans 'Cached Policies' %} |  | ||||||
|                 </div> |  | ||||||
|                 <ak-modal-button href="{% url 'authentik_admin:overview-clear-policy-cache' %}"> |  | ||||||
|                     <a slot="trigger"> |  | ||||||
|                         <i class="fa fa-trash"> </i> |  | ||||||
|                     </a> |  | ||||||
|                     <div slot="modal"></div> |  | ||||||
|                 </ak-modal-button> |  | ||||||
|             </div> |  | ||||||
|             <div class="pf-c-card__body"> |  | ||||||
|                 {% if cached_policies < 1 %} |  | ||||||
|                 <p class="ak-aggregate-card"> |  | ||||||
|                     <i class="fa fa-exclamation-triangle"></i> {{ cached_policies }} |  | ||||||
|                 </p> |  | ||||||
|                 <p>{% trans 'No policies cached. Users may experience slow response times.' %}</p> |  | ||||||
|                 {% else %} |  | ||||||
|                 <p class="ak-aggregate-card"> |  | ||||||
|                     <i class="fa fa-check-circle"></i> {{ cached_policies }} |  | ||||||
|                 </p> |  | ||||||
|                 {% endif %} |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|  |  | ||||||
|         <div class="pf-c-card pf-c-card-aggregate pf-l-gallery__item pf-m-compact"> |  | ||||||
|             <div class="pf-c-card__header pf-l-flex pf-m-justify-content-space-between"> |  | ||||||
|                 <div class="pf-c-card__header-main"> |  | ||||||
|                     <i class="pf-icon pf-icon-server"></i> {% trans 'Cached Flows' %} |  | ||||||
|                 </div> |  | ||||||
|                 <ak-modal-button href="{% url 'authentik_admin:overview-clear-flow-cache' %}"> |  | ||||||
|                     <a slot="trigger"> |  | ||||||
|                         <i class="fa fa-trash"> </i> |  | ||||||
|                     </a> |  | ||||||
|                     <div slot="modal"></div> |  | ||||||
|                 </ak-modal-button> |  | ||||||
|             </div> |  | ||||||
|             <div class="pf-c-card__body"> |  | ||||||
|                 {% if cached_flows < 1 %} |  | ||||||
|                 <p class="ak-aggregate-card"> |  | ||||||
|                     <span class="fa fa-exclamation-triangle"></span> {{ cached_flows }} |  | ||||||
|                 </p> |  | ||||||
|                 <p>{% trans 'No flows cached.' %}</p> |  | ||||||
|                 {% else %} |  | ||||||
|                 <p class="ak-aggregate-card"> |  | ||||||
|                     <i class="fa fa-check-circle"></i> {{ cached_flows }} |  | ||||||
|                 </p> |  | ||||||
|                 {% endif %} |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|     </div> |     </div> | ||||||
| </section> | </section> | ||||||
| {% endblock %} | {% endblock %} | ||||||
|  | |||||||
| @ -33,6 +33,12 @@ export class Flow { | |||||||
|     static list(filter?: QueryArguments): Promise<PBResponse<Flow>> { |     static list(filter?: QueryArguments): Promise<PBResponse<Flow>> { | ||||||
|         return DefaultClient.fetch<PBResponse<Flow>>(["flows", "instances"], filter); |         return DefaultClient.fetch<PBResponse<Flow>>(["flows", "instances"], filter); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     static cached(): Promise<number> { | ||||||
|  |         return DefaultClient.fetch<PBResponse<Flow>>(["flows", "cached"]).then(r => { | ||||||
|  |             return r.pagination.count; | ||||||
|  |         }); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| export class Stage { | export class Stage { | ||||||
|  | |||||||
| @ -8,12 +8,18 @@ export class Policy { | |||||||
|         throw Error(); |         throw Error(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static get(pk: string): Promise<PolicyBinding> { |     static get(pk: string): Promise<Policy> { | ||||||
|         return DefaultClient.fetch<PolicyBinding>(["policies", "all", pk]); |         return DefaultClient.fetch<Policy>(["policies", "all", pk]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static list(filter?: QueryArguments): Promise<PBResponse<PolicyBinding>> { |     static list(filter?: QueryArguments): Promise<PBResponse<Policy>> { | ||||||
|         return DefaultClient.fetch<PBResponse<PolicyBinding>>(["policies", "all"], filter); |         return DefaultClient.fetch<PBResponse<Policy>>(["policies", "all"], filter); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     static cached(): Promise<number> { | ||||||
|  |         return DefaultClient.fetch<PBResponse<Policy>>(["policies", "cached"]).then(r => { | ||||||
|  |             return r.pagination.count; | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -31,15 +31,19 @@ export class AggregateCard extends LitElement { | |||||||
|         return html`<slot></slot>`; |         return html`<slot></slot>`; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     renderHeaderLink(): TemplateResult { | ||||||
|  |         return html`${this.headerLink ? html`<a href="${this.headerLink}"> | ||||||
|  |             <i class="fa fa-external-link-alt"> </i> | ||||||
|  |         </a>` : ""}`; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     render(): TemplateResult { |     render(): TemplateResult { | ||||||
|         return html`<div class="pf-c-card pf-c-card-aggregate"> |         return html`<div class="pf-c-card pf-c-card-aggregate"> | ||||||
|             <div class="pf-c-card__header pf-l-flex pf-m-justify-content-space-between"> |             <div class="pf-c-card__header pf-l-flex pf-m-justify-content-space-between"> | ||||||
|                 <div class="pf-c-card__header-main"> |                 <div class="pf-c-card__header-main"> | ||||||
|                     <i class="${ifDefined(this.icon)}"></i> ${this.header ? gettext(this.header) : ""} |                     <i class="${ifDefined(this.icon)}"></i> ${this.header ? gettext(this.header) : ""} | ||||||
|                 </div> |                 </div> | ||||||
|                 ${this.headerLink ? html`<a href="${this.headerLink}"> |                 ${this.renderHeaderLink()} | ||||||
|                     <i class="fa fa-external-link-alt"> </i> |  | ||||||
|                 </a>` : ""} |  | ||||||
|             </div> |             </div> | ||||||
|             <div class="pf-c-card__body center-value"> |             <div class="pf-c-card__body center-value"> | ||||||
|                 ${this.renderInner()} |                 ${this.renderInner()} | ||||||
|  | |||||||
| @ -41,6 +41,17 @@ export class AdminOverviewPage extends LitElement { | |||||||
|                 <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Apps with most usage" style="grid-column-end: span 2;grid-row-end: span 3;"> |                 <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Apps with most usage" style="grid-column-end: span 2;grid-row-end: span 3;"> | ||||||
|                     <ak-top-applications-table></ak-top-applications-table> |                     <ak-top-applications-table></ak-top-applications-table> | ||||||
|                 </ak-aggregate-card> |                 </ak-aggregate-card> | ||||||
|  |                 <ak-admin-status-card-provider class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-plugged" header="Providers" headerLink="#/administration/providers/"> | ||||||
|  |                 </ak-admin-status-card-provider> | ||||||
|  |                 <ak-admin-status-card-policy-unbound class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-infrastructure" header="Policies" headerLink="#/administration/policies/"> | ||||||
|  |                 </ak-admin-status-card-policy-unbound> | ||||||
|  |                 <ak-aggregate-card-promise | ||||||
|  |                     icon="pf-icon pf-icon-user" | ||||||
|  |                     header="Users" | ||||||
|  |                     headerLink="#/administration/users/" | ||||||
|  |                     .promise=${this.users}> | ||||||
|  |                 </ak-aggregate-card-promise> | ||||||
|  |                 <!-- Version card --> | ||||||
|                 <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Workers"> |                 <ak-aggregate-card class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Workers"> | ||||||
|                     ${this.data ? |                     ${this.data ? | ||||||
|         this.data?.worker_count < 1 ? |         this.data?.worker_count < 1 ? | ||||||
| @ -53,16 +64,10 @@ export class AdminOverviewPage extends LitElement { | |||||||
|                                 </p>` |                                 </p>` | ||||||
|         : html`<ak-spinner size=${SpinnerSize.Large}></ak-spinner>`} |         : html`<ak-spinner size=${SpinnerSize.Large}></ak-spinner>`} | ||||||
|                 </ak-aggregate-card> |                 </ak-aggregate-card> | ||||||
|                 <ak-admin-status-card-provider class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-plugged" header="Providers" headerLink="#/administration/providers/"> |                 <ak-admin-status-card-policy-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Cached Policies"> | ||||||
|                 </ak-admin-status-card-provider> |                 </ak-admin-status-card-policy-cache> | ||||||
|                 <ak-admin-status-card-policy class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-plugged" header="Policies" headerLink="#/administration/policies/"> |                 <ak-admin-status-card-flow-cache class="pf-l-gallery__item pf-m-4-col" icon="pf-icon pf-icon-server" header="Cached Flows"> | ||||||
|                 </ak-admin-status-card-policy> |                 </ak-admin-status-card-flow-cache> | ||||||
|                 <ak-aggregate-card-promise |  | ||||||
|                     icon="pf-icon pf-icon-user" |  | ||||||
|                     header="Users" |  | ||||||
|                     headerLink="#/administration/users/" |  | ||||||
|                     .promise=${this.users}> |  | ||||||
|                 </ak-aggregate-card-promise> |  | ||||||
|             </div> |             </div> | ||||||
|         </section>`; |         </section>`; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ import { gettext } from "django"; | |||||||
| import { customElement, property } from "lit-element"; | import { customElement, property } from "lit-element"; | ||||||
| import { html, TemplateResult } from "lit-html"; | import { html, TemplateResult } from "lit-html"; | ||||||
| import { until } from "lit-html/directives/until"; | import { until } from "lit-html/directives/until"; | ||||||
|  | import { Flow } from "../../api/flow"; | ||||||
| import { Policy } from "../../api/policy"; | import { Policy } from "../../api/policy"; | ||||||
| import { Provider } from "../../api/provider"; | import { Provider } from "../../api/provider"; | ||||||
| import { AggregateCard } from "../../elements/cards/AggregateCard"; | import { AggregateCard } from "../../elements/cards/AggregateCard"; | ||||||
| @ -62,8 +63,8 @@ export class ProviderStatusCard extends AdminStatusCard { | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| @customElement("ak-admin-status-card-policy") | @customElement("ak-admin-status-card-policy-unbound") | ||||||
| export class PolicyStatusCard extends AdminStatusCard { | export class PolicyUnboundStatusCard extends AdminStatusCard { | ||||||
|  |  | ||||||
|     getPrimaryCounter(): Promise<number> { |     getPrimaryCounter(): Promise<number> { | ||||||
|         return Policy.list({ |         return Policy.list({ | ||||||
| @ -88,3 +89,65 @@ export class PolicyStatusCard extends AdminStatusCard { | |||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @customElement("ak-admin-status-card-policy-cache") | ||||||
|  | export class PolicyCacheStatusCard extends AdminStatusCard { | ||||||
|  |  | ||||||
|  |     getPrimaryCounter(): Promise<number> { | ||||||
|  |         return Policy.cached(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     getStatus(counter: number): Promise<AdminStatus> { | ||||||
|  |         if (counter < 1) { | ||||||
|  |             return Promise.resolve<AdminStatus>({ | ||||||
|  |                 icon: "fa fa-exclamation-triangle", | ||||||
|  |                 message: gettext("No policies cached. Users may experience slow response times."), | ||||||
|  |             }); | ||||||
|  |         } else { | ||||||
|  |             return Promise.resolve<AdminStatus>({ | ||||||
|  |                 icon: "fa fa-check-circle" | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     renderHeaderLink(): TemplateResult { | ||||||
|  |         return html`<ak-modal-button href="/administration/overview/cache/policy/"> | ||||||
|  |             <a slot="trigger"> | ||||||
|  |                 <i class="fa fa-trash"> </i> | ||||||
|  |             </a> | ||||||
|  |             <div slot="modal"></div> | ||||||
|  |         </ak-modal-button>`; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @customElement("ak-admin-status-card-flow-cache") | ||||||
|  | export class FlowCacheStatusCard extends AdminStatusCard { | ||||||
|  |  | ||||||
|  |     getPrimaryCounter(): Promise<number> { | ||||||
|  |         return Flow.cached(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     getStatus(counter: number): Promise<AdminStatus> { | ||||||
|  |         if (counter < 1) { | ||||||
|  |             return Promise.resolve<AdminStatus>({ | ||||||
|  |                 icon: "fa fa-exclamation-triangle", | ||||||
|  |                 message: gettext("No flows cached."), | ||||||
|  |             }); | ||||||
|  |         } else { | ||||||
|  |             return Promise.resolve<AdminStatus>({ | ||||||
|  |                 icon: "fa fa-check-circle" | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     renderHeaderLink(): TemplateResult { | ||||||
|  |         return html`<ak-modal-button href="/administration/overview/cache/flow/"> | ||||||
|  |             <a slot="trigger"> | ||||||
|  |                 <i class="fa fa-trash"> </i> | ||||||
|  |             </a> | ||||||
|  |             <div slot="modal"></div> | ||||||
|  |         </ak-modal-button>`; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer