@peng_kai/kit 0.2.17 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -249,8 +249,7 @@ function resetSetting() {
|
|
|
249
249
|
v-bind="settingForm.props"
|
|
250
250
|
class="ant-cover__col2-form"
|
|
251
251
|
layout="vertical"
|
|
252
|
-
:disabled="settingMutator.isPending.value"
|
|
253
|
-
:readonly="props.readonly"
|
|
252
|
+
:disabled="settingMutator.isPending.value || props.readonly"
|
|
254
253
|
>
|
|
255
254
|
<template v-for="item of configList" :key="item.key">
|
|
256
255
|
<FormItem v-bind="settingForm.itemProps[item.key]" :label="item.label" :extra="item.summary">
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { computed,
|
|
2
|
+
import { computed, defineModel, watch } from 'vue';
|
|
3
3
|
import { InputNumber as AInputNumber, Form } from 'ant-design-vue';
|
|
4
|
-
import { isNil } from 'lodash-es';
|
|
5
4
|
</script>
|
|
6
5
|
|
|
7
6
|
<script setup lang="ts">
|
|
8
7
|
const props = withDefaults(
|
|
9
8
|
defineProps<{
|
|
10
|
-
value: [number | undefined, number | undefined]
|
|
11
9
|
placeholder?: [string, string]
|
|
12
10
|
min?: number
|
|
13
11
|
max?: number
|
|
@@ -17,41 +15,38 @@ const props = withDefaults(
|
|
|
17
15
|
max: Number.POSITIVE_INFINITY,
|
|
18
16
|
},
|
|
19
17
|
);
|
|
20
|
-
const
|
|
21
|
-
(e: 'update:value', value: typeof props.value): void
|
|
22
|
-
}>();
|
|
18
|
+
const rangeValue = defineModel<[number | undefined, number | undefined]>('value', { default: [] });
|
|
23
19
|
|
|
24
20
|
const formItemContext = Form.useInjectFormItemContext();
|
|
25
21
|
const minValue = computed({
|
|
26
|
-
get: () =>
|
|
27
|
-
set: v =>
|
|
22
|
+
get: () => rangeValue.value[0],
|
|
23
|
+
set: v => rangeValue.value = [v, rangeValue.value[1]],
|
|
28
24
|
});
|
|
29
25
|
const maxValue = computed({
|
|
30
|
-
get: () =>
|
|
31
|
-
set: v =>
|
|
26
|
+
get: () => rangeValue.value[1],
|
|
27
|
+
set: v => rangeValue.value = [rangeValue.value[0], v],
|
|
32
28
|
});
|
|
33
29
|
|
|
34
30
|
watch([minValue, maxValue], () => formItemContext.onFieldChange());
|
|
35
31
|
|
|
36
32
|
function onBlur() {
|
|
37
|
-
const min =
|
|
38
|
-
const max = props.value[1];
|
|
33
|
+
const [min, max] = rangeValue.value;
|
|
39
34
|
|
|
40
|
-
if (
|
|
41
|
-
|
|
35
|
+
if (typeof min === 'number' && typeof max === 'number')
|
|
36
|
+
rangeValue.value = min > max ? [max, min] : [min, max];
|
|
42
37
|
}
|
|
43
38
|
</script>
|
|
44
39
|
|
|
45
40
|
<template>
|
|
46
41
|
<div class="flex items-center">
|
|
47
42
|
<AInputNumber
|
|
48
|
-
v-model:value="
|
|
43
|
+
v-model:value="rangeValue[0]" class="w-full" :min="props.min"
|
|
49
44
|
:max="props.max" :placeholder="props.placeholder?.[0]"
|
|
50
45
|
@blur="onBlur"
|
|
51
46
|
/>
|
|
52
47
|
<span> - </span>
|
|
53
48
|
<AInputNumber
|
|
54
|
-
v-model:value="
|
|
49
|
+
v-model:value="rangeValue[1]" class="w-full" :min="props.min"
|
|
55
50
|
:max="props.max" :placeholder="props.placeholder?.[1]"
|
|
56
51
|
@blur="onBlur"
|
|
57
52
|
/>
|
package/package.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { computed, reactive, ref, toValue, watch } from 'vue';
|
|
3
|
+
import { useElementBounding, useMutationObserver } from '@vueuse/core';
|
|
4
|
+
import { useTemplateRefs } from '../../hooks/useTemplateRefs';
|
|
3
5
|
import { type IProvide as INavManagerProvide, useNavManagerRouter } from './useNavManager';
|
|
4
6
|
|
|
5
7
|
function useHistory(initialValue: string[] = []) {
|
|
@@ -49,10 +51,26 @@ const emits = defineEmits<{
|
|
|
49
51
|
(e: 'close'): void
|
|
50
52
|
}>();
|
|
51
53
|
|
|
54
|
+
const [refs, setRefs] = useTemplateRefs<{
|
|
55
|
+
header: HTMLDivElement
|
|
56
|
+
}>();
|
|
52
57
|
const viewMap = reactive<Record<string, Parameters<INavManagerProvide['addView']>[0]>>({});
|
|
53
58
|
const history = useHistory([props.indexName]);
|
|
54
59
|
const currentView = computed(() => viewMap[history.current]);
|
|
55
60
|
const transitionName = computed(() => `view-${history.lastOperation}`);
|
|
61
|
+
const { height: headerHeight } = useElementBounding(() => refs.header);
|
|
62
|
+
const cssVars = computed(() => ({
|
|
63
|
+
'--header-height-neg': `-${headerHeight.value}px`,
|
|
64
|
+
'--header-height': `${headerHeight.value}px`,
|
|
65
|
+
}));
|
|
66
|
+
// 检查 header 中是否从外部插入了DOM(例如通过Teleport),如果有插入则将header中的所有需要隐藏的本地DOM都隐藏
|
|
67
|
+
const isCoverHeader = ref(false);
|
|
68
|
+
const headerNeedCoverClasses = ['nav-back-btn', 'nav-title', 'nav-close-btn'].map(cls => `.${cls}.need-cover`);
|
|
69
|
+
const headerNeedCoverSelector = `:scope > :not(${headerNeedCoverClasses.join(',')})`;
|
|
70
|
+
useMutationObserver(() => refs.header, () => {
|
|
71
|
+
const children = refs.header?.querySelectorAll(headerNeedCoverSelector);
|
|
72
|
+
isCoverHeader.value = !!children?.length;
|
|
73
|
+
}, { childList: true });
|
|
56
74
|
|
|
57
75
|
watch(currentView, (view, oldView) => {
|
|
58
76
|
oldView?.hide();
|
|
@@ -71,33 +89,37 @@ useNavManagerRouter(navManager);
|
|
|
71
89
|
</script>
|
|
72
90
|
|
|
73
91
|
<template>
|
|
74
|
-
<div class="tt-nav-manager box-border
|
|
75
|
-
<div class="
|
|
76
|
-
<
|
|
77
|
-
<
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
<div class="tt-nav-manager box-border" :class="[currentView?.name]" :style="cssVars">
|
|
93
|
+
<div class="relative h-full overflow-x-hidden bg-inherit">
|
|
94
|
+
<div :ref="setRefs.header" class="nav-header min-h6 flex items-center sticky z-5 bg-inherit">
|
|
95
|
+
<slot name="header" />
|
|
96
|
+
<template v-if="!isCoverHeader || (!isCoverHeader && !$slots.header)">
|
|
97
|
+
<Transition name="back-btn">
|
|
98
|
+
<div
|
|
99
|
+
v-if="!history.isFirst"
|
|
100
|
+
class="nav-back-btn need-cover mr-2 size-6 flex cursor-pointer items-center justify-center"
|
|
101
|
+
@click="navManager.back()"
|
|
102
|
+
>
|
|
103
|
+
<i class="i-ri:arrow-left-s-line text-6" />
|
|
104
|
+
</div>
|
|
105
|
+
</Transition>
|
|
106
|
+
|
|
107
|
+
<div class="nav-title need-cover flex-1">
|
|
108
|
+
{{ toValue(currentView?.title) }}
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div
|
|
112
|
+
class="nav-close-btn need-cover size-6 flex cursor-pointer items-center justify-center"
|
|
113
|
+
@click="navManager.close()"
|
|
114
|
+
>
|
|
115
|
+
<i class="i-ri:close-line text-6" />
|
|
116
|
+
</div>
|
|
117
|
+
</template>
|
|
88
118
|
</div>
|
|
89
119
|
|
|
90
|
-
<div
|
|
91
|
-
class="nav-close-btn size-6 flex cursor-pointer items-center justify-center"
|
|
92
|
-
@click="navManager.close()"
|
|
93
|
-
>
|
|
94
|
-
<i class="i-ri:close-line text-6" />
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
|
-
<div class="relative flex-1 overflow-x-hidden">
|
|
99
120
|
<Transition :name="transitionName">
|
|
100
|
-
<div :key="currentView?.name" class="absolute left-0 top-0 h-full w-full overflow-
|
|
121
|
+
<div :key="currentView?.name" class="scroll-container absolute left-0 top-0 h-full w-full overflow-y-auto overflow-x-hidden" :class="$props.viewClass">
|
|
122
|
+
<div class="h-$header-height" />
|
|
101
123
|
<slot />
|
|
102
124
|
</div>
|
|
103
125
|
</Transition>
|