Skip to content

Commit

Permalink
[UXE-5197] feat: add edge services drawer to edge nodes services form (
Browse files Browse the repository at this point in the history
…#1813)

* chore: updgrade project version to 1.24.0

* feat: add edge services drawer to edge nodes services form
  • Loading branch information
aloisio-m-bastian authored Oct 17, 2024
1 parent 0502f9b commit 5d8bd2b
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ const parseHttpResponse = (httpResponse) => {
case 201:
return {
feedback: 'Your Edge Service has been created',
urlToEditView: `/edge-services/edit/${httpResponse.body.id}`
urlToEditView: `/edge-services/edit/${httpResponse.body.id}`,
id: httpResponse.body.id
}
case 400:
throw new Errors.NotFoundError().message
Expand Down
118 changes: 60 additions & 58 deletions src/templates/create-drawer-block/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -139,64 +139,66 @@
</script>

<template>
<Sidebar
v-model:visible="visibleDrawer"
:update:visible="toggleDrawerVisibility"
position="right"
:pt="{
root: {
class: `w-full transition-all duration-300 ease-in-out ${
props.isOverlapped ? 'max-w-5xl' : 'max-w-4xl'
}`
},
headercontent: { class: 'flex justify-content-between items-center w-full pr-2' },
content: { class: 'p-8' }
}"
>
<template #header>
<h2>{{ title }}</h2>
<ConsoleFeedback />
</template>

<div class="flex w-full">
<form
@submit.prevent="handleSubmit"
class="pb-16 w-full space-y-8"
>
<Teleport to="body">
<Sidebar
v-model:visible="visibleDrawer"
:update:visible="toggleDrawerVisibility"
position="right"
:pt="{
root: {
class: `w-full transition-all duration-300 ease-in-out ${
props.isOverlapped ? 'max-w-5xl' : 'max-w-4xl'
}`
},
headercontent: { class: 'flex justify-content-between items-center w-full pr-2' },
content: { class: 'p-8' }
}"
>
<template #header>
<h2>{{ title }}</h2>
<ConsoleFeedback />
</template>

