Flex 4 ant target html-wrapper 使用用户自己的html-template

本文介绍了在Flex4 SDK4.1.0中使用HTML Wrapper时遇到的问题,即无法直接指定自定义模板路径。通过源代码修改,实现了支持自定义模板的功能,并提供了修改后的html-wrapper标签用法。
最近在做Flex3到Flex4升级,在对ant脚本升级的时候,发现Flex 4的SDK 4.1.0 ant 的html-wrapper居然不支持让用户自己选自使用自己的template了,不知道是出于什么考虑,真是个遗憾啊。还好有源代码在,于是就修改了原来html-wrapper标签。用法也挺简单的:

<html-wrapper
width="100%" height="100%" title="XXX" file="index.html"
application="XXX" swf="XXX" version-major="10"
templatePath="${template.dir}" version-minor="0"
version-revision="1" history="false" express-install="true"
version-detection="true" output="${out.dir}"/>
其中
templatePath 为用户自己的html-template路径

flexTask.jar 在附件当中。
<template> <div class="button-group theme-public"> <a-radio-group class="button-group-radio" v-model:value="type" button-style="solid" @change=" (e) => { handleChange(e.target.value, 'btn'); } " > <a-radio-button v-for="item in radios" :key="item.value" :value="item.value" type="link">{{ item.label }}</a-radio-button> </a-radio-group> <a-range-picker v-if="showDate" :allowClear="false" v-model:value="date" :format="$t('YYYY-MM-DD')" :getPopupContainer="(triggerNode) => triggerNode.parentNode" @change=" (val) => { handleChange(val, 'date'); } " /> </div> </template> <script> import { defineComponent, ref, onMounted } from 'vue'; import dayjs from 'dayjs'; import { useI18n } from 'vue-i18n'; export default defineComponent({ name: 'Index', components: {}, props: { code: { type: String, default: '', }, radios: { type: Array, default: () => [ { value: 0, label: useI18n().t('近7天') }, { value: 1, label: useI18n().t('本月') }, { value: 2, label: useI18n().t('上月') }, ], }, // 日期输出格式 format: { type: String, default: '', }, showDate: { type: Boolean, default: true, }, // 日期类型 defaultType: { type: String || Number, default: 0, }, isAuto: { type: Boolean, default: false, }, }, emits: ['handleChecked'], setup(prop, { emit }) { const type = ref(prop.defaultType); const date = ref([]); const today = ref(dayjs()); const handleChange = (val, name) => { switch (name) { case 'btn': date.value = []; break; case 'date': type.value = false; break; default: break; } handleDate(); }; // 处理日期 const handleDate = () => { switch (type.value) { case 0: date.value = [today.value.subtract(6, 'day'), today.value]; break; case 1: date.value = [today.value.startOf('month'), today.value.endOf('month')]; break; case 2: const lastMonth = today.value.subtract(1, 'month'); date.value = [lastMonth.startOf('month'), lastMonth.endOf('month')]; break; default: break; } emit('handleChecked', { value: prop.format ? [dayjs(date.value[0]).format(prop.format), dayjs(date.value[1]).format(prop.format)] : date.value, code: prop.code, type: type.value, }); }; onMounted(() => { prop.isAuto ? handleDate() : null; }); return { type, date, handleChange }; }, }); </script> <style scoped lang="less"> .button-group { display: flex; align-items: center; justify-content: space-between; .ant-picker-range { margin-left: 10px; } .ant-radio-button-wrapper { min-width: 30px; padding: 0 6px; font-size: 12px; border: 0; text-align: center; } .ant-radio-button-wrapper::before { width: 0; } .ant-radio-button-wrapper-checked { border-radius: 4px; background: #f2faf7; color: @primary-color; } } </style> 当前代码,怎么设置 <a-range-picker 选择器,限制日期在1年内
09-20
<template> <myModal :params="{title: $t('选择报警类型')}" :modalWidthSize="'middle'" :visible="visible" @submit="handleOk" @cancel="handleCancel"> <template v-slot:header><span></span></template> <template v-slot:body> <div class="alarm_type_modal"> <div class="main_content" v-if="alarmTypeList.length"> <div class="search_item"> <a-input-search @search="handleAlarmTypeSearch" :placeholder="$t('请输入报警类型名称')" /> </div> <template v-if="isShowList"> <div class="check_item"> <div class="all_check"> <a-checkbox :indeterminate="indeterminate" :checked="checkAll" @change="onCheckAllChange"> {{ $t("用电告警")}} </a-checkbox> <img class="down" @click="changeIcon" :class="{'up': expanded}" src="~@/assets/img/down.png" /> </div> <div :class="['check_group_list', expanded ? 'checkboxUp': 'checkboxDown' ]"> <a-checkbox-group v-model="checkedList" @change="onCheckChange"> <template v-for="el in filteredList"> <a-checkbox v-show="el.show" :key="el.alarmTypeCode" :value="el.alarmTypeCode"> {{el.alarmTypeName}} </a-checkbox> </template> </a-checkbox-group> </div> </div> </template> <noData v-else /> </div> <a-space :size="64" v-else> <a-spin tip="加载中,请稍候..." /> </a-space> </div> </template> </myModal> </template> <script> import noData from '@/components/tableNoData' import myModal from "@/components/scfComponents/modalComponents/modal.vue"; export default { components: { noData, myModal }, data() { return { visible: false, isShowList: true, indeterminate: false, checkAll: false, expanded: true, checkedList: [], alarmTypeList: [], filteredList: [] } }, watch: { // 监听过滤后的列表变化 filteredList: { handler(newVal) { this.isShowList = newVal.length > 0; }, immediate: true } }, methods: { getAlarmTypeList() { this.alarmTypeList = [{ "alarmTypeCode": 1001, "alarmTypeName": "电流过高预警" }, { "alarmTypeCode": 1002, "alarmTypeName": "温度过高预警" }, { "alarmTypeCode": 1005, "alarmTypeName": "电压过高预警" }, { "alarmTypeCode": 1006, "alarmTypeName": "电压过低预警" }, { "alarmTypeCode": 1007, "alarmTypeName": "功率过载预警" }, { "alarmTypeCode": 1008, "alarmTypeName": "功率过载报警" },] this.alarmTypeList.forEach(item => { item.show = true }) this.filteredList = [...this.alarmTypeList]; // 初始化过滤列表 console.log(this.alarmTypeList); }, // 打开弹窗 showModal() { this.visible = true this.getAlarmTypeList() }, // 报警类型搜索 handleAlarmTypeSearch(val) { const searchTerm = val.toLowerCase().trim(); if (!searchTerm) { this.filteredList = [...this.alarmTypeList]; this.updateCheckState() return; } this.filteredList = this.alarmTypeList.filter(item => item.alarmTypeName.toLowerCase().includes(searchTerm) ); this.updateCheckState() }, // 更新选择状态 updateCheckState() { const alarmTypeCodes = this.filteredList.map(item => item.alarmTypeCode); const alarmTypeChecked = this.checkedList.filter(code => alarmTypeCodes.includes(code)); console.log(alarmTypeChecked, 'alarmTypeChecked'); console.log(alarmTypeCodes, 'alarmTypeCodesalarmTypeCodes'); this.checkAll = alarmTypeChecked.length === alarmTypeCodes.length; this.indeterminate = !!alarmTypeChecked.length && !this.checkAll; }, // 全选 onCheckAllChange(e) { const visibleCodes = this.filteredList.map(item => item.alarmTypeCode); this.checkedList = e.target.checked ? [...visibleCodes] : []; this.updateCheckState(); }, changeIcon() { this.expanded = !this.expanded }, // 单选 onCheckChange() { this.updateCheckState() }, // 确定 handleOk() { this.visible = false }, // 取消 handleCancel() { this.visible = false } }, } </script> <style lang="less" scoped> .alarm_type_modal { width: 100%; display: flex; padding: 24px; box-sizing: border-box; justify-content: center; .main_content { width: 100%; min-height: 400px; position: relative; border-radius: 8px; border: solid 1px #c5cdd6; padding: 23px 10px 10px 16px; .search_item { width: 100%; margin-bottom: 15px; } .check_item { border-radius: 4px; margin-bottom: 10px; border: 1px solid var(--split); .all_check { display: flex; padding: 10px 16px; align-items: center; justify-content: space-between; background-color: #f0f3f7; .down { width: 13px; height: 8px; transition: all 0.5s; cursor: pointer; } .up { transform: rotate(180deg); } } .check_group_list { width: 100%; overflow: hidden; transition: all 1s; .ant-checkbox-group { width: 100%; padding: 8px 0 8px 14px; .ant-checkbox-wrapper { margin: 0; width: 25%; padding: 4px; overflow: hidden; line-height: 28px; padding-left: 18px; white-space: nowrap; text-overflow: ellipsis; border-right: 1px solid #f0f3f7; &:nth-child(4n) { border-right: none; } } } } .checkboxDown { height: 0px; } .checkboxUp { min-height: 30px; } } } } </style> 代码优化
08-14
<template> <div> <div class="alarm-type-container" v-if="selectList.length"> <a-input-search :placeholder="$t('请输入报警类型名称')" @search="search" style="width: 100%;margin-bottom: 15px;" /> <template v-if="listShow"> <template v-for="(item, index) in selectList"> <div class="allCheckBox" v-if="item.count != 0" :key="item.id"> <div class="allCheck"> <a-checkbox :indeterminate="item.indeterminate" :checked="item.checkAll" @change="checked => onCheckAllChange(checked, index)">{{ $t(item.alarmBigTypeName) }}</a-checkbox> <img class="down" @click="setHeight(index)" :class="item.flag ? 'up' : ''" src="~@/assets/img/down.png" alt="" /> </div> <div :class="['checkboxGroupList', { 'checkboxUp': item.flag, 'checkboxDown': !item.flag }]"> <a-checkbox-group :value="item.codes" @change="checked => onChange(checked, index)"> <template v-for="check in item.alarmTypeVoList"> <a-checkbox :key="check.alarmTypeCode" v-if="!check.show" :value="check.alarmTypeCode"> <span :title="$t(check.alarmTypeName)"> {{ $t(check.alarmTypeName) }} </span> </a-checkbox> </template> </a-checkbox-group> </div> </div> </template> </template> <noData v-else /> </div> <div class="alarm-type-container" style="display: flex;justify-content: center;" v-else> <a-space :size="64"> <a-spin tip="加载中,请稍候..." /> </a-space> </div> </div> </template> <script> import moment from "moment"; import noData from '@/components/tableNoData' export default { name: "alarm-type-container", components: { noData }, props: { visible: { type: Boolean, default: () => false }, selectData: { type: Array, default: () => { return []; } }, isTemplate: { type: Boolean, default: () => false } }, data() { return { selectList: [], searchValue: '', codeList: [], listShow: true, checkCodes: [], delList: [], seatchType: false, selectListBak: [] }; }, watch: { }, created() { }, methods: { moment, deWeightCode(tempArr) { let newArr = []; for (let i = 0; i < tempArr.length; i++) { if (newArr.indexOf(tempArr[i]) == -1) { newArr.push(tempArr[i]); } else { tempArr.splice(i, 1); } } return tempArr; }, search(val, e) { if (val) { this.listShow = false//是否有数据 this.selectList.forEach((item, index) => { item.count = item.alarmTypeVoList.length item.alarmTypeVoList.forEach(select => { //控制显示隐藏 if (select.alarmTypeName.indexOf(val) > -1) { this.listShow = true select.show = false } else { item.count = item.count - 1 select.show = true } }) if (this.selectList.length > this.codeList.length) { this.codeList.push({ alarmBigTypeCode: item.alarmBigTypeCode, codes: item.codes ? item.codes : [], showCodes: [], showLength: [] }) } if (item.codes) { this.codeList[index].showCodes = [] if (item.alarmBigTypeCode == this.codeList[index].alarmBigTypeCode) { this.codeList[index].codes = [...item.codes, ...this.codeList[index].codes] } const uniqueArr = Array.from(new Set(item.codes)); item.codes = uniqueArr item.checkedList = uniqueArr this.codeList[index].codes = uniqueArr this.codeList[index].showLength = item.alarmTypeVoList.filter(it => { return it.show == false }) item.alarmTypeVoList.forEach(ele => { item.codes.forEach(el => { if (!ele.show && ele.alarmTypeCode == el) { this.codeList[index].showCodes.push(el) } }) }); this.selectListBak[index] = item.codes } // 改变全选状态 item.indeterminate = !!this.codeList[index].showCodes.length && this.codeList[index].showCodes.length < this.codeList[index].showLength.length; item.checkAll = (this.codeList[index].showCodes.length === this.codeList[index].showLength.length) && this.codeList[index].showCodes.length != 0; }) this.seatchType = true } else { this.selectList.forEach((item, index) => { if (!item.codes) { item.codes = [] } item.count = item.alarmTypeVoList.length item.alarmTypeVoList.forEach(select => { select.show = false }) item.codes = [...new Set(item.codes)] item.indeterminate = !!item.codes.length && item.codes.length < item.alarmTypeVoList.length; item.checkAll = item.codes.length === item.alarmTypeVoList.length; this.selectListBak[index] = [] }) this.listShow = true this.seatchType = false this.codeList = [] } this.$forceUpdate() }, setHeight(index) { this.selectList[index].flag = !this.selectList[index].flag; this.$forceUpdate(); }, getEle() { return document.querySelector("#app>.standard-page"); }, onChange(checkedList, index) { checkedList = [...new Set(checkedList)] this.delList = [] if (this.codeList.length && this.selectList[index].codes && this.codeList[index].showCodes.length) { let oldCodes = [this.selectListBak[index]]//搜索前选中的 this.codeList[index].showCodes = [...this.codeList[index].showCodes, ...checkedList] this.codeList[index].showCodes = [...new Set(this.codeList[index].showCodes)] this.codeList[index].showCodes.forEach(items => { if (checkedList.indexOf(items) > -1) { } else { this.delList.push(items) this.delList = [...new Set(this.delList)] } }); let list = [...this.selectListBak[index].filter(e => !this.delList.includes(e)), ...checkedList] list = [...new Set(list)] this.selectList[index].checkedList = [...list] this.selectList[index].codes = [...list] } else { if (this.selectListBak[index]) { let list = [] if (this.selectListBak[index].length == this.selectList[index].alarmTypeVoList.length || !this.seatchType) { list = [...checkedList] } else { list = [...this.selectListBak[index], ...checkedList] } this.selectList[index].checkedList = [...new Set(list)] this.selectList[index].codes = [...new Set(list)] this.selectList[index].checkedList = [...new Set(list)] } else { this.selectList[index].checkedList = [...checkedList] this.selectList[index].codes = [...checkedList] } } this.selectList[index].indeterminate = !!checkedList.length && checkedList.length < this.selectList[index].alarmTypeVoList.length; this.selectList[index].checkAll = checkedList.length === this.selectList[index].alarmTypeVoList.length; this.$forceUpdate(); if (this.isTemplate) { this.onSubmit(); } }, //全选 onCheckAllChange(e, index) { Object.assign(this.selectList[index], { checkedList: e.target.checked ? [...this.selectListBak[index], ...this.dataEach(this.selectList[index].alarmTypeVoList)] : [...this.selectListBak[index].filter(e => !this.dataEach(this.selectList[index].alarmTypeVoList).includes(e))], codes: e.target.checked ? [...this.selectListBak[index], ...this.dataEach(this.selectList[index].alarmTypeVoList)] : [...this.selectListBak[index].filter(e => !this.dataEach(this.selectList[index].alarmTypeVoList).includes(e))], indeterminate: false, checkAll: e.target.checked }); if (this.isTemplate) { this.onSubmit(); } this.$forceUpdate(); }, dataEach(val) { return val.map(item => { if (!item.show) { return item.alarmTypeCode } else { return null } }) }, // 提交 onSubmit(type) { if (!this.isTemplate) { this.search() } this.selectList.forEach((select, index) => { select.list = []; if (select.codes) { const uniqueArr = Array.from(new Set(select.codes)); select.codes = uniqueArr select.checkedList = uniqueArr } select.alarmTypeVoList.forEach(item => { if (select.codes.length) { select.codes.forEach(code => { if (item.alarmTypeCode == code) { select.list.push(item); } }); } }); }); if (!type) { this.$emit("checkData", this.selectList); } }, getSelectData(data, type) { this.selectList = [] this.selectListBak = [] data.forEach(items => { items.flag = true; items.count = 1 if (type) { items.checkAll = false items.indeterminate = false items.checkedList = [] items.checkedOption = [] } else { if (items.checkedOption) {//如果有选中的数据 items.checkAll = items.checkedOption.length == items.alarmTypeVoList.length ? true : false; items.indeterminate = items.checkedOption.length && !items.checkAll ? true : false; items.checkedList = items.checkedOption.map(item => { return item; }); items.codes = items.checkedOption.map(item => { if (item) { return item.alarmTypeCode; } }); } else { //反之 items.checkAll = false items.indeterminate = false items.checkedList = [] items.checkedOption = [] } } this.selectList.push(items); this.selectListBak.push(items.codes || []); }); console.log(this.selectList, 'this.selectListthis.selectListthis.selectListthis.selectList'); } } }; </script> <style lang="less" scoped> /deep/.ant-checkbox-checked { .ant-checkbox-inner:after{ transform: rotate(45deg) scale(1) translate(-50%,-50%) translateZ(0) !important; } } .alarm-type-container { width: 100%; min-height: 400px; .allCheckBox { border: 1px solid var(--split); border-radius: 4px; margin-bottom: 10px; } .allCheck { background-color: #f0f3f7; padding: 10px 16px; display: flex; justify-content: space-between; align-items: center; .down { transition: all 0.5s; width: 13px; height: 8px; cursor: pointer; } .up { transform: rotate(180deg); } } .checkboxGroupList { transition: all 1s; width: 100%; overflow: hidden; .ant-checkbox-group { width: 100%; padding: 8px 0 8px 14px; } .ant-checkbox-group-item { padding: 10px 16px; } .ant-checkbox-wrapper { padding: 4px; margin: 0; } .active { color: #2b81f1; } .ant-checkbox-wrapper { width: 25%; line-height: 28px; border-right: 1px solid #f0f3f7; padding-left: 18px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ant-checkbox-wrapper:nth-child(4n) { border-right: none; } } .checkboxDown { height: 0px; } .checkboxUp { min-height: 30px; } } </style> 代码优化
08-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值