Files
mayfly-go/frontend/src/views/ops/machine/file/MachineFileContent.vue

131 lines
3.3 KiB
Vue
Raw Normal View History

<template>
2025-04-26 17:37:09 +08:00
<div>
<el-dialog
destroy-on-close
:before-close="handleClose"
:title="title || path"
v-model="dialogVisible"
:close-on-click-modal="false"
top="5vh"
width="65%"
>
2025-04-26 17:37:09 +08:00
<div v-loading="loadingContent">
<monaco-editor :can-change-mode="true" v-model="fileContent" :language="fileType" />
</div>
<template #footer>
2025-04-26 17:37:09 +08:00
<el-button @click="handleClose">{{ $t('common.cancel') }}</el-button>
<el-button v-auth="'machine:file:write'" type="primary" @click="updateContent">{{ $t('common.save') }}</el-button>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
2025-04-26 17:37:09 +08:00
import { computed, reactive, toRefs, watch } from 'vue';
import { machineApi } from '../api';
import MonacoEditor from '@/components/monaco/MonacoEditor.vue';
2024-11-20 22:43:53 +08:00
import { useI18nSaveSuccessMsg } from '@/hooks/useI18n';
const props = defineProps({
protocol: { type: Number, default: 1 },
title: { type: String, default: '' },
machineId: { type: Number },
authCertName: { type: String },
fileId: { type: Number, default: 0 },
path: { type: String, default: '' },
});
2025-04-26 17:37:09 +08:00
const dialogVisible = defineModel<boolean>('visible', { default: false });
const emit = defineEmits(['cancel', 'update:machineId']);
const updateFileContent = machineApi.updateFileContent;
const state = reactive({
2025-04-26 17:37:09 +08:00
loadingContent: false,
content: '',
fileType: '',
});
2025-04-26 17:37:09 +08:00
const { fileType } = toRefs(state);
const {
isFetching: loadingContent,
execute: getFileContentExec,
data: fileContent,
} = machineApi.fileContent.useApi(
computed(() => {
return {
fileId: props.fileId,
path: props.path,
machineId: props.machineId,
authCertName: props.authCertName,
protocol: props.protocol,
};
})
);
watch(props, async (newValue) => {
2025-04-26 17:37:09 +08:00
if (dialogVisible.value) {
await getFileContent();
}
});
const getFileContent = async () => {
2025-04-26 17:37:09 +08:00
fileContent.value = '';
state.fileType = getFileType(props.path);
await getFileContentExec();
};
const handleClose = () => {
2025-04-26 17:37:09 +08:00
dialogVisible.value = false;
};
const updateContent = async () => {
await updateFileContent.request({
content: state.content,
id: props.fileId,
path: props.path,
machineId: props.machineId,
authCertName: props.authCertName,
protocol: props.protocol,
});
2024-11-20 22:43:53 +08:00
useI18nSaveSuccessMsg();
handleClose();
state.content = '';
};
const getFileType = (path: string) => {
if (path.endsWith('.sh')) {
return 'shell';
}
if (path.endsWith('js')) {
return 'javascript';
}
if (path.endsWith('json')) {
return 'json';
}
if (path.endsWith('Dockerfile')) {
return 'dockerfile';
}
if (path.endsWith('nginx.conf')) {
return 'shell';
}
if (path.endsWith('sql')) {
return 'sql';
}
if (path.endsWith('yaml') || path.endsWith('yml')) {
return 'yaml';
}
if (path.endsWith('xml') || path.endsWith('html')) {
return 'html';
}
if (path.endsWith('py')) {
return 'python';
}
return 'text';
};
</script>
<style lang="scss"></style>