feat(ui): replace native confirm() with DaisyUI modal composable (F7.2)

Create useConfirm composable (promise-based, singleton state) and
ConfirmModal component. Replace all 10 confirm()/window.confirm() calls
across 9 pages and 1 composable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-02-09 11:20:13 +01:00
parent 046f464378
commit 6152848957
11 changed files with 152 additions and 21 deletions

View File

@@ -327,7 +327,8 @@ const handleDeleteComponent = async (component: Record<string, any>) => {
)
}
const confirmed = window.confirm(confirmLines.join('\n\n'))
const { confirm } = useConfirm()
const confirmed = await confirm({ message: confirmLines.join('\n\n') })
if (!confirmed) {
return
}

View File

@@ -127,7 +127,7 @@ import { formatPhone } from '~/utils/formatters/phone'
import IconLucidePlus from '~icons/lucide/plus'
const { constructeurs, loading, searchConstructeurs, createConstructeur, updateConstructeur, deleteConstructeur, loadConstructeurs } = useConstructeurs()
const { showError, showSuccess } = useToast()
const { showError } = useToast()
const searchTerm = ref('')
const sortKey = usePersistedValue('constructeurs-sort', 'name')
@@ -211,8 +211,10 @@ const saveConstructeur = async () => {
}
}
const { confirm } = useConfirm()
const confirmDelete = async (constructeur) => {
if (!confirm(`Supprimer le fournisseur "${constructeur.name}" ?`)) { return }
if (!await confirm({ message: `Supprimer le fournisseur "${constructeur.name}" ?` })) { return }
const result = await deleteConstructeur(constructeur.id)
if (!result.success && result.error) {
showError(result.error)

View File

@@ -705,13 +705,15 @@ const editMachine = (machine) => {
navigateTo(`/machine/${machine.id}?edit=true`)
}
const { confirm: confirmDialog } = useConfirm()
const confirmDeleteMachine = async (machine) => {
const { showError, showSuccess } = useToast()
if (
confirm(
`Êtes-vous sûr de vouloir supprimer la machine "${machine.name}" ? Cette action est irréversible.`
)
await confirmDialog({
message: `Êtes-vous sûr de vouloir supprimer la machine "${machine.name}" ? Cette action est irréversible.`,
})
) {
try {
const result = await deleteMachine(machine.id)

View File

@@ -108,7 +108,7 @@ import IconLucidePackage from "~icons/lucide/package";
import IconLucideLayoutGrid from "~icons/lucide/layout-grid";
import IconLucideBox from "~icons/lucide/box";
const { machineTypes, loading, loadMachineTypes, deleteMachineType } =
const { machineTypes, loadMachineTypes, deleteMachineType } =
useMachineTypesApi();
const categories = ref([
@@ -131,13 +131,15 @@ const filteredTypes = computed(() => {
);
});
const { confirm: confirmDialog } = useConfirm();
const confirmDeleteType = async (type) => {
const { showError, showSuccess } = useToast();
if (
confirm(
`Êtes-vous sûr de vouloir supprimer le type "${type.name}" ? Cette action est irréversible.`
)
await confirmDialog({
message: `Êtes-vous sûr de vouloir supprimer le type "${type.name}" ? Cette action est irréversible.`,
})
) {
try {
const result = await deleteMachineType(type.id);

View File

@@ -202,10 +202,12 @@ const editMachine = (machine) => {
navigateTo(`/machine/${machine.id}?edit=true`)
}
const { confirm: confirmDialog } = useConfirm()
const confirmDeleteMachine = async (machine) => {
const { showError, showSuccess } = toast
if (confirm(`Êtes-vous sûr de vouloir supprimer la machine "${machine.name}" ? Cette action est irréversible.`)) {
if (await confirmDialog({ message: `Êtes-vous sûr de vouloir supprimer la machine "${machine.name}" ? Cette action est irréversible.` })) {
try {
const result = await deleteMachine(machine.id)
if (result.success) {

View File

@@ -189,7 +189,7 @@
</template>
<script setup lang="ts">
import { computed, onMounted, ref, watch } from 'vue'
import { computed, onMounted, ref } from 'vue'
import { usePieces } from '~/composables/usePieces'
import { usePieceTypes } from '~/composables/usePieceTypes'
import { useToast } from '~/composables/useToast'
@@ -442,7 +442,8 @@ const handleDeletePiece = async (piece: Record<string, any>) => {
)
}
const confirmed = window.confirm(confirmLines.join('\n\n'))
const { confirm } = useConfirm()
const confirmed = await confirm({ message: confirmLines.join('\n\n') })
if (!confirmed) {
return
}

View File

@@ -382,10 +382,12 @@ const reload = async () => {
await loadProducts({ force: true })
}
const { confirm } = useConfirm()
const confirmDelete = async (product: Record<string, any>) => {
const confirmed = window.confirm(
`Voulez-vous vraiment supprimer le produit "${product.name}" ?\n\nCette action est irréversible.`,
)
const confirmed = await confirm({
message: `Voulez-vous vraiment supprimer le produit "${product.name}" ?\n\nCette action est irréversible.`,
})
if (!confirmed) {
return
}

View File

@@ -169,8 +169,10 @@ const create = async () => {
}
}
const { confirm } = useConfirm()
const remove = async (profileId) => {
if (!confirm('Supprimer ce profil ?')) { return }
if (!await confirm({ message: 'Supprimer ce profil ?' })) { return }
deleting.value = profileId
try {
await deleteProfile(profileId)