From cd338f0b1f148a7db12daa55f45e15cae52af177 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Wed, 29 Jun 2022 14:53:57 +0800 Subject: [PATCH] feat: add dialog component Signed-off-by: Ryan Wang --- packages/components/package.json | 4 +- packages/components/src/components.ts | 1 + .../src/components/dialog/Dialog.story.vue | 36 +++++ .../src/components/dialog/Dialog.vue | 128 ++++++++++++++++++ .../src/components/dialog/DialogProvider.vue | 26 ++++ .../dialog/__tests__/Dialog.spec.ts | 9 ++ .../components/src/components/dialog/index.ts | 3 + .../src/components/dialog/interface.ts | 15 ++ .../src/components/dialog/use-dialog.ts | 36 +++++ .../components/src/components/modal/Modal.vue | 4 +- packages/components/src/icons/icons.ts | 3 + packages/shared/src/utils/api-client.ts | 2 +- pnpm-lock.yaml | 16 +-- src/App.vue | 5 +- 14 files changed, 274 insertions(+), 14 deletions(-) create mode 100644 packages/components/src/components/dialog/Dialog.story.vue create mode 100644 packages/components/src/components/dialog/Dialog.vue create mode 100644 packages/components/src/components/dialog/DialogProvider.vue create mode 100644 packages/components/src/components/dialog/__tests__/Dialog.spec.ts create mode 100644 packages/components/src/components/dialog/index.ts create mode 100644 packages/components/src/components/dialog/interface.ts create mode 100644 packages/components/src/components/dialog/use-dialog.ts diff --git a/packages/components/package.json b/packages/components/package.json index 670a9abc..b1b04368 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -45,10 +45,10 @@ "homepage": "https://github.com/halo-dev/halo-admin/tree/next/packages/components#readme", "license": "MIT", "devDependencies": { - "@iconify-json/ri": "^1.1.2", + "@iconify-json/ri": "^1.1.3", "@rollup/plugin-typescript": "^8.3.3", "histoire": "^0.7.8", - "unplugin-icons": "^0.14.5", + "unplugin-icons": "^0.14.6", "vite-plugin-dts": "^1.2.0" }, "peerDependencies": { diff --git a/packages/components/src/components.ts b/packages/components/src/components.ts index cc3e6eb2..7d8972ce 100644 --- a/packages/components/src/components.ts +++ b/packages/components/src/components.ts @@ -13,3 +13,4 @@ export * from "./components/tabs"; export * from "./components/tag"; export * from "./components/textarea"; export * from "./components/switch"; +export * from "./components/dialog"; diff --git a/packages/components/src/components/dialog/Dialog.story.vue b/packages/components/src/components/dialog/Dialog.story.vue new file mode 100644 index 00000000..876f2267 --- /dev/null +++ b/packages/components/src/components/dialog/Dialog.story.vue @@ -0,0 +1,36 @@ + + diff --git a/packages/components/src/components/dialog/Dialog.vue b/packages/components/src/components/dialog/Dialog.vue new file mode 100644 index 00000000..a534cef0 --- /dev/null +++ b/packages/components/src/components/dialog/Dialog.vue @@ -0,0 +1,128 @@ + + diff --git a/packages/components/src/components/dialog/DialogProvider.vue b/packages/components/src/components/dialog/DialogProvider.vue new file mode 100644 index 00000000..21d65473 --- /dev/null +++ b/packages/components/src/components/dialog/DialogProvider.vue @@ -0,0 +1,26 @@ + + diff --git a/packages/components/src/components/dialog/__tests__/Dialog.spec.ts b/packages/components/src/components/dialog/__tests__/Dialog.spec.ts new file mode 100644 index 00000000..15a9c515 --- /dev/null +++ b/packages/components/src/components/dialog/__tests__/Dialog.spec.ts @@ -0,0 +1,9 @@ +import { describe, expect, it } from "vitest"; +import { mount } from "@vue/test-utils"; +import { VDialog } from "../index"; + +describe("Dialog", () => { + it("should render", () => { + expect(mount(VDialog)).toBeDefined(); + }); +}); diff --git a/packages/components/src/components/dialog/index.ts b/packages/components/src/components/dialog/index.ts new file mode 100644 index 00000000..3ddc98c3 --- /dev/null +++ b/packages/components/src/components/dialog/index.ts @@ -0,0 +1,3 @@ +export { default as VDialog } from "./Dialog.vue"; +export { default as VDialogProvider } from "./DialogProvider.vue"; +export * from "./use-dialog"; diff --git a/packages/components/src/components/dialog/interface.ts b/packages/components/src/components/dialog/interface.ts new file mode 100644 index 00000000..5e65cad8 --- /dev/null +++ b/packages/components/src/components/dialog/interface.ts @@ -0,0 +1,15 @@ +export type Type = "success" | "info" | "warning" | "error"; +export const DialogProviderProvideKey = "DIALOG_PROVIDER_PROVIDE_KEY"; + +export interface useDialogOptions { + type?: Type; + visible: boolean; + title: string; + description?: string; + confirmText?: string; + cancelText?: string; + onConfirm?: () => void; + onCancel?: () => void; +} + +export type useDialogUserOptions = Omit; diff --git a/packages/components/src/components/dialog/use-dialog.ts b/packages/components/src/components/dialog/use-dialog.ts new file mode 100644 index 00000000..ff623d6b --- /dev/null +++ b/packages/components/src/components/dialog/use-dialog.ts @@ -0,0 +1,36 @@ +import type { Ref } from "vue"; +import { inject } from "vue"; +import type { + Type, + useDialogOptions, + useDialogUserOptions, +} from "@/components/dialog/interface"; +import { DialogProviderProvideKey } from "@/components/dialog/interface"; + +interface useDialogReturn { + success: (options: useDialogUserOptions) => void; + info: (options: useDialogUserOptions) => void; + warning: (options: useDialogUserOptions) => void; + error: (options: useDialogUserOptions) => void; +} + +export function useDialog(): useDialogReturn { + const dialogOptions = inject>(DialogProviderProvideKey); + + if (!dialogOptions) { + throw new Error("DialogProvider is not mounted"); + } + + const createDialog = (type: Type) => (options: useDialogUserOptions) => { + dialogOptions.value = { ...dialogOptions.value, ...options }; + dialogOptions.value.type = type; + dialogOptions.value.visible = true; + }; + + return { + success: createDialog("success"), + info: createDialog("info"), + warning: createDialog("warning"), + error: createDialog("error"), + }; +} diff --git a/packages/components/src/components/modal/Modal.vue b/packages/components/src/components/modal/Modal.vue index 2c0e949a..8f36adce 100644 --- a/packages/components/src/components/modal/Modal.vue +++ b/packages/components/src/components/modal/Modal.vue @@ -46,7 +46,7 @@ function handleClose() { }