it-tools/src/tools/docker-run-to-docker-compose-converter/docker-run-to-docker-compose-converter.vue

90 lines
3 KiB
Vue
Raw Normal View History

<script setup lang="ts">
import { MessageType, composerize } from 'composerize-ts';
import { withDefaultOnError } from '@/utils/defaults';
import { useDownloadFileFromBase64 } from '@/composable/downloadBase64';
import { textToBase64 } from '@/utils/base64';
import TextareaCopyable from '@/components/TextareaCopyable.vue';
const { t } = useI18n();
const dockerRun = ref(
'docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx',
);
const conversionResult = computed(() =>
withDefaultOnError(() => composerize(dockerRun.value.trim()), { yaml: '', messages: [] }),
);
const dockerCompose = computed(() => conversionResult.value.yaml);
const notImplemented = computed(() =>
conversionResult.value.messages.filter(msg => msg.type === MessageType.notImplemented).map(msg => msg.value),
);
const notComposable = computed(() =>
conversionResult.value.messages.filter(msg => msg.type === MessageType.notTranslatable).map(msg => msg.value),
);
const errors = computed(() =>
conversionResult.value.messages
.filter(msg => msg.type === MessageType.errorDuringConversion)
.map(msg => msg.value),
);
const dockerComposeBase64 = computed(() => `data:application/yaml;base64,${textToBase64(dockerCompose.value)}`);
const { download } = useDownloadFileFromBase64({ source: dockerComposeBase64, filename: 'docker-compose.yml' });
</script>
<template>
<div>
<c-input-text
v-model:value="dockerRun"
:label="t('tools.docker-run-to-docker-compose-converter.inputLabel')"
style="font-family: monospace"
multiline
raw-text
monospace
:placeholder="t('tools.docker-run-to-docker-compose-converter.inputPlaceholder')"
rows="3"
/>
<n-divider />
<TextareaCopyable :value="dockerCompose" language="yaml" />
2023-05-27 17:36:15 +02:00
<div mt-5 flex justify-center>
<c-button :disabled="dockerCompose === ''" secondary @click="download">
{{ t('tools.docker-run-to-docker-compose-converter.downloadBtn') }}
</c-button>
2023-05-27 17:36:15 +02:00
</div>
<div v-if="notComposable.length > 0">
<n-alert :title="t('tools.docker-run-to-docker-compose-converter.notComposable')" type="info" mt-5>
<ul>
<li v-for="(message, index) of notComposable" :key="index">
{{ message }}
</li>
</ul>
</n-alert>
</div>
<div v-if="notImplemented.length > 0">
<n-alert
:title="t('tools.docker-run-to-docker-compose-converter.notImplemented')"
type="warning"
mt-5
>
<ul>
<li v-for="(message, index) of notImplemented" :key="index">
{{ message }}
</li>
</ul>
</n-alert>
</div>
<div v-if="errors.length > 0">
<n-alert :title="t('tools.docker-run-to-docker-compose-converter.errors')" type="error" mt-5>
<ul>
<li v-for="(message, index) of errors" :key="index">
{{ message }}
</li>
</ul>
</n-alert>
</div>
</div>
</template>