eoss 0.1.0-alpha.33 → 0.1.0-alpha.34

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.
Files changed (56) hide show
  1. package/lib/account-login.js +1 -1
  2. package/lib/audit-trajectory.js +1 -1
  3. package/lib/autocomplete.js +109 -70
  4. package/lib/cascader.js +109 -70
  5. package/lib/checkbox-group.js +1 -1
  6. package/lib/color-picker.js +109 -70
  7. package/lib/config/api.js +1 -1
  8. package/lib/data-table.js +1 -1
  9. package/lib/date-picker.js +109 -70
  10. package/lib/dropdown-menu.js +109 -70
  11. package/lib/email-login.js +1 -1
  12. package/lib/eoss.common.js +319 -146
  13. package/lib/flow.js +1 -1
  14. package/lib/flows.js +1 -1
  15. package/lib/form.js +1 -1
  16. package/lib/icon.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/login.js +1 -1
  19. package/lib/lowcode-view.js +94 -35
  20. package/lib/lowcode.js +98 -24
  21. package/lib/main.js +2 -1
  22. package/lib/menu.js +109 -70
  23. package/lib/phone-login.js +1 -1
  24. package/lib/popover.js +109 -70
  25. package/lib/process-config.js +1 -1
  26. package/lib/process-module.js +1 -1
  27. package/lib/process-rule.js +1 -1
  28. package/lib/qrcode-login.js +1 -1
  29. package/lib/radio-group.js +1 -1
  30. package/lib/select.js +110 -71
  31. package/lib/selector-panel.js +1 -1
  32. package/lib/selector.js +1 -1
  33. package/lib/submenu.js +109 -70
  34. package/lib/table.js +110 -71
  35. package/lib/theme-chalk/base.css +1 -1
  36. package/lib/theme-chalk/index.css +1 -1
  37. package/lib/theme-chalk/main.css +1 -1
  38. package/lib/time-picker.js +109 -70
  39. package/lib/time-select.js +109 -70
  40. package/lib/tips.js +1 -1
  41. package/lib/tooltip.js +109 -70
  42. package/lib/tree-group.js +1 -1
  43. package/lib/tree.js +1 -1
  44. package/lib/update-history.js +1 -1
  45. package/lib/upload.js +1 -1
  46. package/lib/utils/popper.js +97 -48
  47. package/package.json +1 -1
  48. package/packages/lowcode/src/lowcode.vue +43 -2
  49. package/packages/lowcode/src/render.vue +47 -12
  50. package/packages/lowcode-view/src/render.vue +66 -26
  51. package/packages/lowcode-view/src/view.vue +13 -2
  52. package/packages/main/src/minxs.js +1 -0
  53. package/packages/theme-chalk/src/base.scss +2 -1
  54. package/src/config/api.js +1 -1
  55. package/src/index.js +1 -1
  56. package/src/utils/popper.js +109 -70
@@ -5010,7 +5010,7 @@ var publishedLists = '/main2/pageComponentConfig/listPublished';
5010
5010
  // 获取自定义配置详情
5011
5011
  var pageInfo = '/main2/pageComponentConfig/info';
5012
5012
  // 获取自定义配置授权列表
5013
- var pageGroup = 'main2/pageComponentTarget/listByConfigIdAndTypeGroup';
5013
+ var pageGroup = '/main2/pageComponentTarget/listByConfigIdAndTypeGroup';
5014
5014
 
5015
5015
  // 保存自定义配置,发布也调这个接口但要加上字段status=1
5016
5016
  var pageSave = '/main2/pageComponentConfig/save';
@@ -853,7 +853,7 @@ var publishedLists = '/main2/pageComponentConfig/listPublished';
853
853
  // 获取自定义配置详情
854
854
  var pageInfo = '/main2/pageComponentConfig/info';
855
855
  // 获取自定义配置授权列表
856
- var pageGroup = 'main2/pageComponentTarget/listByConfigIdAndTypeGroup';
856
+ var pageGroup = '/main2/pageComponentTarget/listByConfigIdAndTypeGroup';
857
857
 
858
858
  // 保存自定义配置,发布也调这个接口但要加上字段status=1
859
859
  var pageSave = '/main2/pageComponentConfig/save';
