@teamix/pro 1.5.45 → 1.5.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,