UNPKG

ze-react-component-library

Version:
412 lines (331 loc) 12.5 kB
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; }