@teamix/pro 1.5.45 → 1.5.46

Sign up to get free protection for your applications and to get access to all the features.
package/dist/pro.js CHANGED
@@ -97698,6 +97698,13 @@ var baseStringifyConfig = {
97698
97698
  skipNull: false,
97699
97699
  skipEmptyString: false
97700
97700
  };
97701
+
97702
+ // 柯里化
97703
+ function curryingStringify(options) {
97704
+ return function (input) {
97705
+ return (0,query_string__WEBPACK_IMPORTED_MODULE_0__.stringify)(input, options);
97706
+ };
97707
+ }
97701
97708
  var useUrlState = function useUrlState(initialState, options) {
97702
97709
  var _ref = options || {},
97703
97710
  _ref$navigateMode = _ref.navigateMode,
@@ -97745,7 +97752,7 @@ var useUrlState = function useUrlState(initialState, options) {
97745
97752
  });
97746
97753
  }
97747
97754
  };
97748
- return [targetQuery, (0,ahooks__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .Z)(setState), queryFromUrl];
97755
+ return [targetQuery, (0,ahooks__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .Z)(setState), queryFromUrl, curryingStringify(mergedStringifyOptions)];
97749
97756
  };
97750
97757
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useUrlState);
97751
97758
 
@@ -97788,7 +97795,6 @@ var mergedOptions = function mergedOptions(options, globalOptions) {
97788
97795
  }, globalOptions == null ? void 0 : globalOptions.parseOptions, options == null ? void 0 : options.parseOptions)
97789
97796
  });
97790
97797
  };
97791
-
97792
97798
  /**
97793
97799
  * 解析值类型
97794
97800
  * @param values 值
@@ -97813,9 +97819,12 @@ var parseValueType = function parseValueType(values, valueType, mode) {
97813
97819
  Object.entries(value).forEach(function (_ref2) {
97814
97820
  var kk = _ref2[0],
97815
97821
  vv = _ref2[1];
97816
- newValues[k + "." + kk] = vv;
97822
+ newValues[String(k) + "." + kk] = vv; // add String() to make typescript happy
97817
97823
  });
97824
+
97818
97825
  delete newValues[k];
97826
+ } else {
97827
+ console.warn("valueType's object type must be a plain object");
97819
97828
  }
97820
97829
  break;
97821
97830
  default:
@@ -97842,7 +97851,8 @@ var parseValueType = function parseValueType(values, valueType, mode) {
97842
97851
  Object.entries(newValues).forEach(function (_ref3) {
97843
97852
  var kk = _ref3[0],
97844
97853
  vv = _ref3[1];
97845
- if (kk.startsWith(k + ".")) {
97854
+ // add String() to make typescript happy
97855
+ if (kk.startsWith(String(k) + ".")) {
97846
97856
  var _kk$split = kk.split('.'),
97847
97857
  _ = _kk$split[0],
97848
97858
  subKey = _kk$split[1];
@@ -97860,10 +97870,10 @@ var parseValueType = function parseValueType(values, valueType, mode) {
97860
97870
  };
97861
97871
 
97862
97872
  /**
97863
- * 基于useUrlState的hooks,增加默认配置和额外参数
97873
+ * 基于 ahooks 的 useUrlState,增加默认配置和额外参数,以及幂等判断避免重复 update 的能力
97864
97874
  * @param initialState 同useUrlState
97865
97875
  * @param urlStateOptions 新增beforeStringify、beforeParse、valueType参数和默认配置
97866
- * @returns `[urlState, setUrlState, queryFromUrl]` 注意 queryFromUrl 完全对应 url 中参数的情况、用于幂等判断,而 urlState 包含不在 url 中的(初次 use 时提供的)默认值
97876
+ * @returns `[urlState, setUrlState, queryFromUrl, stringify]` 注意 queryFromUrl 完全对应 url 中参数的情况、用于幂等判断,而 urlState 包含不在 url 中的(初次 use 时提供的)默认值;stringify 是根据 options 柯里化得到的参数转字符串函数,也用于幂等判断。
97867
97877
  */
