summary history files

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>