diff --git a/src/app/navi-items.ts b/src/app/navi-items.ts index ef1280e4..56d78507 100644 --- a/src/app/navi-items.ts +++ b/src/app/navi-items.ts @@ -42,6 +42,12 @@ export function useNaviItems() { to: { name: "queue" }, exact: true, }, + { + icon: "mdi-script-text", + title: "Preview", + to: { name: "preview" }, + exact: true, + }, ]); return { naviItems }; diff --git a/src/components/schedule/preview/Editor.vue b/src/components/schedule/preview/Editor.vue new file mode 100644 index 00000000..f31d18f9 --- /dev/null +++ b/src/components/schedule/preview/Editor.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/schedule/preview/PreviewFrame.vue b/src/components/schedule/preview/PreviewFrame.vue new file mode 100644 index 00000000..6c2047b1 --- /dev/null +++ b/src/components/schedule/preview/PreviewFrame.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/schedule/preview/PreviewView.vue b/src/components/schedule/preview/PreviewView.vue new file mode 100644 index 00000000..e8a8c045 --- /dev/null +++ b/src/components/schedule/preview/PreviewView.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/components/schedule/preview/preview.ts b/src/components/schedule/preview/preview.ts new file mode 100644 index 00000000..5e383411 --- /dev/null +++ b/src/components/schedule/preview/preview.ts @@ -0,0 +1,43 @@ +import { computed } from "vue"; +import type { Ref, ComputedRef } from "vue"; +import { refThrottled } from "@vueuse/core"; +import { useScheduleSchedulerPreviewQuery } from "@/graphql/codegen/generated"; +import { useRefresh } from "@/graphql/urql"; + +interface _UsePreviewResponse { + script: ComputedRef; + loading: Ref; + error: ComputedRef; + load: () => Promise; +} + +type UsePreviewResponse = _UsePreviewResponse & PromiseLike<_UsePreviewResponse>; + +export function usePreview(): UsePreviewResponse { + const query = useScheduleSchedulerPreviewQuery({ + requestPolicy: "network-only", + variables: {}, + pause: true, + }); + + const { refresh: load, refreshing } = useRefresh(query); + + const loading = refThrottled( + computed(() => query.fetching.value || refreshing.value), + 300 + ); + + const error = computed(() => query.error?.value); + + const script = computed(() => query.data.value?.schedule.scheduler.preview.script); + + const ret = { script, loading, error, load }; + + return { + ...ret, + async then(onFulfilled, onRejected) { + await query; + return Promise.resolve(ret).then(onFulfilled, onRejected); + }, + }; +} diff --git a/src/graphql/codegen/generated.ts b/src/graphql/codegen/generated.ts index 5598102f..8378056a 100644 --- a/src/graphql/codegen/generated.ts +++ b/src/graphql/codegen/generated.ts @@ -314,6 +314,7 @@ export type QueryScheduleScheduler = { apiUrl: Scalars['String']['output']; lengthMinutes: Scalars['Int']['output']; policy: Scalars['String']['output']; + preview: ScheduleSchedulerPreviewItem; }; export type RunNode = { @@ -389,6 +390,11 @@ export type ScheduleQueuePushInput = { script: Scalars['String']['input']; }; +export type ScheduleSchedulerPreviewItem = { + __typename?: 'ScheduleSchedulerPreviewItem'; + script: Scalars['String']['output']; +}; + export type StdoutNode = { __typename?: 'StdoutNode'; id: Scalars['Int']['output']; @@ -689,6 +695,11 @@ export type ScheduleQueueItemsQueryVariables = Exact<{ [key: string]: never; }>; export type ScheduleQueueItemsQuery = { __typename?: 'Query', schedule: { __typename?: 'QuerySchedule', queue: { __typename?: 'QueryScheduleQueue', items: Array<{ __typename?: 'ScheduleQueueItem', id: number, name: string, createdAt: any, script: string }> } } }; +export type ScheduleSchedulerPreviewQueryVariables = Exact<{ [key: string]: never; }>; + + +export type ScheduleSchedulerPreviewQuery = { __typename?: 'Query', schedule: { __typename?: 'QuerySchedule', scheduler: { __typename?: 'QueryScheduleScheduler', preview: { __typename?: 'ScheduleSchedulerPreviewItem', script: string } } } }; + export type CtrlContinuousEnabledSSubscriptionVariables = Exact<{ [key: string]: never; }>; @@ -1141,6 +1152,21 @@ export const ScheduleQueueItemsDocument = gql` export function useScheduleQueueItemsQuery(options: Omit, 'query'>) { return Urql.useQuery({ query: ScheduleQueueItemsDocument, ...options }); }; +export const ScheduleSchedulerPreviewDocument = gql` + query ScheduleSchedulerPreview { + schedule { + scheduler { + preview { + script + } + } + } +} + `; + +export function useScheduleSchedulerPreviewQuery(options: Omit, 'query'>) { + return Urql.useQuery({ query: ScheduleSchedulerPreviewDocument, ...options }); +}; export const CtrlContinuousEnabledSDocument = gql` subscription CtrlContinuousEnabledS { ctrlContinuousEnabled diff --git a/src/graphql/gql/queries/schedule/scheduler/Preview.gql b/src/graphql/gql/queries/schedule/scheduler/Preview.gql new file mode 100644 index 00000000..f28c91b7 --- /dev/null +++ b/src/graphql/gql/queries/schedule/scheduler/Preview.gql @@ -0,0 +1,9 @@ +query ScheduleSchedulerPreview { + schedule { + scheduler { + preview { + script + } + } + } +} diff --git a/src/plugins/router.ts b/src/plugins/router.ts index 5ef1735c..e2885d15 100644 --- a/src/plugins/router.ts +++ b/src/plugins/router.ts @@ -21,6 +21,11 @@ const routes: RouteRecordRaw[] = [ name: "queue", component: () => import("@/components/schedule/queue/QueueView.vue"), }, + { + path: "/preview", + name: "preview", + component: () => import("@/components/schedule/preview/PreviewView.vue"), + }, { path: "/db/runs", name: "runs",