ze-react-component-library
Version:
ZeroETP React Component Library
412 lines (331 loc) • 12.5 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
var __assign = this && this.__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = this && this.__spreadArray || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {
to[j] = from[i];
}
return to;
};
import { useRef, useCallback } from "react";
import { normaliseGroupby, findPropByName, getIDProperty } from "zeroetp-api-sdk";
import moment from "moment";
/**
* 逻辑是这样的。
* TODO:写testcase
* groupby: "商品_分类",从’单品‘开始下钻 -> query:{商品_分类:'单品'}, groupby: "商品",
* 如果是多维groupby,按照第一个groupby去下钻
* @param logicform
* @param schema
* @param groupbyItem
* @returns new logicform
*/
export var drilldownLogicformInSDK = function drilldownLogicformInSDK(logicform, schema, groupbyItem, downHierarchy) {
var _a;
var _b, _c, _d;
console.log('groupbyItem', groupbyItem);
if (!logicform.groupby) return null; //必须有groupby才能下钻
var newLF = JSON.parse(JSON.stringify(logicform));
normaliseGroupby(newLF);
if (!newLF.query) newLF.query = {}; // 下钻不会把limit,having,skip带过去
delete newLF.skip;
delete newLF.limit;
delete newLF.having; // console.log('newLF', newLF);
// 一般来说,__开头的,是前端自己添加的一些辅助行。例如汇总行之类的。
if (typeof groupbyItem === 'string' && groupbyItem.startsWith('__') || _typeof(groupbyItem) === 'object' && groupbyItem._id.startsWith('__')) {
return null;
} // 获取下一层
var groupbyProp = findPropByName(schema, newLF.groupby[0]._id);
if (!groupbyProp) {
console.error("schema: " + schema._id + " \u4E2D\u672A\u627E\u5230groupbyProp\uFF1A" + newLF.groupby[0]._id);
return null;
} // 如果groupby的key改了,检查一下sort
var updateSort = function updateSort(newLF) {
if (newLF.sort) {
var newSort = {};
for (var _i = 0, _a = Object.entries(newLF.sort); _i < _a.length; _i++) {
var _b = _a[_i],
k = _b[0],
v = _b[1];
if (k === groupbyProp.name) {
newSort[typeof newLF.groupby[0] === 'string' ? newLF.groupby[0] : newLF.groupby[0]._id] = v;
} else {
newSort[k] = v;
}
}
newLF.sort = newSort;
}
};
if (newLF.groupby[0].level) {
if ((_b = groupbyProp.schema) === null || _b === void 0 ? void 0 : _b.hierarchy) {
var hierarchy = groupbyProp.schema.hierarchy;
var thisLevelIndex = hierarchy.findIndex(function (h) {
return h.name === newLF.groupby[0].level;
});
var drilldownLevel = 1;
var groupbyItemID = groupbyItem._id; // 特殊逻辑,对于geo来说,直辖市直接下钻2级(重庆市除外,重庆市就算是直辖市,也有两个子分区)
if (groupbyProp.schema._id === 'geo') {
if (newLF.groupby[0].level === '省市') {
if (groupbyItemID.endsWith('31') || groupbyItemID.endsWith('11') || groupbyItemID.endsWith('12')) {
// 4个直辖市判断
drilldownLevel = 2;
groupbyItemID += '01';
}
}
}
var idProp = getIDProperty(groupbyProp.schema);
if (!idProp) return null;
var id = groupbyItem[newLF.groupby[0].name]._id;
newLF.query[newLF.groupby[0]._id] = {
schema: groupbyProp.schema._id,
query: (_a = {}, _a[idProp.name] = id, _a),
entity_id: id
}; // 因为设置了id,那么如果之前的logicform里面有展开了的chained query的,也要删除
var chain = newLF.groupby[0]._id.split('_');
if (chain.length > 1) {
var currentQuery = newLF.query;
for (var index = 0; index < chain.length; index++) {
var chainItem = chain[index];
if (index === chain.length - 1) {
delete currentQuery[chainItem];
break;
}
currentQuery = currentQuery[chainItem];
if (!currentQuery) break;
if (_typeof(currentQuery) !== 'object') {
currentQuery = null;
break;
}
if (!currentQuery.schema) {
currentQuery = null;
break;
}
currentQuery = currentQuery.query || {};
}
}
if (thisLevelIndex < hierarchy.length - 1) {
newLF.groupby[0].level = hierarchy[thisLevelIndex + drilldownLevel].name;
delete newLF.groupby[0].name;
return newLF;
} else if (chain.length > 1) {
// 有chain的。上去一层
// console.log('有chain的。上去一层');
var newChain = __spreadArray([], chain);
newChain.pop();
var newGroupbyID_1 = newChain.join('_');
newLF.groupby[0] = {
_id: newGroupbyID_1
}; // 但是,如果有count,count里面有自己,那么直接显示明细吧
if (newLF.preds && newLF.preds.find(function (pi) {
return _typeof(pi) === 'object' && pi.pred === newGroupbyID_1;
})) {
return {
schema: newLF.schema,
query: newLF.query
};
}
return newLF;
} else {
// 最低一层了,显示明细
return {
schema: newLF.schema,
query: newLF.query
};
}
} else if (groupbyProp.primal_type === 'date') {
var level = newLF.groupby[0].level;
var newLevel = undefined;
if (level === 'year' || level === 'quarter') {
newLevel = 'month';
}
if (level === 'month' || level === 'week') {
newLevel = 'day';
} // query
var oldQueryKey = newLF.groupby[0].name || groupbyProp.name + "(" + level + ")";
if (!newLF.query) newLF.query = {};
if (!newLF.query[groupbyProp.name]) newLF.query[groupbyProp.name] = {}; // 根据之前的level来决定怎么处置这个值:
var value = groupbyItem[oldQueryKey];
if (level === 'year') {
newLF.query[groupbyProp.name][level] = parseInt(value);
} else if (level === 'quarter') {
var vs = value.split('-').map(function (i) {
return parseInt(i);
});
newLF.query[groupbyProp.name].year = vs[0];
newLF.query[groupbyProp.name].quarter = vs[1];
} else if (level === 'month') {
var vs = value.split('-').map(function (i) {
return parseInt(i);
});
newLF.query[groupbyProp.name].year = vs[0];
newLF.query[groupbyProp.name].month = vs[1];
} else if (level === 'week') {
var vs = value.split('-').map(function (i) {
return parseInt(i);
});
newLF.query[groupbyProp.name].year = vs[0];
newLF.query[groupbyProp.name].week = vs[1];
} // 给明细
if (groupbyProp.granularity === level) {
return {
schema: newLF.schema,
query: newLF.query
};
}
if (newLevel) {
var newQueryKey = groupbyProp.name + "(" + newLevel + ")";
if (newLF.sort && newLF.sort[oldQueryKey]) {
newLF.sort[newQueryKey] = newLF.sort[oldQueryKey];
delete newLF.sort[oldQueryKey];
}
newLF.groupby[0].level = newLevel;
delete newLF.groupby[0].name;
return newLF;
} else {
// 不能往下了,显示明细
return {
schema: newLF.schema,
query: newLF.query
};
}
}
}
newLF.query = __assign({}, newLF.query);
newLF.query[newLF.groupby[0]._id] = groupbyItem._id;
if (downHierarchy || ((_c = groupbyProp.hierarchy) === null || _c === void 0 ? void 0 : _c.down)) {
var nextLevel = downHierarchy || ((_d = groupbyProp.hierarchy) === null || _d === void 0 ? void 0 : _d.down);
var groupbyChain = newLF.groupby[0]._id.split('_');
groupbyChain.pop();
if (nextLevel === '_id') {
newLF.groupby[0] = {
_id: groupbyChain.join('_')
};
} else {
newLF.groupby[0] = {
_id: __spreadArray(__spreadArray([], groupbyChain), [nextLevel]).join('_')
};
} // 其实是groupby _id,转变为simple query就好了
if (newLF.groupby[0]._id.length === 0) {
return {
query: newLF.query,
schema: newLF.schema
};
}
updateSort(newLF); // 但是,如果有count,count里面有自己,那么直接显示明细吧
if (newLF.preds && newLF.preds.find(function (pi) {
return _typeof(pi) === 'object' && pi.pred === newLF.groupby[0]._id;
})) {
return {
schema: newLF.schema,
query: newLF.query
};
}
return newLF;
} else if (newLF.groupby[0]._id.indexOf('_') > 0) {
// 列入groupby : 产品_品牌_公司
newLF.groupby[0]._id = newLF.groupby[0]._id.split('_').slice(0, -1).join('_');
newLF.groupby[0].name = newLF.groupby[0]._id;
delete newLF.groupby[0].level;
updateSort(newLF);
console.log('11111', newLF); // 但是,如果有count,count里面有自己,那么直接显示明细吧
if (newLF.preds && newLF.preds.find(function (pi) {
return _typeof(pi) === 'object' && pi.pred === newLF.groupby[0]._id;
})) {
return {
schema: newLF.schema,
query: newLF.query
};
}
return newLF;
} // 不能往下了,显示明细
return {
query: newLF.query,
schema: newLF.schema
};
};
export var drilldownLogicform = function drilldownLogicform(item, data, onChangeLogicform) {
var _a, _b;
if (item && data) {
var value = item[(_b = (_a = data.logicform.groupby) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.name];
if (value) {
item._id = _typeof(value) === "object" ? value === null || value === void 0 ? void 0 : value._id : value;
}
if (typeof value === "boolean") {
item._id = JSON.stringify(value);
} // 下钻
var drilledLF = drilldownLogicformInSDK(data.logicform, data.schema, item); // N/A值处理成{ $exists: false }
var query_1 = drilledLF === null || drilledLF === void 0 ? void 0 : drilledLF.query;
if (query_1) {
var _query_1 = __assign({}, query_1);
Object.keys(query_1).forEach(function (k) {
if (query_1[k] === "N/A") {
_query_1[k] = {
$exists: false
};
} // 布尔值处理
if (query_1[k] === 'false') {
_query_1[k] = false;
}
if (query_1[k] === 'true') {
_query_1[k] = true;
}
});
drilledLF.query = _query_1;
}
if (drilledLF) {
onChangeLogicform(drilledLF);
}
} else {
console.error("item不存在");
}
};
export function useDrillDownDbClick(props) {
var clickRef = useRef();
var clickCallBackId;
var logicform = props.logicform,
onChangeLogicform = props.onChangeLogicform,
back = props.back;
var onDbClick = useCallback(function (item, data, triggerBack, clickCallBack) {
var current = moment();
if (clickCallBackId) {
clearTimeout(clickCallBackId);
}
if (!clickRef.current || current.diff(clickRef.current, "millisecond") > 200 || !(data === null || data === void 0 ? void 0 : data.schema) || !onChangeLogicform) {
clickRef.current = current;
if (clickCallBack) {
clickCallBackId = setTimeout(function () {
clickCallBack();
}, 200);
}
return;
}
if (triggerBack) {
back();
return;
}
if (item) {
drilldownLogicform(item, data, onChangeLogicform);
}
clickRef.current = current;
}, [JSON.stringify({
logicform: logicform
}), back, onChangeLogicform]);
return {
onDbClick: onDbClick
};
}
export function formatLogicformForEditor(logicform) {
var newLf = __assign({}, logicform);
delete newLf._path;
return newLf;
}