<div class="flex w-full">
<form
@submit.prevent="handleSubmit"
class="pb-16 w-full space-y-8"
>
<slot
name="formFields"
:errors="errors"
:disabledFields="isSubmitting"
:closeDrawer="closeDrawer"
/>
</form>
</div>
<div class="fixed w-full left-0 bottom-0">
<slot
name="formFields"
:errors="errors"
:disabledFields="isSubmitting"
:closeDrawer="closeDrawer"
/>
</form>
</div>
<div class="fixed w-full left-0 bottom-0">
<slot
name="actionBar"
:goBack="handleGoBack"
:closeDrawer="closeDrawer"
:onSubmit="onSubmit"
:isSubmitting="isSubmitting"
>
<GoBack
name="actionBar"
:goBack="handleGoBack"
v-if="showGoBack"
:inDrawer="true"
/>
<ActionBarBlock
v-else
:data-testid="`${drawerId}__action-bar`"
@onCancel="closeDrawer"
@onSubmit="onSubmit"
:inDrawer="true"
:loading="isSubmitting"
/>
</slot>
</div>
</Sidebar>
<DialogUnsavedBlock
:blockRedirectUnsaved="formHasChanges"
:isDrawer="true"
/>
:closeDrawer="closeDrawer"
:onSubmit="onSubmit"
:isSubmitting="isSubmitting"
>
<GoBack
:goBack="handleGoBack"
v-if="showGoBack"
:inDrawer="true"
/>
<ActionBarBlock
v-else
:data-testid="`${drawerId}__action-bar`"
@onCancel="closeDrawer"
@onSubmit="onSubmit"
:inDrawer="true"
:loading="isSubmitting"
/>
</slot>
</div>
</Sidebar>
<DialogUnsavedBlock
:blockRedirectUnsaved="formHasChanges"
:isDrawer="true"
/>
</Teleport>
</template>
8 changes: 8 additions & 0 deletions src/views/EdgeNode/Drawer/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
const showEditServiceDrawer = ref(false)
const showCreateServiceDrawer = ref(false)
const isOverlapped = ref(false)
const debouncedDrawerAnimate = 300
const selectedServiceToEdit = ref('0')
const loadCreateServiceDrawer = refDebounced(showCreateServiceDrawer, debouncedDrawerAnimate)
Expand Down Expand Up @@ -74,6 +75,10 @@
return edgeNode
}
const handleToggleDrawer = (value) => {
isOverlapped.value = value
}
const openDrawerCreate = () => {
showCreateServiceDrawer.value = true
}
Expand All @@ -97,13 +102,15 @@
v-model:visible="showCreateServiceDrawer"
:createService="createServiceEdgeNodeService"
:schema="validationSchema"
:isOverlapped="isOverlapped"
:initialValues="initialValues"
@onSuccess="emit('onSuccess')"
title="Bind Service"
>
<template #formFields="{ disabledFields }">
<FormFieldsDrawerService
:edgeNodeId="edgeNodeId"
@toggleDrawer="handleToggleDrawer"
:listServicesHandle="listServiceEdgeNodeService"
:disabledFields="disabledFields"
:bound="false"
Expand All @@ -124,6 +131,7 @@
<template #formFields="{ disabledFields }">
<FormFieldsDrawerService
:edgeNodeId="edgeNodeId"
@toggleDrawer="handleToggleDrawer"
:listServicesHandle="listServiceEdgeNodeService"
:disabledFields="disabledFields"
bound
Expand Down
52 changes: 50 additions & 2 deletions src/views/EdgeNode/FormFields/FormFieldsDrawerService.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
import { useAccountStore } from '@/stores/account'
import FormHorizontal from '@/templates/create-form-block/form-horizontal'
import FieldDropdown from '@/templates/form-fields-inputs/fieldDropdown'
import PrimeButton from 'primevue/button'
import { useToast } from 'primevue/usetoast'
import CreateEdgeServiceDrawer from '@/views/EdgeServices/CreateEdgeServiceDrawer'
import { useField } from 'vee-validate'
import { computed, ref, onMounted } from 'vue'
import { computed, ref, onMounted, watch } from 'vue'
defineOptions({ name: 'form-fields-drawer-service' })
const emit = defineEmits(['toggleDrawer'])
const props = defineProps({
listServicesHandle: {
Expand All @@ -23,10 +26,15 @@
},
bound: {
type: Boolean
},
reloadServices: {
type: Function,
required: true
}
})
const listService = ref([])
const drawerRef = ref('')
const loadingOptionsServices = ref(false)
const toast = useToast()
Expand Down Expand Up @@ -64,11 +72,27 @@
}
})
const openDrawer = () => {
drawerRef.value.openCreateDrawer()
}
const store = useAccountStore()
const theme = computed(() => {
return store.currentTheme === 'light' ? 'vs' : 'vs-dark'
})
watch(
() => drawerRef.value.showCreateDrawer,
() => {
emit('toggleDrawer', drawerRef.value.showCreateDrawer)
}
)
const handleDrawerSuccess = (id) => {
getServices()
serviceId.value = id
}
onMounted(() => {
getServices()
})
Expand All @@ -81,6 +105,10 @@
description="Provision services created in the Edge Service library and customize variables."
>
<template #inputs>
<CreateEdgeServiceDrawer
ref="drawerRef"
@onSuccess="handleDrawerSuccess"
/>
<div class="flex flex-col w-full sm:max-w-3xl gap-2">
<div class="flex flex-col gap-2">
<div class="flex w-80 sm:max-w-lg flex-col items-start gap-2">
Expand All @@ -98,7 +126,27 @@
appendTo="self"
class="w-full"
description="Select the service to be provisioned."
/>
>
<template #footer>
<ul class="p-2">
<li>
<PrimeButton
class="w-full whitespace-nowrap flex"
data-testid="edge-applications-rules-engine-form__create-cache-policy-button"
text
@click="openDrawer"
size="small"
icon="pi pi-plus-circle"
:pt="{
label: { class: 'w-full text-left' },
root: { class: 'p-2' }
}"
label="Create Edge Service"
/>
</li>
</ul>
</template>
</FieldDropdown>
</div>
</div>
</div>
Expand Down
89 changes: 89 additions & 0 deletions src/views/EdgeServices/CreateEdgeServiceDrawer/index.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<script setup>
import CreateDrawerBlock from '@templates/create-drawer-block'
import { refDebounced } from '@vueuse/core'
import * as yup from 'yup'
import { ref, inject, defineExpose } from 'vue'
import FormFieldsEdgeService from '../FormFields/FormFieldsEdgeService'
import { createEdgeServiceServices } from '@/services/edge-service-services'
import { handleTrackerError } from '@/utils/errorHandlingTracker'
defineOptions({
name: 'edge-services-drawer'
})
const emit = defineEmits(['onSuccess'])
/**@type {import('@/plugins/adapters/AnalyticsTrackerAdapter').AnalyticsTrackerAdapter} */
const tracker = inject('tracker')
const showCreateEdgeServicesDrawer = ref(false)
const DEBOUNCE_TIME_IN_MS = 300
const showCreateDrawer = refDebounced(showCreateEdgeServicesDrawer, DEBOUNCE_TIME_IN_MS)
const validateCode = (val = '') => {
const split = val.split(/\s*\n+\s*/).filter((row) => !!row)
const isValid = split.every((row) => /^\w+\s*=[^]+$/.test(row))
return isValid
}
const validationSchema = yup.object({
name: yup.string().required().label('Name'),
active: yup.boolean(),
code: yup.string().test('formatInvalid', 'The format is invalid', validateCode)
})
const initialValues = {
name: '',
code: '',
active: true
}
const handleTrackSuccessCreated = () => {
tracker.product.productCreated({
productName: 'Edge Service'
})
}
const handleTrackFailCreated = (error) => {
const { fieldName, message } = handleTrackerError(error)
tracker.product
.failedToCreate({
productName: 'Edge Service',
errorType: 'api',
fieldName: fieldName.trim(),
errorMessage: message
})
.track()
}
const closeCreateDrawer = () => {
showCreateEdgeServicesDrawer.value = false
}
const openCreateDrawer = () => {
showCreateEdgeServicesDrawer.value = true
}
const handleCreateWithSuccess = (response) => {
handleTrackSuccessCreated()
emit('onSuccess', response.id)
closeCreateDrawer()
}
defineExpose({
showCreateDrawer,
openCreateDrawer
})
</script>

<template>
<CreateDrawerBlock
v-if="showCreateDrawer"
v-model:visible="showCreateEdgeServicesDrawer"
drawerId="create-edge-service-drawer"
:createService="createEdgeServiceServices"
:schema="validationSchema"
:initialValues="initialValues"
@onSuccess="handleCreateWithSuccess"
@onResponseFail="handleTrackFailCreated"
title="Create Edge Service"
>
<template #formFields>
<FormFieldsEdgeService isDrawer />
</template>
</CreateDrawerBlock>
</template>
Loading

0 comments on commit 5d8bd2b

Please sign in to comment.