52 changed files with 260 additions and 385 deletions
@ -1,6 +1,10 @@ |
|||
import AppLocalePickerLib from './src/AppLocalePicker.vue'; |
|||
import AppLogoLib from './src/AppLogo.vue'; |
|||
import AppLocalePicker from './src/AppLocalePicker.vue'; |
|||
import AppLogo from './src/AppLogo.vue'; |
|||
import AppProvider from './src/AppProvider.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const AppLocalePicker = withInstall(AppLocalePickerLib); |
|||
export const AppLogo = withInstall(AppLogoLib); |
|||
withInstall(AppLocalePicker, AppLogo, AppProvider); |
|||
|
|||
export { useAppProviderContext } from './src/useAppContext'; |
|||
|
|||
export { AppLocalePicker, AppLogo, AppProvider }; |
|||
|
|||
@ -0,0 +1,24 @@ |
|||
<template> |
|||
<slot /> |
|||
</template> |
|||
<script lang="ts"> |
|||
import type { PropType } from 'vue'; |
|||
import { defineComponent, toRefs } from 'vue'; |
|||
|
|||
import { createAppProviderContext } from './useAppContext'; |
|||
export default defineComponent({ |
|||
name: 'AppProvider', |
|||
inheritAttrs: false, |
|||
props: { |
|||
prefixCls: { |
|||
type: String as PropType<string>, |
|||
default: 'vben', |
|||
}, |
|||
}, |
|||
setup(props) { |
|||
const { prefixCls } = toRefs(props); |
|||
createAppProviderContext({ prefixCls }); |
|||
return {}; |
|||
}, |
|||
}); |
|||
</script> |
|||
@ -0,0 +1,16 @@ |
|||
import { InjectionKey, Ref } from 'vue'; |
|||
import { createContext, useContext } from '/@/hooks/core/useContext'; |
|||
|
|||
export interface AppProviderContextProps { |
|||
prefixCls: Ref<string>; |
|||
} |
|||
|
|||
const key: InjectionKey<AppProviderContextProps> = Symbol(); |
|||
|
|||
export function createAppProviderContext(context: AppProviderContextProps) { |
|||
return createContext<AppProviderContextProps>(context, key); |
|||
} |
|||
|
|||
export function useAppProviderContext() { |
|||
return useContext<AppProviderContextProps>(key); |
|||
} |
|||
@ -1,5 +1,7 @@ |
|||
import AuthorityLib from './src/index.vue'; |
|||
import Authority from './src/index.vue'; |
|||
|
|||
import { withInstall } from '../util'; |
|||
|
|||
export const Authority = withInstall(AuthorityLib); |
|||
withInstall(Authority); |
|||
|
|||
export { Authority }; |
|||
|
|||
@ -1,9 +1,9 @@ |
|||
import BasicArrowLib from './src/BasicArrow.vue'; |
|||
import BasicHelpLib from './src/BasicHelp.vue'; |
|||
import BasicTitleLib from './src/BasicTitle.vue'; |
|||
import BasicArrow from './src/BasicArrow.vue'; |
|||
import BasicHelp from './src/BasicHelp.vue'; |
|||
import BasicTitle from './src/BasicTitle.vue'; |
|||
|
|||
import { withInstall } from '../util'; |
|||
|
|||
export const BasicArrow = withInstall(BasicArrowLib); |
|||
export const BasicHelp = withInstall(BasicHelpLib); |
|||
export const BasicTitle = withInstall(BasicTitleLib); |
|||
withInstall(BasicArrow, BasicHelp, BasicTitle); |
|||
|
|||
export { BasicArrow, BasicHelp, BasicTitle }; |
|||
|
|||
@ -1,4 +1,6 @@ |
|||
import ButtonLib from './src/BasicButton.vue'; |
|||
import Button from './src/BasicButton.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const Button = withInstall(ButtonLib); |
|||
withInstall(Button); |
|||
|
|||
export { Button }; |
|||
|
|||
@ -1,4 +1,6 @@ |
|||
import ClickOutSideLib from './src/index.vue'; |
|||
import ClickOutSide from './src/index.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const ClickOutSide = withInstall(ClickOutSideLib); |
|||
withInstall(ClickOutSide); |
|||
|
|||
export { ClickOutSide }; |
|||
|
|||
@ -1,10 +1,10 @@ |
|||
import ScrollContainerLib from './src/ScrollContainer.vue'; |
|||
import CollapseContainerLib from './src/collapse/CollapseContainer.vue'; |
|||
import LazyContainerLib from './src/LazyContainer.vue'; |
|||
import ScrollContainer from './src/ScrollContainer.vue'; |
|||
import CollapseContainer from './src/collapse/CollapseContainer.vue'; |
|||
import LazyContainer from './src/LazyContainer.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(ScrollContainer, CollapseContainer, LazyContainer); |
|||
|
|||
export * from './src/types'; |
|||
|
|||
export const ScrollContainer = withInstall(ScrollContainerLib); |
|||
export const CollapseContainer = withInstall(CollapseContainerLib); |
|||
export const LazyContainer = withInstall(LazyContainerLib); |
|||
export { ScrollContainer, CollapseContainer, LazyContainer }; |
|||
|
|||
@ -1,6 +1,7 @@ |
|||
// Transform vue-count-to to support vue3 version
|
|||
|
|||
import CountToLib from './src/index.vue'; |
|||
import CountTo from './src/index.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const CountTo = withInstall(CountToLib); |
|||
withInstall(CountTo); |
|||
export { CountTo }; |
|||
|
|||
@ -1,8 +1,9 @@ |
|||
import DescriptionLib from './src/index'; |
|||
import Description from './src/index'; |
|||
|
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(Description); |
|||
|
|||
export * from './src/types'; |
|||
export { useDescription } from './src/useDescription'; |
|||
|
|||
export const Description = withInstall(DescriptionLib); |
|||
export { Description }; |
|||
|
|||
@ -1,6 +1,7 @@ |
|||
import BasicDrawerLib from './src/BasicDrawer'; |
|||
import BasicDrawer from './src/BasicDrawer'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(BasicDrawer); |
|||
export * from './src/types'; |
|||
export { useDrawer, useDrawerInner } from './src/useDrawer'; |
|||
export const BasicDrawer = withInstall(BasicDrawerLib); |
|||
export { BasicDrawer }; |
|||
|
|||
@ -1,6 +1,7 @@ |
|||
import DropdownLib from './src/Dropdown'; |
|||
import Dropdown from './src/Dropdown'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(Dropdown); |
|||
export * from './src/types'; |
|||
|
|||
export const Dropdown = withInstall(DropdownLib); |
|||
export { Dropdown }; |
|||
|
|||
@ -1,11 +1,12 @@ |
|||
import ImportExcelLib from './src/ImportExcel.vue'; |
|||
import ExportExcelModelLib from './src/ExportExcelModel.vue'; |
|||
import ImportExcel from './src/ImportExcel.vue'; |
|||
import ExportExcelModel from './src/ExportExcelModel.vue'; |
|||
|
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(ImportExcel, ExportExcelModel); |
|||
|
|||
export * from './src/types'; |
|||
|
|||
export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; |
|||
|
|||
export const ImportExcel = withInstall(ImportExcelLib); |
|||
export const ExportExcelModel = withInstall(ExportExcelModelLib); |
|||
export { ImportExcel, ExportExcelModel }; |
|||
|
|||
@ -1,10 +1,12 @@ |
|||
import BasicFormLib from './src/BasicForm.vue'; |
|||
import BasicForm from './src/BasicForm.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(BasicForm); |
|||
|
|||
export * from './src/types/form'; |
|||
export * from './src/types/formItem'; |
|||
|
|||
export { useComponentRegister } from './src/hooks/useComponentRegister'; |
|||
export { useForm } from './src/hooks/useForm'; |
|||
|
|||
export const BasicForm = withInstall(BasicFormLib); |
|||
export { BasicForm }; |
|||
|
|||
@ -1,8 +1,9 @@ |
|||
import './src/indicator'; |
|||
import LoadingLib from './src/index.vue'; |
|||
import Loading from './src/index.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(Loading); |
|||
export { useLoading } from './src/useLoading'; |
|||
export { createLoading } from './src/createLoading'; |
|||
|
|||
export const Loading = withInstall(LoadingLib); |
|||
export { Loading }; |
|||
|
|||
@ -1,7 +1,9 @@ |
|||
import MarkDownLib from './src/index.vue'; |
|||
import MarkDown from './src/index.vue'; |
|||
|
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(MarkDown); |
|||
|
|||
export * from './src/types'; |
|||
|
|||
export const MarkDown = withInstall(MarkDownLib); |
|||
export { MarkDown }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
import BasicMenuLib from './src/BasicMenu'; |
|||
import BasicMenu from './src/BasicMenu'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const BasicMenu = withInstall(BasicMenuLib); |
|||
withInstall(BasicMenu); |
|||
export { BasicMenu }; |
|||
|
|||
@ -0,0 +1,11 @@ |
|||
<template> |
|||
<div> </div> |
|||
</template> |
|||
<script lang="ts"> |
|||
import { defineComponent } from 'vue'; |
|||
export default defineComponent({ |
|||
setup() { |
|||
return {}; |
|||
}, |
|||
}); |
|||
</script> |
|||
@ -1,116 +0,0 @@ |
|||
<template> |
|||
<section class="menu-search-input" @Click="handleClick" :class="searchClass"> |
|||
<a-input-search |
|||
:placeholder="t('component.menu.search')" |
|||
class="menu-search-input__search" |
|||
allowClear |
|||
@change="handleChange" |
|||
/> |
|||
</section> |
|||
</template> |
|||
<script lang="ts"> |
|||
import type { PropType } from 'vue'; |
|||
import { defineComponent, computed } from 'vue'; |
|||
import { ThemeEnum } from '/@/enums/appEnum'; |
|||
// hook |
|||
import { useDebounce } from '/@/hooks/core/useDebounce'; |
|||
import { useI18n } from '/@/hooks/web/useI18n'; |
|||
// |
|||
export default defineComponent({ |
|||
name: 'BasicMenuSearchInput', |
|||
props: { |
|||
// Whether to expand, used in the left menu |
|||
collapsed: { |
|||
type: Boolean as PropType<boolean>, |
|||
default: true, |
|||
}, |
|||
theme: { |
|||
type: String as PropType<ThemeEnum>, |
|||
}, |
|||
}, |
|||
setup(props, { emit }) { |
|||
const { t } = useI18n(); |
|||
|
|||
const [debounceEmitChange] = useDebounce(emitChange, 200); |
|||
|
|||
function emitChange(value?: string): void { |
|||
emit('change', value); |
|||
} |
|||
|
|||
function handleChange(e: ChangeEvent): void { |
|||
const { collapsed } = props; |
|||
if (collapsed) return; |
|||
debounceEmitChange(e.target.value); |
|||
} |
|||
|
|||
function handleClick(): void { |
|||
emit('click'); |
|||
} |
|||
|
|||
const searchClass = computed(() => { |
|||
const cls: string[] = []; |
|||
cls.push(props.theme ? `menu-search-input__search--${props.theme}` : ''); |
|||
cls.push(props.collapsed ? 'hide-search-icon' : ''); |
|||
return cls; |
|||
}); |
|||
|
|||
return { handleClick, searchClass, handleChange, t }; |
|||
}, |
|||
}); |
|||
</script> |
|||
<style lang="less"> |
|||
@import (reference) '../../../design/index.less'; |
|||
// 输入框背景颜色 深 |
|||
@input-dark-bg-color: #516085; |
|||
|
|||
@icon-color: #c0c4cc; |
|||
|
|||
.menu-search-input { |
|||
margin: 12px 8px; |
|||
|
|||
&.hide-search-icon { |
|||
.ant-input, |
|||
.ant-input-suffix { |
|||
opacity: 0; |
|||
transition: all 0.5s; |
|||
} |
|||
} |
|||
|
|||
&__search--dark { |
|||
.ant-input-affix-wrapper, |
|||
.ant-input { |
|||
.set-bg(); |
|||
} |
|||
|
|||
.ant-input-search-icon, |
|||
.ant-input-clear-icon { |
|||
color: rgba(255, 255, 255, 0.4) !important; |
|||
} |
|||
} |
|||
|
|||
&__search--light { |
|||
.ant-input-affix-wrapper, |
|||
.ant-input { |
|||
color: @text-color-base; |
|||
background: #fff; |
|||
outline: none; |
|||
} |
|||
|
|||
.ant-input-search-icon { |
|||
color: @icon-color; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.set-bg() { |
|||
color: #fff; |
|||
background: @sider-dark-lighten-1-bg-color; |
|||
border: 0; |
|||
outline: none; |
|||
} |
|||
.hide-outline() { |
|||
border: none; |
|||
outline: none; |
|||
box-shadow: none; |
|||
} |
|||
</style> |
|||
@ -1,58 +0,0 @@ |
|||
import type { Menu as MenuType } from '/@/router/types'; |
|||
import type { MenuState } from '../types'; |
|||
import type { Ref } from 'vue'; |
|||
|
|||
import { isString } from '/@/utils/is'; |
|||
import { unref } from 'vue'; |
|||
import { es6Unique } from '/@/utils'; |
|||
import { getAllParentPath } from '/@/router/helper/menuHelper'; |
|||
|
|||
interface UseSearchInputOptions { |
|||
menuState: MenuState; |
|||
flatMenusRef: Ref<MenuType[]>; |
|||
emit: EmitType; |
|||
handleMenuChange: Fn; |
|||
} |
|||
export function useSearchInput({ |
|||
menuState, |
|||
flatMenusRef, |
|||
handleMenuChange, |
|||
emit, |
|||
}: UseSearchInputOptions) { |
|||
/** |
|||
* @description: 输入框搜索 |
|||
*/ |
|||
function handleInputChange(value?: string): void { |
|||
if (!isString(value)) { |
|||
value = (value as any).target.value; |
|||
} |
|||
if (!value) { |
|||
handleMenuChange && handleMenuChange(); |
|||
} |
|||
|
|||
menuState.searchValue = value || ''; |
|||
if (!value) { |
|||
menuState.openKeys = []; |
|||
return; |
|||
} |
|||
|
|||
const flatMenus = unref(flatMenusRef); |
|||
let openKeys: string[] = []; |
|||
for (const menu of flatMenus) { |
|||
const { name, path } = menu; |
|||
if (!name.includes(value)) { |
|||
continue; |
|||
} |
|||
openKeys = openKeys.concat(getAllParentPath(flatMenus, path)); |
|||
} |
|||
openKeys = es6Unique(openKeys); |
|||
menuState.openKeys = openKeys; |
|||
} |
|||
|
|||
// 搜索框点击
|
|||
function handleInputClick(e: any): void { |
|||
emit('clickSearchInput', e); |
|||
} |
|||
|
|||
return { handleInputChange, handleInputClick }; |
|||
} |
|||
@ -1,8 +1,10 @@ |
|||
import './src/index.less'; |
|||
import BasicModalLib from './src/BasicModal'; |
|||
import BasicModal from './src/BasicModal'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(BasicModal); |
|||
|
|||
export { useModalContext } from './src/useModalContext'; |
|||
export { useModal, useModalInner } from './src/useModal'; |
|||
export * from './src/types'; |
|||
export const BasicModal = withInstall(BasicModalLib); |
|||
export { BasicModal }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
import PageFooterLib from './src/PageFooter.vue'; |
|||
import PageFooter from './src/PageFooter.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const PageFooter = withInstall(PageFooterLib); |
|||
withInstall(PageFooter); |
|||
export { PageFooter }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
import StrengthMeterLib from './src/index'; |
|||
import StrengthMeter from './src/index'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const StrengthMeter = withInstall(StrengthMeterLib); |
|||
withInstall(StrengthMeter); |
|||
export { StrengthMeter }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
import TinymceLib from './src/Editor.vue'; |
|||
import Tinymce from './src/Editor.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const Tinymce = withInstall(TinymceLib); |
|||
withInstall(Tinymce); |
|||
export { Tinymce }; |
|||
|
|||
@ -1,8 +1,5 @@ |
|||
import type { App } from 'vue'; |
|||
import BasicUpload from './src/BasicUpload.vue'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export default (app: App): void => { |
|||
app.component(BasicUpload.name, BasicUpload); |
|||
}; |
|||
|
|||
withInstall(BasicUpload); |
|||
export { BasicUpload }; |
|||
|
|||
@ -1,8 +1,9 @@ |
|||
import BasicDragVerifyLib from './src/DragVerify'; |
|||
import RotateDragVerifyLib from './src/ImgRotate'; |
|||
import BasicDragVerify from './src/DragVerify'; |
|||
import RotateDragVerify from './src/ImgRotate'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
withInstall(BasicDragVerify, RotateDragVerify); |
|||
|
|||
export * from './src/types'; |
|||
|
|||
export const RotateDragVerify = withInstall(RotateDragVerifyLib); |
|||
export const BasicDragVerify = withInstall(BasicDragVerifyLib); |
|||
export { BasicDragVerify, RotateDragVerify }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
import VirtualScrollLib from './src/index'; |
|||
import VirtualScroll from './src/index'; |
|||
import { withInstall } from '../util'; |
|||
|
|||
export const VirtualScroll = withInstall(VirtualScrollLib); |
|||
withInstall(VirtualScroll); |
|||
export { VirtualScroll }; |
|||
|
|||
@ -1,21 +1,54 @@ |
|||
import { InjectionKey, provide, inject, reactive, readonly } from 'vue'; |
|||
import { |
|||
InjectionKey, |
|||
provide, |
|||
inject, |
|||
reactive, |
|||
readonly as defineReadonly, |
|||
defineComponent, |
|||
UnwrapRef, |
|||
} from 'vue'; |
|||
|
|||
export const createContext = <T>( |
|||
context: any, |
|||
contextInjectKey: InjectionKey<T> = Symbol(), |
|||
_readonly = true |
|||
) => { |
|||
const state = reactive({ ...context }); |
|||
export interface CreateContextOptions { |
|||
readonly?: boolean; |
|||
createProvider?: boolean; |
|||
} |
|||
|
|||
const provideData = _readonly ? readonly(state) : state; |
|||
provide(contextInjectKey, provideData); |
|||
type ShallowUnwrap<T> = { |
|||
[P in keyof T]: UnwrapRef<T[P]>; |
|||
}; |
|||
|
|||
export function createContext<T>( |
|||
context: any, |
|||
key: InjectionKey<T> = Symbol(), |
|||
options: CreateContextOptions = {} |
|||
) { |
|||
const { readonly = true, createProvider = false } = options; |
|||
|
|||
const state = reactive(context); |
|||
|
|||
const provideData = readonly ? defineReadonly(state) : state; |
|||
!createProvider && provide(key, provideData); |
|||
|
|||
const Provider = createProvider |
|||
? defineComponent({ |
|||
name: 'Provider', |
|||
inheritAttrs: false, |
|||
setup(_, { slots }) { |
|||
provide(key, provideData); |
|||
return () => slots.default?.(); |
|||
}, |
|||
}) |
|||
: null; |
|||
|
|||
return { Provider, state }; |
|||
} |
|||
|
|||
export const useContext = <T>( |
|||
contextInjectKey: InjectionKey<T> = Symbol(), |
|||
key: InjectionKey<T> = Symbol(), |
|||
defaultValue?: any, |
|||
_readonly = true |
|||
): T => { |
|||
const state = inject(contextInjectKey, defaultValue || {}); |
|||
return _readonly ? readonly(state) : state; |
|||
readonly = false |
|||
): ShallowUnwrap<T> => { |
|||
const state = inject(key, defaultValue || {}); |
|||
|
|||
return readonly ? defineReadonly(state) : state; |
|||
}; |
|||
|
|||
@ -0,0 +1,19 @@ |
|||
import { useAppProviderContext } from '/@/components/Application'; |
|||
import { computed } from 'vue'; |
|||
// import { useCssModule, reactive } from 'vue';
|
|||
export function useDesign(scope: string) { |
|||
const values = useAppProviderContext(); |
|||
// const style = cssModule ? useCssModule() : {};
|
|||
|
|||
// if (cssModule) {
|
|||
// Object.keys(style).forEach((key) => {
|
|||
// const moduleCls = style[key];
|
|||
// style[key] = `${cls}-${moduleCls}`;
|
|||
// });
|
|||
// }
|
|||
return { |
|||
prefixCls: computed(() => `${values.prefixCls}-${scope}`), |
|||
prefixVar: values.prefixCls, |
|||
// style,
|
|||
}; |
|||
} |
|||
Loading…
Reference in new issue