select-tmpl.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: select-tmpl.vue
  4. * @Description: 自动化-选择模板
  5. * @Author: Cheney
  6. */
  7. import { ref, onMounted, watch } from 'vue';
  8. import * as api from './api';
  9. import XEUtils from 'xe-utils';
  10. interface Props {
  11. data: AutoCampaignRule;
  12. }
  13. const props = defineProps<Props>();
  14. const ruleUsage = ref('custom');
  15. const tmplId = ref(0);
  16. if (props.data.template) {
  17. tmplId.value = props.data.template.id;
  18. }
  19. const tmplList = ref([]);
  20. // const emits = defineEmits(['change-tmpl'])
  21. onMounted(async () => {
  22. await getTmplList();
  23. });
  24. watch(
  25. () => props.data.useTmpl,
  26. () => {
  27. console.log("=>(select-tmpl.vue:26) props.data.useTmpl", props.data.useTmpl);
  28. if (props.data.useTmpl) {
  29. ruleUsage.value = 'tmpl';
  30. tmplId.value = props.data.template.id;
  31. } else {
  32. ruleUsage.value = 'custom';
  33. }
  34. }
  35. );
  36. async function getTmplList() {
  37. const resp = await api.getTemplateList({
  38. page: 1,
  39. pageSize: 999,
  40. type: props.data.ruleType,
  41. });
  42. tmplList.value = resp.data;
  43. }
  44. function changeTmpl() {
  45. const tmpl = XEUtils.find(tmplList.value, (item) => item.id === tmplId.value);
  46. props.data.rule = XEUtils.clone(tmpl.rule, true);
  47. props.data.template = tmpl;
  48. // emits('change-tmpl', tmpl)
  49. }
  50. function changeRuleUsage() {
  51. props.data.useTmpl = ruleUsage.value === 'tmpl';
  52. if (props.data.useTmpl) {
  53. if (!tmplId.value && tmplList.value.length > 0) {
  54. tmplId.value = tmplList.value[0].id;
  55. }
  56. changeTmpl();
  57. }
  58. }
  59. defineExpose({ getTmplList });
  60. </script>
  61. <template>
  62. <el-card class="mt-3">
  63. <div class="asj-h3">
  64. <span class="custom-title-icon"></span>
  65. 选择模板
  66. </div>
  67. <el-radio-group v-model="ruleUsage" @change="changeRuleUsage">
  68. <div style="display: flex; justify-content: flex-start; flex-direction: column">
  69. <el-radio label="custom">自定义规则</el-radio>
  70. <!--<el-input-->
  71. <!-- v-model="data.templateName"-->
  72. <!-- v-show="ruleUsage === 'custom'"-->
  73. <!-- style="margin-left: 22px; width: 220px"-->
  74. <!-- placeholder="将规则同时保存为模板(可选)" />-->
  75. <el-radio label="tmpl">使用已有模板</el-radio>
  76. <el-select v-show="ruleUsage === 'tmpl'" @change="changeTmpl" v-model="tmplId" style="margin-left: 22px">
  77. <el-option v-for="info in tmplList" :label="info.name" :value="info.id" :key="info.id" />
  78. </el-select>
  79. </div>
  80. </el-radio-group>
  81. </el-card>
  82. </template>
  83. <style scoped>
  84. .custom-title-icon {
  85. padding: 0 5px;
  86. }
  87. .custom-title-icon:before {
  88. content: '';
  89. width: 4px;
  90. height: 15px;
  91. background: #3569d6;
  92. position: absolute;
  93. top: 50%;
  94. transform: translateY(-50%);
  95. left: 0;
  96. }
  97. </style>