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 @@
+
+
+
+
+
+
+
+ preview
+
+
+
+
+
+
+
+
+
+
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",