From e8ce2d847dc484b45ddd82cb0ade51283e6e4ade Mon Sep 17 00:00:00 2001 From: henrychoy Date: Wed, 24 Jul 2024 15:14:30 -0400 Subject: [PATCH 1/3] feat: implement drafts for entrypoints --- .../src/components/TableComponent.vue | 1 - src/frontend/src/dialogs/AssignTagsDialog.vue | 2 +- src/frontend/src/router/index.ts | 2 +- src/frontend/src/services/dataApi.ts | 42 ++++++++++++--- src/frontend/src/views/CreateEntryPoint.vue | 50 +++++++++++++----- src/frontend/src/views/EntryPointsView.vue | 52 +++++++++++++++++-- 6 files changed, 122 insertions(+), 27 deletions(-) diff --git a/src/frontend/src/components/TableComponent.vue b/src/frontend/src/components/TableComponent.vue index bb78d28d3..4124bfa78 100644 --- a/src/frontend/src/components/TableComponent.vue +++ b/src/frontend/src/components/TableComponent.vue @@ -121,7 +121,6 @@ const filter = ref('') const selected = defineModel('selected') const radioSelected = ref('') - //const showDrafts = ref(false) const showDrafts = defineModel('showDrafts') function handleClick(tableProps) { diff --git a/src/frontend/src/dialogs/AssignTagsDialog.vue b/src/frontend/src/dialogs/AssignTagsDialog.vue index 389a06831..6b4dccb8e 100644 --- a/src/frontend/src/dialogs/AssignTagsDialog.vue +++ b/src/frontend/src/dialogs/AssignTagsDialog.vue @@ -61,7 +61,7 @@ try { const res = await api.getData('tags', {index: 0, rowsPerPage: 50, search: ''}) tags.value = res.data.data - if(props.editObj.tags.length > 0) { + if(props.editObj.tags?.length > 0) { props.editObj.tags.forEach((tag) => { selectedTagIDs.value.push(tag.id) }) diff --git a/src/frontend/src/router/index.ts b/src/frontend/src/router/index.ts index 38e3f4aa9..e040f3019 100644 --- a/src/frontend/src/router/index.ts +++ b/src/frontend/src/router/index.ts @@ -13,7 +13,7 @@ const router = createRouter({ component: () => import('../views/EntryPointsView.vue') }, { - path: '/entrypoints/:id', + path: '/entrypoints/:id/:draftType?/:resourceDraftParentId?', component: () => import('../views/CreateEntryPoint.vue') }, { diff --git a/src/frontend/src/services/dataApi.ts b/src/frontend/src/services/dataApi.ts index deada9374..fd491527e 100644 --- a/src/frontend/src/services/dataApi.ts +++ b/src/frontend/src/services/dataApi.ts @@ -172,17 +172,33 @@ export async function getItem(type: T, id: number, isDraft: return res } -export async function getDraft(type: T, id: number) { - const res = await axios.get(`/api/${type}/${id}/draft`) +export async function getNewDraft(type: T, draftId: number) { + const res = await axios.get(`/api/${type}/drafts/${draftId}`) + if(res.data) { + console.log('res = ', res) + Object.assign(res.data, res.data.payload) + } return res } -export async function updateItem(type: T, id: number, params: UpdateParams[T]) { - return await axios.put(`/api/${type}/${id}`, params) +export async function getResourceDraft(type: T, parentResourceId: number) { + console.log('parentResourceId = ', parentResourceId) + const res = await axios.get(`/api/${type}/${parentResourceId}/draft`) + if(res.data) { + console.log('res = ', res) + Object.assign(res.data, res.data.payload) + } + return res } -export async function addItem(type: T, params: CreateParams[T]) { - return await axios.post(`/api/${type}/`, params) +// update item or NEW draft +export async function updateItem(type: T, id: number, params: UpdateParams[T], isDraft?: boolean) { + return await axios.put(`/api/${type}/${isDraft ? 'drafts/' : ''}${id}`, params) +} + +// add item or NEW draft +export async function addItem(type: T, params: CreateParams[T], isDraft?: boolean) { + return await axios.post(`/api/${type}/${isDraft ? 'drafts/' : ''}`, params) } interface JobParams { @@ -203,12 +219,26 @@ export async function deleteJob(id: number, jobId: number) { export async function addDraft(type: T, params: CreateParams[T], id: number) { if(id) { + // add RESOURCE draft return await axios.post(`/api/${type}/${id}/draft`, params) } else { + // add NEW draft return await axios.post(`/api/${type}/drafts/`, params) } } +export async function addNewDraft(type: T, params: CreateParams[T]) { + return await axios.post(`/api/${type}/drafts/`, params) +} + +export async function addResourceDraft(type: T, params: CreateParams[T], id: number) { + return await axios.post(`/api/${type}/${id}/draft`, params) +} + +export async function updateResourceDraft(type: T, params: CreateParams[T], id: number) { + return await axios.put(`/api/${type}/${id}/draft`, params) +} + export async function updateDraft(type: T, draftId: string, params: UpdateParams[T]) { return await axios.put(`/api/${type}/drafts/${draftId}`, params) } diff --git a/src/frontend/src/views/CreateEntryPoint.vue b/src/frontend/src/views/CreateEntryPoint.vue index 83170d873..72edaa7e8 100644 --- a/src/frontend/src/views/CreateEntryPoint.vue +++ b/src/frontend/src/views/CreateEntryPoint.vue @@ -172,8 +172,14 @@ - -
+
+ + { taskGraphError.value = entryPoint.value.taskGraph.length > 0 ? '' : 'This field is required' if (success && taskGraphError.value === '') { - addOrModifyEntrypoint() - } - else { - // error + addOrModifyEntrypoint(isNewDraft) } }) } - async function addOrModifyEntrypoint() { + async function addOrModifyEntrypoint(isNewDraft) { entryPoint.value.queues.forEach((queue, index, array) => { if(typeof queue === 'object') { array[index] = queue.id } }) try { - if (route.params.id === 'new') { - await api.addItem('entrypoints', entryPoint.value) + // CREATE + if (route.params.id === 'new' || (route.params.id === 'new' && route.params.draftType === 'resourceDraft')) { + if(isNewDraft) { + await api.addNewDraft('entrypoints', entryPoint.value) + } else if(route.params.draftType === 'resourceDraft') { + const { group, ...entryPointWithoutGroup } = entryPoint.value + await api.addResourceDraft('entrypoints', entryPointWithoutGroup, route.params.resourceDraftParentId) + } else { + await api.addItem('entrypoints', entryPoint.value) + } notify.success(`Sucessfully created '${entryPoint.value.name}'`) } else { - await api.updateItem('entrypoints', route.params.id, { + // EDIT + const params = { name: entryPoint.value.name, description: entryPoint.value.description, taskGraph: entryPoint.value.taskGraph, parameters: entryPoint.value.parameters, queues: entryPoint.value.queues, - }) + } + if (route.params.draftType === 'resourceDraft') { + await api.updateResourceDraft('entrypoints', params, route.params.resourceDraftParentId) + } else { + await api.updateItem('entrypoints', route.params.id, params, route.params.draftType === 'newDraft') + } notify.success(`Sucessfully updated '${entryPoint.value.name}'`) } } catch(err) { diff --git a/src/frontend/src/views/EntryPointsView.vue b/src/frontend/src/views/EntryPointsView.vue index cf4fb1231..88e19f23f 100644 --- a/src/frontend/src/views/EntryPointsView.vue +++ b/src/frontend/src/views/EntryPointsView.vue @@ -4,15 +4,17 @@ /> + import TableComponent from '@/components/TableComponent.vue' - import { ref } from 'vue' + import { ref, computed } from 'vue' import { useRouter } from 'vue-router' import CodeEditor from '@/components/CodeEditor.vue' import InfoPopupDialog from '@/dialogs/InfoPopupDialog.vue' @@ -141,6 +152,7 @@ const columns = [ { name: 'name', label: 'Name', align: 'left', field: 'name', sortable: true, }, { name: 'group', label: 'Group', align: 'left', field: 'group', sortable: true, }, + { name: 'hasDraft', label: 'hasDraft', align: 'left', field: 'hasDraft', sortable: true }, { name: 'taskGraph', label: 'Task Graph', align: 'left', field: 'taskGraph',sortable: true, }, { name: 'parameterNames', label: 'Parameter Name(s)', align: 'left', sortable: true }, { name: 'parameterTypes', label: 'Parameter Type(s)', align: 'left', field: 'parameterTypes', sortable: true }, @@ -151,6 +163,13 @@ const selected = ref([]) + const draftType = computed(() => { + if(selected.value.length === 0) return null + if(Object.hasOwn(selected.value[0], 'payload') && !selected.value[0].resource) { + return 'newDraft' + } + }) + const showTaskGraphDialog = ref(false) const displayYaml = ref('') @@ -175,17 +194,40 @@ async function deleteEntryPoint() { try { - await api.deleteItem('entrypoints', selected.value[0].id) + if(Object.hasOwn(selected.value[0], 'payload') && !selected.value[0].resource) { + await api.deleteDraft('entrypoints', selected.value[0].id) + } else { + await api.deleteItem('entrypoints', selected.value[0].id) + } notify.success(`Sucessfully deleted '${selected.value[0].name}'`) showDeleteDialog.value = false selected.value = [] tableRef.value.refreshTable() } catch(err) { - notify.error(err.response.data.message); + notify.error(err.response.data.message) } } const editObjTags = ref({}) const showTagsDialog = ref(false) + const showDrafts = ref(false) + + async function loadResouceDraft(entryPoint) { + let res + console.log('entrypoint = ', entryPoint) + if(entryPoint.hasDraft) { + try { + res = await api.getResourceDraft('entrypoints', entryPoint.id) + console.log('ressssss = ', res) + router.push(`/entrypoints/${res.data.id}/resourceDraft/${entryPoint.id}`) + } catch(err) { + notify.error(err.response.data.message) + } + } else { + router.push(`/entrypoints/new/resourceDraft/${entryPoint.id}`) + } + } + + \ No newline at end of file From b9515de1952c51c6f3e07437ea248dbf05303b0b Mon Sep 17 00:00:00 2001 From: henrychoy Date: Sat, 27 Jul 2024 20:56:02 -0400 Subject: [PATCH 2/3] feat: drafts now working for endpoints --- src/frontend/src/components/CodeEditor.vue | 1 + .../src/components/TableComponent.vue | 51 +++++++++++++++++-- src/frontend/src/dialogs/DeleteDialog.vue | 16 ++++-- src/frontend/src/services/dataApi.ts | 4 ++ src/frontend/src/views/CreateEntryPoint.vue | 24 +++++++-- src/frontend/src/views/EntryPointsView.vue | 42 +++++++++++---- src/frontend/src/views/QueuesView.vue | 30 +++++++++-- 7 files changed, 140 insertions(+), 28 deletions(-) diff --git a/src/frontend/src/components/CodeEditor.vue b/src/frontend/src/components/CodeEditor.vue index b49bad032..8600bd26f 100644 --- a/src/frontend/src/components/CodeEditor.vue +++ b/src/frontend/src/components/CodeEditor.vue @@ -7,6 +7,7 @@ :indent-with-tab="true" :tab-size="2" :extensions="extensions" + :disabled="readOnly" @ready="handleReady" @change="console.log('change', $event)" @focus="console.log('focus', $event)" diff --git a/src/frontend/src/components/TableComponent.vue b/src/frontend/src/components/TableComponent.vue index 3b52d9834..80db21d60 100644 --- a/src/frontend/src/components/TableComponent.vue +++ b/src/frontend/src/components/TableComponent.vue @@ -96,8 +96,51 @@ From 1f1395bc5a40f852c7f629abd684882f2ecb36d6 Mon Sep 17 00:00:00 2001 From: henrychoy Date: Thu, 1 Aug 2024 14:04:35 -0400 Subject: [PATCH 3/3] fix: resolved related bug with deleting queues --- src/frontend/src/views/QueuesView.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/views/QueuesView.vue b/src/frontend/src/views/QueuesView.vue index 7741c5abb..c66d62578 100644 --- a/src/frontend/src/views/QueuesView.vue +++ b/src/frontend/src/views/QueuesView.vue @@ -64,7 +64,7 @@ :queueToDraft="queueToDraft" />