magix-components
Version:
101 lines (100 loc) • 2.94 kB
JavaScript
/*
ver:1.3.1
*/
/*
author:xinglie.lkf@alibaba-inc.com
*/
let $ = require('$');
let Magix = require('magix');
let FindNames = (node) => {
node = $(node);
let subs = node.find('input[linkage-parent]');
let names = {};
subs.each((idx, item) => {
let name = $(item).attr('linkage-parent');
names[name] = 1;
});
node.find('input[linkage]').each((idx, item) => {
let name = $(item).attr('linkage');
names[name] = 1;
});
return Magix.keys(names);
};
let SyncState = (node, checkbox, name) => {
let all = node.find('input[linkage=' + name + ']');
let subs = node.find('input[linkage-parent=' + name + ']');
let indeterminate = false;
let noneChecked = false;
let toggle = all[0] == checkbox;
let checked = checkbox && checkbox.checked;
subs.each((index, item) => {
if (toggle) {
item.checked = checked;
}
if (item.checked) {
indeterminate = true;
} else {
noneChecked = true;
}
});
all.prop('indeterminate', false);
if (indeterminate && !noneChecked) {
all.prop('checked', true);
} else if (noneChecked && !indeterminate) {
all.prop('checked', false);
} else if (indeterminate) {
all.prop('indeterminate', true);
}
};
let ApplyTableCheckbox = (node, checkbox) => {
node = $(node);
let names = FindNames(node);
if (names.length) {
for (let name of names) {
SyncState(node, checkbox, name);
}
}
};
module.exports = {
ctor() {
let me = this;
me.on('rendered', () => {
ApplyTableCheckbox('#' + me.id);
});
if (DEBUG) {
let mixins = me.mixins;
let linkageBeforeState = false;
let findLinkage = false;
for (let m of mixins) {
if (m.getSelectedIds) {
findLinkage = true;
} else if (m.getStoreState) {
if (findLinkage) {
linkageBeforeState = true;
}
}
}
if (linkageBeforeState) {
console.error('put `app/gallery/mx-checkbox/storestate` before `app/gallery/mx-checkbox/linkage`');
}
}
},
getSelectedIds(name) {
let ids = [];
$('#' + this.id + ' input:checked').each((idx, input) => {
let value = input.value;
let node = $(input);
let pName = node.attr('linkage-parent');
if (pName && value && (!name || (name && name == pName))) {
ids.push(input.value);
}
});
return ids;
},
'$input[linkage-parent]<change>'(e) {
ApplyTableCheckbox('#' + this.id, e.eventTarget);
},
'$input[linkage]<change>'(e) {
ApplyTableCheckbox('#' + this.id, e.eventTarget);
}
};