github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/static_source/admin/src/views/Entities/components/MetricForm.vue (about) 1 <script setup lang="ts"> 2 import api from "@/api/api"; 3 import {h, PropType, reactive, ref, unref, watch} from 'vue' 4 import {ElButton, ElRow, ElCol, ElCard, ElForm, 5 ElFormItem, ElDivider, ElCollapse, ElCollapseItem, 6 ElColorPicker, ElPopconfirm, ElInput, ElSkeleton} from 'element-plus' 7 import {useI18n} from '@/hooks/web/useI18n' 8 import {useForm} from '@/hooks/web/useForm' 9 import {useValidator} from '@/hooks/web/useValidator' 10 import {ApiMetric} from "@/api/stub"; 11 12 const {register, elFormRef, methods} = useForm() 13 const {required} = useValidator() 14 const {t} = useI18n() 15 16 interface Current { 17 item: ApiMetric 18 } 19 20 const current = reactive<Current>({ 21 item: {} as ApiMetric 22 }) 23 24 const props = defineProps({ 25 modelValue: { 26 type: Object as PropType<Nullable<ApiMetric>>, 27 default: () => null 28 } 29 }) 30 31 watch( 32 () => props.modelValue, 33 (val) => { 34 if (val == unref(current)) return; 35 current.item = val 36 }, 37 { 38 deep: true, 39 immediate: true 40 } 41 ) 42 43 const rules = { 44 name: [ 45 {required: true, trigger: 'blur'}, 46 {min: 4, max: 255, trigger: 'blur'} 47 ], 48 description: [ 49 {required: false, trigger: 'blur'}, 50 {max: 255, trigger: 'blur'} 51 ], 52 type: [ 53 {required: false, trigger: 'blur'}, 54 {max: 255, trigger: 'blur'} 55 ] 56 }; 57 58 const rules2 = { 59 name: [ 60 {required: true, trigger: 'blur'}, 61 {min: 4, max: 255, trigger: 'blur'} 62 ], 63 description: [ 64 {required: false, trigger: 'blur'}, 65 {max: 255, trigger: 'blur'} 66 ], 67 // color: [ 68 // {required: false, trigger: 'blur'}, 69 // {max: 255, trigger: 'blur'} 70 // ], 71 translate: [ 72 {required: false, trigger: 'blur'}, 73 {max: 255, trigger: 'blur'} 74 ], 75 label: [ 76 {required: false, trigger: 'blur'}, 77 {max: 255, trigger: 'blur'} 78 ] 79 }; 80 81 const addProp = () => { 82 83 current.item.options!.items!.push({ 84 name: 'new label', 85 description: '', 86 // color: '#FF0000', 87 translate: '', 88 label: '' 89 }); 90 } 91 92 const removeProp = (index: number) => { 93 current.item.options!.items!.splice(index, 1); 94 } 95 96 </script> 97 98 <template> 99 100 <ElForm v-if="current.item" label-position="top" label-width="100px" ref="current.item" :model="current.item" :rules="rules2" style="width: 100%"> 101 <ElFormItem :label="$t('metrics.name')" prop="name"> 102 <ElInput v-model="current.item.name"/> 103 </ElFormItem> 104 <ElFormItem :label="$t('metrics.description')" prop="description"> 105 <ElInput v-model="current.item.description"/> 106 </ElFormItem> 107 108 </ElForm> 109 110 <ElDivider v-if="current.item" content-position="left">{{ $t('metrics.properties') }}</ElDivider> 111 112 <div v-if="current.item" style="padding-bottom: 20px" > 113 <ElButton type="default" @click.prevent.stop="addProp()"> 114 <Icon icon="ep:plus" class="mr-5px"/> 115 {{ $t('metrics.addProperty') }} 116 </ElButton> 117 </div> 118 119 <!-- props --> 120 <ElSkeleton v-if="current.item && !current.item?.options?.items.length" :rows="5" /> 121 122 <ElCollapse v-if="current.item && current.item?.options?.items.length"> 123 <ElCollapseItem :title="prop.name" :name="index" :key="index" v-for="(prop, index) in current.item.options?.items"> 124 125 <!-- <ElCard shadow="never" class="item-card-editor">--> 126 <ElForm label-position="top" :model="prop" style="width: 100%" ref="cardItemForm"> 127 128 <ElRow :gutter="20"> 129 <ElCol> 130 <ElFormItem :label="$t('metrics.name')" prop="name"> 131 <ElInput v-model="prop.name"/> 132 </ElFormItem> 133 134 <ElFormItem :label="$t('metrics.description')" prop="description"> 135 <ElInput v-model="prop.description"/> 136 </ElFormItem> 137 138 <!-- <ElFormItem :label="$t('metrics.color')" prop="background">--> 139 <!-- <ElColorPicker show-alpha v-model="prop.color"/>--> 140 <!-- </ElFormItem>--> 141 142 <ElFormItem :label="$t('metrics.translate')" prop="translate"> 143 <ElInput v-model="prop.translate"/> 144 </ElFormItem> 145 146 <ElFormItem :label="$t('metrics.label')" prop="label"> 147 <ElInput v-model="prop.label"/> 148 </ElFormItem> 149 150 </ElCol> 151 </ElRow> 152 153 </ElForm> 154 <!-- </ElCard>--> 155 156 <ElPopconfirm 157 :confirm-button-text="$t('main.ok')" 158 :cancel-button-text="$t('main.no')" 159 width="250" 160 style="margin-left: 10px;" 161 :title="$t('main.are_you_sure_to_do_want_this?')" 162 @confirm="removeProp(index)" 163 > 164 <template #reference> 165 <ElButton class="mr-10px" type="danger" plain> 166 <Icon icon="ep:delete" class="mr-5px"/> 167 {{ t('metrics.removeProp') }} 168 </ElButton> 169 </template> 170 </ElPopconfirm> 171 172 </ElCollapseItem> 173 </ElCollapse> 174 <!-- /props --> 175 176 </template>