diff --git a/cypress/integration/1.simple.spec.js b/cypress/integration/1.simple.spec.js index 3ef10ca2..98c67c04 100644 --- a/cypress/integration/1.simple.spec.js +++ b/cypress/integration/1.simple.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes, moveGutterByKeyboard, checkGutterAriaLabel, checkGuttersAriaValueTexts } from '../support/splitUtils' context('Simple split example page tests', () => { const W = 1076 @@ -14,6 +14,8 @@ context('Simple split example page tests', () => { it('Display initial state', () => { checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [319.5, 745.5]) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [120, 774, 160]) + checkGutterAriaLabel('.ex-percent .as-split-gutter', 0, 'adjustable divider between two views') + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['30 percent']) }) it('Change direction', () => { @@ -24,55 +26,125 @@ context('Simple split example page tests', () => { }) it('Move gutter horizontally', () => { - moveGutter('.ex-percent .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [599.5, 465.5]) - moveGutter('.ex-pixel .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [400, 494, 160]) }) it('Change direction & move gutter vertically', () => { cy.get('.btns > .btn').click() - moveGutter('.ex-percent .as-split-gutter', 0, 0, 60) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, 0, 60) checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [146.6875, 142.296875]) - moveGutter('.ex-pixel .as-split-gutter', 0, 0, 60) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, 0, 60) checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [180, 0, 100]) }) it('Move gutter horizontally and move it back', () => { - moveGutter('.ex-percent .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [599.5, 465.5]) - moveGutter('.ex-percent .as-split-gutter', 0, -280, 0) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, -280, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [319.5, 745.5]) - moveGutter('.ex-pixel .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [400, 494, 160]) - moveGutter('.ex-pixel .as-split-gutter', 0, -280, 0) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, -280, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [120, 774, 160]) }) it('Move gutter horizontally to max, change direction', () => { - moveGutter('.ex-percent .as-split-gutter', 0, -1000, 0) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, -1000, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [0, 1065]) - moveGutter('.ex-pixel .as-split-gutter', 0, -1000, 0) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, -1000, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [0, 894, 160]) cy.get('.btns > .btn').click() checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [0, 289]) - moveGutter('.ex-percent .as-split-gutter', 0, 0, 1000) + moveGutterByMouse('.ex-percent .as-split-gutter', 0, 0, 1000) checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [0, 118, 160]) - moveGutter('.ex-pixel .as-split-gutter', 0, 0, 1000) + moveGutterByMouse('.ex-pixel .as-split-gutter', 0, 0, 1000) cy.get('.btns > .btn').click() checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [1065, 0]) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [278, 776, 0]) }) + + it('Move gutter horizontally by using keyboard', () => { + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'leftarrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [269.5, 795.5]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['25 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'rightarrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [319.5, 745.5]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['30 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'pagedown') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [0, 1065]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['0 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [500, 565]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['47 percent']) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'leftarrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [70, 824, 160]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['70 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'rightarrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [120, 774, 160]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['120 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [620, 274, 160]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['620 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'pagedown') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [120, 774, 160]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['120 pixel', null]) + }) + + it('Move gutter vertically by using keyboard', () => { + cy.get('.btns > .btn').click() + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'downarrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [136.703125, 152.296875]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['47 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'uparrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [86.703125, 202.28125]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['30 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'pagedown') + checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [289, 0]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['100 percent']) + + moveGutterByKeyboard('.ex-percent .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-percent > as-split', 'vertical', W, H, GUTTER, [0, 289]) + checkGuttersAriaValueTexts('.ex-percent .as-split-gutter', ['0 percent']) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'downarrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [170, 0, 110]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['170 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'uparrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [120, 48, 110]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['120 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [0, 168, 110]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['0 pixel', null]) + + moveGutterByKeyboard('.ex-pixel .as-split-gutter', 0, 1, 'pagedown') + checkSplitDirAndSizes('.ex-pixel > as-split', 'vertical', W, H, GUTTER, [278, 0, 0]) + checkGuttersAriaValueTexts('.ex-pixel .as-split-gutter', ['278 pixel', null]) + }) }) diff --git a/cypress/integration/2.minmax.spec.js b/cypress/integration/2.minmax.spec.js index 35936662..6edbcff3 100644 --- a/cypress/integration/2.minmax.spec.js +++ b/cypress/integration/2.minmax.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes, moveGutterByKeyboard, checkGuttersAriaValueTexts } from '../support/splitUtils' context('Min & max splits example page tests', () => { const W = 1070 @@ -31,7 +31,7 @@ context('Min & max splits example page tests', () => { }) it('Move gutters having restrictMove off [PERCENT MODE]', () => { - moveGutter('.ex-percent > as-split > .as-split-gutter', 0, 200, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 0, 200, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [304.796875, 406.390625, 304.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -40,7 +40,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 0, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 0, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [204.796875, 506.390625, 304.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -49,7 +49,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 0, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 0, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [203.1875, 508, 304.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -58,7 +58,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 1, 100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 1, 100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [303.203125, 508, 204.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -67,7 +67,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [303.203125, 408, 304.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -76,7 +76,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [303.203125, 308, 404.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -85,7 +85,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [206.390625, 304.796875, 504.796875]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -94,7 +94,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) + moveGutterByMouse('.ex-percent > as-split > .as-split-gutter', 1, -100, 0) checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [203.1875, 304.796875, 508]) checkAreasClasses('.ex-percent > as-split > .as-split-area', [ @@ -105,7 +105,7 @@ context('Min & max splits example page tests', () => { }) it('Move gutters having restrictMove off [PIXEL MODE]', () => { - moveGutter('.ex-pixel > as-split > .as-split-gutter', 0, 200, 0) + moveGutterByMouse('.ex-pixel > as-split > .as-split-gutter', 0, 200, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [200, 386, 150, 250]) checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ @@ -115,7 +115,7 @@ context('Min & max splits example page tests', () => { { haveTo: ['as-min'], notHaveTo: ['as-max'] }, ]) - moveGutter('.ex-pixel > as-split > .as-split-gutter', 0, -100, 0) + moveGutterByMouse('.ex-pixel > as-split > .as-split-gutter', 0, -100, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [100, 486, 150, 250]) checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ @@ -125,7 +125,7 @@ context('Min & max splits example page tests', () => { { haveTo: ['as-min'], notHaveTo: ['as-max'] }, ]) - moveGutter('.ex-pixel > as-split > .as-split-gutter', 1, 100, 0) + moveGutterByMouse('.ex-pixel > as-split > .as-split-gutter', 1, 100, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [100, 486, 150, 250]) checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ @@ -135,7 +135,7 @@ context('Min & max splits example page tests', () => { { haveTo: ['as-min'], notHaveTo: ['as-max'] }, ]) - moveGutter('.ex-pixel > as-split > .as-split-gutter', 1, -100, 0) + moveGutterByMouse('.ex-pixel > as-split > .as-split-gutter', 1, -100, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [100, 386, 150, 350]) checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ @@ -145,7 +145,7 @@ context('Min & max splits example page tests', () => { { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, ]) - moveGutter('.ex-pixel > as-split > .as-split-gutter', 2, -100, 0) + moveGutterByMouse('.ex-pixel > as-split > .as-split-gutter', 2, -100, 0) checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [100, 336, 150, 400]) checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ @@ -159,6 +159,95 @@ context('Min & max splits example page tests', () => { it('Move gutters having restrictMove on [PERCENT MODE]', () => {}) it('Move gutters having restrictMove on [PIXEL MODE]', () => {}) + + it('Move gutters having restrictMove off by keyboard [PERCENT MODE]', () => { + moveGutterByKeyboard('.ex-percent > as-split > .as-split-gutter', 0, 1, 'leftarrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [254.796875, 456.390625, 304.796875]) + checkAreasClasses('.ex-percent > as-split > .as-split-area', [ + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + ]) + checkGuttersAriaValueTexts('.ex-percent > as-split > .as-split-gutter', ['25 percent', '45 percent']) + + moveGutterByKeyboard('.ex-percent > as-split > .as-split-gutter', 0, 1, 'pagedown') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [203.1875, 508, 304.796875]) + checkAreasClasses('.ex-percent > as-split > .as-split-area', [ + { haveTo: ['as-min'], notHaveTo: ['as-max'] }, + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + ]) + checkGuttersAriaValueTexts('.ex-percent > as-split > .as-split-gutter', ['20 percent', '50 percent']) + + moveGutterByKeyboard('.ex-percent > as-split > .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [304.796875, 406.390625, 304.796875]) + checkAreasClasses('.ex-percent > as-split > .as-split-area', [ + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + ]) + checkGuttersAriaValueTexts('.ex-percent > as-split > .as-split-gutter', ['30 percent', '40 percent']) + + moveGutterByKeyboard('.ex-percent > as-split > .as-split-gutter', 1, 1, 'leftarrow') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [304.796875, 356.390625, 354.796875]) + checkAreasClasses('.ex-percent > as-split > .as-split-area', [ + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + ]) + checkGuttersAriaValueTexts('.ex-percent > as-split > .as-split-gutter', ['30 percent', '35 percent']) + + moveGutterByKeyboard('.ex-percent > as-split > .as-split-gutter', 1, 1, 'pagedown') + checkSplitDirAndSizes('.ex-percent > as-split', 'horizontal', W, H, GUTTER, [203.1875, 304.796875, 508]) + checkAreasClasses('.ex-percent > as-split > .as-split-area', [ + { haveTo: ['as-min'], notHaveTo: ['as-max'] }, + { haveTo: ['as-min'], notHaveTo: ['as-max'] }, + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + ]) + checkGuttersAriaValueTexts('.ex-percent > as-split > .as-split-gutter', ['20 percent', '30 percent']) + }) + + it('Move gutters having restrictMove off by keyboard [PIXEL MODE]', () => { + moveGutterByKeyboard('.ex-pixel > as-split > .as-split-gutter', 0, 1, 'leftarrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [150, 436, 150, 250]) + checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: ['as-min', 'as-max'], notHaveTo: [] }, + { haveTo: ['as-min'], notHaveTo: ['as-max'] } + ]) + checkGuttersAriaValueTexts('.ex-pixel > as-split > .as-split-gutter', ['150 pixel', null, '150 pixel']) + + moveGutterByKeyboard('.ex-pixel > as-split > .as-split-gutter', 0, 1, 'pageup') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [200, 386, 150, 250]) + checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: ['as-min', 'as-max'], notHaveTo: [] }, + { haveTo: ['as-min'], notHaveTo: ['as-max'] } + ]) + checkGuttersAriaValueTexts('.ex-pixel > as-split > .as-split-gutter', ['200 pixel', null, '150 pixel']) + + moveGutterByKeyboard('.ex-pixel > as-split > .as-split-gutter', 1, 2, 'leftarrow') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [200, 286, 150, 350]) + checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: ['as-min', 'as-max'], notHaveTo: [] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] } + ]) + checkGuttersAriaValueTexts('.ex-pixel > as-split > .as-split-gutter', ['200 pixel', null, '150 pixel']) + + moveGutterByKeyboard('.ex-pixel > as-split > .as-split-gutter', 2, 1, 'pageup') + checkSplitDirAndSizes('.ex-pixel > as-split', 'horizontal', W, H, GUTTER, [200, 386, 150, 250]) + checkAreasClasses('.ex-pixel > as-split > .as-split-area', [ + { haveTo: ['as-max'], notHaveTo: ['as-min'] }, + { haveTo: [], notHaveTo: ['as-min', 'as-max'] }, + { haveTo: ['as-min', 'as-max'], notHaveTo: [] }, + { haveTo: ['as-min'], notHaveTo: ['as-max'] } + ]) + checkGuttersAriaValueTexts('.ex-pixel > as-split > .as-split-gutter', ['200 pixel', null, '150 pixel']) + }) }) function checkAreasClasses(sel, all) { diff --git a/cypress/integration/3.nested.spec.js b/cypress/integration/3.nested.spec.js index b645470d..fc2b5514 100644 --- a/cypress/integration/3.nested.spec.js +++ b/cypress/integration/3.nested.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes } from '../support/splitUtils' context('Nested splits example page tests', () => { const W = 1070 @@ -33,21 +33,21 @@ context('Nested splits example page tests', () => { }) it('Move gutter horizontally 3 times and until maximum', () => { - moveGutter('.split-example > as-split > .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.split-example > as-split > .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [706, 358.984375]) - moveGutter('.split-example > as-split > .as-split-gutter', 0, -80, 0) + moveGutterByMouse('.split-example > as-split > .as-split-gutter', 0, -80, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [626.015625, 438.984375]) - moveGutter('.split-example > as-split > .as-split-gutter', 0, 700, 0) + moveGutterByMouse('.split-example > as-split > .as-split-gutter', 0, 700, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [1065, 0]) }) it('Move nested split 1 multiple times', () => { - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, 60) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, 60) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'vertical', @@ -57,7 +57,7 @@ context('Nested splits example page tests', () => { [186.015625, 65.984375, 125.984375], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 1, 0, -300) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 1, 0, -300) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'vertical', @@ -68,7 +68,7 @@ context('Nested splits example page tests', () => { ) // Move space smaller than gutter > move - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -10) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -10) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'vertical', @@ -79,7 +79,7 @@ context('Nested splits example page tests', () => { ) // Move space same as gutter > move - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -GUTTER) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -GUTTER) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'vertical', @@ -90,7 +90,7 @@ context('Nested splits example page tests', () => { ) // Move space bigger than gutter > move - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -20) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 0, -20) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'vertical', @@ -102,7 +102,7 @@ context('Nested splits example page tests', () => { }) it('Move nested split 2 multiple times', () => { - moveGutter('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 0, 600) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 0, 600) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(2) > as-split', 'vertical', @@ -112,7 +112,7 @@ context('Nested splits example page tests', () => { [389, 0], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 0, -600) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 0, -600) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(2) > as-split', 'vertical', diff --git a/cypress/integration/4.sync.spec.js b/cypress/integration/4.sync.spec.js index 64f88bb6..7c9ae5d0 100644 --- a/cypress/integration/4.sync.spec.js +++ b/cypress/integration/4.sync.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes } from '../support/splitUtils' context('Sync splits example page tests', () => { const W = 1076 @@ -40,7 +40,7 @@ context('Sync splits example page tests', () => { }) it('Move gutter first split horizontally and check if others splits follow', () => { - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', @@ -66,7 +66,7 @@ context('Sync splits example page tests', () => { [546.25, 518.75], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 600, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, 600, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', @@ -92,7 +92,7 @@ context('Sync splits example page tests', () => { [1065, 0], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, -1500, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(1) > as-split > .as-split-gutter', 0, -1500, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', @@ -120,7 +120,7 @@ context('Sync splits example page tests', () => { }) it('Move gutter second split horizontally and check if others splits follow', () => { - moveGutter('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 280, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 280, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', @@ -146,7 +146,7 @@ context('Sync splits example page tests', () => { [546.25, 518.75], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 600, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, 600, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', @@ -172,7 +172,7 @@ context('Sync splits example page tests', () => { [1065, 0], ) - moveGutter('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, -1500, 0) + moveGutterByMouse('.split-example > as-split > .as-split-area:nth-child(2) > as-split > .as-split-gutter', 0, -1500, 0) checkSplitDirAndSizes( '.split-example > as-split > .as-split-area:nth-child(1) > as-split', 'horizontal', diff --git a/cypress/integration/5.style.spec.js b/cypress/integration/5.style.spec.js index 003b0395..2b716464 100644 --- a/cypress/integration/5.style.spec.js +++ b/cypress/integration/5.style.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes } from '../support/splitUtils' context('Custom split style example page tests', () => { const W = 1070 diff --git a/cypress/integration/7.click.spec.js b/cypress/integration/7.click.spec.js index 6f029026..c8f0ed88 100644 --- a/cypress/integration/7.click.spec.js +++ b/cypress/integration/7.click.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes } from '../support/splitUtils' function checkEventCount({ dragStartCount, dragEndCount, gutterClickCount, gutterDblClickCount, transitionEndCount }) { if (dragStartCount !== undefined) { @@ -70,7 +70,7 @@ context('Gutter click example page tests', () => { it('Mix gutter click and dragging', () => { // Try move gutter event if disabled - moveGutter('.as-split-gutter', 0, -100, 0) + moveGutterByMouse('.as-split-gutter', 0, -100, 0) // gutterClick should be fired same as normal click event since dragging is disabled. checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [264, 528, 264]) @@ -78,7 +78,7 @@ context('Gutter click example page tests', () => { cy.get('.btns button').eq(1).click() // Move gutter1 - moveGutter('.as-split-gutter', 0, -100, 0) + moveGutterByMouse('.as-split-gutter', 0, -100, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [164, 628, 264]) cy.wait(10) @@ -101,7 +101,7 @@ context('Gutter click example page tests', () => { checkEventCount({ dragStartCount: 1, dragEndCount: 1, gutterClickCount: 2, transitionEndCount: 2 }) // Move gutter2 to enlarge area3 - moveGutter('.as-split-gutter', 1, -20, 0) + moveGutterByMouse('.as-split-gutter', 1, -20, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [0, 1036, 20]) checkEventCount({ dragStartCount: 2, dragEndCount: 2, gutterClickCount: 2, transitionEndCount: 2 }) diff --git a/cypress/integration/9.geek.spec.js b/cypress/integration/9.geek.spec.js index 10314fc5..43c92e47 100644 --- a/cypress/integration/9.geek.spec.js +++ b/cypress/integration/9.geek.spec.js @@ -1,6 +1,6 @@ /// -import { moveGutter, checkSplitDirAndSizes } from '../support/splitUtils' +import { moveGutterByMouse, checkSplitDirAndSizes } from '../support/splitUtils' context('Geek demo example page tests', () => { const W = 1076 @@ -79,30 +79,30 @@ context('Geek demo example page tests', () => { [27.875, 27.875, 27.875, 27.875, 27.875, 27.875, 27.875, 27.875], ) - moveGutter('.as-split-gutter', 0, 0, -200) - moveGutter('.as-split-gutter', 1, 0, -200) - moveGutter('.as-split-gutter', 2, 0, -200) - moveGutter('.as-split-gutter', 3, 0, -200) - moveGutter('.as-split-gutter', 4, 0, -200) - moveGutter('.as-split-gutter', 5, 0, -200) - moveGutter('.as-split-gutter', 6, 0, -200) + moveGutterByMouse('.as-split-gutter', 0, 0, -200) + moveGutterByMouse('.as-split-gutter', 1, 0, -200) + moveGutterByMouse('.as-split-gutter', 2, 0, -200) + moveGutterByMouse('.as-split-gutter', 3, 0, -200) + moveGutterByMouse('.as-split-gutter', 4, 0, -200) + moveGutterByMouse('.as-split-gutter', 5, 0, -200) + moveGutterByMouse('.as-split-gutter', 6, 0, -200) checkSplitDirAndSizes('.split-example > as-split', 'vertical', W, H, GUTTER, [0, 0, 0, 0, 0, 0, 0, 223]) - moveGutter('.as-split-gutter', 0, 0, 100) - moveGutter('.as-split-gutter', 1, 0, 100) - moveGutter('.as-split-gutter', 2, 0, 100) - moveGutter('.as-split-gutter', 3, 0, 100) - moveGutter('.as-split-gutter', 4, 0, 100) - moveGutter('.as-split-gutter', 5, 0, 100) - moveGutter('.as-split-gutter', 6, 0, 100) + moveGutterByMouse('.as-split-gutter', 0, 0, 100) + moveGutterByMouse('.as-split-gutter', 1, 0, 100) + moveGutterByMouse('.as-split-gutter', 2, 0, 100) + moveGutterByMouse('.as-split-gutter', 3, 0, 100) + moveGutterByMouse('.as-split-gutter', 4, 0, 100) + moveGutterByMouse('.as-split-gutter', 5, 0, 100) + moveGutterByMouse('.as-split-gutter', 6, 0, 100) checkSplitDirAndSizes('.split-example > as-split', 'vertical', W, H, GUTTER, [0, 0, 0, 0, 0, 0, 100, 123]) - moveGutter('.as-split-gutter', 5, 0, 150) - moveGutter('.as-split-gutter', 4, 0, 150) - moveGutter('.as-split-gutter', 3, 0, 150) - moveGutter('.as-split-gutter', 2, 0, 150) - moveGutter('.as-split-gutter', 1, 0, 150) - moveGutter('.as-split-gutter', 0, 0, 150) + moveGutterByMouse('.as-split-gutter', 5, 0, 150) + moveGutterByMouse('.as-split-gutter', 4, 0, 150) + moveGutterByMouse('.as-split-gutter', 3, 0, 150) + moveGutterByMouse('.as-split-gutter', 2, 0, 150) + moveGutterByMouse('.as-split-gutter', 1, 0, 150) + moveGutterByMouse('.as-split-gutter', 0, 0, 150) checkSplitDirAndSizes('.split-example > as-split', 'vertical', W, H, GUTTER, [100, 0, 0, 0, 0, 0, 0, 123]) cy.get('.opts-prop .btn').contains('horizontal').click() @@ -235,7 +235,7 @@ context('Geek demo example page tests', () => { checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [263.5, 527, 263.5]) // Move gutter 5px > move 5px - moveGutter('.split-example .as-split-gutter', 0, 5, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 5, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [268.484375, 522, 263.5]) /////////////////////////////////// @@ -243,19 +243,19 @@ context('Geek demo example page tests', () => { cy.get('.opts-prop').contains('Gutter step:').parent().contains('10').click() // Move gutter 5px > no move - moveGutter('.split-example .as-split-gutter', 0, 5, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 5, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [268.484375, 522, 263.5]) // Move gutter 6px > move 10px - moveGutter('.split-example .as-split-gutter', 0, 6, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 6, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [278.5, 511.984375, 263.5]) // Move gutter 15px > move 10px - moveGutter('.split-example .as-split-gutter', 0, 15, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 15, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [288.515625, 501.984375, 263.5]) // Move gutter 16px > move 20px - moveGutter('.split-example .as-split-gutter', 0, 16, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 16, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [308.515625, 481.984375, 263.5]) /////////////////////////////////// @@ -263,15 +263,15 @@ context('Geek demo example page tests', () => { cy.get('.opts-prop').contains('Gutter step:').parent().contains('50').click() // Move gutter 20px > nomove - moveGutter('.split-example .as-split-gutter', 0, 20, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 20, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [308.515625, 481.984375, 263.5]) // Move gutter 25px > nomove - moveGutter('.split-example .as-split-gutter', 0, 25, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 25, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [308.515625, 481.984375, 263.5]) // Move gutter 26px > move 50px - moveGutter('.split-example .as-split-gutter', 0, 26, 0) + moveGutterByMouse('.split-example .as-split-gutter', 0, 26, 0) checkSplitDirAndSizes('.split-example > as-split', 'horizontal', W, H, GUTTER, [358.515625, 431.96875, 263.5]) }) }) diff --git a/cypress/support/splitUtils.js b/cypress/support/splitUtils.js index 92cb3ede..01bfe9f2 100644 --- a/cypress/support/splitUtils.js +++ b/cypress/support/splitUtils.js @@ -1,4 +1,4 @@ -export function moveGutter(gutters, num, x, y) { +export function moveGutterByMouse(gutters, num, x, y) { cy.get(gutters) .eq(num) .trigger('mousedown', { which: 1, clientX: 0, clientY: 0 }) @@ -13,6 +13,38 @@ export function moveGutter(gutters, num, x, y) { cy.wait(10) } +export function moveGutterByKeyboard(gutters, num, numKeyPresses, keySequence) { + for (let i = 0; i < numKeyPresses; i++) { + cy.get(gutters) + .eq(num) + .focus() + .type(`{${keySequence}}`) + cy.wait(10) + } +} + +export function checkGutterAriaLabel(gutters, num, ariaLabel) { + cy.get(gutters) + .eq(num) + .should('have.attr', 'aria-label') + .and('equal', ariaLabel) +} + +export function checkGuttersAriaValueTexts(gutters, ariaValueTexts) { + cy.get(gutters) + .each(($gutter, index) => { + const ariaValueText = ariaValueTexts[index] + if (ariaValueText === null) { + cy.wrap($gutter) + .should('not.have.attr', 'aria-valuetext') + } else { + cy.wrap($gutter) + .should('have.attr', 'aria-valuetext') + .and('equal', ariaValueTexts[index]) + } + }) +} + ////////////////////////////////////////// export function checkSplitDirAndCalcSizes(el, dir, w, h, gutter, sizes) { diff --git a/projects/angular-split/src/lib/component/split.component.scss b/projects/angular-split/src/lib/component/split.component.scss index 451b5325..74f850a8 100644 --- a/projects/angular-split/src/lib/component/split.component.scss +++ b/projects/angular-split/src/lib/component/split.component.scss @@ -8,6 +8,7 @@ height: 100%; & > .as-split-gutter { + border: none; flex-grow: 0; flex-shrink: 0; background-color: #eeeeee; diff --git a/projects/angular-split/src/lib/component/split.component.ts b/projects/angular-split/src/lib/component/split.component.ts index d2d1a39e..910a60da 100644 --- a/projects/angular-split/src/lib/component/split.component.ts +++ b/projects/angular-split/src/lib/component/split.component.ts @@ -19,7 +19,15 @@ import { import { Observable, Subscriber, Subject } from 'rxjs' import { debounceTime } from 'rxjs/operators' -import { IArea, IPoint, ISplitSnapshot, IAreaSnapshot, IOutputData, IOutputAreaSizes, IDefaultOptions } from '../interface' +import { + IArea, + IPoint, + ISplitSnapshot, + IAreaSnapshot, + IOutputData, + IOutputAreaSizes, + IDefaultOptions, +} from '../interface' import { SplitAreaDirective } from '../directive/split-area.directive' import { getInputPositiveNumber, @@ -32,8 +40,9 @@ import { isUserSizesValid, pointDeltaEquals, updateAreaSize, + getKeyboardEndpoint, } from '../utils' -import { ANGULAR_SPLIT_DEFAULT_OPTIONS} from '../angular-split-config.token' +import { ANGULAR_SPLIT_DEFAULT_OPTIONS } from '../angular-split-config.token' /** * angular-split @@ -71,17 +80,26 @@ import { ANGULAR_SPLIT_DEFAULT_OPTIONS} from '../angular-split-config.token' changeDetection: ChangeDetectionStrategy.OnPush, styleUrls: [`./split.component.scss`], template: ` - +
@@ -188,6 +206,8 @@ export class SplitComponent implements AfterViewInit, OnDestroy { @Input() gutterClickDeltaPx = 2 + @Input() gutterAriaLabel: string + get gutterDblClickDuration(): number { return this._gutterDblClickDuration } @@ -530,7 +550,28 @@ export class SplitComponent implements AfterViewInit, OnDestroy { } } - public startDragging(event: MouseEvent | TouchEvent, gutterOrder: number, gutterNum: number): void { + public startKeyboardDrag(event: KeyboardEvent, gutterOrder: number, gutterNum: number) { + if (this.disabled === true || this.isWaitingClear === true) { + return + } + + const endPoint = getKeyboardEndpoint(event, this.direction) + if (endPoint === null) { + return + } + this.endPoint = endPoint + this.startPoint = getPointFromEvent(event) + + event.preventDefault() + event.stopPropagation() + + this.setupForDragEvent(gutterOrder, gutterNum) + this.startDragging() + this.drag() + this.stopDragging() + } + + public startMouseDrag(event: MouseEvent | TouchEvent, gutterOrder: number, gutterNum: number): void { event.preventDefault() event.stopPropagation() @@ -539,6 +580,21 @@ export class SplitComponent implements AfterViewInit, OnDestroy { return } + this.setupForDragEvent(gutterOrder, gutterNum) + + this.dragListeners.push(this.renderer.listen('document', 'mouseup', this.stopDragging.bind(this))) + this.dragListeners.push(this.renderer.listen('document', 'touchend', this.stopDragging.bind(this))) + this.dragListeners.push(this.renderer.listen('document', 'touchcancel', this.stopDragging.bind(this))) + + this.ngZone.runOutsideAngular(() => { + this.dragListeners.push(this.renderer.listen('document', 'mousemove', this.mouseDragEvent.bind(this))) + this.dragListeners.push(this.renderer.listen('document', 'touchmove', this.mouseDragEvent.bind(this))) + }) + + this.startDragging() + } + + private setupForDragEvent(gutterOrder: number, gutterNum: number) { this.snapshot = { gutterNum, lastSteppedOffset: 0, @@ -580,23 +636,16 @@ export class SplitComponent implements AfterViewInit, OnDestroy { if (this.snapshot.areasBeforeGutter.length === 0 || this.snapshot.areasAfterGutter.length === 0) { return } + } - this.dragListeners.push(this.renderer.listen('document', 'mouseup', this.stopDragging.bind(this))) - this.dragListeners.push(this.renderer.listen('document', 'touchend', this.stopDragging.bind(this))) - this.dragListeners.push(this.renderer.listen('document', 'touchcancel', this.stopDragging.bind(this))) - - this.ngZone.runOutsideAngular(() => { - this.dragListeners.push(this.renderer.listen('document', 'mousemove', this.dragEvent.bind(this))) - this.dragListeners.push(this.renderer.listen('document', 'touchmove', this.dragEvent.bind(this))) - }) - + private startDragging() { this.displayedAreas.forEach((area) => area.component.lockEvents()) this.isDragging = true this.isWaitingInitialMove = true } - private dragEvent(event: MouseEvent | TouchEvent): void { + private mouseDragEvent(event: MouseEvent | TouchEvent): void { event.preventDefault() event.stopPropagation() @@ -615,6 +664,10 @@ export class SplitComponent implements AfterViewInit, OnDestroy { return } + this.drag() + } + + private drag() { if (this.isWaitingInitialMove) { if (this.startPoint.x !== this.endPoint.x || this.startPoint.y !== this.endPoint.y) { this.ngZone.run(() => { @@ -825,4 +878,12 @@ export class SplitComponent implements AfterViewInit, OnDestroy { } this.updateArea(comp, false, false) } + + public getAriaAreaSizeText(size: number | null): string { + if (size === null) { + return null + } + + return size.toFixed(0) + ' ' + this.unit + } } diff --git a/projects/angular-split/src/lib/utils.ts b/projects/angular-split/src/lib/utils.ts index 3a45ffed..0ea95d8f 100644 --- a/projects/angular-split/src/lib/utils.ts +++ b/projects/angular-split/src/lib/utils.ts @@ -2,7 +2,7 @@ import { ElementRef } from '@angular/core' import { IArea, IPoint, IAreaSnapshot, ISplitSideAbsorptionCapacity, IAreaAbsorptionCapacity } from './interface' -export function getPointFromEvent(event: MouseEvent | TouchEvent): IPoint { +export function getPointFromEvent(event: MouseEvent | TouchEvent | KeyboardEvent): IPoint { // TouchEvent if ((event).changedTouches !== undefined && (event).changedTouches.length > 0) { return { @@ -17,6 +17,14 @@ export function getPointFromEvent(event: MouseEvent | TouchEvent): IPoint { y: (event).clientY, } } + // KeyboardEvent + else if ((event).currentTarget !== undefined) { + const gutterEl = event.currentTarget as HTMLElement + return { + x: gutterEl.offsetLeft, + y: gutterEl.offsetTop, + } + } return null } @@ -24,6 +32,72 @@ export function pointDeltaEquals(lhs: IPoint, rhs: IPoint, deltaPx: number) { return Math.abs(lhs.x - rhs.x) <= deltaPx && Math.abs(lhs.y - rhs.y) <= deltaPx } +export function getKeyboardEndpoint(event: KeyboardEvent, direction: 'horizontal' | 'vertical'): IPoint | null { + // Return null if direction keys on the opposite axis were pressed + if (direction === 'horizontal') { + switch (event.key) { + case 'ArrowLeft': + case 'ArrowRight': + case 'PageUp': + case 'PageDown': + break + default: + return null + } + } + if (direction === 'vertical') { + switch (event.key) { + case 'ArrowUp': + case 'ArrowDown': + case 'PageUp': + case 'PageDown': + break + default: + return null + } + } + + const gutterEl = event.currentTarget as HTMLElement + const offset = event.key === 'PageUp' || event.key === 'PageDown' ? 50 * 10 : 50 + let offsetX = gutterEl.offsetLeft, + offsetY = gutterEl.offsetTop + switch (event.key) { + case 'ArrowLeft': + offsetX -= offset + break + case 'ArrowRight': + offsetX += offset + break + case 'ArrowUp': + offsetY -= offset + break + case 'ArrowDown': + offsetY += offset + break + case 'PageUp': + if (direction === 'vertical') { + offsetY -= offset + } else { + offsetX += offset + } + break + case 'PageDown': + if (direction === 'vertical') { + offsetY += offset + } else { + offsetX -= offset + } + break + default: + return null + } + + return { + x: offsetX, + y: offsetY, + } +} + export function getElementPixelSize(elRef: ElementRef, direction: 'horizontal' | 'vertical'): number { const rect = (elRef.nativeElement).getBoundingClientRect() diff --git a/src/app/examples/simple-split/simple-split.component.ts b/src/app/examples/simple-split/simple-split.component.ts index 60b91068..1b01ffed 100644 --- a/src/app/examples/simple-split/simple-split.component.ts +++ b/src/app/examples/simple-split/simple-split.component.ts @@ -25,7 +25,13 @@ import { AComponent } from '../../ui/components/AComponent'
Percent mode:
- +
Initial size: 30%