ant-design-vue/components/config-provider/demo/direction.vue

561 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<docs>
---
order: 2
title:
zh-CN: 方向
en-US: Direction
---
## zh-CN
这里列出了支持 `rtl` 方向的组件您可以在演示中切换方向
## en-US
Components which support rtl direction are listed here, you can toggle the direction in the demo.
</docs>
<template>
<span style="margin-right: 16px">Change direction of components:</span>
<a-radio-group v-model:value="state.direction">
<a-radio-button value="ltr">LTR</a-radio-button>
<a-radio-button value="rtl">RTL</a-radio-button>
</a-radio-group>
<a-divider />
<a-config-provider :direction="state.direction">
<a-space direction="vertical" class="direction-components">
<a-row>
<a-col :span="24">
<a-divider orientation="left">Cascader example</a-divider>
<a-cascader
:options="cascaderOptions"
placeholder="یک مورد انتخاب کنید"
:placement="state.popupPlacement"
@change="onCascaderChange"
>
<template #suffixIcon><SearchIcon /></template>
</a-cascader>
&nbsp;&nbsp;&nbsp;&nbsp; With search:
<a-cascader
:options="cascaderOptions"
placeholder="Select an item"
:placement="state.popupPlacement"
:show-search="{ filter: cascaderFilter }"
@change="onCascaderChange"
>
<template #suffixIcon><SmileOutlined /></template>
</a-cascader>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-divider orientation="left">Switch example</a-divider>
<a-space>
<a-switch default-checked />
<a-switch loading default-checked />
<a-switch size="small" loading />
</a-space>
</a-col>
<a-col :span="12">
<a-divider orientation="left">Radio Group example</a-divider>
<a-radio-group default-value="c" button-style="solid">
<a-radio-button value="a">تهران</a-radio-button>
<a-radio-button value="b" disabled>اصفهان</a-radio-button>
<a-radio-button value="c">فارس</a-radio-button>
<a-radio-button value="d">خوزستان</a-radio-button>
</a-radio-group>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-divider orientation="left">Button example</a-divider>
<div class="button-demo">
<a-button type="primary">
<template #icon><DownloadOutlined /></template>
</a-button>
<a-button type="primary" shape="circle">
<template #icon><DownloadOutlined /></template>
</a-button>
<a-button type="primary" shape="round">
<template #icon><DownloadOutlined /></template>
</a-button>
<a-button type="primary" shape="round">
<template #icon><DownloadOutlined /></template>
Download
</a-button>
<a-button type="primary">
<template #icon><DownloadOutlined /></template>
Download
</a-button>
<br />
<a-button-group>
<a-button type="primary">
<LeftOutlined />
Backward
</a-button>
<a-button type="primary">
Forward
<RightOutlined />
</a-button>
</a-button-group>
<a-button type="primary" loading>Loading</a-button>
<a-button type="primary" size="small" loading>Loading</a-button>
</div>
</a-col>
<a-col :span="12">
<a-divider orientation="left">Tree example</a-divider>
<a-tree
v-model:expandedKeys="expandedKeys"
v-model:selectedKeys="selectedKeys"
v-model:checkedKeys="checkedKeys"
show-line
checkable
:tree-data="treeData"
>
<template #title="{ title, key }">
<span v-if="key === '0-0-1-0'" style="color: #1890ff">{{ title }}</span>
<template v-else>{{ title }}</template>
</template>
</a-tree>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-divider orientation="left">Input (Input Group) example</a-divider>
<a-space direction="vertical" style="width: 100%">
<a-input-group size="large">
<a-row :gutter="8">
<a-col :span="5">
<a-input default-value="0571" />
</a-col>
<a-col :span="8">
<a-input default-value="26888888" />
</a-col>
</a-row>
</a-input-group>
<a-input-group compact>
<a-input style="width: 20%" default-value="0571" />
<a-input style="width: 30%" default-value="26888888" />
</a-input-group>
<a-input-group compact>
<a-select default-value="Option1">
<a-select-option value="Option1">Option1</a-select-option>
<a-select-option value="Option2">Option2</a-select-option>
</a-select>
<a-input style="width: 50%" default-value="input content" />
<a-inputNumber />
</a-input-group>
<a-input-search placeholder="input search text" enter-button="Search" size="large" />
<div style="margin-bottom: 16px">
<a-input default-value="mysite">
<template #selectBefore>
<a-select default-value="Http://" style="width: 90px">
<a-select-option value="Http://">Http://</a-select-option>
<a-select-option value="Https://">Https://</a-select-option>
</a-select>
</template>
<template #selectAfter>
<a-select default-value=".com" style="width: 80px">
<a-select-option value=".com">.com</a-select-option>
<a-select-option value=".jp">.jp</a-select-option>
<a-select-option value=".cn">.cn</a-select-option>
<a-select-option value=".org">.org</a-select-option>
</a-select>
</template>
</a-input>
</div>
<a-row>
<a-col :span="12">
<a-divider orientation="left">Select example</a-divider>
<a-space wrap>
<a-select mode="multiple" default-value="مورچه" style="width: 120px">
<a-select-option value="jack">Jack</a-select-option>
<a-select-option value="مورچه">مورچه</a-select-option>
<a-select-option value="disabled" disabled>Disabled</a-select-option>
<a-select-option value="Yiminghe">yiminghe</a-select-option>
</a-select>
<a-select default-value="مورچه" style="width: 120px" disabled>
<a-select-option value="مورچه">مورچه</a-select-option>
</a-select>
<a-select default-value="مورچه" style="width: 120px" loading>
<a-select-option value="مورچه">مورچه</a-select-option>
</a-select>
<a-select
show-search
style="width: 200px"
placeholder="Select a person"
option-filter-prop="children"
:filter-option="
(input, option) =>
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
"
>
<a-select-option value="jack">Jack</a-select-option>
<a-select-option value="سعید">سعید</a-select-option>
<a-select-option value="tom">Tom</a-select-option>
</a-select>
</a-space>
</a-col>
<a-col :span="12">
<a-divider orientation="left">TreeSelect example</a-divider>
<div>
<a-tree-select
show-search
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="Please select"
allow-clear
tree-default-expand-all
:tree-data="treeSelectData"
></a-tree-select>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-divider orientation="left">Modal example</a-divider>
<div>
<a-button type="primary" @click="showModal">Open Modal</a-button>
<a-modal v-model:open="state.modalVisible" title="پنچره ساده">
<p>نگاشته‌های خود را اینجا قراردهید</p>
<p>نگاشته‌های خود را اینجا قراردهید</p>
<p>نگاشته‌های خود را اینجا قراردهید</p>
</a-modal>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-divider orientation="left">Steps example</a-divider>
<div>
<a-steps
progress-dot
:current="state.currentStep"
:items="[
{
title: 'Finished',
description: 'This is a description.',
},
{
title: 'In Progress',
description: 'This is a description.',
},
{
title: 'Waiting',
description: 'This is a description.',
},
]"
></a-steps>
<br />
<a-steps
:current="state.currentStep"
:items="[
{
title: 'Step 1',
description: 'This is a description.',
},
{
title: 'Step 2',
description: 'This is a description.',
},
{
title: 'Step 3',
description: 'This is a description.',
},
]"
@change="onStepsChange"
></a-steps>
</div>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-divider orientation="left">Rate example</a-divider>
<div>
<a-rate v-model:value="rateValue" />
<br />
<strong>* Note:</strong>
Half star not implemented in RTL direction.
</div>
</a-col>
<a-col :span="12">
<a-divider orientation="left">Badge example</a-divider>
<div>
<div>
<a-badge :count="state.badgeCount">
<a href="#" class="head-example" />
</a-badge>
<a-button-group>
<a-button @click="declineBadge">
<MinusOutlined />
</a-button>
<a-button @click="increaseBadge">
<PlusOutlined />
</a-button>
</a-button-group>
</div>
<div style="margin-top: 10px">
<a-badge :dot="state.showBadge">
<a href="#" class="head-example" />
</a-badge>
<a-switch :checked="state.showBadge" @change="onChangeBadge" />
</div>
</div>
</a-col>
</a-row>
</a-space>
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-divider orientation="left">Pagination example</a-divider>
<a-pagination show-size-changer :default-current="3" :total="500" />
</a-col>
</a-row>
<a-row>
<a-col :span="24">
<a-divider orientation="left">Grid System example</a-divider>
<div class="grid-demo">
<div class="code-box-demo">
<p>
<strong>* Note:</strong>
Every calculation in RTL grid system is from right side (offset, push, etc.)
</p>
<a-row>
<a-col :span="8">col-8</a-col>
<a-col :span="8" :offset="8">col-8</a-col>
</a-row>
<a-row>
<a-col :span="6" :offset="6">col-6 col-offset-6</a-col>
<a-col :span="6" :offset="6">col-6 col-offset-6</a-col>
</a-row>
<a-row>
<a-col :span="12" :offset="6">col-12 col-offset-6</a-col>
</a-row>
<a-row>
<a-col :span="18" :push="6">col-18 col-push-6</a-col>
<a-col :span="6" :pull="18">col-6 col-pull-18</a-col>
</a-row>
</div>
</div>
</a-col>
</a-row>
</a-space>
</a-config-provider>
</template>
<script lang="ts" setup>
import { reactive, watch, ref } from 'vue';
import {
SearchOutlined as SearchIcon,
SmileOutlined,
DownloadOutlined,
LeftOutlined,
RightOutlined,
MinusOutlined,
PlusOutlined,
} from '@ant-design/icons-vue';
import type { TreeProps, TreeSelectProps, CascaderProps } from 'ant-design-vue';
const state = reactive({
currentStep: 0,
modalVisible: false,
badgeCount: 5,
showBadge: true,
direction: 'ltr' as 'ltr' | 'rtl',
popupPlacement: 'bottomLeft' as CascaderProps['placement'],
});
const expandedKeys = ref<string[]>(['0-0-0', '0-0-1']);
const selectedKeys = ref<string[]>(['0-0-0', '0-0-1']);
const checkedKeys = ref<string[]>(['0-0-0', '0-0-1']);
const treeData: TreeProps['treeData'] = [
{
title: 'parent 1',
key: '0-0',
children: [
{
title: 'parent 1-0',
key: '0-0-0',
disabled: true,
children: [
{ title: 'leaf', key: '0-0-0-0', disableCheckbox: true },
{ title: 'leaf', key: '0-0-0-1' },
],
},
{
title: 'parent 1-1',
key: '0-0-1',
children: [{ key: '0-0-1-0', title: 'sss' }],
},
],
},
];
const treeSelectData = ref<TreeSelectProps['treeData']>([
{
title: 'parent 1',
value: 'parent 1',
children: [
{
title: 'parent 1-0',
value: 'parent 1-0',
children: [
{
title: 'my leaf',
value: 'leaf1',
},
{
title: 'your leaf',
value: 'leaf2',
},
],
},
{
title: 'parent 1-1',
value: 'parent 1-1',
},
],
},
]);
watch(
() => state.direction,
directionValue => {
if (directionValue === 'rtl') {
state.popupPlacement = 'bottomRight';
} else {
state.popupPlacement = 'bottomLeft';
}
},
);
const cascaderOptions = [
{
value: 'tehran',
label: 'تهران',
children: [
{
value: 'tehran-c',
label: 'تهران',
children: [
{
value: 'saadat-abad',
label: 'سعادت آیاد',
},
],
},
],
},
{
value: 'ardabil',
label: 'اردبیل',
children: [
{
value: 'ardabil-c',
label: 'اردبیل',
children: [
{
value: 'primadar',
label: 'پیرمادر',
},
],
},
],
},
{
value: 'gilan',
label: 'گیلان',
children: [
{
value: 'rasht',
label: 'رشت',
children: [
{
value: 'district-3',
label: 'منطقه ۳',
},
],
},
],
},
];
// ==== Cascader ====
const cascaderFilter = (inputValue, path) =>
path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
const onCascaderChange = value => {
console.log(value);
};
// ==== End Cascader ====
// ==== Modal ====
const showModal = () => {
state.modalVisible = true;
};
// ==== End Modal ====
const onStepsChange = currentStep => {
console.log('onChange:', currentStep);
state.currentStep = currentStep;
};
// ==== Badge ====
const increaseBadge = () => {
const badgeCount = state.badgeCount + 1;
state.badgeCount = badgeCount;
};
const declineBadge = () => {
let badgeCount = state.badgeCount - 1;
if (badgeCount < 0) {
badgeCount = 0;
}
state.badgeCount = badgeCount;
};
const onChangeBadge = showBadge => {
state.showBadge = showBadge;
};
const rateValue = ref(2);
</script>
<style lang="less" scoped>
.direction-components {
width: 100%;
.button-demo .ant-btn,
.button-demo .ant-btn-group {
margin-right: 8px;
margin-bottom: 12px;
}
.button-demo .ant-btn-group > .ant-btn,
.button-demo .ant-btn-group > span > .ant-btn {
margin-right: 0;
margin-left: 0;
}
.head-example {
display: inline-block;
width: 42px;
height: 42px;
vertical-align: middle;
background: #eee;
border-radius: 4px;
}
.ant-badge:not(.ant-badge-not-a-wrapper) {
margin-right: 20px;
}
.ant-badge-rtl:not(.ant-badge-not-a-wrapper) {
margin-right: 0;
margin-left: 20px;
}
}
[data-theme='dark'] .head-example {
background: rgba(255, 255, 255, 0.12);
}
</style>