AtPanels.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. const { centerOfBbox } = require("../tests/helpers");
  2. const { I } = inject();
  3. /**
  4. * Helper to test draggable panels like Details and Outliner.
  5. * They are selected by providing one of PANEL selectors to constructor (see exports).
  6. */
  7. class Panel {
  8. container = ".lsf-sidepanels";
  9. root = ".lsf-panel";
  10. detached = ".lsf-panel_detached";
  11. aligmentLeft = ".lsf-panel_alignment_left";
  12. aligmentRight = ".lsf-panel_alignment_right";
  13. header = ".lsf-panel__header";
  14. body = ".lsf-panel__body";
  15. title = ".lsf-panel__title";
  16. leftZone = ".lsf-sidepanels__wrapper_align_left";
  17. rightZone = ".lsf-sidepanels__wrapper_align_right";
  18. collapsingToggle = ".lsf-panel__toggle";
  19. collapseButton = `${this.collapsingToggle}[data-tooltip*="Collapse"]`;
  20. expandButton = `${this.collapsingToggle}[data-tooltip*="Expand"]`;
  21. resizeTopLeft = '[data-resize="top-left"]';
  22. resizeTopRight = '[data-resize="top-right"]';
  23. resizeBottomLeft = '[data-resize="bottom-left"]';
  24. resizeBottomRight = '[data-resize="bottom-right"]';
  25. resizeTop = '[data-resize="top"]';
  26. resizeBottom = '[data-resize="bottom"]';
  27. resizeLeft = '[data-resize="left"]';
  28. resizeRight = '[data-resize="right"]';
  29. constructor(selector) {
  30. this.root = selector ? `${this.root}${selector}` : this.root;
  31. }
  32. locatePanel(stateSelector = "") {
  33. return locate(this.root + stateSelector);
  34. }
  35. locate(locator) {
  36. return locator ? locate(locator).inside(this.locatePanel()) : this.locatePanel();
  37. }
  38. seePanel() {
  39. I.seeElement(this.locatePanel());
  40. }
  41. seePanelAttachedLeft() {
  42. I.seeElement(this.locatePanel(`${this.aligmentLeft}:not(${this.detached})`).inside(this.leftZone));
  43. }
  44. seePanelAttachedRight() {
  45. I.seeElement(this.locatePanel(`${this.aligmentRight}:not(${this.detached})`).inside(this.rightZone));
  46. }
  47. seePanelDetached() {
  48. I.seeElement(this.locatePanel(this.detached));
  49. }
  50. seePanelBody() {
  51. I.seeElement(this.locate(this.body));
  52. }
  53. dontSeePanelBody() {
  54. I.dontSeeElement(this.locate(this.body));
  55. }
  56. collapsePanel() {
  57. I.click(this.locate(this.collapsingToggle));
  58. // Allow some tags to rerender and get new sizes before we can continue testing things
  59. I.wait(1);
  60. }
  61. expandPanel() {
  62. I.click(this.locate(this.header));
  63. }
  64. seeExpandButton() {
  65. I.seeElement(this.locate(this.expandButton));
  66. }
  67. dontSeeExpandButton() {
  68. I.dontSeeElement(this.locate(this.expandButton));
  69. }
  70. seeСollapseButton() {
  71. I.seeElement(this.locate(this.collapseButton));
  72. }
  73. dontSeeСollapseButton() {
  74. I.dontSeeElement(this.locate(this.collapseButton));
  75. }
  76. async grabHeaderBbox(elementSize) {
  77. return I.grabElementBoundingRect(this.locate(this.header), elementSize);
  78. }
  79. async grabPanelBbox(elementSize) {
  80. return I.grabElementBoundingRect(this.locatePanel(), elementSize);
  81. }
  82. async grabPanelsContainerBbox(elementSize) {
  83. return I.grabElementBoundingRect(this.container, elementSize);
  84. }
  85. async dragPanelBy(shiftX, shiftY, steps = 1) {
  86. const fromBbox = await this.grabHeaderBbox();
  87. const fromPoint = centerOfBbox(fromBbox);
  88. const toPoint = {
  89. x: fromPoint.x + shiftX,
  90. y: fromPoint.y + shiftY,
  91. };
  92. return await I.dragAndDropMouse(fromPoint, toPoint, "left", steps);
  93. }
  94. async dragPanelTo(x, y, steps = 1) {
  95. const fromBbox = await this.grabHeaderBbox();
  96. const fromPoint = centerOfBbox(fromBbox);
  97. const toPoint = {
  98. x,
  99. y,
  100. };
  101. return await I.dragAndDropMouse(fromPoint, toPoint, "left", steps);
  102. }
  103. async dragPanelToElement(locator, steps = 1) {
  104. const fromBbox = await this.grabHeaderBbox();
  105. const toBbox = await I.grabElementBoundingRect(locator);
  106. const fromPoint = centerOfBbox(fromBbox);
  107. const toPoint = centerOfBbox(toBbox);
  108. return await I.dragAndDropMouse(fromPoint, toPoint, "left", steps);
  109. }
  110. async dragPanelToLeftSocket(steps = 1) {
  111. return await this.dragPanelToElement(this.leftZone, steps);
  112. }
  113. async dragPanelToRightSocket(steps = 1) {
  114. return await this.dragPanelToElement(this.rightZone, steps);
  115. }
  116. async dragResizerBy(shiftX, shiftY, resizerSelector, steps = 1) {
  117. const fromBbox = await I.grabElementBoundingRect(this.locate(resizerSelector));
  118. const fromPoint = centerOfBbox(fromBbox);
  119. const toPoint = {
  120. x: fromPoint.x + shiftX,
  121. y: fromPoint.y + shiftY,
  122. };
  123. return await I.dragAndDropMouse(fromPoint, toPoint, "left", steps);
  124. }
  125. }
  126. module.exports = new Panel();
  127. module.exports.PANEL = {
  128. OUTLINER: ".lsf-outliner",
  129. DETAILS: ".lsf-details",
  130. };
  131. module.exports.usePanel = (panel) => {
  132. return new Panel(panel);
  133. };