@@ -6288,7 +6288,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
6288
6288
  //
6289
6289
  var referenceOffsets = getOffsetRectRelativeToCustomParent(
6290
6290
  reference,
6291
- getOffsetParent(popper),
6291
+ popper,
6292
6292
  isParentFixed
6293
6293
  );
6294
6294
 
@@ -6343,17 +6343,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
6343
6343
  Popper.prototype._setupEventListeners = function () {
6344
6344
  // NOTE: 1 DOM access here
6345
6345
  this.state.updateBound = this.update.bind(this);
6346
- root.addEventListener('resize', this.state.updateBound);
6346
+ // 无界等微前端场景下沙箱 window 不会触发 resize,需监听真实 window
6347
+ this.state.realWindow = getRealWindow(this._popper);
6348
+ this.state.realWindow.addEventListener('resize', this.state.updateBound);
6347
6349
  // if the boundariesElement is window we don't need to listen for the scroll event
6348
6350
  if (this._options.boundariesElement !== 'window') {
6349
6351
  var target = getScrollParent(this._reference);
6350
- // here it could be both `body` or `documentElement` thanks to Firefox, we then check both
6351
- if (
6352
- target === root.document.body ||
6353
- target === root.document.documentElement
6354
- ) {
6355
- target = root;
6356
- }
6357
6352
  target.addEventListener('scroll', this.state.updateBound);
6358
6353
  this.state.scrollTarget = target;
6359
6354
  }
@@ -6367,7 +6362,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
6367
6362
  */
6368
6363
  Popper.prototype._removeEventListeners = function () {
6369
6364
  // NOTE: 1 DOM access here
6370
- root.removeEventListener('resize', this.state.updateBound);
6365
+ (this.state.realWindow || root).removeEventListener(
6366
+ 'resize',
6367
+ this.state.updateBound
6368
+ );
6371
6369
  if (
6372
6370
  this._options.boundariesElement !== 'window' &&
6373
6371
  this.state.scrollTarget
@@ -6421,47 +6419,24 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
6421
6419
  left: 0
6422
6420
  };
6423
6421
  } else if (boundariesElement === 'viewport') {
6424
- var offsetParent = getOffsetParent(this._popper);
6425
- var scrollParent = getScrollParent(this._popper);
6426
- var offsetParentRect = getOffsetRect(offsetParent);
6427
-
6428
- // Thanks the fucking native API, `document.body.scrollTop` & `document.documentElement.scrollTop`
6429
- var getScrollTopValue = function (element) {
6430
- return element == document.body
6431
- ? Math.max(
6432
- document.documentElement.scrollTop,
6433
- document.body.scrollTop
6434
- )
6435
- : element.scrollTop;
6436
- };
6437
- var getScrollLeftValue = function (element) {
6438
- return element == document.body
6439
- ? Math.max(
6440
- document.documentElement.scrollLeft,
6441
- document.body.scrollLeft
6442
- )
6443
- : element.scrollLeft;
6444
- };
6445
-
6446
- // if the popper is fixed we don't have to substract scrolling from the boundaries
6447
- var scrollTop =
6448
- data.offsets.popper.position === 'fixed'
6449
- ? 0
6450
- : getScrollTopValue(scrollParent);
6451
- var scrollLeft =
6422
+ // 将真实 window 的视口换算到 popper 所在包含块的坐标系。
6423
+ // 无界等场景下沙箱 window 的尺寸、shadowRoot 内元素的 scrollTop 均不可靠,
6424
+ // 统一从元素自身的 view 与真实包含块获取
6425
+ var realWindow = getRealWindow(this._popper);
6426
+ var containingBlockRect = getContainingBlockRect(
6427
+ this._popper,
6452
6428
  data.offsets.popper.position === 'fixed'
6453
- ? 0
6454
- : getScrollLeftValue(scrollParent);
6429
+ );
6455
6430
 
6456
6431
  boundaries = {
6457
- top: 0 - (offsetParentRect.top - scrollTop),
6432
+ top: 0 - containingBlockRect.top,
6458
6433
  right:
6459
- root.document.documentElement.clientWidth -
6460
- (offsetParentRect.left - scrollLeft),
6434
+ realWindow.document.documentElement.clientWidth -
6435
+ containingBlockRect.left,
6461
6436
  bottom:
6462
- root.document.documentElement.clientHeight -
6463
- (offsetParentRect.top - scrollTop),
6464
- left: 0 - (offsetParentRect.left - scrollLeft)
6437
+ realWindow.document.documentElement.clientHeight -
6438
+ containingBlockRect.top,
6439
+ left: 0 - containingBlockRect.left
6465
6440
  };
6466
6441
  } else {
6467
6442
  if (getOffsetParent(this._popper) === boundariesElement) {
@@ -6929,7 +6904,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
6929
6904
  element.style.visibility = 'hidden';
6930
6905
  var calcWidthToForceRepaint = element.offsetWidth;
6931
6906
  // original method
6932
- var styles = root.getComputedStyle(element);
6907
+ var styles = getRealWindow(element).getComputedStyle(element);
6933
6908
  var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);
6934
6909
  var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);
6935
6910
  var result = {
@@ -7000,9 +6975,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7000
6975
  */
7001
6976
  function getStyleComputedProperty(element, property) {
7002
6977
  // NOTE: 1 DOM access here
7003
- var css = root.getComputedStyle(element, null);
6978
+ // 无界等微前端场景下沙箱 window 与元素实际渲染所在 window 可能不一致,
6979
+ // 需使用元素自身的 view 读取计算样式,避免跨 document 读取到空值
6980
+ var css = getRealWindow(element).getComputedStyle(element, null);
7004
6981
  return css[property];
7005
6982
  }
6983
+
7006
6984
  /**
7007
6985
  * Returns the offset parent of the given element
7008
6986
  * @function
@@ -7017,6 +6995,68 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7017
6995
  : offsetParent;
7018
6996
  }
7019
6997
 
6998
+ /**
6999
+ * Returns the window the given element actually renders in.
7000
+ * 无界等微前端场景下组件代码运行在沙箱 window 中,而 DOM 实际渲染在
7001
+ * 主应用的 window(shadowRoot 内),滚动量、视口尺寸等必须取自元素自身的 view
7002
+ * @function
7003
+ * @ignore
7004
+ * @argument {Element} element
7005
+ * @returns {Window} window
7006
+ */
7007
+ function getRealWindow(element) {
7008
+ return (
7009
+ (element &&
7010
+ element.ownerDocument &&
7011
+ element.ownerDocument.defaultView) ||
7012
+ root
7013
+ );
7014
+ }
7015
+
7016
+ /**
7017
+ * Returns the viewport rect of the containing block actually used to position the popper.
7018
+ * 无界微前端等场景下 popper 被挂载进子应用的 shadowRoot,offsetParent 的兜底值
7019
+ * (documentElement)与浏览器真实的包含块不再重合,导致下拉框/提示框整体偏移
7020
+ * (偏移量恰为子应用容器在主应用中的位置),因此需要沿 composed tree 查找:
7021
+ * - fixed 定位:包含块为视口;
7022
+ * - absolute 定位:最近的 positioned 祖先元素(跨 shadowRoot 边界查找);
7023
+ * - 无 positioned 祖先:初始包含块,其视口原点为真实 window 滚动量的负值。
7024
+ * @function
7025
+ * @ignore
7026
+ * @argument {Element} element - popper element
7027
+ * @argument {Boolean} fixed - whether the popper is fixed positioned
7028
+ * @returns {Object} rect
7029
+ */
7030
+ function getContainingBlockRect(element, fixed) {
7031
+ if (fixed) {
7032
+ return { top: 0, left: 0, right: 0, bottom: 0 };
7033
+ }
7034
+
7035
+ var node = element.parentNode;
7036
+ while (node) {
7037
+ if (node.nodeType === 1) {
7038
+ if (getStyleComputedProperty(node, 'position') !== 'static') {
7039
+ return getBoundingClientRect(node);
7040
+ }
7041
+ } else if (node.nodeType === 11) {
7042
+ // 遇到 shadowRoot,跨边界从宿主元素继续向上查找
7043
+ node = node.host;
7044
+ continue;
7045
+ } else {
7046
+ break;
7047
+ }
7048
+ node = node.parentNode;
7049
+ }
7050
+
7051
+ var win = getRealWindow(element);
7052
+ return {
7053
+ top: -(win.pageYOffset || 0),
7054
+ left: -(win.pageXOffset || 0),
7055
+ right: 0,
7056
+ bottom: 0
7057
+ };
7058
+ }
7059
+
7020
7060
  /**
7021
7061
  * Returns the scrolling parent of the given element
7022
7062
  * @function
@@ -7026,18 +7066,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7026
7066
  */
7027
7067
  function getScrollParent(element) {
7028
7068
  var parent = element.parentNode;
7029
- if (!parent || parent.nodeType !== 1) {
7069
+ if (!parent) {
7030
7070
  return element;
7031
7071
  }
7032
7072
 
7033
- if (parent === root.document) {
7034
- // Firefox puts the scrollTOp value on `documentElement` instead of `body`, we then check which of them is
7035
- // greater than 0 and return the proper element
7036
- if (root.document.body.scrollTop || root.document.body.scrollLeft) {
7037
- return root.document.body;
7038
- } else {
7039
- return root.document.documentElement;
7040
- }
7073
+ if (parent.nodeType === 11) {
7074
+ // 无界等微前端场景 DOM 位于 shadowRoot 内,需跨边界从宿主元素继续向上查找,
7075
+ // 否则查找到 shadowRoot 即终止,滚动事件无法被监听
7076
+ return getScrollParent(parent.host);
7077
+ }
7078
+
7079
+ if (parent.nodeType !== 1) {
7080
+ // 到达 document,返回元素实际渲染所在的真实 window,
7081
+ // 保证 window 滚动时能触发位置更新
7082
+ return getRealWindow(element);
7041
7083
  }
7042
7084
 
7043
7085
  // Firefox want us to check `-x` and `-y` variations as well
@@ -7057,7 +7099,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7057
7099
  // fixes issue #65
7058
7100
  return parent;
7059
7101
  }
7060
- return getScrollParent(element.parentNode);
7102
+ return getScrollParent(parent);
7061
7103
  }
7062
7104
 
7063
7105
  /**
@@ -7075,9 +7117,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7075
7117
  if (getStyleComputedProperty(element, 'position') === 'fixed') {
7076
7118
  return true;
7077
7119
  }
7078
- return element.parentNode && element.parentNode.nodeType === 1
7079
- ? isFixed(element.parentNode)
7080
- : element;
7120
+ var parent = element.parentNode;
7121
+ if (parent && parent.nodeType === 11) {
7122
+ // 跨 shadowRoot 边界,从宿主元素继续向上判断
7123
+ parent = parent.host;
7124
+ }
7125
+ return parent && parent.nodeType === 1 ? isFixed(parent) : false;
7081
7126
  }
7082
7127
 
7083
7128
  /**
@@ -7193,15 +7238,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7193
7238
  */
7194
7239
  function getOffsetRectRelativeToCustomParent(element, parent, fixed) {
7195
7240
  var elementRect = getBoundingClientRect(element);
7196
- var parentRect = getBoundingClientRect(parent);
7197
-
7198
- if (fixed) {
7199
- var scrollParent = getScrollParent(parent);
7200
- parentRect.top += scrollParent.scrollTop;
7201
- parentRect.bottom += scrollParent.scrollTop;
7202
- parentRect.left += scrollParent.scrollLeft;
7203
- parentRect.right += scrollParent.scrollLeft;
7204
- }
7241
+ // parent 为 popper 元素:取其真实包含块的视口 rect,
7242
+ // 避免无界 shadowRoot 等场景下包含块假设错误导致的整体偏移
7243
+ var parentRect = getContainingBlockRect(parent, fixed);
7205
7244
 
7206
7245
  var rect = {
7207
7246
  top: elementRect.top - parentRect.top,
package/lib/cascader.js CHANGED
@@ -7191,7 +7191,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7191
7191
  //
7192
7192
  var referenceOffsets = getOffsetRectRelativeToCustomParent(
7193
7193
  reference,
7194
- getOffsetParent(popper),
7194
+ popper,
7195
7195
  isParentFixed
7196
7196
  );
7197
7197
 
@@ -7246,17 +7246,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7246
7246
  Popper.prototype._setupEventListeners = function () {
7247
7247
  // NOTE: 1 DOM access here
7248
7248
  this.state.updateBound = this.update.bind(this);
7249
- root.addEventListener('resize', this.state.updateBound);
7249
+ // 无界等微前端场景下沙箱 window 不会触发 resize,需监听真实 window
7250
+ this.state.realWindow = getRealWindow(this._popper);
7251
+ this.state.realWindow.addEventListener('resize', this.state.updateBound);
7250
7252
  // if the boundariesElement is window we don't need to listen for the scroll event
7251
7253
  if (this._options.boundariesElement !== 'window') {
7252
7254
  var target = getScrollParent(this._reference);
7253
- // here it could be both `body` or `documentElement` thanks to Firefox, we then check both
7254
- if (
7255
- target === root.document.body ||
7256
- target === root.document.documentElement
7257
- ) {
7258
- target = root;
7259
- }
7260
7255
  target.addEventListener('scroll', this.state.updateBound);
7261
7256
  this.state.scrollTarget = target;
7262
7257
  }
@@ -7270,7 +7265,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7270
7265
  */
7271
7266
  Popper.prototype._removeEventListeners = function () {
7272
7267
  // NOTE: 1 DOM access here
7273
- root.removeEventListener('resize', this.state.updateBound);
7268
+ (this.state.realWindow || root).removeEventListener(
7269
+ 'resize',
7270
+ this.state.updateBound
7271
+ );
7274
7272
  if (
7275
7273
  this._options.boundariesElement !== 'window' &&
7276
7274
  this.state.scrollTarget
@@ -7324,47 +7322,24 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7324
7322
  left: 0
7325
7323
  };
7326
7324
  } else if (boundariesElement === 'viewport') {
7327
- var offsetParent = getOffsetParent(this._popper);
7328
- var scrollParent = getScrollParent(this._popper);
7329
- var offsetParentRect = getOffsetRect(offsetParent);
7330
-
7331
- // Thanks the fucking native API, `document.body.scrollTop` & `document.documentElement.scrollTop`
7332
- var getScrollTopValue = function (element) {
7333
- return element == document.body
7334
- ? Math.max(
7335
- document.documentElement.scrollTop,
7336
- document.body.scrollTop
7337
- )
7338
- : element.scrollTop;
7339
- };
7340
- var getScrollLeftValue = function (element) {
7341
- return element == document.body
7342
- ? Math.max(
7343
- document.documentElement.scrollLeft,
7344
- document.body.scrollLeft
7345
- )
7346
- : element.scrollLeft;
7347
- };
7348
-
7349
- // if the popper is fixed we don't have to substract scrolling from the boundaries
7350
- var scrollTop =
7351
- data.offsets.popper.position === 'fixed'
7352
- ? 0
7353
- : getScrollTopValue(scrollParent);
7354
- var scrollLeft =
7325
+ // 将真实 window 的视口换算到 popper 所在包含块的坐标系。
7326
+ // 无界等场景下沙箱 window 的尺寸、shadowRoot 内元素的 scrollTop 均不可靠,
7327
+ // 统一从元素自身的 view 与真实包含块获取
7328
+ var realWindow = getRealWindow(this._popper);
7329
+ var containingBlockRect = getContainingBlockRect(
7330
+ this._popper,
7355
7331
  data.offsets.popper.position === 'fixed'
7356
- ? 0
7357
- : getScrollLeftValue(scrollParent);
7332
+ );
7358
7333
 
7359
7334
  boundaries = {
7360
- top: 0 - (offsetParentRect.top - scrollTop),
7335
+ top: 0 - containingBlockRect.top,
7361
7336
  right:
7362
- root.document.documentElement.clientWidth -
7363
- (offsetParentRect.left - scrollLeft),
7337
+ realWindow.document.documentElement.clientWidth -
7338
+ containingBlockRect.left,
7364
7339
  bottom:
7365
- root.document.documentElement.clientHeight -
7366
- (offsetParentRect.top - scrollTop),
7367
- left: 0 - (offsetParentRect.left - scrollLeft)
7340
+ realWindow.document.documentElement.clientHeight -
7341
+ containingBlockRect.top,
7342
+ left: 0 - containingBlockRect.left
7368
7343
  };
7369
7344
  } else {
7370
7345
  if (getOffsetParent(this._popper) === boundariesElement) {
@@ -7832,7 +7807,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7832
7807
  element.style.visibility = 'hidden';
7833
7808
  var calcWidthToForceRepaint = element.offsetWidth;
7834
7809
  // original method
7835
- var styles = root.getComputedStyle(element);
7810
+ var styles = getRealWindow(element).getComputedStyle(element);
7836
7811
  var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);
7837
7812
  var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);
7838
7813
  var result = {
@@ -7903,9 +7878,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7903
7878
  */
7904
7879
  function getStyleComputedProperty(element, property) {
7905
7880
  // NOTE: 1 DOM access here
7906
- var css = root.getComputedStyle(element, null);
7881
+ // 无界等微前端场景下沙箱 window 与元素实际渲染所在 window 可能不一致,
7882
+ // 需使用元素自身的 view 读取计算样式,避免跨 document 读取到空值
7883
+ var css = getRealWindow(element).getComputedStyle(element, null);
7907
7884
  return css[property];
7908
7885
  }
7886
+
7909
7887
  /**
7910
7888
  * Returns the offset parent of the given element
7911
7889
  * @function
@@ -7920,6 +7898,68 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7920
7898
  : offsetParent;
7921
7899
  }
7922
7900
 
7901
+ /**
7902
+ * Returns the window the given element actually renders in.
7903
+ * 无界等微前端场景下组件代码运行在沙箱 window 中,而 DOM 实际渲染在
7904
+ * 主应用的 window(shadowRoot 内),滚动量、视口尺寸等必须取自元素自身的 view
7905
+ * @function
7906
+ * @ignore
7907
+ * @argument {Element} element
7908
+ * @returns {Window} window
7909
+ */
7910
+ function getRealWindow(element) {
7911
+ return (
7912
+ (element &&
7913
+ element.ownerDocument &&
7914
+ element.ownerDocument.defaultView) ||
7915
+ root
7916
+ );
7917
+ }
7918
+
7919
+ /**
7920
+ * Returns the viewport rect of the containing block actually used to position the popper.
7921
+ * 无界微前端等场景下 popper 被挂载进子应用的 shadowRoot,offsetParent 的兜底值
7922
+ * (documentElement)与浏览器真实的包含块不再重合,导致下拉框/提示框整体偏移
7923
+ * (偏移量恰为子应用容器在主应用中的位置),因此需要沿 composed tree 查找:
7924
+ * - fixed 定位:包含块为视口;
7925
+ * - absolute 定位:最近的 positioned 祖先元素(跨 shadowRoot 边界查找);
7926
+ * - 无 positioned 祖先:初始包含块,其视口原点为真实 window 滚动量的负值。
7927
+ * @function
7928
+ * @ignore
7929
+ * @argument {Element} element - popper element
7930
+ * @argument {Boolean} fixed - whether the popper is fixed positioned
7931
+ * @returns {Object} rect
7932
+ */
7933
+ function getContainingBlockRect(element, fixed) {
7934
+ if (fixed) {
7935
+ return { top: 0, left: 0, right: 0, bottom: 0 };
7936
+ }
7937
+
7938
+ var node = element.parentNode;
7939
+ while (node) {
7940
+ if (node.nodeType === 1) {
7941
+ if (getStyleComputedProperty(node, 'position') !== 'static') {
7942
+ return getBoundingClientRect(node);
7943
+ }
7944
+ } else if (node.nodeType === 11) {
7945
+ // 遇到 shadowRoot,跨边界从宿主元素继续向上查找
7946
+ node = node.host;
7947
+ continue;
7948
+ } else {
7949
+ break;
7950
+ }
7951
+ node = node.parentNode;
7952
+ }
7953
+
7954
+ var win = getRealWindow(element);
7955
+ return {
7956
+ top: -(win.pageYOffset || 0),
7957
+ left: -(win.pageXOffset || 0),
7958
+ right: 0,
7959
+ bottom: 0
7960
+ };
7961
+ }
7962
+
7923
7963
  /**
7924
7964
  * Returns the scrolling parent of the given element
7925
7965
  * @function
@@ -7929,18 +7969,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7929
7969
  */
7930
7970
  function getScrollParent(element) {
7931
7971
  var parent = element.parentNode;
7932
- if (!parent || parent.nodeType !== 1) {
7972
+ if (!parent) {
7933
7973
  return element;
7934
7974
  }
7935
7975
 
7936
- if (parent === root.document) {
7937
- // Firefox puts the scrollTOp value on `documentElement` instead of `body`, we then check which of them is
7938
- // greater than 0 and return the proper element
7939
- if (root.document.body.scrollTop || root.document.body.scrollLeft) {
7940
- return root.document.body;
7941
- } else {
7942
- return root.document.documentElement;
7943
- }
7976
+ if (parent.nodeType === 11) {
7977
+ // 无界等微前端场景 DOM 位于 shadowRoot 内,需跨边界从宿主元素继续向上查找,
7978
+ // 否则查找到 shadowRoot 即终止,滚动事件无法被监听
7979
+ return getScrollParent(parent.host);
7980
+ }
7981
+
7982
+ if (parent.nodeType !== 1) {
7983
+ // 到达 document,返回元素实际渲染所在的真实 window,
7984
+ // 保证 window 滚动时能触发位置更新
7985
+ return getRealWindow(element);
7944
7986
  }
7945
7987
 
7946
7988
  // Firefox want us to check `-x` and `-y` variations as well
@@ -7960,7 +8002,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7960
8002
  // fixes issue #65
7961
8003
  return parent;
7962
8004
  }
7963
- return getScrollParent(element.parentNode);
8005
+ return getScrollParent(parent);
7964
8006
  }
7965
8007
 
7966
8008
  /**
@@ -7978,9 +8020,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
7978
8020
  if (getStyleComputedProperty(element, 'position') === 'fixed') {
7979
8021
  return true;
7980
8022
  }
7981
- return element.parentNode && element.parentNode.nodeType === 1
7982
- ? isFixed(element.parentNode)
7983
- : element;
8023
+ var parent = element.parentNode;
8024
+ if (parent && parent.nodeType === 11) {
8025
+ // 跨 shadowRoot 边界,从宿主元素继续向上判断
8026
+ parent = parent.host;
8027
+ }
8028
+ return parent && parent.nodeType === 1 ? isFixed(parent) : false;
7984
8029
  }
7985
8030
 
7986
8031
  /**
@@ -8096,15 +8141,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
8096
8141
  */
8097
8142
  function getOffsetRectRelativeToCustomParent(element, parent, fixed) {
8098
8143
  var elementRect = getBoundingClientRect(element);
8099
- var parentRect = getBoundingClientRect(parent);
8100
-
8101
- if (fixed) {
8102
- var scrollParent = getScrollParent(parent);
8103
- parentRect.top += scrollParent.scrollTop;
8104
- parentRect.bottom += scrollParent.scrollTop;
8105
- parentRect.left += scrollParent.scrollLeft;
8106
- parentRect.right += scrollParent.scrollLeft;
8107
- }
8144
+ // parent 为 popper 元素:取其真实包含块的视口 rect,
8145
+ // 避免无界 shadowRoot 等场景下包含块假设错误导致的整体偏移
8146
+ var parentRect = getContainingBlockRect(parent, fixed);
8108
8147
 
8109
8148
  var rect = {
8110
8149
  top: elementRect.top - parentRect.top,
@@ -4764,7 +4764,7 @@ var publishedLists = '/main2/pageComponentConfig/listPublished';
4764
4764
  // 获取自定义配置详情
4765
4765
  var pageInfo = '/main2/pageComponentConfig/info';
4766
4766
  // 获取自定义配置授权列表
4767
- var pageGroup = 'main2/pageComponentTarget/listByConfigIdAndTypeGroup';
4767
+ var pageGroup = '/main2/pageComponentTarget/listByConfigIdAndTypeGroup';
4768
4768
 
4769
4769
  // 保存自定义配置,发布也调这个接口但要加上字段status=1
4770
4770
  var pageSave = '/main2/pageComponentConfig/save';