diff --git a/docs/examples/confirm-delete/App.vue b/docs/examples/confirm-delete/App.vue new file mode 100644 index 00000000..b77b6dbd --- /dev/null +++ b/docs/examples/confirm-delete/App.vue @@ -0,0 +1,69 @@ + + + diff --git a/docs/examples/confirm-delete/Dialog.vue b/docs/examples/confirm-delete/Dialog.vue new file mode 100644 index 00000000..1f0d8c1e --- /dev/null +++ b/docs/examples/confirm-delete/Dialog.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/docs/examples/confirm-delete/index.ts b/docs/examples/confirm-delete/index.ts new file mode 100644 index 00000000..a63b5812 --- /dev/null +++ b/docs/examples/confirm-delete/index.ts @@ -0,0 +1,3 @@ +export { default as ConfirmApp } from './App.vue?raw' +export { default as ConfirmDialog } from './Dialog.vue?raw' +export { default as useDialog } from './useDialog.js?raw' diff --git a/docs/examples/confirm-delete/useDialog.js b/docs/examples/confirm-delete/useDialog.js new file mode 100644 index 00000000..6147b07e --- /dev/null +++ b/docs/examples/confirm-delete/useDialog.js @@ -0,0 +1,29 @@ +import { ref } from 'vue' + +const isVisible = ref(false) +const message = ref('') +let resolveCallback + +export function useDialogState() { + return { + isVisible, + message, + resolve: (value) => { + if (resolveCallback) { + resolveCallback(value) + } + }, + } +} + +export function useDialog() { + return { + confirm(msg) { + isVisible.value = true + message.value = msg + return new Promise((resolve) => { + resolveCallback = resolve + }) + }, + } +} diff --git a/docs/examples/index.ts b/docs/examples/index.ts index 859496b6..86bac902 100644 --- a/docs/examples/index.ts +++ b/docs/examples/index.ts @@ -20,6 +20,7 @@ import { NodeResizerApp, ResizableNode } from './node-resizer' import { ToolbarApp, ToolbarNode } from './node-toolbar' import { LayoutApp, LayoutEdge, LayoutElements, LayoutIcon, LayoutNode, useLayout, useRunProcess, useShuffle } from './layout' import { MathApp, MathCSS, MathElements, MathIcon, MathOperatorNode, MathResultNode, MathValueNode } from './math' +import { ConfirmApp, ConfirmDialog, useDialog } from './confirm-delete' export const exampleImports = { basic: { @@ -150,4 +151,9 @@ export const exampleImports = { 'style.css': MathCSS, 'initial-elements.js': MathElements, }, + confirmDelete: { + 'App.vue': ConfirmApp, + 'Dialog.vue': ConfirmDialog, + 'useDialog.js': useDialog, + }, } diff --git a/docs/src/.vitepress/config.mts b/docs/src/.vitepress/config.mts index 4832f6f2..5dd642c7 100644 --- a/docs/src/.vitepress/config.mts +++ b/docs/src/.vitepress/config.mts @@ -208,6 +208,7 @@ export default defineConfigWithTheme({ { text: 'Save & Restore', link: '/examples/save' }, { text: 'Math Operation Flow', link: '/examples/math' }, { text: 'Screenshot', link: '/examples/screenshot' }, + { text: 'Confirm Delete', link: '/examples/confirm' }, { text: 'Node Visibility', link: '/examples/hidden' }, { text: 'Node Intersections', link: '/examples/intersection' }, { text: 'Multiple Flows', link: '/examples/multi' }, diff --git a/docs/src/examples/confirm.md b/docs/src/examples/confirm.md new file mode 100644 index 00000000..42ad42a1 --- /dev/null +++ b/docs/src/examples/confirm.md @@ -0,0 +1,9 @@ +# Confirm Delete + +Sometimes you want to confirm a delete action before it happens. Here's how you can do that with a simple dialog. + +This example also demonstrates how to take-over the application of changes to the graph. This is useful when you want to confirm changes before they are applied. + +
+ +
diff --git a/examples/vite/router.ts b/examples/vite/router.ts index 9e8a9f58..a1f4180b 100644 --- a/examples/vite/router.ts +++ b/examples/vite/router.ts @@ -134,6 +134,10 @@ export const routes: RouterOptions['routes'] = [ path: '/screenshot', component: () => import('./src/Screenshot/ScreenshotExample.vue'), }, + { + path: '/confirm-delete', + component: () => import('./src/ConfirmDelete/ConfirmDeleteExample.vue'), + }, ] export const router = createRouter({ diff --git a/examples/vite/src/ConfirmDelete/ConfirmDeleteExample.vue b/examples/vite/src/ConfirmDelete/ConfirmDeleteExample.vue new file mode 100644 index 00000000..86c38245 --- /dev/null +++ b/examples/vite/src/ConfirmDelete/ConfirmDeleteExample.vue @@ -0,0 +1,69 @@ + + + diff --git a/examples/vite/src/ConfirmDelete/Dialog.vue b/examples/vite/src/ConfirmDelete/Dialog.vue new file mode 100644 index 00000000..667242e3 --- /dev/null +++ b/examples/vite/src/ConfirmDelete/Dialog.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/examples/vite/src/ConfirmDelete/useDialog.ts b/examples/vite/src/ConfirmDelete/useDialog.ts new file mode 100644 index 00000000..3cf031db --- /dev/null +++ b/examples/vite/src/ConfirmDelete/useDialog.ts @@ -0,0 +1,30 @@ +import { ref } from 'vue' + +const isVisible = ref(false) +const message = ref('') +let resolveCallback: (value: boolean) => void + +export function useDialogState() { + return { + isVisible, + message, + resolve: (value: boolean) => { + if (resolveCallback) { + resolveCallback(value) + } + }, + } +} + +export function useDialog(opts: { message?: string }) { + message.value = opts.message || 'Are you sure?' + + return { + confirm(): Promise { + isVisible.value = true + return new Promise((resolve) => { + resolveCallback = resolve + }) + }, + } +} diff --git a/examples/vite/src/CustomNode/ColorSelectorNode.vue b/examples/vite/src/CustomNode/ColorSelectorNode.vue index f4bd0bf1..411d7e32 100644 --- a/examples/vite/src/CustomNode/ColorSelectorNode.vue +++ b/examples/vite/src/CustomNode/ColorSelectorNode.vue @@ -26,7 +26,11 @@ export default {