parent
b7d451b5fb
commit
32a7696b66
@ -0,0 +1,124 @@ |
|||||||
|
<script lang="ts" setup> |
||||||
|
import { computed, ref } from 'vue' |
||||||
|
|
||||||
|
defineOptions({ |
||||||
|
name: 'Switch' |
||||||
|
}) |
||||||
|
|
||||||
|
const props = withDefaults( |
||||||
|
defineProps<{ |
||||||
|
size?: 'small' | 'medium' | 'large' |
||||||
|
value?: boolean |
||||||
|
loading?: boolean |
||||||
|
defaultValue?: boolean |
||||||
|
disabled?: boolean |
||||||
|
bgActiveColor?: string |
||||||
|
}>(), |
||||||
|
{ |
||||||
|
size: 'medium', |
||||||
|
defaultValue: false, |
||||||
|
disabled: false, |
||||||
|
bgActiveColor: '#0256FF' |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
const { _width } = formartSize(props.size) |
||||||
|
const _bgActiveColor = computed(() => props.bgActiveColor) |
||||||
|
const status = ref<boolean>() |
||||||
|
status.value = props.value || props.defaultValue |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const emits = defineEmits<{ |
||||||
|
(event: 'change', status: boolean): void |
||||||
|
}>() |
||||||
|
|
||||||
|
type tempObj = { |
||||||
|
_width: string |
||||||
|
_height: string |
||||||
|
} |
||||||
|
|
||||||
|
function formartSize(str: string): tempObj { |
||||||
|
let _width = "", _height = "" |
||||||
|
if (str === 'small') { |
||||||
|
_width = "40px" |
||||||
|
_height = "20px" |
||||||
|
} |
||||||
|
if (str === 'medium') { |
||||||
|
_width = "40px" |
||||||
|
_height = "20px" |
||||||
|
} |
||||||
|
if (str === 'large') { |
||||||
|
_width = "40px" |
||||||
|
_height = "20px" |
||||||
|
} |
||||||
|
|
||||||
|
return { _width, _height } |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
const handleClick = () => { |
||||||
|
if (!props.disabled) { |
||||||
|
status.value = !status.value |
||||||
|
emits('change', status.value) |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
<template> |
||||||
|
<div class="d-switch" :class="{ 'is-checked': status }"> |
||||||
|
<input |
||||||
|
class="d-switch__input" |
||||||
|
ref="input" |
||||||
|
type="checkbox" |
||||||
|
:checked="status" |
||||||
|
@change="handleClick" |
||||||
|
/> |
||||||
|
<span class="d-switch_action"></span> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="less" scoped> |
||||||
|
.d-switch { |
||||||
|
position: relative; |
||||||
|
height: 18px; |
||||||
|
transition: #0256FF 0.2s; |
||||||
|
width: v-bind(_width); |
||||||
|
background: rgb(117, 117, 117); |
||||||
|
border-radius: 10px; |
||||||
|
display: inline-flex; |
||||||
|
align-items: center; |
||||||
|
vertical-align: middle; |
||||||
|
.d-switch__input { |
||||||
|
position: relative; |
||||||
|
z-index: 1; |
||||||
|
margin: 0; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
opacity: 0; |
||||||
|
} |
||||||
|
.d-switch_action { |
||||||
|
position: absolute; |
||||||
|
transition: 0.2s; |
||||||
|
left: 2px; |
||||||
|
top: 2px; |
||||||
|
z-index: 0; |
||||||
|
height: 14px; |
||||||
|
width: 14px; |
||||||
|
background: #fff; |
||||||
|
border-radius: 50%; |
||||||
|
} |
||||||
|
&.is-checked { |
||||||
|
background: v-bind(_bgActiveColor); |
||||||
|
.d-switch_action { |
||||||
|
left: 100%; |
||||||
|
background: #fff; |
||||||
|
margin-left: -18px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
</style> |
@ -1,62 +1,86 @@ |
|||||||
<script lang="ts" setup> |
<script lang="ts" setup> |
||||||
import { computed } from "vue"; |
import { computed, ref } from "vue"; |
||||||
import { useSource } from "../context" |
import { useSource } from "../context" |
||||||
defineOptions({ |
defineOptions({ |
||||||
name: "DddBackgroundConfig" |
name: "DddBackgroundConfig" |
||||||
}) |
}) |
||||||
const props = defineProps<{ |
const props = defineProps<{ |
||||||
field: string |
field: string |
||||||
help?: string |
help?: string |
||||||
features: string[] |
features: string[] |
||||||
label?: string |
label?: string |
||||||
}>() |
}>() |
||||||
|
|
||||||
const tempString = useSource(props.field) |
const tempString = useSource<string>(props.field) |
||||||
const typeList = computed(() => { |
|
||||||
return props.features.map((item: any)=> { |
const chooseType = ref<string>() |
||||||
return { |
if(typeof tempString.value === 'string'){ |
||||||
value: item, |
chooseType.value = 'color' |
||||||
label: formart(item) |
} |
||||||
} |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
function formart(str: string) { |
const typeList = computed(() => { |
||||||
const temp: Record<string, any> = { |
return props.features.map((item: any) => { |
||||||
color: '纯色', |
return { |
||||||
gradient: '渐变', |
value: item, |
||||||
|
label: formart(item) |
||||||
} |
} |
||||||
return temp[str] |
}) |
||||||
|
}) |
||||||
|
|
||||||
|
function formart(str: string) { |
||||||
|
const temp: Record<string, any> = { |
||||||
|
color: '纯色', |
||||||
|
gradient: '渐变', |
||||||
} |
} |
||||||
|
return temp[str] |
||||||
|
} |
||||||
</script> |
</script> |
||||||
<template> |
<template> |
||||||
<div class="box"> |
<div> |
||||||
<label>{{ label }}</label> |
<div class="box"> |
||||||
<div class="box-typeList"> |
<label>{{ label }}</label> |
||||||
<div v-for="(item,index) in typeList" :key="index" class="box-typeList-box"> |
<div class="box-typeList"> |
||||||
<span>{{ item.label }}</span> |
<div v-for="(item, index) in typeList" :key="index" :class="{ 'is-active': chooseType === item.value }" |
||||||
|
class="box-typeList-box" @click="chooseType = item.value"> |
||||||
|
<span>{{ item.label }}</span> |
||||||
|
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
</div> |
</div> |
||||||
|
<template v-if="chooseType === 'color'"> |
||||||
|
<label style="display: flex;justify-content: space-between;"> |
||||||
|
<span>颜色</span> |
||||||
|
<input v-model="tempString" type="color"> |
||||||
|
</label> |
||||||
|
</template> |
||||||
</div> |
</div> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<style lang="less" scoped> |
<style lang="less" scoped> |
||||||
.box{ |
.box { |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
&-typeList { |
||||||
display: flex; |
display: flex; |
||||||
justify-content: space-between; |
|
||||||
align-items: center; |
&-box { |
||||||
&-typeList{ |
|
||||||
display: flex; |
display: flex; |
||||||
&-box{ |
color: #0256ff; |
||||||
display: flex; |
border: 1px solid #0256ff; |
||||||
color:#fff; |
width: 50px; |
||||||
background-color: aqua; |
height: 20px; |
||||||
width:50px; |
font-size: 12px; |
||||||
height:20px; |
justify-content: center; |
||||||
font-size: 12px; |
align-items: center; |
||||||
justify-content: center; |
|
||||||
align-items: center; |
&.is-active { |
||||||
|
background-color: #0256ff; |
||||||
|
color: #fff; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
} |
||||||
</style> |
</style> |
||||||
|
@ -0,0 +1,19 @@ |
|||||||
|
<script lang="ts" setup> |
||||||
|
import { ref } from 'vue' |
||||||
|
import { useSource } from "../context" |
||||||
|
defineOptions({ |
||||||
|
name: 'DddBaseConfig' |
||||||
|
}) |
||||||
|
const props = defineProps<{ |
||||||
|
field: string |
||||||
|
label?: string |
||||||
|
help?:string |
||||||
|
}>() |
||||||
|
|
||||||
|
const tempStr = useSource<string>(props.field) |
||||||
|
</script> |
||||||
|
<template> |
||||||
|
<div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</template> |
@ -0,0 +1,21 @@ |
|||||||
|
<script lang="ts" setup> |
||||||
|
import { useSource} from "../context" |
||||||
|
|
||||||
|
defineOptions({ |
||||||
|
name: "DddColorConfig" |
||||||
|
}) |
||||||
|
const props = defineProps<{ |
||||||
|
field: string |
||||||
|
label?: string |
||||||
|
help?: string |
||||||
|
}>() |
||||||
|
|
||||||
|
const tempStr = useSource<string>(props.field) |
||||||
|
</script> |
||||||
|
|
||||||
|
<template> |
||||||
|
<label style="display: flex;justify-content: space-between;align-items: center;"> |
||||||
|
<span>{{ label }}</span> |
||||||
|
<input v-model="tempStr" type="color"> |
||||||
|
</label> |
||||||
|
</template> |
@ -0,0 +1,69 @@ |
|||||||
|
<script lang="ts" setup> |
||||||
|
import { computed } from 'vue'; |
||||||
|
import { RenderConfig } from './render'; |
||||||
|
import { useSource } from '../context' |
||||||
|
defineOptions({ |
||||||
|
name: "DddImageConfig" |
||||||
|
}) |
||||||
|
const props = defineProps<{ |
||||||
|
field: string |
||||||
|
label?: string |
||||||
|
help?: string |
||||||
|
required?: boolean |
||||||
|
inlines?: any |
||||||
|
}>() |
||||||
|
|
||||||
|
const inlineFieldPrefix = computed(() => { |
||||||
|
const i = props.field.lastIndexOf('.') |
||||||
|
return i > -1 ? `${props.field.slice(0, i)}.` : '' |
||||||
|
}) |
||||||
|
|
||||||
|
const img = useSource<string>(props.field) |
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
<template> |
||||||
|
<div class="container"> |
||||||
|
<div class="container-imgbox"> |
||||||
|
<span>{{ label }}<span v-if="required" style="color: brown;">*</span></span> |
||||||
|
<!-- <input type="text" v-model="img"> --> |
||||||
|
</div> |
||||||
|
<div class="container-rightbox"> |
||||||
|
<div v-for="(line, index) in props.inlines" :key="index"> |
||||||
|
<!-- {{inlineFieldPrefix}}{{ line.field }} --> |
||||||
|
<RenderConfig :type="line.type" :props="{ |
||||||
|
...line, |
||||||
|
field: `${inlineFieldPrefix}${line.field}`, |
||||||
|
}" /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<style lang="less" scoped> |
||||||
|
.container { |
||||||
|
box-sizing: border-box; |
||||||
|
border-radius: 2px; |
||||||
|
padding: 2px; |
||||||
|
display:flex; |
||||||
|
gap:10px; |
||||||
|
align-items:center; |
||||||
|
background-color: #f5f5f5; |
||||||
|
margin-bottom: 5px; |
||||||
|
&-imgbox { |
||||||
|
width: 55px; |
||||||
|
height: 55px; |
||||||
|
border-radius:5px; |
||||||
|
border : 1px solid #ccc; |
||||||
|
display:flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
&-rightbox{ |
||||||
|
display: flex; |
||||||
|
flex:1; |
||||||
|
overflow: hidden; |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,27 @@ |
|||||||
|
import { error } from "console" |
||||||
|
|
||||||
|
export function clone<T>(v: T): T { |
||||||
|
switch (typeof v) { |
||||||
|
case "string": |
||||||
|
case "boolean": |
||||||
|
case "number": |
||||||
|
case "undefined": |
||||||
|
return v |
||||||
|
case "symbol": |
||||||
|
case "function": |
||||||
|
case "bigint": |
||||||
|
throw new Error("invalid type") |
||||||
|
case "object": |
||||||
|
if (v == null) { |
||||||
|
return v |
||||||
|
} |
||||||
|
if (Array.isArray(v)) { |
||||||
|
return v.map(clone) as T |
||||||
|
} |
||||||
|
const obj = Object.create(null) |
||||||
|
for (const [key, value] of Object.entries(v)) { |
||||||
|
obj[key] = clone(value) |
||||||
|
} |
||||||
|
return obj |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue