<template>
<Modal ref="modalRef" title="Delete Component" @keydown.enter="onConfirm">
<div class="max-h-[70vh] overflow-hidden flex flex-col">
<div class="pb-xs">
Are you sure you want to delete
{{ components.length > 1 ? `${components.length} components` : "this component" }}?
</div>
<div class="scrollable">
<ComponentCard v-for="component in components" :key="component.id" :component="component" />
</div>
<div class="px-2xs py-xs">
<VormInput v-model="mode" noLabel type="radio">
<VormInputOption :value="DeleteMode.Delete">
<div class="text-xs my-xs">
<span class="flex flex-col">
<strong>Delete</strong>
</span>
<span class="flex flex-col">
If this component has a corresponding resource, and/or its outgoing dependencies do, it will be marked
for deletion and removed when this change set is applied. Otherwise, the component will be deleted
immediately.
</span>
</div>
</VormInputOption>
<VormInputOption :value="DeleteMode.Remove">
<div class="text-xs my-xs">
<span class="flex flex-col">
<strong>Remove</strong>
</span>
<span class="flex flex-col">
If this component exists in at least two views, it will be removed from the current view and will remain
in other view(s). Otherwise, the remove request will "no-op" and the component will remain in the
current view.
</span>
</div>
</VormInputOption>
</VormInput>
</div>
<div class="flex gap-sm">
<NewButton label="Cancel" @click="close" />
<NewButton class="flex-grow" icon="trash" label="Confirm" tone="destructive" @click="onConfirm" />
</div>
</div>
</Modal>
</template>
<script lang="ts" setup>
import * as _ from "lodash-es";
import { Modal, NewButton, useModal, VormInput, VormInputOption } from "@si/vue-lib/design-system";
import { onBeforeUnmount, onMounted, ref } from "vue";
import { ComponentInList } from "@/workers/types/entity_kind_types";
import ComponentCard from "./ComponentCard.vue";
import { KeyDetails, keyEmitter } from "./logic_composables/emitters";
const components = ref<ComponentInList[]>([]);
const modalRef = ref<InstanceType<typeof Modal>>();
const { open: openModal, close: closeModal } = useModal(modalRef);
function open(selectedComponents: ComponentInList[]) {
components.value = selectedComponents;
openModal();
}
function close() {
components.value = [];
closeModal();
}
const mode = ref(DeleteMode.Delete);
async function onConfirm() {
close();
emit("delete", mode.value);
}
onMounted(() => {
keyEmitter.on("Enter", onKeyDown);
});
onBeforeUnmount(() => {
keyEmitter.off("Enter", onKeyDown);
});
const onKeyDown = async (e: KeyDetails["Enter"]) => {
if (modalRef.value?.isOpen) {
onConfirm();
}
};
const emit = defineEmits<{
(e: "delete", value: DeleteMode): void;
}>();
defineExpose({ open, close });
</script>
<script lang="ts">
export enum DeleteMode {
Delete,
Remove,
}
</script>