import { findAimClassDom, findAimlabelingDom } from '@/utils/utils';
import { nextTick } from 'vue';
* 功能:给标签添加id
* 注册一个全局自定义指令 `v-addId`
* 注意:
* 1. v-addId 注意传一个字符串进去
* 2. 添加类型修饰符,比如v-addId.select
* 所有的修饰符:select(下拉框)、input(输入框)、checkbox(多选框)、radio(单选框)、 pagination(分页)、表格(table)
* 3. 如果是下拉框,需要添加 popper-append-to-body 或者 teleported 为false(推荐使用teleported,不然控制台会报警告)
* 这样自定义指令才能获取下拉列表的el-popper标签
*/
export function addIdDirective(app: any) {
app.directive('addId', {
mounted(el: any, binding: any) {
nextTick(() => {
mountedDoing(el, binding);
});
},
updated(el: any, binding: any) {
const id = binding.value;
Object.keys(binding.modifiers).forEach(key => {
switch (key) {
case 'pagination':
nextTick(() => {
paginationAction(id, el);
});
break;
default:
break;
}
});
}
});
}
function mountedDoing(el: any, binding: any) {
const id = binding.value;
Object.keys(binding.modifiers).forEach(key => {
switch (key) {
case 'select':
selectAction(id, el);
break;
case 'input':
inputAction(id, el);
break;
case 'checkbox':
checkboxAction(id, el);
break;
case 'radio':
radioAction(id, el);
break;
case 'table':
tableAction(id, el);
break;
case 'pagination':
paginationAction(id, el);
break;
default:
break;
}
});
}
function selectAction(id: string, el: any) {
if (id) {
el.setAttribute('id', id);
findAimClassDom(el, 'el-input__inner')?.setAttribute('id', `${id}_dominator_input`);
const elPopper = findAimClassDom(el, 'el-popper');
if (elPopper) {
findAimClassDom(elPopper, 'el-select-dropdown__list')?.setAttribute(
'id',
`${id}_droplist_list_list`
);
}
}
}
function inputAction(id: string, el: any) {
if (id) {
el.setAttribute('id', `${id}Box`);
findAimClassDom(el, 'el-input__inner')?.setAttribute('id', id);
findAimClassDom(el, 'el-input__prefix')?.setAttribute('id', `${id}_search`);
findAimClassDom(el, 'el-input__suffix')?.setAttribute('id', `${id}_clear`);
}
}
function checkboxAction(id: string, el: any) {
if (id) {
el.setAttribute('id', `${id}_checkbox`);
findAimClassDom(el, 'el-checkbox__label')?.setAttribute('id', `${id}_label`);
findAimClassDom(el, 'el-checkbox__original')?.setAttribute('id', id);
}
}
function radioAction(id: string, el: any) {
if (id) {
el.setAttribute('id', `${id}_radio`);
findAimClassDom(el, 'el-radio__label')?.setAttribute('id', `${id}_label`);
findAimClassDom(el, 'el-radio__original')?.setAttribute('id', id);
}
}
function tableAction(id: string, el: any) {
const bodyWrapper = findAimClassDom(el, 'el-table__body-wrapper');
if (bodyWrapper) {
findAimlabelingDom(bodyWrapper, 'tbody')[0]?.setAttribute('id', id);
}
}
function paginationAction(id: string, el: any) {
el?.setAttribute('id', id);
findAimClassDom(el, 'el-pagination__total')?.setAttribute('id', `${id}Total`);
paginationSelectAction(id, el);
paginationBtnPrevAndNextAction(id, el);
paginationPagerAction(id, el);
paginationJumpAction(id, el);
}
function paginationSelectAction(id: string, el: any) {
const sizesDom = findAimClassDom(el, 'el-pagination__sizes');
if (sizesDom) {
sizesDom.setAttribute('id', `${id}Sizes`);
findAimClassDom(sizesDom, 'el-select')?.setAttribute('id', `${id}Select`);
findAimClassDom(sizesDom, 'select-trigger')?.setAttribute('id', `${id}Trigger`);
findAimClassDom(sizesDom, 'el-input')?.setAttribute('id', `${id}Box`);
findAimClassDom(sizesDom, 'el-input__inner')?.setAttribute('id', `${id}Input`);
findAimClassDom(sizesDom, 'el-input__suffix')?.setAttribute('id', `${id}Suffix`);
findAimClassDom(sizesDom, 'el-input__suffix-inner')?.setAttribute('id', `${id}SuffixInner`);
findAimClassDom(sizesDom, 'el-select__caret')?.setAttribute('id', `${id}Caret`);
findAimClassDom(sizesDom, 'el-select__caret')?.children[0]?.setAttribute('id', `${id}Svg`);
}
}
function paginationBtnPrevAndNextAction(id: string, el: any) {
findAimClassDom(el, 'btn-prev')?.setAttribute('id', `${id}Prev`);
findAimClassDom(el, 'btn-next')?.setAttribute('id', `${id}Next`);
}
function paginationPagerAction(id: string, el: any) {
findAimClassDom(el, 'el-pager')?.setAttribute('id', `${id}Pager`);
}
function paginationJumpAction(id: string, el: any) {
const jumpDom = findAimClassDom(el, 'el-pagination__jump');
if (!jumpDom) {
return;
}
jumpDom.setAttribute('id', `${id}Jump`);
findAimClassDom(jumpDom, 'el-pagination__editor')?.setAttribute('id', `${id}Editor`);
findAimClassDom(jumpDom, 'el-input__inner')?.setAttribute('id', `${id}EditorInput`);
}