Skip to content

Commit

Permalink
Redesign of the scrolling zones (codex-team#634)
Browse files Browse the repository at this point in the history
* update table

* Fix mouse button

* scrollZones

* build

* zones resize
  • Loading branch information
horoyami authored Mar 1, 2019
1 parent 1e5e779 commit 19d228d
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 96 deletions.
10 changes: 5 additions & 5 deletions dist/editor.js

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Changelog
### 2.11.5

- `Fix` *RectangeSelection* — Redesign of the scrolling zones

### 2.11.4

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@editorjs/editorjs",
"version": "2.11.4",
"version": "2.11.5",
"description": "Editor.js — Native JS, based on API and Open Source",
"main": "dist/editor.js",
"types": "./types/index.d.ts",
Expand Down Expand Up @@ -61,8 +61,8 @@
"postcss-nested": "^3.0.0",
"postcss-nested-ancestors": "^2.0.0",
"postcss-nesting": "^6.0.0",
"postcss-preset-env": "^6.5.0",
"postcss-smart-import": "^0.7.6",
"postcss-preset-env": "^6.5.0",
"raw-loader": "^0.5.1",
"rimraf": "^2.6.2",
"stylelint": "^9.3.0",
Expand Down
4 changes: 2 additions & 2 deletions src/components/modules/blockSelection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ export default class BlockSelection extends Module {
const {BlockManager} = this.Editor;
/**
* When one page consist of two or more EditorJS instances
* Shortcut module tries to handle all events. Thats why Editor's selection works inside the target Editor, but for
* others error occurs because nothing to select.
* Shortcut module tries to handle all events. Thats why Editor's selection works inside the target Editor, but
* for others error occurs because nothing to select.
*
* Prevent such actions if focus is not inside the Editor
*/
Expand Down
119 changes: 54 additions & 65 deletions src/components/modules/rectangleSelection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import $ from '../dom';
import SelectionUtils from '../selection';
import Block from '../block';
import UI from './ui';
import Timeout = NodeJS.Timeout;

export default class RectangleSelection extends Module {
/**
Expand Down Expand Up @@ -41,7 +42,7 @@ export default class RectangleSelection extends Module {
/**
* Height of scroll zone on boundary of screen
*/
private readonly HEIGHT_OF_SCROLL_ZONE = 25;
private readonly HEIGHT_OF_SCROLL_ZONE = 40;

/**
* Scroll zone type indicators
Expand All @@ -59,6 +60,11 @@ export default class RectangleSelection extends Module {
*/
private mousedown: boolean = false;

/**
* Is scrolling now
*/
private isScrolling: boolean = false;

/**
* Mouse is in scroll zone
*/
Expand Down Expand Up @@ -87,48 +93,27 @@ export default class RectangleSelection extends Module {
*/
private overlayRectangle: HTMLDivElement;

/**
* Coords of redactor
*/
private left;
private top;

/**
* Module Preparation
* Creating rect and hang handlers
*/
public prepare(): void {
const {Listeners} = this.Editor;
const {overlayTopScrollZone, overlayBottomScrollZone, container, overlay} = this.genHTML();

Listeners.on(overlayBottomScrollZone, 'mouseenter', (event) => {
this.inScrollZone = this.BOTTOM_SCROLL_ZONE;
this.scrollVertical(this.SCROLL_SPEED);
});

Listeners.on(overlayTopScrollZone, 'mouseenter', (event) => {
this.inScrollZone = this.TOP_SCROLL_ZONE;
this.scrollVertical(-this.SCROLL_SPEED);
});

Listeners.on(overlayBottomScrollZone, 'mouseleave', (event) => {
this.inScrollZone = null;
});

Listeners.on(overlayTopScrollZone, 'mouseleave', (event) => {
this.inScrollZone = null;
});
const {container} = this.genHTML();

Listeners.on(container, 'mousedown', (event: MouseEvent) => {
if (event.button !== this.MAIN_MOUSE_BUTTON) { return; }
if (event.button !== this.MAIN_MOUSE_BUTTON) {
return;
}
this.startSelection(event.pageX, event.pageY);
}, false);

Listeners.on(document.body, 'mousemove', (event) => {
Listeners.on(document.body, 'mousemove', (event: MouseEvent) => {
this.changingRectangle(event);
this.scrollByZones(event.clientY);
}, false);

Listeners.on(document.body, 'mouseleave', (event) => {
Listeners.on(document.body, 'mouseleave', () => {
this.clearSelection();
this.endSelection();
});
Expand All @@ -137,7 +122,7 @@ export default class RectangleSelection extends Module {
this.changingRectangle(event);
}, false);

Listeners.on(document.body, 'mouseup', (event) => {
Listeners.on(document.body, 'mouseup', () => {
this.endSelection();
}, false);
}
Expand All @@ -161,7 +146,6 @@ export default class RectangleSelection extends Module {
this.mousedown = true;
this.startX = pageX;
this.startY = pageY;
const container = document.querySelector('.' + UI.CSS.editorWrapper);
}

/**
Expand All @@ -188,24 +172,42 @@ export default class RectangleSelection extends Module {
this.isRectSelectionActivated = false;
}

/**
* Scroll If mouse in scroll zone
* @param {number} clientY - Y coord of mouse
*/
private scrollByZones(clientY) {
this.inScrollZone = null;
if (clientY <= this.HEIGHT_OF_SCROLL_ZONE) {
this.inScrollZone = this.TOP_SCROLL_ZONE;
}
if (document.documentElement.clientHeight - clientY <= this.HEIGHT_OF_SCROLL_ZONE) {
this.inScrollZone = this.BOTTOM_SCROLL_ZONE;
}

if (!this.inScrollZone) {
this.isScrolling = false;
return;
}

if (!this.isScrolling) {
this.scrollVertical(this.inScrollZone === this.TOP_SCROLL_ZONE ? -this.SCROLL_SPEED : this.SCROLL_SPEED);
this.isScrolling = true;
}
}

private genHTML() {
const container = document.querySelector('.' + UI.CSS.editorWrapper);
const container = this.Editor.UI.nodes.holder.querySelector('.' + UI.CSS.editorWrapper);
const overlay = $.make('div', RectangleSelection.CSS.overlay, {});
const overlayContainer = $.make('div', RectangleSelection.CSS.overlayContainer, {});
const overlayRectangle = $.make('div', RectangleSelection.CSS.rect, {});
const overlayTopScrollZone = $.make('div', RectangleSelection.CSS.topScrollZone, {});
const overlayBottomScrollZone = $.make('div', RectangleSelection.CSS.bottomScrollZone, {});

overlayContainer.appendChild(overlayRectangle);
overlay.appendChild(overlayContainer);
document.body.appendChild(overlayTopScrollZone);
document.body.appendChild(overlayBottomScrollZone);
container.appendChild(overlay);

this.overlayRectangle = overlayRectangle as HTMLDivElement;
return {
overlayBottomScrollZone,
overlayTopScrollZone,
container,
overlay,
};
Expand All @@ -219,8 +221,9 @@ export default class RectangleSelection extends Module {
if (!(this.inScrollZone && this.mousedown)) {
return;
}
this.mouseY += speed;
const lastOffset = window.pageYOffset;
window.scrollBy(0, speed);
this.mouseY += window.pageYOffset - lastOffset;
setTimeout(() => {
this.scrollVertical(speed);
}, 0);
Expand Down Expand Up @@ -286,14 +289,14 @@ export default class RectangleSelection extends Module {
const isSelecteMode = firstBlockInStack.selected;

if (this.rectCrossesBlocks && !isSelecteMode) {
for (let i = 0; i < this.stackOfSelected.length; i++) {
this.Editor.BlockSelection.selectBlockByIndex(this.stackOfSelected[i]);
for (const it of this.stackOfSelected) {
this.Editor.BlockSelection.selectBlockByIndex(it);
}
}

if (!this.rectCrossesBlocks && isSelecteMode) {
for (let i = 0; i < this.stackOfSelected.length; i++) {
this.Editor.BlockSelection.unSelectBlockByIndex(this.stackOfSelected[i]);
for (const it of this.stackOfSelected) {
this.Editor.BlockSelection.unSelectBlockByIndex(it);
}
}
}
Expand Down Expand Up @@ -328,7 +331,7 @@ export default class RectangleSelection extends Module {
private genInfoForMouseSelection() {
const widthOfRedactor = document.body.offsetWidth;
const centerOfRedactor = widthOfRedactor / 2;
const Y = this.getHorizontalMousePosition();
const Y = this.mouseY - window.pageYOffset;
const elementUnderMouse = document.elementFromPoint(centerOfRedactor, Y);
const blockInCurrentPos = this.Editor.BlockManager.getBlockByChildNode(elementUnderMouse);
let index;
Expand All @@ -347,21 +350,6 @@ export default class RectangleSelection extends Module {
};
}

/**
* Get mouse Y coord with accounting Scroll zone
*/
private getHorizontalMousePosition() {
let value = this.mouseY - window.pageYOffset;
// To look at the item below the zone
if (this.inScrollZone === this.TOP_SCROLL_ZONE) {
value += this.HEIGHT_OF_SCROLL_ZONE;
}
if (this.inScrollZone === this.BOTTOM_SCROLL_ZONE) {
value -= this.HEIGHT_OF_SCROLL_ZONE;
}
return value;
}

/**
* Select block with index index
* @param index - index of block in redactor
Expand Down Expand Up @@ -394,19 +382,20 @@ export default class RectangleSelection extends Module {
const reduction = !generalSelection;

// When the selection is too fast, some blocks do not have time to be noticed. Fix it.
if (!reduction && (index > this.stackOfSelected[sizeStack - 1] || this.stackOfSelected[sizeStack - 1] === undefined)) {
let i = this.stackOfSelected[sizeStack - 1] + 1 || index;
if (!reduction && (index > this.stackOfSelected[sizeStack - 1] ||
this.stackOfSelected[sizeStack - 1] === undefined)) {
let ind = this.stackOfSelected[sizeStack - 1] + 1 || index;

for (i; i <= index; i++) {
this.addBlockInSelection(i);
for (ind; ind <= index; ind++) {
this.addBlockInSelection(ind);
}
return;
}

// for both directions
if (!reduction && (index < this.stackOfSelected[sizeStack - 1])) {
for (let i = this.stackOfSelected[sizeStack - 1] - 1; i >= index; i--) {
this.addBlockInSelection(i);
for (let ind = this.stackOfSelected[sizeStack - 1] - 1; ind >= index; ind--) {
this.addBlockInSelection(ind);
}
return;
}
Expand Down
22 changes: 0 additions & 22 deletions src/styles/ui.css
Original file line number Diff line number Diff line change
Expand Up @@ -85,28 +85,6 @@
background-color: rgba(46, 170, 220, 0.2);
border: 1px solid transparent;
}

&__scroll-zone {


&--top {
top: 0;
width: 100%;
height: 30px;
position: fixed;
pointer-events: auto;
z-index: 10500;
}

&--bottom {
bottom: 0;
width: 100%;
height: 30px;
position: fixed;
pointer-events: auto;
z-index: 10500;
}
}
}

svg {
Expand Down

0 comments on commit 19d228d

Please sign in to comment.