remove syncstatus leftovers
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
This commit is contained in:
@ -14,12 +14,6 @@ from authentik.rbac.filters import ObjectFilter
|
|||||||
from authentik.tasks.models import Task
|
from authentik.tasks.models import Task
|
||||||
|
|
||||||
|
|
||||||
class SyncStatusSerializer(PassiveSerializer):
|
|
||||||
"""Provider sync status"""
|
|
||||||
|
|
||||||
is_running = BooleanField(read_only=True)
|
|
||||||
|
|
||||||
|
|
||||||
class SyncObjectSerializer(PassiveSerializer):
|
class SyncObjectSerializer(PassiveSerializer):
|
||||||
"""Sync object serializer"""
|
"""Sync object serializer"""
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,7 @@
|
|||||||
"""Source API Views"""
|
"""Source API Views"""
|
||||||
|
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from drf_spectacular.utils import extend_schema
|
|
||||||
from rest_framework.decorators import action
|
|
||||||
from rest_framework.fields import BooleanField, SerializerMethodField
|
from rest_framework.fields import BooleanField, SerializerMethodField
|
||||||
from rest_framework.request import Request
|
|
||||||
from rest_framework.response import Response
|
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
|
||||||
from authentik.core.api.sources import SourceSerializer
|
from authentik.core.api.sources import SourceSerializer
|
||||||
@ -50,12 +46,6 @@ class KerberosSourceSerializer(SourceSerializer):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class KerberosSyncStatusSerializer(PassiveSerializer):
|
|
||||||
"""Kerberos Source sync status"""
|
|
||||||
|
|
||||||
is_running = BooleanField(read_only=True)
|
|
||||||
|
|
||||||
|
|
||||||
class KerberosSourceViewSet(UsedByMixin, ModelViewSet):
|
class KerberosSourceViewSet(UsedByMixin, ModelViewSet):
|
||||||
"""Kerberos Source Viewset"""
|
"""Kerberos Source Viewset"""
|
||||||
|
|
||||||
@ -84,20 +74,3 @@ class KerberosSourceViewSet(UsedByMixin, ModelViewSet):
|
|||||||
"spnego_server_name",
|
"spnego_server_name",
|
||||||
]
|
]
|
||||||
ordering = ["name"]
|
ordering = ["name"]
|
||||||
|
|
||||||
@extend_schema(responses={200: KerberosSyncStatusSerializer()})
|
|
||||||
@action(
|
|
||||||
methods=["GET"],
|
|
||||||
detail=True,
|
|
||||||
pagination_class=None,
|
|
||||||
url_path="sync/status",
|
|
||||||
filter_backends=[],
|
|
||||||
)
|
|
||||||
def sync_status(self, request: Request, slug: str) -> Response:
|
|
||||||
"""Get source's sync status"""
|
|
||||||
source: KerberosSource = self.get_object()
|
|
||||||
with source.sync_lock as lock_acquired:
|
|
||||||
status = {
|
|
||||||
"is_running": not lock_acquired,
|
|
||||||
}
|
|
||||||
return Response(KerberosSyncStatusSerializer(status).data)
|
|
||||||
|
|||||||
@ -23,7 +23,6 @@ from authentik.core.api.sources import (
|
|||||||
)
|
)
|
||||||
from authentik.core.api.used_by import UsedByMixin
|
from authentik.core.api.used_by import UsedByMixin
|
||||||
from authentik.crypto.models import CertificateKeyPair
|
from authentik.crypto.models import CertificateKeyPair
|
||||||
from authentik.lib.sync.outgoing.api import SyncStatusSerializer
|
|
||||||
from authentik.sources.ldap.models import (
|
from authentik.sources.ldap.models import (
|
||||||
GroupLDAPSourceConnection,
|
GroupLDAPSourceConnection,
|
||||||
LDAPSource,
|
LDAPSource,
|
||||||
@ -154,28 +153,6 @@ class LDAPSourceViewSet(UsedByMixin, ModelViewSet):
|
|||||||
search_fields = ["name", "slug"]
|
search_fields = ["name", "slug"]
|
||||||
ordering = ["name"]
|
ordering = ["name"]
|
||||||
|
|
||||||
@extend_schema(
|
|
||||||
responses={
|
|
||||||
200: SyncStatusSerializer(),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@action(
|
|
||||||
methods=["GET"],
|
|
||||||
detail=True,
|
|
||||||
pagination_class=None,
|
|
||||||
url_path="sync/status",
|
|
||||||
filter_backends=[],
|
|
||||||
)
|
|
||||||
def sync_status(self, request: Request, slug: str) -> Response:
|
|
||||||
"""Get source's sync status"""
|
|
||||||
source: LDAPSource = self.get_object()
|
|
||||||
with source.sync_lock as lock_acquired:
|
|
||||||
status = {
|
|
||||||
# If we could not acquire the lock, it means a task is using it, and thus is running
|
|
||||||
"is_running": not lock_acquired,
|
|
||||||
}
|
|
||||||
return Response(SyncStatusSerializer(status).data)
|
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
responses={
|
responses={
|
||||||
200: inline_serializer(
|
200: inline_serializer(
|
||||||
|
|||||||
188
schema.yml
188
schema.yml
@ -19451,40 +19451,6 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/GenericError'
|
$ref: '#/components/schemas/GenericError'
|
||||||
description: ''
|
description: ''
|
||||||
/providers/google_workspace/{id}/sync/status/:
|
|
||||||
get:
|
|
||||||
operationId: providers_google_workspace_sync_status_retrieve
|
|
||||||
description: Get provider's sync status
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: id
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
description: A unique integer value identifying this Google Workspace Provider.
|
|
||||||
required: true
|
|
||||||
tags:
|
|
||||||
- providers
|
|
||||||
security:
|
|
||||||
- authentik: []
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/SyncStatus'
|
|
||||||
description: ''
|
|
||||||
'400':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ValidationError'
|
|
||||||
description: ''
|
|
||||||
'403':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/GenericError'
|
|
||||||
description: ''
|
|
||||||
/providers/google_workspace/{id}/used_by/:
|
/providers/google_workspace/{id}/used_by/:
|
||||||
get:
|
get:
|
||||||
operationId: providers_google_workspace_used_by_list
|
operationId: providers_google_workspace_used_by_list
|
||||||
@ -20492,40 +20458,6 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/GenericError'
|
$ref: '#/components/schemas/GenericError'
|
||||||
description: ''
|
description: ''
|
||||||
/providers/microsoft_entra/{id}/sync/status/:
|
|
||||||
get:
|
|
||||||
operationId: providers_microsoft_entra_sync_status_retrieve
|
|
||||||
description: Get provider's sync status
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: id
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
description: A unique integer value identifying this Microsoft Entra Provider.
|
|
||||||
required: true
|
|
||||||
tags:
|
|
||||||
- providers
|
|
||||||
security:
|
|
||||||
- authentik: []
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/SyncStatus'
|
|
||||||
description: ''
|
|
||||||
'400':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ValidationError'
|
|
||||||
description: ''
|
|
||||||
'403':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/GenericError'
|
|
||||||
description: ''
|
|
||||||
/providers/microsoft_entra/{id}/used_by/:
|
/providers/microsoft_entra/{id}/used_by/:
|
||||||
get:
|
get:
|
||||||
operationId: providers_microsoft_entra_used_by_list
|
operationId: providers_microsoft_entra_used_by_list
|
||||||
@ -23025,40 +22957,6 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/GenericError'
|
$ref: '#/components/schemas/GenericError'
|
||||||
description: ''
|
description: ''
|
||||||
/providers/scim/{id}/sync/status/:
|
|
||||||
get:
|
|
||||||
operationId: providers_scim_sync_status_retrieve
|
|
||||||
description: Get provider's sync status
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: id
|
|
||||||
schema:
|
|
||||||
type: integer
|
|
||||||
description: A unique integer value identifying this SCIM Provider.
|
|
||||||
required: true
|
|
||||||
tags:
|
|
||||||
- providers
|
|
||||||
security:
|
|
||||||
- authentik: []
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/SyncStatus'
|
|
||||||
description: ''
|
|
||||||
'400':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ValidationError'
|
|
||||||
description: ''
|
|
||||||
'403':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/GenericError'
|
|
||||||
description: ''
|
|
||||||
/providers/scim/{id}/used_by/:
|
/providers/scim/{id}/used_by/:
|
||||||
get:
|
get:
|
||||||
operationId: providers_scim_used_by_list
|
operationId: providers_scim_used_by_list
|
||||||
@ -28147,40 +28045,6 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/GenericError'
|
$ref: '#/components/schemas/GenericError'
|
||||||
description: ''
|
description: ''
|
||||||
/sources/kerberos/{slug}/sync/status/:
|
|
||||||
get:
|
|
||||||
operationId: sources_kerberos_sync_status_retrieve
|
|
||||||
description: Get source's sync status
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: slug
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: Internal source name, used in URLs.
|
|
||||||
required: true
|
|
||||||
tags:
|
|
||||||
- sources
|
|
||||||
security:
|
|
||||||
- authentik: []
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/KerberosSyncStatus'
|
|
||||||
description: ''
|
|
||||||
'400':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ValidationError'
|
|
||||||
description: ''
|
|
||||||
'403':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/GenericError'
|
|
||||||
description: ''
|
|
||||||
/sources/kerberos/{slug}/used_by/:
|
/sources/kerberos/{slug}/used_by/:
|
||||||
get:
|
get:
|
||||||
operationId: sources_kerberos_used_by_list
|
operationId: sources_kerberos_used_by_list
|
||||||
@ -28597,40 +28461,6 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/GenericError'
|
$ref: '#/components/schemas/GenericError'
|
||||||
description: ''
|
description: ''
|
||||||
/sources/ldap/{slug}/sync/status/:
|
|
||||||
get:
|
|
||||||
operationId: sources_ldap_sync_status_retrieve
|
|
||||||
description: Get source's sync status
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: slug
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
description: Internal source name, used in URLs.
|
|
||||||
required: true
|
|
||||||
tags:
|
|
||||||
- sources
|
|
||||||
security:
|
|
||||||
- authentik: []
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/SyncStatus'
|
|
||||||
description: ''
|
|
||||||
'400':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ValidationError'
|
|
||||||
description: ''
|
|
||||||
'403':
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/GenericError'
|
|
||||||
description: ''
|
|
||||||
/sources/ldap/{slug}/used_by/:
|
/sources/ldap/{slug}/used_by/:
|
||||||
get:
|
get:
|
||||||
operationId: sources_ldap_used_by_list
|
operationId: sources_ldap_used_by_list
|
||||||
@ -47577,15 +47407,6 @@ components:
|
|||||||
- name
|
- name
|
||||||
- realm
|
- realm
|
||||||
- slug
|
- slug
|
||||||
KerberosSyncStatus:
|
|
||||||
type: object
|
|
||||||
description: Kerberos Source sync status
|
|
||||||
properties:
|
|
||||||
is_running:
|
|
||||||
type: boolean
|
|
||||||
readOnly: true
|
|
||||||
required:
|
|
||||||
- is_running
|
|
||||||
KubernetesServiceConnection:
|
KubernetesServiceConnection:
|
||||||
type: object
|
type: object
|
||||||
description: KubernetesServiceConnection Serializer
|
description: KubernetesServiceConnection Serializer
|
||||||
@ -60242,15 +60063,6 @@ components:
|
|||||||
readOnly: true
|
readOnly: true
|
||||||
required:
|
required:
|
||||||
- messages
|
- messages
|
||||||
SyncStatus:
|
|
||||||
type: object
|
|
||||||
description: Provider sync status
|
|
||||||
properties:
|
|
||||||
is_running:
|
|
||||||
type: boolean
|
|
||||||
readOnly: true
|
|
||||||
required:
|
|
||||||
- is_running
|
|
||||||
SystemInfo:
|
SystemInfo:
|
||||||
type: object
|
type: object
|
||||||
description: Get system information.
|
description: Get system information.
|
||||||
|
|||||||
@ -1,157 +0,0 @@
|
|||||||
import type { Meta, StoryObj } from "@storybook/web-components";
|
|
||||||
|
|
||||||
import { html } from "lit";
|
|
||||||
|
|
||||||
import { LogLevelEnum, SyncStatus, SystemTaskStatusEnum } from "@goauthentik/api";
|
|
||||||
|
|
||||||
import "./SyncStatusCard";
|
|
||||||
|
|
||||||
const metadata: Meta<SyncStatus> = {
|
|
||||||
title: "Elements/<ak-sync-status-card>",
|
|
||||||
component: "ak-sync-status-card",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default metadata;
|
|
||||||
|
|
||||||
export const Running: StoryObj = {
|
|
||||||
args: {
|
|
||||||
status: {
|
|
||||||
isRunning: true,
|
|
||||||
tasks: [],
|
|
||||||
} as SyncStatus,
|
|
||||||
},
|
|
||||||
// @ts-ignore
|
|
||||||
render: ({ status }: SyncStatus) => {
|
|
||||||
return html` <div style="background-color: #f0f0f0; padding: 1rem;">
|
|
||||||
<ak-sync-status-card
|
|
||||||
.fetch=${async () => {
|
|
||||||
return status;
|
|
||||||
}}
|
|
||||||
></ak-sync-status-card>
|
|
||||||
</div>`;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const SingleTask: StoryObj = {
|
|
||||||
args: {
|
|
||||||
status: {
|
|
||||||
isRunning: false,
|
|
||||||
tasks: [
|
|
||||||
{
|
|
||||||
uuid: "9ff42169-8249-4b67-ae3d-e455d822de2b",
|
|
||||||
name: "Single task",
|
|
||||||
fullName: "foo:bar:baz",
|
|
||||||
status: SystemTaskStatusEnum.Successful,
|
|
||||||
messages: [
|
|
||||||
{
|
|
||||||
logger: "foo",
|
|
||||||
event: "bar",
|
|
||||||
attributes: {
|
|
||||||
foo: "bar",
|
|
||||||
},
|
|
||||||
timestamp: new Date(),
|
|
||||||
logLevel: LogLevelEnum.Info,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
description: "foo",
|
|
||||||
startTimestamp: new Date(),
|
|
||||||
finishTimestamp: new Date(),
|
|
||||||
duration: 0,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
} as SyncStatus,
|
|
||||||
},
|
|
||||||
// @ts-ignore
|
|
||||||
render: ({ status }: SyncStatus) => {
|
|
||||||
return html` <div style="background-color: #f0f0f0; padding: 1rem;">
|
|
||||||
<ak-sync-status-card
|
|
||||||
.fetch=${async () => {
|
|
||||||
return status;
|
|
||||||
}}
|
|
||||||
></ak-sync-status-card>
|
|
||||||
</div>`;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const MultipleTasks: StoryObj = {
|
|
||||||
args: {
|
|
||||||
status: {
|
|
||||||
isRunning: false,
|
|
||||||
tasks: [
|
|
||||||
{
|
|
||||||
uuid: "9ff42169-8249-4b67-ae3d-e455d822de2b",
|
|
||||||
name: "Single task",
|
|
||||||
fullName: "foo:bar:baz",
|
|
||||||
status: SystemTaskStatusEnum.Successful,
|
|
||||||
messages: [
|
|
||||||
{
|
|
||||||
logger: "foo",
|
|
||||||
event: "bar",
|
|
||||||
attributes: {
|
|
||||||
foo: "bar",
|
|
||||||
},
|
|
||||||
timestamp: new Date(),
|
|
||||||
logLevel: LogLevelEnum.Info,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
description: "foo",
|
|
||||||
startTimestamp: new Date(),
|
|
||||||
finishTimestamp: new Date(),
|
|
||||||
duration: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uuid: "9ff42169-8249-4b67-ae3d-e455d822de2b",
|
|
||||||
name: "Single task",
|
|
||||||
fullName: "foo:bar:baz",
|
|
||||||
status: SystemTaskStatusEnum.Successful,
|
|
||||||
messages: [
|
|
||||||
{
|
|
||||||
logger: "foo",
|
|
||||||
event: "bar",
|
|
||||||
attributes: {
|
|
||||||
foo: "bar",
|
|
||||||
},
|
|
||||||
timestamp: new Date(),
|
|
||||||
logLevel: LogLevelEnum.Info,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
description: "foo",
|
|
||||||
startTimestamp: new Date(),
|
|
||||||
finishTimestamp: new Date(),
|
|
||||||
duration: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uuid: "9ff42169-8249-4b67-ae3d-e455d822de2b",
|
|
||||||
name: "Single task",
|
|
||||||
fullName: "foo:bar:baz",
|
|
||||||
status: SystemTaskStatusEnum.Successful,
|
|
||||||
messages: [
|
|
||||||
{
|
|
||||||
logger: "foo",
|
|
||||||
event: "bar",
|
|
||||||
attributes: {
|
|
||||||
foo: "bar",
|
|
||||||
},
|
|
||||||
timestamp: new Date(),
|
|
||||||
logLevel: LogLevelEnum.Info,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
description: "foo",
|
|
||||||
startTimestamp: new Date(),
|
|
||||||
finishTimestamp: new Date(),
|
|
||||||
duration: 0,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
} as SyncStatus,
|
|
||||||
},
|
|
||||||
// @ts-ignore
|
|
||||||
render: ({ status }: SyncStatus) => {
|
|
||||||
return html` <div style="background-color: #f0f0f0; padding: 1rem;">
|
|
||||||
<ak-sync-status-card
|
|
||||||
.fetch=${async () => {
|
|
||||||
return status;
|
|
||||||
}}
|
|
||||||
></ak-sync-status-card>
|
|
||||||
</div>`;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
import { EVENT_REFRESH } from "@goauthentik/common/constants";
|
|
||||||
import "@goauthentik/components/ak-status-label";
|
|
||||||
import { AKElement } from "@goauthentik/elements/Base";
|
|
||||||
import "@goauthentik/elements/EmptyState";
|
|
||||||
import "@goauthentik/elements/buttons/ActionButton";
|
|
||||||
import "@goauthentik/elements/events/LogViewer";
|
|
||||||
|
|
||||||
import { msg } from "@lit/localize";
|
|
||||||
import { CSSResult, TemplateResult, html } from "lit";
|
|
||||||
import { customElement, property, state } from "lit/decorators.js";
|
|
||||||
|
|
||||||
import PFButton from "@patternfly/patternfly/components/Button/button.css";
|
|
||||||
import PFCard from "@patternfly/patternfly/components/Card/card.css";
|
|
||||||
import PFTable from "@patternfly/patternfly/components/Table/table.css";
|
|
||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
|
||||||
|
|
||||||
import { SyncStatus } from "@goauthentik/api";
|
|
||||||
|
|
||||||
@customElement("ak-sync-status-card")
|
|
||||||
export class SyncStatusCard extends AKElement {
|
|
||||||
@state()
|
|
||||||
syncState?: SyncStatus;
|
|
||||||
|
|
||||||
@state()
|
|
||||||
loading = false;
|
|
||||||
|
|
||||||
@property({ attribute: false })
|
|
||||||
fetch!: () => Promise<SyncStatus>;
|
|
||||||
|
|
||||||
@property({ attribute: false })
|
|
||||||
triggerSync!: () => Promise<unknown>;
|
|
||||||
|
|
||||||
static get styles(): CSSResult[] {
|
|
||||||
return [PFBase, PFButton, PFCard, PFTable];
|
|
||||||
}
|
|
||||||
|
|
||||||
firstUpdated() {
|
|
||||||
this.loading = true;
|
|
||||||
this.fetch().then((status) => {
|
|
||||||
this.syncState = status;
|
|
||||||
this.loading = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
renderSyncStatus(): TemplateResult {
|
|
||||||
if (this.loading) {
|
|
||||||
return html`<ak-empty-state loading></ak-empty-state>`;
|
|
||||||
}
|
|
||||||
if (!this.syncState) {
|
|
||||||
return html`${msg("No sync status.")}`;
|
|
||||||
}
|
|
||||||
if (this.syncState.isRunning) {
|
|
||||||
return html`${msg("Sync currently running.")}`;
|
|
||||||
}
|
|
||||||
return html`${msg("No synchronization currently running.")}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
render(): TemplateResult {
|
|
||||||
return html`<div class="pf-c-card">
|
|
||||||
<div class="pf-c-card__header">
|
|
||||||
<div class="pf-c-card__actions">
|
|
||||||
<button
|
|
||||||
class="pf-c-button pf-m-plain"
|
|
||||||
type="button"
|
|
||||||
@click=${() => {
|
|
||||||
this.fetch();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i class="fa fa-sync"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="pf-c-card__title">${msg("Sync status")}</div>
|
|
||||||
</div>
|
|
||||||
<div class="pf-c-card__body">${this.renderSyncStatus()}</div>
|
|
||||||
<div class="pf-c-card__footer">
|
|
||||||
<ak-action-button
|
|
||||||
class="pf-m-secondary"
|
|
||||||
?disabled=${this.syncState?.isRunning}
|
|
||||||
.apiRequest=${() => {
|
|
||||||
if (this.syncState) {
|
|
||||||
// This is a bit of a UX cheat, we set isRunning to true to disable the button
|
|
||||||
// and change the text even before we hear back from the backend
|
|
||||||
this.syncState = {
|
|
||||||
...this.syncState,
|
|
||||||
isRunning: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
this.triggerSync().then(() => {
|
|
||||||
this.dispatchEvent(
|
|
||||||
new CustomEvent(EVENT_REFRESH, {
|
|
||||||
bubbles: true,
|
|
||||||
composed: true,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
this.firstUpdated();
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
${this.syncState?.isRunning
|
|
||||||
? msg("Sync currently running")
|
|
||||||
: msg("Run sync again")}
|
|
||||||
</ak-action-button>
|
|
||||||
</div>
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"ak-sync-status-card": SyncStatusCard;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user