meeting-tpl-events.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <div class="pd-16">
  3. <div class="f-s-16 c-333 f-w-6 mb-16">设置事件</div>
  4. <el-form ref="enentFormRef" :model="form" label-position="left" :rules="rules" label-width="auto">
  5. <el-form-item label="触发事件" prop="eventName">
  6. <el-select v-model="form.eventName" @change="changeEventName" placeholder="请选择事件类型">
  7. <el-option v-for="item in page_event" :key="item.value" :label="item.label" :value="item.value"></el-option>
  8. </el-select>
  9. </el-form-item>
  10. <template v-if="form.eventName === 'callEvent'">
  11. <el-form-item label="电话号码" prop="params.phone">
  12. <el-input v-model="form.params.phone" placeholder="请输入电话号码"></el-input>
  13. </el-form-item>
  14. </template>
  15. <template v-if="form.eventName === 'msgEvent'">
  16. <el-form-item label="提示内容" prop="params.msg">
  17. <el-input v-model="form.params.msg" placeholder="请输入提示内容"></el-input>
  18. </el-form-item>
  19. </template>
  20. <template v-if="form.eventName === 'viewEvent'">
  21. <el-form-item label="文件上传" prop="params.file" label-position="top">
  22. <FileUpload v-model="form.params.file" format="object" :fileSize="100"></FileUpload>
  23. </el-form-item>
  24. </template>
  25. <template v-if="form.eventName === 'gotoEvent'">
  26. <el-form-item label="页面" prop="params.pageId" label-position="top">
  27. <el-button v-if="!form.params.pageId" type="primary" @click="showSelectMeeting = true">选择页面</el-button>
  28. <div v-if="form.params.pageId" class="pt-10">
  29. <div class="w-160 p-rtv">
  30. <div class="delete-icon-tpl c-s-p c-danger f-s-20" @click="form.params.pageId = null; selectPageInfo = null;">
  31. <el-icon><CircleCloseFilled /></el-icon>
  32. </div>
  33. <div class="h-180 bg-#ccc bg-img-item_view" :style="{ backgroundImage: 'url('+ selectPageInfo?.img +')' }"></div>
  34. <div class="f-s-14 pd2-10-0 btm-text">{{ selectPageInfo?.label }}</div>
  35. </div>
  36. </div>
  37. </el-form-item>
  38. </template>
  39. <template v-if="form.eventName === 'navigateEvent'">
  40. <el-form-item label="地址导航" prop="params.wepArea">
  41. <SelectWepArea v-model="form.params.wepArea" placeholder="选择地址"></SelectWepArea>
  42. </el-form-item>
  43. </template>
  44. <template v-if="form.eventName === 'linkEvent'">
  45. <el-form-item label="跳转链接" prop="params.linkType">
  46. <el-radio-group v-model="form.params.linkType">
  47. <el-radio label="内链">内部链接</el-radio>
  48. <el-radio label="外链">外链链接</el-radio>
  49. </el-radio-group>
  50. </el-form-item>
  51. <el-form-item label="链接地址" prop="params.url">
  52. <el-input v-model="form.params.url" placeholder="请输入链接地址"></el-input>
  53. </el-form-item>
  54. </template>
  55. <el-form-item>
  56. <div class="flex1 d-flex j-ed pt-40">
  57. <el-button @click="clearForm">清除</el-button>
  58. <el-button @click="save" type="primary">保存</el-button>
  59. </div>
  60. </el-form-item>
  61. </el-form>
  62. </div>
  63. <SelectMeetingTplPage v-model:show="showSelectMeeting" :list="list" :pageId="form.params.pageId" @success="selectSuccess"></SelectMeetingTplPage>
  64. </template>
  65. <script setup lang="ts">
  66. import { SelectMeetingTplPage } from '.';
  67. const props = defineProps<{
  68. modelValue: any;
  69. dict: any;
  70. list: any[];
  71. }>();
  72. const { page_event } = toRefs<any>(props.dict);
  73. const enentFormRef = ref<any>(null);
  74. const showSelectMeeting = ref(false);
  75. const emit = defineEmits<{
  76. (e: 'update:modelValue', value: any): void;
  77. (e: 'save', value: any): void;
  78. }>();
  79. const rules = ref<any>({
  80. eventName: [{ required: true, message: '请选择触发事件', trigger: 'change' }],
  81. 'params.phone': [
  82. { required: true, message: '请输入电话号码', trigger: 'blur' },
  83. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的电话号码', trigger: 'blur' }
  84. ],
  85. 'params.file': [{ required: true, message: '请上传文件', trigger: 'change' }],
  86. 'params.msg': [{ required: true, message: '请输入提示内容', trigger: 'change' }],
  87. 'params.pageId': [{ required: true, message: '请选择页面', trigger: 'change' }],
  88. 'params.wepArea': [{ required: true, message: '请选择地址', trigger: 'change' }],
  89. 'params.linkType': [{ required: true, message: '请选择链接类型', trigger: 'change' }],
  90. 'params.url': [
  91. { required: true, message: '请输入跳转链接', trigger: 'blur' },
  92. { type: 'url', message: '请输入正确的链接地址', trigger: 'blur' }
  93. ]
  94. });
  95. const form = ref<any>(props.modelValue || {});
  96. const save = async () => {
  97. await enentFormRef.value.validate();
  98. const value = { ...form.value, id: form.value?.id || new Date().getTime() + '_btn_drap', isSave: '1' };
  99. emit('update:modelValue', value);
  100. emit('save', value);
  101. };
  102. const selectPageInfo = computed<any>(() => {
  103. if (!form.value.params || !form.value.params.pageId) return null;
  104. return props.list.find((item) => item.id === form.value.params.pageId) || null;
  105. });
  106. const selectSuccess = (pageId: string) => {
  107. form.value.params.pageId = pageId;
  108. };
  109. const changeEventName = (val: string) => {
  110. form.value.params = {};
  111. };
  112. const clearForm = () => {
  113. enentFormRef.value.resetFields();
  114. };
  115. watch(
  116. () => props.modelValue,
  117. (val) => {
  118. form.value = val || {};
  119. },
  120. { deep: true }
  121. );
  122. </script>
  123. <style lang="scss" scoped>
  124. .bg-img-item_view {
  125. background-size: cover;
  126. background-position: center top;
  127. border: 1px solid transparent;
  128. }
  129. .delete-icon-tpl {
  130. position: absolute;
  131. top: -10px;
  132. right: -10px;
  133. width: 24px;
  134. height: 24px;
  135. display: flex;
  136. align-items: center;
  137. justify-content: center;
  138. }
  139. </style>