|
@@ -1,29 +1,48 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div :class="[
|
|
|
|
|
- 'dynamic-form-group',
|
|
|
|
|
- {
|
|
|
|
|
- 'collapsed': collapsed,
|
|
|
|
|
- 'collapsible': collapsible,
|
|
|
|
|
- 'plain': plain,
|
|
|
|
|
- }
|
|
|
|
|
- ]">
|
|
|
|
|
- <h5 v-if="title" class="title" @click="collapsible ? collapsed = !collapsed : null">
|
|
|
|
|
- <span class="title-text">{{ title }}</span>
|
|
|
|
|
- <view class="title-right">
|
|
|
|
|
- <span class="title-right-text" v-show="collapsed">点击展开更多</span>
|
|
|
|
|
- <Icon :size="22" icon="arrow-down" v-if="collapsible" innerClass="collapsible-icon" />
|
|
|
|
|
- </view>
|
|
|
|
|
- </h5>
|
|
|
|
|
|
|
+ <FlexCol
|
|
|
|
|
+ :innerClass="[
|
|
|
|
|
+ 'dynamic-form-group',
|
|
|
|
|
+ {
|
|
|
|
|
+ 'collapsed': collapsed,
|
|
|
|
|
+ 'collapsible': collapsible,
|
|
|
|
|
+ 'plain': plain,
|
|
|
|
|
+ }
|
|
|
|
|
+ ]"
|
|
|
|
|
+ :innerStyle="dynamicFormGroupStyle"
|
|
|
|
|
+ >
|
|
|
|
|
+ <Touchable
|
|
|
|
|
+ v-if="title"
|
|
|
|
|
+ innerClass="title"
|
|
|
|
|
+ direction="row"
|
|
|
|
|
+ :innerStyle="dynamicFormGroupTitleWraperStyle"
|
|
|
|
|
+ @click="collapsible ? collapsed = !collapsed : null"
|
|
|
|
|
+ >
|
|
|
|
|
+ <span :style="dynamicFormGroupTitleStyle">{{ title }}</span>
|
|
|
|
|
+ <FlexRow align="center">
|
|
|
|
|
+ <text :style="dynamicFormGroupTitleStyle" v-show="collapsed">点击展开更多</text>
|
|
|
|
|
+ <Icon
|
|
|
|
|
+ v-if="collapsible"
|
|
|
|
|
+ :size="theme.resolveThemeSize('DynamicFormGroupIconSize', 22)"
|
|
|
|
|
+ icon="arrow-down"
|
|
|
|
|
+ innerClass="collapsible-icon"
|
|
|
|
|
+ />
|
|
|
|
|
+ </FlexRow>
|
|
|
|
|
+ </Touchable>
|
|
|
<Row v-if="!collapsed" :justify="(justify as any)" :gutter="gutter">
|
|
<Row v-if="!collapsed" :justify="(justify as any)" :gutter="gutter">
|
|
|
<slot />
|
|
<slot />
|
|
|
</Row>
|
|
</Row>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </FlexCol>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
-import { ref } from "vue";
|
|
|
|
|
|
|
+import { computed, ref } from "vue";
|
|
|
import Row from "@/components/layout/grid/Row.vue";
|
|
import Row from "@/components/layout/grid/Row.vue";
|
|
|
import Icon from "@/components/basic/Icon.vue";
|
|
import Icon from "@/components/basic/Icon.vue";
|
|
|
|
|
+import { useTheme } from "@/components/theme/ThemeDefine";
|
|
|
|
|
+import FlexRow from "@/components/layout/FlexRow.vue";
|
|
|
|
|
+import Touchable from "@/components/feedback/Touchable.vue";
|
|
|
|
|
+import FlexCol from "@/components/layout/FlexCol.vue";
|
|
|
|
|
+
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
|
/**
|
|
/**
|
|
|
* 标题
|
|
* 标题
|
|
@@ -68,8 +87,22 @@ const props = defineProps({
|
|
|
default: false,
|
|
default: false,
|
|
|
},
|
|
},
|
|
|
});
|
|
});
|
|
|
|
|
+const theme = useTheme();
|
|
|
|
|
|
|
|
const collapsed = ref(props.collapsed);
|
|
const collapsed = ref(props.collapsed);
|
|
|
|
|
+const dynamicFormGroupStyle = computed(() => ({
|
|
|
|
|
+ backgroundColor: theme.resolveThemeColor('DynamicFormGroupBackgroundColor', 'white'),
|
|
|
|
|
+ borderRadius: theme.resolveThemeSize('DynamicFormGroupBorderRadius', 10),
|
|
|
|
|
+ padding: `${theme.resolveThemeSize('DynamicFormGroupPaddingVertical', 10)} ${theme.resolveThemeSize('DynamicFormGroupPaddingHorizontal', 0)}`,
|
|
|
|
|
+ marginBottom: theme.resolveThemeSize('DynamicFormGroupMarginBottom', 12),
|
|
|
|
|
+}));
|
|
|
|
|
+const dynamicFormGroupTitleWraperStyle = computed(() => ({
|
|
|
|
|
+ marginBottom: theme.resolveThemeSize('DynamicFormGroupTitleMarginBottom', 12),
|
|
|
|
|
+}));
|
|
|
|
|
+const dynamicFormGroupTitleStyle = computed(() => ({
|
|
|
|
|
+ fontSize: theme.resolveThemeSize('DynamicFormGroupTitleFontSize', 25),
|
|
|
|
|
+ color: theme.resolveThemeColor('DynamicFormGroupTitleColor', 'text.second')
|
|
|
|
|
+}));
|
|
|
|
|
|
|
|
defineOptions({
|
|
defineOptions({
|
|
|
options: {
|
|
options: {
|
|
@@ -82,10 +115,6 @@ defineOptions({
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
<style lang="scss">
|
|
|
.dynamic-form-group {
|
|
.dynamic-form-group {
|
|
|
- padding: 10px 0;
|
|
|
|
|
- background-color: var(--dynamic-form-background-color);
|
|
|
|
|
- border-radius: var(--dynamic-form-border-radius);
|
|
|
|
|
-
|
|
|
|
|
&.collapsed {
|
|
&.collapsed {
|
|
|
.collapsible-icon {
|
|
.collapsible-icon {
|
|
|
transform: rotate(0deg);
|
|
transform: rotate(0deg);
|
|
@@ -96,32 +125,19 @@ defineOptions({
|
|
|
cursor: pointer;
|
|
cursor: pointer;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.collapsible-icon {
|
|
.collapsible-icon {
|
|
|
transform: rotate(180deg);
|
|
transform: rotate(180deg);
|
|
|
transition: transform 0.3s ease-in-out;
|
|
transition: transform 0.3s ease-in-out;
|
|
|
- width: 16px;
|
|
|
|
|
- height: 16px;
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.title {
|
|
.title {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
- color: var(--dynamic-form-text-color);
|
|
|
|
|
- margin: 0;
|
|
|
|
|
- margin-bottom: 12px;
|
|
|
|
|
|
|
|
|
|
.title-right {
|
|
.title-right {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: row;
|
|
flex-direction: row;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
-
|
|
|
|
|
- .title-right-text {
|
|
|
|
|
- font-size: 11px;
|
|
|
|
|
- margin-right: 10rpx;
|
|
|
|
|
- color: var(--dynamic-form-secondary-color);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|