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>