feat: add MTG result sorting
This commit is contained in:
+29
-1
@@ -501,9 +501,18 @@
|
|||||||
const match = selectControl('mtgMatch', '');
|
const match = selectControl('mtgMatch', '');
|
||||||
[['all','全部关联状态'], ['matched','已关联订单'], ['missing','关联且待搬单'], ['covered','关联且已覆盖'], ['unmatched','未关联订单']]
|
[['all','全部关联状态'], ['matched','已关联订单'], ['missing','关联且待搬单'], ['covered','关联且已覆盖'], ['unmatched','未关联订单']]
|
||||||
.forEach(([value,label]) => match.append(new Option(label, value)));
|
.forEach(([value,label]) => match.append(new Option(label, value)));
|
||||||
|
const sort = selectControl('mtgSort', '');
|
||||||
|
[
|
||||||
|
['cost-desc','Cost:高到低'], ['cost-asc','Cost:低到高'],
|
||||||
|
['revenue-desc','Revenue:高到低'], ['revenue-asc','Revenue:低到高'],
|
||||||
|
['valid_clicks-desc','Clicks:高到低'], ['valid_clicks-asc','Clicks:低到高'],
|
||||||
|
['installs-desc','Installs:高到低'], ['installs-asc','Installs:低到高'],
|
||||||
|
['roas-desc','ROAS:高到低'], ['roas-asc','ROAS:低到高'],
|
||||||
|
['profit-desc','利润:高到低'], ['adpingid-asc','Adping ID:升序'], ['pkg-asc','Pkg:A-Z']
|
||||||
|
].forEach(([value,label]) => sort.append(new Option(`排序 · ${label}`, value)));
|
||||||
const exportButton = el('button', 'button', '导出 MTG 数据');
|
const exportButton = el('button', 'button', '导出 MTG 数据');
|
||||||
exportButton.id = 'mtgExport'; exportButton.type = 'button';
|
exportButton.id = 'mtgExport'; exportButton.type = 'button';
|
||||||
filters.append(search, country, match, exportButton);
|
filters.append(search, country, match, sort, exportButton);
|
||||||
header.append(head, summary, filters);
|
header.append(head, summary, filters);
|
||||||
|
|
||||||
panel.append(header, el('div', 'result-meta'), el('div', 'table-wrap'), el('div', 'pagination'));
|
panel.append(header, el('div', 'result-meta'), el('div', 'table-wrap'), el('div', 'pagination'));
|
||||||
@@ -513,6 +522,7 @@
|
|||||||
search.addEventListener('input', () => { mtgState.page = 1; applyMtgFilters(); });
|
search.addEventListener('input', () => { mtgState.page = 1; applyMtgFilters(); });
|
||||||
country.addEventListener('change', () => { mtgState.page = 1; applyMtgFilters(); });
|
country.addEventListener('change', () => { mtgState.page = 1; applyMtgFilters(); });
|
||||||
match.addEventListener('change', () => { mtgState.page = 1; applyMtgFilters(); });
|
match.addEventListener('change', () => { mtgState.page = 1; applyMtgFilters(); });
|
||||||
|
sort.addEventListener('change', () => { mtgState.page = 1; applyMtgFilters(); });
|
||||||
['search', 'countryFilter', 'platformFilter', 'statusFilter'].forEach(id => {
|
['search', 'countryFilter', 'platformFilter', 'statusFilter'].forEach(id => {
|
||||||
const control = document.getElementById(id);
|
const control = document.getElementById(id);
|
||||||
control.addEventListener(id === 'search' ? 'input' : 'change', () => {
|
control.addEventListener(id === 'search' ? 'input' : 'change', () => {
|
||||||
@@ -528,6 +538,8 @@
|
|||||||
const query = document.getElementById('mtgSearch').value.trim().toLocaleLowerCase();
|
const query = document.getElementById('mtgSearch').value.trim().toLocaleLowerCase();
|
||||||
const country = document.getElementById('mtgCountry').value;
|
const country = document.getElementById('mtgCountry').value;
|
||||||
const match = document.getElementById('mtgMatch').value;
|
const match = document.getElementById('mtgMatch').value;
|
||||||
|
const sortControl = document.getElementById('mtgSort');
|
||||||
|
const sort = sortControl.value;
|
||||||
const mainSearch = document.getElementById('search').value.trim().toLocaleLowerCase();
|
const mainSearch = document.getElementById('search').value.trim().toLocaleLowerCase();
|
||||||
const mainCountry = document.getElementById('countryFilter').value;
|
const mainCountry = document.getElementById('countryFilter').value;
|
||||||
const mainPlatform = document.getElementById('platformFilter').value;
|
const mainPlatform = document.getElementById('platformFilter').value;
|
||||||
@@ -554,6 +566,22 @@
|
|||||||
&& (mainStatus === 'all' || coverageStatus === mainStatus);
|
&& (mainStatus === 'all' || coverageStatus === mainStatus);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [field, direction] = sort.split('-');
|
||||||
|
const multiplier = direction === 'asc' ? 1 : -1;
|
||||||
|
mtgState.filtered.sort((left, right) => {
|
||||||
|
const a = left[field];
|
||||||
|
const b = right[field];
|
||||||
|
if (a === null && b !== null) return 1;
|
||||||
|
if (a !== null && b === null) return -1;
|
||||||
|
if (typeof a === 'string' || typeof b === 'string') {
|
||||||
|
const result = String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });
|
||||||
|
return result * multiplier || left.adpingid.localeCompare(right.adpingid, undefined, { numeric: true });
|
||||||
|
}
|
||||||
|
return (Number(a) - Number(b)) * multiplier
|
||||||
|
|| left.adpingid.localeCompare(right.adpingid, undefined, { numeric: true });
|
||||||
|
});
|
||||||
|
mtgState.sortLabel = sortControl.options[sortControl.selectedIndex].text.replace('排序 · ', '');
|
||||||
|
|
||||||
const linked = [mainStatusControl.options[mainStatusControl.selectedIndex].text];
|
const linked = [mainStatusControl.options[mainStatusControl.selectedIndex].text];
|
||||||
if (mainCountry !== 'all') linked.push(`国家 ${mainCountry}`);
|
if (mainCountry !== 'all') linked.push(`国家 ${mainCountry}`);
|
||||||
if (mainPlatform !== 'all') linked.push(`平台 ${mainPlatform}`);
|
if (mainPlatform !== 'all') linked.push(`平台 ${mainPlatform}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user