delta-component
Version:
embeddable react component
113 lines (98 loc) • 4.22 kB
JavaScript
'use strict';
const BaseClientDocument = require('./logic/baseClientDocument').BaseClientDocument;
const HistoricalDocument = require('./logic/history/history').HistoricalDocument;
class Document extends BaseClientDocument {
/**
* UI работает с этим классом.
*
* Это прокси к другим классам, в которых выполняется бизнес-логика.
*
* Испускает события:
*
* * permanentlyNotOperable - с этим объектом нельзя никгда больше работать
* * lock - временно нельзя работать с объектом
* * unlock - можно работать с объектом
* * textChanged - изменился текст
* * localSelectionChanged - изменилось выделение текста
* * participantsChanged - участники изменили свое состояние
*
* Чтобы подписаться - нужно использовать
* document.on('lock', (...args) => {
* ...
* })
*
* @param documentString
* @param treedoc
* @param transport
* @param currentPerson
*/
constructor(documentString, treedoc, transport, currentPerson) {
super(documentString, treedoc, transport, currentPerson);
}
/** методы которые можно вызывать интерфейсу **/
insert(text) {
/**
* Вставить строку текста справа от текущей позиции курсора, сдвинуть курсор направо.
*
* Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры.
*
*/
this.throwWhenLocked();
this.getSelection().toNullWidth(); // на деле этот вызов необязателен
this._textState.makeDirty();
this.treedocClient.insert(text);
}
backspace(){
/**
* Удалить howMany символов влево от текущей позиции курсора.
*
* Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры.
*/
this.throwWhenLocked();
const selectionWidth = this.getSelection().getWidth();
const howMany = selectionWidth > 0 ? selectionWidth : 1;
this.getSelection().toNullWidth();
this._textState.makeDirty();
for(let i = 0; i < howMany; i++) this.treedocClient.backspace();
}
delete() {
this.throwWhenLocked();
try {
this._delete();
} catch (e) {
this.usageStats.send(`Unhandled exc ${e.stack}`);
throw e;
}
}
replace(deleteBeforeCursorCount, text = '') {
/**
* Заменить howMany символов влево строкой text и переместить курсор.
*
* Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры.
*
* Если нужно удалить несколько символов - используйте ее, передав string = ''.
*/
this.throwWhenLocked();
this._textState.makeDirty();
this.treedocClient.replace(deleteBeforeCursorCount, text);
}
close() {
/**
* Уведомить все остальные браузеры, что больше не будешь редактировать документ.
*/
// TODO: продумать что делать если больше одного окна ввода подписано на документ
this.removeAllListeners();
this.transport.leaveDocument(this.documentString);
}
getHistory() {
return new HistoricalDocument(
this.documentString,
this.treedoc,
this.transport,
this.viewersMap.currentUser
)
}
}
module.exports = {
Document,
};