Compare commits

..

3 Commits

Author SHA1 Message Date
青菜白玉汤
510ecfbe8b Merge branch 'example' into example 2025-05-16 13:05:23 +08:00
Zheng-Changfu
38b91d8c6a feat(projects): add pro-naive-ui example 2025-05-16 10:47:38 +08:00
Soybean
7db195e86a Merge branch 'main' into example 2025-05-16 10:25:07 +08:00
10 changed files with 222 additions and 192 deletions

1
pnpm-lock.yaml generated
View File

@@ -6961,7 +6961,6 @@ snapshots:
- vue - vue
'@vicons/antd@0.13.0': {} '@vicons/antd@0.13.0': {}
'@visactor/vchart-theme@1.12.2(@visactor/vchart@1.13.7)': '@visactor/vchart-theme@1.12.2(@visactor/vchart@1.13.7)':
dependencies: dependencies:
'@visactor/vchart': 1.13.7 '@visactor/vchart': 1.13.7

View File

@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue'; import { computed } from 'vue';
import { darkTheme } from 'naive-ui'; import { NConfigProvider, darkTheme } from 'naive-ui';
import type { WatermarkProps } from 'naive-ui'; import type { WatermarkProps } from 'naive-ui';
import { useAppStore } from './store/modules/app'; import { useAppStore } from './store/modules/app';
import { useThemeStore } from './store/modules/theme'; import { useThemeStore } from './store/modules/theme';
@@ -41,7 +41,7 @@ const watermarkProps = computed<WatermarkProps>(() => {
</script> </script>
<template> <template>
<ProConfigProvider <NConfigProvider
:theme="naiveDarkTheme" :theme="naiveDarkTheme"
:theme-overrides="themeStore.naiveTheme" :theme-overrides="themeStore.naiveTheme"
:locale="naiveLocale" :locale="naiveLocale"
@@ -52,7 +52,7 @@ const watermarkProps = computed<WatermarkProps>(() => {
<RouterView class="bg-layout" /> <RouterView class="bg-layout" />
<NWatermark v-if="themeStore.watermark.visible" v-bind="watermarkProps" /> <NWatermark v-if="themeStore.watermark.visible" v-bind="watermarkProps" />
</AppProvider> </AppProvider>
</ProConfigProvider> </NConfigProvider>
</template> </template>
<style scoped></style> <style scoped></style>

View File

@@ -1,6 +1,5 @@
import { dateEnUS, dateZhCN, enUS } from 'naive-ui'; import { dateEnUS, dateZhCN, enUS, zhCN } from 'naive-ui';
import type { NDateLocale, NLocale } from 'naive-ui'; import type { NDateLocale, NLocale } from 'naive-ui';
import { zhCN } from 'pro-naive-ui';
export const naiveLocales: Record<App.I18n.LangType, NLocale> = { export const naiveLocales: Record<App.I18n.LangType, NLocale> = {
'zh-CN': zhCN, 'zh-CN': zhCN,

View File

@@ -630,7 +630,7 @@ export const generatedRoutes: GeneratedRoute[] = [
title: 'pro-naive', title: 'pro-naive',
i18nKey: 'route.pro-naive', i18nKey: 'route.pro-naive',
order: 7, order: 7,
icon:'material-symbols-light:demography-outline-rounded' icon: 'material-symbols-light:demography-outline-rounded'
}, },
children: [ children: [
{ {
@@ -639,7 +639,7 @@ export const generatedRoutes: GeneratedRoute[] = [
meta: { meta: {
title: 'pro-naive_form', title: 'pro-naive_form',
i18nKey: 'route.pro-naive_form', i18nKey: 'route.pro-naive_form',
icon:'fluent:form-28-regular' icon: 'fluent:form-28-regular'
}, },
children: [ children: [
{ {
@@ -677,7 +677,7 @@ export const generatedRoutes: GeneratedRoute[] = [
meta: { meta: {
title: 'pro-naive_table', title: 'pro-naive_table',
i18nKey: 'route.pro-naive_table', i18nKey: 'route.pro-naive_table',
icon:'mynaui:table' icon: 'mynaui:table'
}, },
children: [ children: [
{ {

View File

@@ -0,0 +1,17 @@
<script setup lang="tsx">
import { computed } from 'vue';
import { zhCN } from 'pro-naive-ui';
import { useAppStore } from '@/store/modules/app';
const appStore = useAppStore();
const locale = computed(() => {
return appStore.locale === 'zh-CN' ? zhCN : undefined;
});
</script>
<template>
<ProConfigProvider :locale="locale" class="h-full">
<slot></slot>
</ProConfigProvider>
</template>

View File

@@ -1,8 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import { useMessage } from 'naive-ui'; import { useMessage } from 'naive-ui';
import { createProForm } from 'pro-naive-ui'; import { createProForm, zhCN } from 'pro-naive-ui';
import { $t } from '@/locales'; import { $t } from '@/locales';
import ConfigProvider from '../../ConfigProvider.vue';
const submiting = ref(false); const submiting = ref(false);
const message = useMessage(); const message = useMessage();
@@ -56,126 +57,128 @@ function fillValues() {
</script> </script>
<template> <template>
<ProForm <ConfigProvider :locale="zhCN">
:form="form" <ProForm
:loading="submiting" :form="form"
:rules="{ :loading="submiting"
appName: { :rules="{
required: true appName: {
} required: true
}" }
> }"
<ProCard :title="$t('page.proNaive.form.basic.title')" :show-collapse="false"> >
<template #header-extra> <ProCard :title="$t('page.proNaive.form.basic.title')" :show-collapse="false">
<NFlex> <template #header-extra>
<NButton @click="fillValues">{{ $t('page.proNaive.form.basic.fillValue') }}</NButton> <NFlex>
<NButton attr-type="reset">{{ $t('page.proNaive.form.basic.reset') }}</NButton> <NButton @click="fillValues">{{ $t('page.proNaive.form.basic.fillValue') }}</NButton>
<NButton type="primary" attr-type="submit" :loading="submiting"> <NButton attr-type="reset">{{ $t('page.proNaive.form.basic.reset') }}</NButton>
{{ $t('page.proNaive.form.basic.submit') }} <NButton type="primary" attr-type="submit" :loading="submiting">
</NButton> {{ $t('page.proNaive.form.basic.submit') }}
</NFlex> </NButton>
</template> </NFlex>
<NGrid cols="1 s:2 l:3" :x-gap="16" responsive="screen"> </template>
<NGi> <NGrid cols="1 s:2 l:3" :x-gap="16" responsive="screen">
<ProInput <NGi>
:title="$t('page.proNaive.form.basic.appName')"
:tooltip="$t('page.proNaive.form.basic.appName')"
path="appName"
/>
</NGi>
<NGi>
<ProSelect
:title="$t('page.proNaive.form.basic.appStatus')"
path="appStatus"
:field-props="{
options: [
{ label: $t('page.proNaive.form.basic.normal'), value: 0 },
{ label: $t('page.proNaive.form.basic.anomaly'), value: 1 }
]
}"
/>
</NGi>
<NGi>
<ProDate :title="$t('page.proNaive.form.basic.createTime')" path="createTime" />
</NGi>
<NGi>
<ProDate :title="$t('page.proNaive.form.basic.responseDate')" path="responseDate" required />
</NGi>
<NGi :span="3">
<ProFormList
:title="$t('page.proNaive.form.basic.specificationInfo')"
path="attributes"
:min="1"
:creator-initial-value="
() => ({
name: $t('page.proNaive.form.basic.color'),
items: [
{ name: $t('page.proNaive.form.basic.specificationColorRed') },
{ name: $t('page.proNaive.form.basic.specificationColorOrange') }
]
})
"
:copy-button-props="false"
:creator-button-props="{
content: $t('page.proNaive.form.basic.addSpecificateItem')
}"
>
<template #item="{ index, itemDom, actionDom }">
<NCard
size="small"
embedded
:title="`${$t('page.proNaive.form.basic.specificate')}${index + 1}`"
class="mb-8px"
>
<template #header-extra>
<component :is="actionDom" />
</template>
<component :is="itemDom" />
</NCard>
</template>
<ProInput <ProInput
:title="$t('page.proNaive.form.basic.specificationName')" :title="$t('page.proNaive.form.basic.appName')"
path="name" :tooltip="$t('page.proNaive.form.basic.appName')"
path="appName"
/>
</NGi>
<NGi>
<ProSelect
:title="$t('page.proNaive.form.basic.appStatus')"
path="appStatus"
:field-props="{ :field-props="{
class: 'w-230px!' options: [
{ label: $t('page.proNaive.form.basic.normal'), value: 0 },
{ label: $t('page.proNaive.form.basic.anomaly'), value: 1 }
]
}" }"
/> />
</NGi>
<NGi>
<ProDate :title="$t('page.proNaive.form.basic.createTime')" path="createTime" />
</NGi>
<NGi>
<ProDate :title="$t('page.proNaive.form.basic.responseDate')" path="responseDate" required />
</NGi>
<NGi :span="3">
<ProFormList <ProFormList
:title="$t('page.proNaive.form.basic.specificationValue')" :title="$t('page.proNaive.form.basic.specificationInfo')"
path="items" path="attributes"
:min="1" :min="1"
:creator-button-props="{ :creator-initial-value="
dashed: false, () => ({
block: false, name: $t('page.proNaive.form.basic.color'),
renderIcon: undefined, items: [
ghost: true, { name: $t('page.proNaive.form.basic.specificationColorRed') },
text: true, { name: $t('page.proNaive.form.basic.specificationColorOrange') }
type: 'info', ]
content: $t('page.proNaive.form.basic.add') })
}" "
:copy-button-props="false" :copy-button-props="false"
:remove-button-props="{ :creator-button-props="{
tooltip: $t('page.proNaive.form.basic.delete') content: $t('page.proNaive.form.basic.addSpecificateItem')
}" }"
> >
<template #item="{ itemDom, actionDom }"> <template #item="{ index, itemDom, actionDom }">
<div class="me-25px inline-flex"> <NCard
<component :is="itemDom" /> size="small"
<div class="ml-8px"> embedded
:title="`${$t('page.proNaive.form.basic.specificate')}${index + 1}`"
class="mb-8px"
>
<template #header-extra>
<component :is="actionDom" /> <component :is="actionDom" />
</div> </template>
</div> <component :is="itemDom" />
</NCard>
</template> </template>
<ProInput <ProInput
:title="$t('page.proNaive.form.basic.specificationName')"
path="name" path="name"
:field-props="{ :field-props="{
class: 'w-104px!' class: 'w-230px!'
}" }"
/> />
<ProFormList
:title="$t('page.proNaive.form.basic.specificationValue')"
path="items"
:min="1"
:creator-button-props="{
dashed: false,
block: false,
renderIcon: undefined,
ghost: true,
text: true,
type: 'info',
content: $t('page.proNaive.form.basic.add')
}"
:copy-button-props="false"
:remove-button-props="{
tooltip: $t('page.proNaive.form.basic.delete')
}"
>
<template #item="{ itemDom, actionDom }">
<div class="me-25px inline-flex">
<component :is="itemDom" />
<div class="ml-8px">
<component :is="actionDom" />
</div>
</div>
</template>
<ProInput
path="name"
:field-props="{
class: 'w-104px!'
}"
/>
</ProFormList>
</ProFormList> </ProFormList>
</ProFormList> </NGi>
</NGi> </NGrid>
</NGrid> </ProCard>
</ProCard> </ProForm>
</ProForm> </ConfigProvider>
</template> </template>

View File

@@ -4,6 +4,7 @@ import { useMessage } from 'naive-ui';
import type { ProSearchFormColumns } from 'pro-naive-ui'; import type { ProSearchFormColumns } from 'pro-naive-ui';
import { createProSearchForm } from 'pro-naive-ui'; import { createProSearchForm } from 'pro-naive-ui';
import { $t } from '@/locales'; import { $t } from '@/locales';
import ConfigProvider from '../../ConfigProvider.vue';
interface Info { interface Info {
appName: string; appName: string;
@@ -85,12 +86,14 @@ function delay(time: number) {
</script> </script>
<template> <template>
<div class="bg-#fff"> <ConfigProvider>
<ProCard :title="$t('page.proNaive.form.query.title1')" :show-collapse="false"> <div class="bg-#fff">
<ProSearchForm :form="form" :loading="loading" :columns="columns" /> <ProCard :title="$t('page.proNaive.form.query.title1')" :show-collapse="false">
</ProCard> <ProSearchForm :form="form" :loading="loading" :columns="columns" />
<ProCard class="mt-12px" :title="$t('page.proNaive.form.query.title2')" :show-collapse="false"> </ProCard>
<ProSearchForm :form="form2" :loading="loading2" :columns="columns2" :collapsed-rows="2" /> <ProCard class="mt-12px" :title="$t('page.proNaive.form.query.title2')" :show-collapse="false">
</ProCard> <ProSearchForm :form="form2" :loading="loading2" :columns="columns2" :collapsed-rows="2" />
</div> </ProCard>
</div>
</ConfigProvider>
</template> </template>

View File

@@ -3,6 +3,7 @@ import { ref } from 'vue';
import { useMessage } from 'naive-ui'; import { useMessage } from 'naive-ui';
import { createProForm } from 'pro-naive-ui'; import { createProForm } from 'pro-naive-ui';
import { $t } from '@/locales'; import { $t } from '@/locales';
import ConfigProvider from '../../ConfigProvider.vue';
const step = ref(1); const step = ref(1);
const submiting = ref(false); const submiting = ref(false);
@@ -37,33 +38,35 @@ function delay(time: number) {
</script> </script>
<template> <template>
<div class="color-#fff"> <ConfigProvider>
<ProCard :title="$t('page.proNaive.form.step.title')" :segmented="{ content: true }" :show-collapse="false"> <div class="color-#fff">
<div class="flex flex-col items-center justify-center"> <ProCard :title="$t('page.proNaive.form.step.title')" :segmented="{ content: true }" :show-collapse="false">
<NSteps :current="step" class="mb-50px ml-200px w-60%"> <div class="flex flex-col items-center justify-center">
<NStep :title="$t('page.proNaive.form.step.step1.title')" /> <NSteps :current="step" class="mb-50px ml-200px w-60%">
<NStep :title="$t('page.proNaive.form.step.step2.title')" /> <NStep :title="$t('page.proNaive.form.step.step1.title')" />
</NSteps> <NStep :title="$t('page.proNaive.form.step.step2.title')" />
<template v-if="step === 1"> </NSteps>
<ProForm :form="form" label-placement="left"> <template v-if="step === 1">
<ProInput :title="$t('page.proNaive.form.step.step1.field')" path="form1Field" required /> <ProForm :form="form" label-placement="left">
<NButton @click="toNextStepAfterValidated">{{ $t('page.proNaive.form.step.step1.nextStep') }}</NButton> <ProInput :title="$t('page.proNaive.form.step.step1.field')" path="form1Field" required />
</ProForm> <NButton @click="toNextStepAfterValidated">{{ $t('page.proNaive.form.step.step1.nextStep') }}</NButton>
</template> </ProForm>
<template v-if="step === 2"> </template>
<ProForm :form="form2" :loading="submiting" label-placement="left"> <template v-if="step === 2">
<ProInput :title="$t('page.proNaive.form.step.step2.field')" path="form2Field" required /> <ProForm :form="form2" :loading="submiting" label-placement="left">
<NFlex> <ProInput :title="$t('page.proNaive.form.step.step2.field')" path="form2Field" required />
<NButton :disabled="submiting" @click="step -= 1"> <NFlex>
{{ $t('page.proNaive.form.step.step2.prevStep') }} <NButton :disabled="submiting" @click="step -= 1">
</NButton> {{ $t('page.proNaive.form.step.step2.prevStep') }}
<NButton type="primary" attr-type="submit" :loading="submiting"> </NButton>
{{ $t('page.proNaive.form.step.step2.submit') }} <NButton type="primary" attr-type="submit" :loading="submiting">
</NButton> {{ $t('page.proNaive.form.step.step2.submit') }}
</NFlex> </NButton>
</ProForm> </NFlex>
</template> </ProForm>
</div> </template>
</ProCard> </div>
</div> </ProCard>
</div>
</ConfigProvider>
</template> </template>

View File

@@ -10,6 +10,7 @@ import {
useNDataTable useNDataTable
} from 'pro-naive-ui'; } from 'pro-naive-ui';
import { $t } from '@/locales'; import { $t } from '@/locales';
import ConfigProvider from '../../ConfigProvider.vue';
function fetchList(params: any, values: any) { function fetchList(params: any, values: any) {
console.log(params, values); console.log(params, values);
@@ -123,17 +124,19 @@ const {
</script> </script>
<template> <template>
<div class="flex flex-col"> <ConfigProvider>
<ProCard :title="$t('page.proNaive.table.remote.filterCondition')" class="mb-24px" :show-collapse="false"> <div class="h-full flex flex-col">
<ProSearchForm :form="searchForm" label-placement="left" :columns="searchColumns" v-bind="proSearchFormProps" /> <ProCard :title="$t('page.proNaive.table.remote.filterCondition')" class="mb-24px" :show-collapse="false">
</ProCard> <ProSearchForm :form="searchForm" label-placement="left" :columns="searchColumns" v-bind="proSearchFormProps" />
<ProDataTable </ProCard>
:title="$t('page.proNaive.table.remote.title')" <ProDataTable
size="small" :title="$t('page.proNaive.table.remote.title')"
flex-height size="small"
:columns="columns" flex-height
row-key="no" :columns="columns"
v-bind="tableProps" row-key="no"
/> v-bind="tableProps"
</div> />
</div>
</ConfigProvider>
</template> </template>

View File

@@ -4,6 +4,7 @@ import { NButton, NFlex, useMessage } from 'naive-ui';
import type { ProEditDataTableColumns } from 'pro-naive-ui'; import type { ProEditDataTableColumns } from 'pro-naive-ui';
import { createProForm } from 'pro-naive-ui'; import { createProForm } from 'pro-naive-ui';
import { $t } from '@/locales'; import { $t } from '@/locales';
import ConfigProvider from '../../ConfigProvider.vue';
interface DataSourceType { interface DataSourceType {
id: string; id: string;
@@ -103,33 +104,35 @@ const columns = computed<ProEditDataTableColumns<DataSourceType>>(() => {
</script> </script>
<template> <template>
<ProForm :form="form" label-placement="left"> <ConfigProvider>
<ProConfigProvider <ProForm :form="form" label-placement="left">
:prop-overrides="{ <ProConfigProvider
ProFormItem: { :prop-overrides="{
showFeedback: false ProFormItem: {
} showFeedback: false
}" }
>
<ProEditDataTable
v-model:editable-keys="editableKeys"
path="list"
:columns="columns"
:record-creator-props="{
record: () => ({ id: Date.now() })
}"
row-key="id"
:field-props="{
title: $t('page.proNaive.table.rowEdit.title')
}" }"
> >
<template #toolbar> <ProEditDataTable
<NFlex> v-model:editable-keys="editableKeys"
<NButton attr-type="reset">{{ $t('page.proNaive.table.rowEdit.reset') }}</NButton> path="list"
<NButton type="primary" attr-type="submit">{{ $t('page.proNaive.table.rowEdit.submit') }}</NButton> :columns="columns"
</NFlex> :record-creator-props="{
</template> record: () => ({ id: Date.now() })
</ProEditDataTable> }"
</ProConfigProvider> row-key="id"
</ProForm> :field-props="{
title: $t('page.proNaive.table.rowEdit.title')
}"
>
<template #toolbar>
<NFlex>
<NButton attr-type="reset">{{ $t('page.proNaive.table.rowEdit.reset') }}</NButton>
<NButton type="primary" attr-type="submit">{{ $t('page.proNaive.table.rowEdit.submit') }}</NButton>
</NFlex>
</template>
</ProEditDataTable>
</ProConfigProvider>
</ProForm>
</ConfigProvider>
</template> </template>