97868
97878
  var useUrlState = function useUrlState(initialState, urlStateOptions) {
97869
97879
  var _getGlobalConfig;
@@ -97898,7 +97908,8 @@ var useUrlState = function useUrlState(initialState, urlStateOptions) {
97898
97908
  var _useUrlStateAhooks = (0,_ahooksUseUrlState__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(initialState, options),
97899
97909
  state = _useUrlStateAhooks[0],
97900
97910
  setState = _useUrlStateAhooks[1],
97901
- queryFromUrl = _useUrlStateAhooks[2];
97911
+ queryFromUrl = _useUrlStateAhooks[2],
97912
+ stringify = _useUrlStateAhooks[3];
97902
97913
  var setUrlStateCalls = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)([]);
97903
97914
 
97904
97915
  // 配置url参数
@@ -97918,7 +97929,7 @@ var useUrlState = function useUrlState(initialState, urlStateOptions) {
97918
97929
 
97919
97930
  // 输出url参数
97920
97931
  var urlState = parseValueType(mergedBeforeParse(state), mergedValueType, 'post');
97921
- return [urlState, setUrlState, queryFromUrl];
97932
+ return [urlState, setUrlState, queryFromUrl, stringify];
97922
97933
  };
97923
97934
 
97924
97935
 
@@ -102609,6 +102620,8 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
102609
102620
 
102610
102621
 
102611
102622
  function useBindUrl(bindUrl, functions, formRef) {
102623
+ var update = (0,_teamix_hooks__WEBPACK_IMPORTED_MODULE_0__.useUpdate)();
102624
+
102612
102625
  // 预处理 bindUrl 参数(主要兼容 SelectGroup 组件)
102613
102626
  var initializeBindUrl = function initializeBindUrl(options) {
102614
102627
  return options ? _extends({}, options, {
@@ -102640,7 +102653,8 @@ function useBindUrl(bindUrl, functions, formRef) {
102640
102653
  var _ref3 = bindUrl ? (0,_teamix_hooks__WEBPACK_IMPORTED_MODULE_0__.useUrlState)(undefined, initializeBindUrl((0,_teamix_utils__WEBPACK_IMPORTED_MODULE_1__.isPlainObj)(bindUrl) ? bindUrl : {})) : [],
102641
102654
  urlState = _ref3[0],
102642
102655
  setUrlState = _ref3[1],
102643
- queryFromUrl = _ref3[2];
102656
+ queryFromUrl = _ref3[2],
102657
+ stringify = _ref3[3];
102644
102658
 
102645
102659
  // 输出配置url参数的函数
102646
102660
  var initializedFunctions = Object.entries(functions).reduce(function (prev, _ref4) {
@@ -102650,31 +102664,33 @@ function useBindUrl(bindUrl, functions, formRef) {
102650
102664
  originalFunction == null ? void 0 : originalFunction(values);
102651
102665
  if (bindUrl) {
102652
102666
  // guard: onInit 会在 mount 时被自动调用,需要避免其在任何情况下都调用 setUrlState。故增加幂等判断
102653
- var hasDifference = false;
102667
+ var hasStringifiedDiff = false;
102668
+ var hasValuesDiff = false;
102654
102669
  for (var paramName in values) {
102655
102670
  if (Object.hasOwn(values, paramName)) {
102656
- var simpleTransform = function simpleTransform(value) {
102657
- if (value instanceof Array) {
102658
- return value.join(',');
102659
- }
102660
- if (value === undefined || value === null) {
102661
- return '';
102662
- }
102663
- if (value instanceof Object) {
102664
- console.warn('useBindUrl: 无法处理对象类型的 url 参数');
102665
- }
102666
- return value;
102667
- };
102668
102671
  var oldValue = queryFromUrl == null ? void 0 : queryFromUrl[paramName];
102669
102672
  var newValue = values[paramName];
102670
- if (simpleTransform(newValue) !== simpleTransform(oldValue)) {
102671
- hasDifference = true;
102673
+ // 这里我们必须使用 stringify 来判断是否有变化,因为 special case 太多。例如,默认配置下:
102674
+ // { a: [undefined, undefined], b: undefined, c: [], d: null, e: ''} 会生成 'd=&e='
102675
+ // 类似地,{ a: [''], b: [null], c: [undefined] } 会生成 'a=&b='。更不用说还有非默认配置的情况
102676
+ // 想要避免这种 hazard,我们必须使用钩子内部导出的、经过柯里化的 stringify 来判断生成的字符串是否无变化。
102677
+ if (stringify({
102678
+ v: newValue
102679
+ }) !== stringify({
102680
+ v: oldValue
102681
+ })) {
102682
+ hasStringifiedDiff = true;
102672
102683
  break;
102684
+ } else if (oldValue !== newValue) {
102685
+ hasValuesDiff = true;
102673
102686
  }
102674
102687
  }
102675
102688
  }
102676
- if (hasDifference) {
102689
+ if (hasStringifiedDiff) {
102677
102690
  setUrlState(values);
102691
+ } else if (hasValuesDiff) {
102692
+ // guard: 虽然 url 字符串没有变化,但是 values 变化了,还是需要触发组件的 update 以保证行为一致。
102693
+ update();
102678
102694
  }
102679
102695
  }
102680
102696
  };
@@ -105649,7 +105665,7 @@ if (!((_window = window) != null && _window.TEAMIXPRO_WITHOUT_ICON)) {
105649
105665
 
105650
105666
 
105651
105667
 
105652
- var version = '1.5.45';
105668
+ var version = '1.5.46';
105653
105669
 
105654
105670
  // By TeamixTest
105655
105671
  window.postMessage({
@@ -114455,7 +114471,10 @@ function genAutoWidthColumns(columns, ref, data, size, useRowSelection, actionCo
114455
114471
  return columns;
114456
114472
  }
114457
114473
  var finalColumns = [];
114458
- var filterdColumnsResult = _teamix_utils__WEBPACK_IMPORTED_MODULE_1__._.cloneDeep(columns);
114474
+ // @FIXME: lodash cloneDeep 无法正确处理 columns 内部含有 ReactNode 的情况。我们也不该用 React 以外的工具来复制 ReactNode
114475
+ // 因为它里面的 fiber node id 等等的在复制后并不会变,对于 React 来讲这就意味着两个 ReactNode 有相同的 fiber node id,不符合预期。
114476
+ // 先注释掉,后续再想办法
114477
+ var filterdColumnsResult = columns; // _.cloneDeep(columns);
114459
114478
  filterdColumnsResult.forEach(function (column, index) {
114460
114479
  var render = column.render,
114461
114480
  _column$valueType = column.valueType,