diff --git a/web/src/components/agent/AgentList.vue b/web/src/components/agent/AgentList.vue index cbe01b889..4f5213af2 100644 --- a/web/src/components/agent/AgentList.vue +++ b/web/src/components/agent/AgentList.vue @@ -1,7 +1,7 @@ @@ -51,7 +51,7 @@ import ListItem from '~/components/atomic/ListItem.vue'; import { useDate } from '~/compositions/useDate'; import type { Agent } from '~/lib/api/types'; -const props = defineProps<{ +defineProps<{ agents: Agent[]; isDeleting: boolean; loading: boolean; diff --git a/web/src/components/agent/AgentManager.vue b/web/src/components/agent/AgentManager.vue index e3a0ab53a..08c90c1c7 100644 --- a/web/src/components/agent/AgentManager.vue +++ b/web/src/components/agent/AgentManager.vue @@ -77,7 +77,7 @@ const { doSubmit: saveAgent, isLoading: isSaving } = useAsyncAction(async () => title: isEditingAgent.value ? t('admin.settings.agents.saved') : t('admin.settings.agents.created'), type: 'success', }); - resetPage(); + await resetPage(); }); const { doSubmit: deleteAgent, isLoading: isDeleting } = useAsyncAction(async (_agent: Agent) => { @@ -88,7 +88,7 @@ const { doSubmit: deleteAgent, isLoading: isDeleting } = useAsyncAction(async (_ await props.deleteAgent(_agent); notifications.notify({ title: t('admin.settings.agents.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editAgent(agent: Agent) { diff --git a/web/src/components/atomic/Icon.vue b/web/src/components/atomic/Icon.vue index 8afd1c662..e5caf2a54 100644 --- a/web/src/components/atomic/Icon.vue +++ b/web/src/components/atomic/Icon.vue @@ -93,6 +93,8 @@
+ +
{{ throwNotFound() }}
diff --git a/web/src/components/atomic/IconButton.vue b/web/src/components/atomic/IconButton.vue index a7bf4dbbd..a3650f5f7 100644 --- a/web/src/components/atomic/IconButton.vue +++ b/web/src/components/atomic/IconButton.vue @@ -22,7 +22,7 @@
- +
diff --git a/web/src/components/registry/RegistryList.vue b/web/src/components/registry/RegistryList.vue index 75a19edaf..236f180bb 100644 --- a/web/src/components/registry/RegistryList.vue +++ b/web/src/components/registry/RegistryList.vue @@ -22,7 +22,10 @@ /> -
{{ $t('registries.none') }}
+
+ +
+
{{ $t('registries.none') }}
@@ -30,6 +33,7 @@ import { toRef } from 'vue'; import { useI18n } from 'vue-i18n'; +import Icon from '~/components/atomic/Icon.vue'; import IconButton from '~/components/atomic/IconButton.vue'; import ListItem from '~/components/atomic/ListItem.vue'; import type { Registry } from '~/lib/api/types'; @@ -37,6 +41,7 @@ import type { Registry } from '~/lib/api/types'; const props = defineProps<{ modelValue: (Registry & { edit?: boolean })[]; isDeleting: boolean; + loading: boolean; }>(); const emit = defineEmits<{ diff --git a/web/src/components/repo/pipeline/PipelineList.vue b/web/src/components/repo/pipeline/PipelineList.vue index 4651e9749..c2985847d 100644 --- a/web/src/components/repo/pipeline/PipelineList.vue +++ b/web/src/components/repo/pipeline/PipelineList.vue @@ -1,5 +1,5 @@ diff --git a/web/src/components/secrets/SecretList.vue b/web/src/components/secrets/SecretList.vue index 1986a31d2..ce5113aa7 100644 --- a/web/src/components/secrets/SecretList.vue +++ b/web/src/components/secrets/SecretList.vue @@ -31,7 +31,10 @@ -
{{ $t('secrets.none') }}
+
+ +
+
{{ $t('secrets.none') }}
@@ -40,6 +43,7 @@ import { toRef } from 'vue'; import { useI18n } from 'vue-i18n'; import Badge from '~/components/atomic/Badge.vue'; +import Icon from '~/components/atomic/Icon.vue'; import IconButton from '~/components/atomic/IconButton.vue'; import ListItem from '~/components/atomic/ListItem.vue'; import type { Secret } from '~/lib/api/types'; @@ -47,6 +51,7 @@ import type { Secret } from '~/lib/api/types'; const props = defineProps<{ modelValue: (Secret & { edit?: boolean })[]; isDeleting: boolean; + loading: boolean; }>(); const emit = defineEmits<{ diff --git a/web/src/store/pipelines.ts b/web/src/store/pipelines.ts index 2e3bccdf1..a2b1b2530 100644 --- a/web/src/store/pipelines.ts +++ b/web/src/store/pipelines.ts @@ -34,11 +34,12 @@ export const usePipelineStore = defineStore('pipelines', () => { const repoStore = useRepoStore(); const pipelines: Map> = reactive(new Map()); + const loading = ref(false); function setPipeline(repoId: number, pipeline: Pipeline) { const repoPipelines = pipelines.get(repoId) || new Map(); repoPipelines.set(pipeline.number, { - ...(repoPipelines.get(pipeline.number) || {}), + ...repoPipelines.get(pipeline.number), ...pipeline, }); @@ -82,15 +83,19 @@ export const usePipelineStore = defineStore('pipelines', () => { } async function loadRepoPipelines(repoId: number, page?: number) { + loading.value = true; const _pipelines = await apiClient.getPipelineList(repoId, { page }); _pipelines.forEach((pipeline) => { setPipeline(repoId, pipeline); }); + loading.value = false; } async function loadPipeline(repoId: number, pipelinesNumber: number) { + loading.value = true; const pipeline = await apiClient.getPipeline(repoId, pipelinesNumber); setPipeline(repoId, pipeline); + loading.value = false; } const pipelineFeed = computed(() => @@ -117,14 +122,17 @@ export const usePipelineStore = defineStore('pipelines', () => { async function loadPipelineFeed() { await repoStore.loadRepos(); + loading.value = true; const _pipelines = await apiClient.getPipelineFeed(); _pipelines.forEach((pipeline) => { setPipeline(pipeline.repo_id, pipeline); }); + loading.value = false; } return { pipelines, + loading, setPipeline, setWorkflow, getRepoPipelines, diff --git a/web/src/views/admin/AdminOrgs.vue b/web/src/views/admin/AdminOrgs.vue index a8afd7a1b..db45a1161 100644 --- a/web/src/views/admin/AdminOrgs.vue +++ b/web/src/views/admin/AdminOrgs.vue @@ -28,7 +28,10 @@ /> -
{{ $t('admin.settings.orgs.none') }}
+
+ +
+
{{ $t('admin.settings.orgs.none') }}
@@ -37,6 +40,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; +import Icon from '~/components/atomic/Icon.vue'; import IconButton from '~/components/atomic/IconButton.vue'; import ListItem from '~/components/atomic/ListItem.vue'; import Settings from '~/components/layout/Settings.vue'; @@ -55,7 +59,7 @@ async function loadOrgs(page: number): Promise { return apiClient.getOrgs({ page }); } -const { resetPage, data: orgs } = usePagination(loadOrgs); +const { resetPage, data: orgs, loading } = usePagination(loadOrgs); const { doSubmit: deleteOrg, isLoading: isDeleting } = useAsyncAction(async (_org: Org) => { // eslint-disable-next-line no-alert @@ -65,7 +69,7 @@ const { doSubmit: deleteOrg, isLoading: isDeleting } = useAsyncAction(async (_or await apiClient.deleteOrg(_org); notifications.notify({ title: t('admin.settings.orgs.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); useWPTitle(computed(() => [t('admin.settings.orgs.orgs'), t('admin.settings.settings')])); diff --git a/web/src/views/admin/AdminRegistries.vue b/web/src/views/admin/AdminRegistries.vue index c833b1973..dbc732236 100644 --- a/web/src/views/admin/AdminRegistries.vue +++ b/web/src/views/admin/AdminRegistries.vue @@ -22,6 +22,7 @@ v-if="!selectedRegistry" v-model="registries" :is-deleting="isDeleting" + :loading="loading" @edit="editRegistry" @delete="deleteRegistry" /> @@ -70,7 +71,7 @@ async function loadRegistries(page: number): Promise { return apiClient.getGlobalRegistryList({ page }); } -const { resetPage, data: registries } = usePagination(loadRegistries, () => !selectedRegistry.value); +const { resetPage, data: registries, loading } = usePagination(loadRegistries, () => !selectedRegistry.value); const { doSubmit: createRegistry, isLoading: isSaving } = useAsyncAction(async () => { if (!selectedRegistry.value) { @@ -87,13 +88,13 @@ const { doSubmit: createRegistry, isLoading: isSaving } = useAsyncAction(async ( type: 'success', }); selectedRegistry.value = undefined; - resetPage(); + await resetPage(); }); const { doSubmit: deleteRegistry, isLoading: isDeleting } = useAsyncAction(async (_registry: Registry) => { await apiClient.deleteGlobalRegistry(_registry.address); notifications.notify({ title: i18n.t('registries.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editRegistry(registry: Registry) { diff --git a/web/src/views/admin/AdminRepos.vue b/web/src/views/admin/AdminRepos.vue index 846a29474..cfce0c28e 100644 --- a/web/src/views/admin/AdminRepos.vue +++ b/web/src/views/admin/AdminRepos.vue @@ -37,7 +37,10 @@ -
{{ $t('admin.settings.repos.none') }}
+
+ +
+
{{ $t('admin.settings.repos.none') }}
@@ -48,6 +51,7 @@ import { useI18n } from 'vue-i18n'; import Badge from '~/components/atomic/Badge.vue'; import Button from '~/components/atomic/Button.vue'; +import Icon from '~/components/atomic/Icon.vue'; import IconButton from '~/components/atomic/IconButton.vue'; import ListItem from '~/components/atomic/ListItem.vue'; import Settings from '~/components/layout/Settings.vue'; @@ -66,7 +70,7 @@ async function loadRepos(page: number): Promise { return apiClient.getAllRepos({ page }); } -const { data: repos } = usePagination(loadRepos); +const { data: repos, loading } = usePagination(loadRepos); const { doSubmit: repairRepos, isLoading: isRepairingRepos } = useAsyncAction(async () => { await apiClient.repairAllRepos(); diff --git a/web/src/views/admin/AdminSecrets.vue b/web/src/views/admin/AdminSecrets.vue index fb8a3cfa5..8d41e2834 100644 --- a/web/src/views/admin/AdminSecrets.vue +++ b/web/src/views/admin/AdminSecrets.vue @@ -17,6 +17,7 @@ v-if="!selectedSecret" v-model="secrets" :is-deleting="isDeleting" + :loading="loading" @edit="editSecret" @delete="deleteSecret" /> @@ -67,7 +68,7 @@ async function loadSecrets(page: number): Promise { return apiClient.getGlobalSecretList({ page }); } -const { resetPage, data: secrets } = usePagination(loadSecrets, () => !selectedSecret.value); +const { resetPage, data: secrets, loading } = usePagination(loadSecrets, () => !selectedSecret.value); const { doSubmit: createSecret, isLoading: isSaving } = useAsyncAction(async () => { if (!selectedSecret.value) { @@ -84,13 +85,13 @@ const { doSubmit: createSecret, isLoading: isSaving } = useAsyncAction(async () type: 'success', }); selectedSecret.value = undefined; - resetPage(); + await resetPage(); }); const { doSubmit: deleteSecret, isLoading: isDeleting } = useAsyncAction(async (_secret: Secret) => { await apiClient.deleteGlobalSecret(_secret.name); notifications.notify({ title: i18n.t('secrets.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editSecret(secret: Secret) { diff --git a/web/src/views/admin/AdminUsers.vue b/web/src/views/admin/AdminUsers.vue index 03f0b3482..e70f6c617 100644 --- a/web/src/views/admin/AdminUsers.vue +++ b/web/src/views/admin/AdminUsers.vue @@ -39,7 +39,10 @@ /> -
{{ $t('admin.settings.users.none') }}
+
+ +
+
{{ $t('admin.settings.users.none') }}
@@ -88,6 +91,7 @@ import { useI18n } from 'vue-i18n'; import Badge from '~/components/atomic/Badge.vue'; import Button from '~/components/atomic/Button.vue'; +import Icon from '~/components/atomic/Icon.vue'; import IconButton from '~/components/atomic/IconButton.vue'; import ListItem from '~/components/atomic/ListItem.vue'; import Checkbox from '~/components/form/Checkbox.vue'; @@ -112,7 +116,7 @@ async function loadUsers(page: number): Promise { return apiClient.getUsers({ page }); } -const { resetPage, data: users } = usePagination(loadUsers, () => !selectedUser.value); +const { resetPage, data: users, loading } = usePagination(loadUsers, () => !selectedUser.value); const { doSubmit: saveUser, isLoading: isSaving } = useAsyncAction(async () => { if (!selectedUser.value) { @@ -133,7 +137,7 @@ const { doSubmit: saveUser, isLoading: isSaving } = useAsyncAction(async () => { }); } selectedUser.value = undefined; - resetPage(); + await resetPage(); }); const { doSubmit: deleteUser, isLoading: isDeleting } = useAsyncAction(async (_user: User) => { @@ -144,7 +148,7 @@ const { doSubmit: deleteUser, isLoading: isDeleting } = useAsyncAction(async (_u await apiClient.deleteUser(_user); notifications.notify({ title: t('admin.settings.users.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editUser(user: User) { diff --git a/web/src/views/org/settings/OrgRegistries.vue b/web/src/views/org/settings/OrgRegistries.vue index cb274245e..8bb362508 100644 --- a/web/src/views/org/settings/OrgRegistries.vue +++ b/web/src/views/org/settings/OrgRegistries.vue @@ -18,6 +18,7 @@ v-if="!selectedRegistry" v-model="registries" :is-deleting="isDeleting" + :loading="loading" @edit="editRegistry" @delete="deleteRegistry" /> @@ -67,7 +68,7 @@ async function loadRegistries(page: number): Promise { return apiClient.getOrgRegistryList(org.value.id, { page }); } -const { resetPage, data: registries } = usePagination(loadRegistries, () => !selectedRegistry.value); +const { resetPage, data: registries, loading } = usePagination(loadRegistries, () => !selectedRegistry.value); const { doSubmit: createRegistry, isLoading: isSaving } = useAsyncAction(async () => { if (!selectedRegistry.value) { @@ -84,13 +85,13 @@ const { doSubmit: createRegistry, isLoading: isSaving } = useAsyncAction(async ( type: 'success', }); selectedRegistry.value = undefined; - resetPage(); + await resetPage(); }); const { doSubmit: deleteRegistry, isLoading: isDeleting } = useAsyncAction(async (_registry: Registry) => { await apiClient.deleteOrgRegistry(org.value.id, _registry.address); notifications.notify({ title: i18n.t('registries.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editRegistry(registry: Registry) { diff --git a/web/src/views/org/settings/OrgSecrets.vue b/web/src/views/org/settings/OrgSecrets.vue index 9f0cb2af9..59fff130a 100644 --- a/web/src/views/org/settings/OrgSecrets.vue +++ b/web/src/views/org/settings/OrgSecrets.vue @@ -9,6 +9,7 @@ v-if="!selectedSecret" v-model="secrets" :is-deleting="isDeleting" + :loading="loading" @edit="editSecret" @delete="deleteSecret" /> @@ -60,7 +61,7 @@ async function loadSecrets(page: number): Promise { return apiClient.getOrgSecretList(org.value.id, { page }); } -const { resetPage, data: secrets } = usePagination(loadSecrets, () => !selectedSecret.value); +const { resetPage, data: secrets, loading } = usePagination(loadSecrets, () => !selectedSecret.value); const { doSubmit: createSecret, isLoading: isSaving } = useAsyncAction(async () => { if (!selectedSecret.value) { @@ -77,13 +78,13 @@ const { doSubmit: createSecret, isLoading: isSaving } = useAsyncAction(async () type: 'success', }); selectedSecret.value = undefined; - resetPage(); + await resetPage(); }); const { doSubmit: deleteSecret, isLoading: isDeleting } = useAsyncAction(async (_secret: Secret) => { await apiClient.deleteOrgSecret(org.value.id, _secret.name); notifications.notify({ title: i18n.t('secrets.deleted'), type: 'success' }); - resetPage(); + await resetPage(); }); function editSecret(secret: Secret) { diff --git a/web/src/views/repo/RepoBranches.vue b/web/src/views/repo/RepoBranches.vue index 7fbf7b3b1..20958dcd6 100644 --- a/web/src/views/repo/RepoBranches.vue +++ b/web/src/views/repo/RepoBranches.vue @@ -1,20 +1,18 @@