Files
Hydro/ui/components/marker/MarkerReactive.js
T
masnn f9468536de upgrade dep:
css-loader 0.28->3.5
del 4.1->5.1
eslint 5.18->6.8
eslint-config-airbnb 17.1->18.1
eslint-loader 2.1->4.0
file-loader 2.0->6.0
fs.extra 8.0->9.0
gulp 2.0->3.0
gulp-nunjucks 4.0->5.0
json-loader 0.5->Removed
style-loader 0.23->1.1
uglifyjs-webpack-plugin 1.3->2.2
yargs 13.2->15.3
katex 0.10->0.11
react-monaco-editor 0.35->0.36
timeage-react 1.2->3.0
timeago.js 3.0->4.0
uuid 3.3->7.0
2020-04-15 12:47:55 +08:00

59 lines
1.3 KiB
JavaScript

import _ from 'lodash';
import delay from 'vj/utils/delay';
import DOMAttachedObject from 'vj/components/DOMAttachedObject';
import Marker from './Marker';
export default class MarkerReactive extends DOMAttachedObject {
static DOMAttachKey = 'vjMarkerReactiveInstance';
static initFromDOM($dom) {
return MarkerReactive.getOrConstruct($dom);
}
static initAll() {
$('[data-marker-enabled]').get().forEach((dom) => MarkerReactive.initFromDOM($(dom)));
}
constructor($target) {
super($target);
this._onMouseUp = this.onMouseUp.bind(this);
this.bindEventHandlers();
}
bindEventHandlers() {
this.$dom.on('mouseup', this._onMouseUp);
}
unbindEventHandlers() {
this.$dom.off('mouseup', this._onMouseUp);
}
async onMouseUp(ev) {
await delay(1);
if (!window.getSelection) {
return;
}
const selection = window.getSelection();
if (!selection || selection.rangeCount === 0) {
return;
}
const range = selection.getRangeAt(0);
if (range.collapsed) {
return;
}
Marker.showAtPosition(this.$dom, ev.clientX, ev.clientY);
}
detach() {
if (this.detached) {
return;
}
this.unbindEventHandlers();
Marker.close();
super.detach();
}
}
_.assign(MarkerReactive, DOMAttachedObject);