frontend/src/components/NamespacesEdit.vue
<!-- NamespacesEdit.vue -->
<template>
<div v-if="show" class="modal-overlay" @click="closeModal">
<div class="modal-content yaml-editor" @click.stop>
<div class="modal-header">
<h3>Edit Namespace YAML</h3>
<button class="close-button" @click="closeModal">×</button>
</div>
<div class="modal-body">
<div v-if="error" class="error-message">{{ error }}</div>
<div v-if="isLoading" class="loading-message">Loading namespace YAML...</div>
<div v-if="!isLoading" class="yaml-container">
<textarea
v-model="yamlContent"
:disabled="isSubmitting"
class="yaml-textarea"
></textarea>
</div>
</div>
<div class="modal-footer">
<button
class="cancel-button"
@click="closeModal"
:disabled="isSubmitting"
>
Cancel
</button>
<button
class="update-button"
@click="updateNamespace"
:disabled="isSubmitting || isLoading || !yamlContent.trim()"
>
{{ isSubmitting ? 'Updating...' : 'Update Namespace' }}
</button>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch, PropType } from 'vue';
import { KubernetesNamespace, KubernetesCluster } from '../types/kubernetes';
import { kubernetesService } from '../lib/kubernetes';
import { namespaceJsonToYaml } from '../lib/lib';
export default defineComponent({
name: 'ResourceNamespaceEdit',
props: {
show: {
type: Boolean,
default: false
},
namespace: {
type: Object as PropType<KubernetesNamespace | null>,
default: null
},
cluster: {
type: Object as PropType<KubernetesCluster | null>,
default: null
}
},
emits: ['close', 'namespace-updated'],
setup(props, { emit }) {
// State
const yamlContent = ref('');
const isLoading = ref(false);
const isSubmitting = ref(false);
const error = ref('');
const originalNamespaceName = ref('');
// Watch for changes to show prop
watch(() => props.show, (newVal) => {
if (newVal && props.namespace) {
fetchNamespaceYaml();
} else {
yamlContent.value = '';
error.value = '';
}
});
// Methods
const closeModal = () => {
if (!isSubmitting.value) {
emit('close');
}
};
const fetchNamespaceYaml = async () => {
if (!props.namespace || !props.cluster) return;
isLoading.value = true;
error.value = '';
originalNamespaceName.value = props.namespace.metadata.name;
try {
const response = await kubernetesService.getNamespace(
props.cluster.contextName,
originalNamespaceName.value
);
if (response.success) {
yamlContent.value = namespaceJsonToYaml(response.data);
} else {
error.value = response.msg || 'Failed to fetch namespace YAML';
}
} catch (err: any) {
error.value = `Error fetching namespace YAML: ${err.message || err}`;
} finally {
isLoading.value = false;
}
};
const updateNamespace = async () => {
if (!props.namespace || !props.cluster) return;
isSubmitting.value = true;
error.value = '';
try {
const response = await kubernetesService.updateNamespace(
props.cluster.contextName,
yamlContent.value,
originalNamespaceName.value
);
if (response.success) {
emit('namespace-updated', response);
closeModal();
} else {
error.value = response.msg || 'Failed to update namespace';
}
} catch (err: any) {
error.value = `Failed to update namespace: ${err.message || err}`;
} finally {
isSubmitting.value = false;
}
};
return {
yamlContent,
isLoading,
isSubmitting,
error,
originalNamespaceName,
closeModal,
fetchNamespaceYaml,
updateNamespace
};
}
});
</script>
<style src="@/assets/css/MenuDialog.css" scoped></style>