easy-richtextarea 4.0.19 → 4.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/undoBuffer.js CHANGED
@@ -44,97 +44,102 @@ function _interopRequireDefault(obj) {
44
44
  default: obj
45
45
  };
46
46
  }
47
- var push = _necessary.arrayUtilities.push;
47
+ var clear = _necessary.arrayUtilities.clear, filter = _necessary.arrayUtilities.filter, unshift = _necessary.arrayUtilities.unshift;
48
48
  var UndoBuffer = /*#__PURE__*/ function() {
49
- function UndoBuffer(position, operations) {
49
+ function UndoBuffer(undoOperations, redoOperations) {
50
50
  _classCallCheck(this, UndoBuffer);
51
- this.position = position;
52
- this.operations = operations;
51
+ this.undoOperations = undoOperations;
52
+ this.redoOperations = redoOperations;
53
53
  }
54
54
  _createClass(UndoBuffer, [
55
55
  {
56
- key: "getPosition",
57
- value: function getPosition() {
58
- return this.position;
56
+ key: "getUndoOperations",
57
+ value: function getUndoOperations() {
58
+ return this.undoOperations;
59
59
  }
60
60
  },
61
61
  {
62
- key: "getOperations",
63
- value: function getOperations() {
64
- return this.operations;
62
+ key: "getRedoOperations",
63
+ value: function getRedoOperations() {
64
+ return this.redoOperations;
65
65
  }
66
66
  },
67
67
  {
68
68
  key: "undo",
69
69
  value: function undo() {
70
- var operation = null;
71
- if (this.position > 0) {
72
- this.position--;
73
- operation = this.operations[this.position];
74
- var invertedOperation = operation.invert(_insert.default, _delete.default);
75
- operation = invertedOperation; ///
70
+ var undoOperation = null;
71
+ var undoOperationsLength = this.undoOperations.length;
72
+ if (undoOperationsLength > 0) {
73
+ undoOperation = this.undoOperations.shift();
74
+ var invertedUndoOperation = undoOperation.invert(_insert.default, _delete.default), redoOperation = invertedUndoOperation; ///
75
+ this.redoOperations.unshift(redoOperation);
76
76
  }
77
- return operation;
77
+ return undoOperation;
78
78
  }
79
79
  },
80
80
  {
81
81
  key: "redo",
82
82
  value: function redo() {
83
- var operation = null;
84
- var operationsLength = this.operations.length;
85
- if (this.position < operationsLength) {
86
- operation = this.operations[this.position];
87
- this.position++;
83
+ var redoOperation = null;
84
+ var redoOperationsLength = this.redoOperations.length;
85
+ if (redoOperationsLength > 0) {
86
+ redoOperation = this.redoOperations.shift();
87
+ var invertedRedoOperation = redoOperation.invert(_insert.default, _delete.default), undoOperation = invertedRedoOperation; ///
88
+ this.undoOperations.unshift(undoOperation);
88
89
  }
89
- return operation;
90
+ return redoOperation;
90
91
  }
91
92
  },
92
93
  {
93
94
  key: "transform",
94
95
  value: function transform(operations) {
95
- this.operations = (0, _operations.default)(this.operations, operations);
96
- this.filterEmptyOperations();
96
+ this.undoOperations = (0, _operations.default)(this.undoOperations, operations);
97
+ this.redoOperations = (0, _operations.default)(this.redoOperations, operations);
98
+ filterEmptyOperations(this.undoOperations);
99
+ filterEmptyOperations(this.redoOperations);
97
100
  }
98
101
  },
99
102
  {
100
103
  key: "addOperations",
101
104
  value: function addOperations(operations) {
102
- var start = this.position; ///
103
- this.operations.splice(start);
104
- push(this.operations, operations);
105
- var operationsLength = this.operations.length;
106
- this.position = operationsLength; ///
107
- }
108
- },
109
- {
110
- key: "filterEmptyOperations",
111
- value: function filterEmptyOperations() {
112
- var length = this.operations.length, position = 0;
113
- while(position < length){
114
- var operation = this.operations[position];
115
- if (_instanceof(operation, _empty.default)) {
116
- var start = position, deleteCount = 1;
117
- this.operations.splice(start, deleteCount);
118
- if (this.position > position) {
119
- this.position--;
120
- }
121
- } else {
122
- position++;
123
- }
124
- length = this.operations.length;
125
- }
105
+ var invertedOperations = invertOperations(operations), reversedInvertedOperations = reverseOperations(invertedOperations), undoOperations = reversedInvertedOperations; ///
106
+ unshift(this.undoOperations, undoOperations);
107
+ clear(this.redoOperations);
126
108
  }
127
109
  }
128
110
  ], [
129
111
  {
130
112
  key: "fromNothing",
131
113
  value: function fromNothing() {
132
- var position = 0, operations = [], undoBuffer = new UndoBuffer(position, operations);
114
+ var undoOperations = [], redoOperations = [], undoBuffer = new UndoBuffer(undoOperations, redoOperations);
133
115
  return undoBuffer;
134
116
  }
135
117
  }
136
118
  ]);
137
119
  return UndoBuffer;
138
120
  }();
121
+ function invertOperations(operations) {
122
+ var invertedOperations = operations.map(function(operation) {
123
+ var invertedOperation = operation.invert(_insert.default, _delete.default);
124
+ return invertedOperation;
125
+ });
126
+ return invertedOperations;
127
+ }
128
+ function reverseOperations(operations) {
129
+ var reversedOperations = operations.reduce(function(reversedOperations, operation) {
130
+ var reversedOperation = operation; ///
131
+ reversedOperations.unshift(reversedOperation);
132
+ return reversedOperations;
133
+ }, []);
134
+ return reversedOperations;
135
+ }
136
+ function filterEmptyOperations(operations) {
137
+ filter(operations, function(operation) {
138
+ var operationEmptyOperation = _instanceof(operation, _empty.default);
139
+ if (!operationEmptyOperation) {
140
+ return true;
141
+ }
142
+ });
143
+ }
139
144
 
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91bmRvQnVmZmVyLmpzIiwiPDxqc3gtY29uZmlnLXByYWdtYS5qcz4+Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVtcHR5T3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbi9lbXB0eVwiO1xuaW1wb3J0IEluc2VydE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb24vaW5zZXJ0XCI7XG5pbXBvcnQgRGVsZXRlT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbi9kZWxldGVcIjtcbmltcG9ydCB0cmFuc2Zvcm1PcGVyYXRpb25zIGZyb20gXCIuL3RyYW5zZm9ybS9vcGVyYXRpb25zXCI7XG5cbmNvbnN0IHsgcHVzaCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVuZG9CdWZmZXIge1xuICBjb25zdHJ1Y3Rvcihwb3NpdGlvbiwgb3BlcmF0aW9ucykge1xuICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb247XG4gIH1cblxuICBnZXRPcGVyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnM7XG4gIH1cblxuICB1bmRvKCkge1xuICAgIGxldCBvcGVyYXRpb24gPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucG9zaXRpb24gPiAwKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uLS07XG5cbiAgICAgIG9wZXJhdGlvbiA9IHRoaXMub3BlcmF0aW9uc1t0aGlzLnBvc2l0aW9uXTtcblxuICAgICAgY29uc3QgaW52ZXJ0ZWRPcGVyYXRpb24gPSBvcGVyYXRpb24uaW52ZXJ0KEluc2VydE9wZXJhdGlvbiwgRGVsZXRlT3BlcmF0aW9uKTtcblxuICAgICAgb3BlcmF0aW9uID0gaW52ZXJ0ZWRPcGVyYXRpb247ICAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgcmVkbygpIHtcbiAgICBsZXQgb3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnNMZW5ndGggPSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMucG9zaXRpb24gPCBvcGVyYXRpb25zTGVuZ3RoKSB7XG4gICAgICBvcGVyYXRpb24gPSB0aGlzLm9wZXJhdGlvbnNbdGhpcy5wb3NpdGlvbl07XG5cbiAgICAgIHRoaXMucG9zaXRpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gb3BlcmF0aW9uO1xuICB9XG5cbiAgdHJhbnNmb3JtKG9wZXJhdGlvbnMpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMgPSB0cmFuc2Zvcm1PcGVyYXRpb25zKHRoaXMub3BlcmF0aW9ucywgb3BlcmF0aW9ucyk7XG5cbiAgICB0aGlzLmZpbHRlckVtcHR5T3BlcmF0aW9ucygpO1xuICB9XG5cbiAgYWRkT3BlcmF0aW9ucyhvcGVyYXRpb25zKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvc2l0aW9uOyAgLy8vXG5cbiAgICB0aGlzLm9wZXJhdGlvbnMuc3BsaWNlKHN0YXJ0KTtcblxuICAgIHB1c2godGhpcy5vcGVyYXRpb25zLCBvcGVyYXRpb25zKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnNMZW5ndGggPSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoO1xuXG4gICAgdGhpcy5wb3NpdGlvbiA9IG9wZXJhdGlvbnNMZW5ndGg7IC8vL1xuICB9XG5cbiAgZmlsdGVyRW1wdHlPcGVyYXRpb25zKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHBvc2l0aW9uID0gMDtcblxuICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5vcGVyYXRpb25zW3Bvc2l0aW9uXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEVtcHR5T3BlcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9zaXRpb24sIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID4gcG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc2l0aW9uKys7XG4gICAgICB9XG5cbiAgICAgIGxlbmd0aCA9IHRoaXMub3BlcmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKCkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gMCxcbiAgICAgICAgICBvcGVyYXRpb25zID0gW10sXG4gICAgICAgICAgdW5kb0J1ZmZlciA9IG5ldyBVbmRvQnVmZmVyKHBvc2l0aW9uLCBvcGVyYXRpb25zKTtcblxuICAgIHJldHVybiB1bmRvQnVmZmVyO1xuICB9XG59XG4iLCJSZWFjdC5jcmVhdGVFbGVtZW50Il0sIm5hbWVzIjpbIlVuZG9CdWZmZXIiLCJwdXNoIiwiYXJyYXlVdGlsaXRpZXMiLCJwb3NpdGlvbiIsIm9wZXJhdGlvbnMiLCJnZXRQb3NpdGlvbiIsImdldE9wZXJhdGlvbnMiLCJ1bmRvIiwib3BlcmF0aW9uIiwiaW52ZXJ0ZWRPcGVyYXRpb24iLCJpbnZlcnQiLCJJbnNlcnRPcGVyYXRpb24iLCJEZWxldGVPcGVyYXRpb24iLCJyZWRvIiwib3BlcmF0aW9uc0xlbmd0aCIsImxlbmd0aCIsInRyYW5zZm9ybSIsInRyYW5zZm9ybU9wZXJhdGlvbnMiLCJmaWx0ZXJFbXB0eU9wZXJhdGlvbnMiLCJhZGRPcGVyYXRpb25zIiwic3RhcnQiLCJzcGxpY2UiLCJFbXB0eU9wZXJhdGlvbiIsImRlbGV0ZUNvdW50IiwiZnJvbU5vdGhpbmciLCJ1bmRvQnVmZmVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQVdxQkE7Ozt5QkFUVTswREFFSjsyREFDQzsyREFDQTsrREFDSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFaEMsSUFBTSxBQUFFQyxPQUFTQyx5QkFBYyxDQUF2QkQ7QUFFTyxJQUFBLEFBQU1ELDJCQUFOO2FBQU1BLFdBQ1BHLFFBQVEsRUFBRUMsVUFBVTs4QkFEYko7UUFFakIsSUFBSSxDQUFDRyxRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTs7aUJBSERKOztZQU1uQkssS0FBQUE7bUJBQUFBLFNBQUFBLGNBQWM7Z0JBQ1osT0FBTyxJQUFJLENBQUNGLFFBQVE7WUFDdEI7OztZQUVBRyxLQUFBQTttQkFBQUEsU0FBQUEsZ0JBQWdCO2dCQUNkLE9BQU8sSUFBSSxDQUFDRixVQUFVO1lBQ3hCOzs7WUFFQUcsS0FBQUE7bUJBQUFBLFNBQUFBLE9BQU87Z0JBQ0wsSUFBSUMsWUFBWSxJQUFJO2dCQUVwQixJQUFJLElBQUksQ0FBQ0wsUUFBUSxHQUFHLEdBQUc7b0JBQ3JCLElBQUksQ0FBQ0EsUUFBUTtvQkFFYkssWUFBWSxJQUFJLENBQUNKLFVBQVUsQ0FBQyxJQUFJLENBQUNELFFBQVEsQ0FBQztvQkFFMUMsSUFBTU0sb0JBQW9CRCxVQUFVRSxNQUFNLENBQUNDLGVBQWUsRUFBRUMsZUFBZTtvQkFFM0VKLFlBQVlDLG1CQUFvQixHQUFHO2dCQUNyQyxDQUFDO2dCQUVELE9BQU9EO1lBQ1Q7OztZQUVBSyxLQUFBQTttQkFBQUEsU0FBQUEsT0FBTztnQkFDTCxJQUFJTCxZQUFZLElBQUk7Z0JBRXBCLElBQU1NLG1CQUFtQixJQUFJLENBQUNWLFVBQVUsQ0FBQ1csTUFBTTtnQkFFL0MsSUFBSSxJQUFJLENBQUNaLFFBQVEsR0FBR1csa0JBQWtCO29CQUNwQ04sWUFBWSxJQUFJLENBQUNKLFVBQVUsQ0FBQyxJQUFJLENBQUNELFFBQVEsQ0FBQztvQkFFMUMsSUFBSSxDQUFDQSxRQUFRO2dCQUNmLENBQUM7Z0JBRUQsT0FBT0s7WUFDVDs7O1lBRUFRLEtBQUFBO21CQUFBQSxTQUFBQSxVQUFVWixVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQ0EsVUFBVSxHQUFHYSxJQUFBQSxtQkFBbUIsRUFBQyxJQUFJLENBQUNiLFVBQVUsRUFBRUE7Z0JBRXZELElBQUksQ0FBQ2MscUJBQXFCO1lBQzVCOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLGNBQWNmLFVBQVUsRUFBRTtnQkFDeEIsSUFBTWdCLFFBQVEsSUFBSSxDQUFDakIsUUFBUSxFQUFHLEdBQUc7Z0JBRWpDLElBQUksQ0FBQ0MsVUFBVSxDQUFDaUIsTUFBTSxDQUFDRDtnQkFFdkJuQixLQUFLLElBQUksQ0FBQ0csVUFBVSxFQUFFQTtnQkFFdEIsSUFBTVUsbUJBQW1CLElBQUksQ0FBQ1YsVUFBVSxDQUFDVyxNQUFNO2dCQUUvQyxJQUFJLENBQUNaLFFBQVEsR0FBR1csa0JBQWtCLEdBQUc7WUFDdkM7OztZQUVBSSxLQUFBQTttQkFBQUEsU0FBQUEsd0JBQXdCO2dCQUN0QixJQUFJSCxTQUFTLElBQUksQ0FBQ1gsVUFBVSxDQUFDVyxNQUFNLEVBQzdCWixXQUFXO2dCQUVqQixNQUFPQSxXQUFXWSxPQUFRO29CQUN4QixJQUFNUCxZQUFZLElBQUksQ0FBQ0osVUFBVSxDQUFDRCxTQUFTO29CQUUzQyxJQUFJSyxBQUFTLFlBQVRBLFdBQXFCYyxjQUFjLEdBQUU7d0JBQ3ZDLElBQU1GLFFBQVFqQixVQUNSb0IsY0FBYzt3QkFFcEIsSUFBSSxDQUFDbkIsVUFBVSxDQUFDaUIsTUFBTSxDQUFDRCxPQUFPRzt3QkFFOUIsSUFBSSxJQUFJLENBQUNwQixRQUFRLEdBQUdBLFVBQVU7NEJBQzVCLElBQUksQ0FBQ0EsUUFBUTt3QkFDZixDQUFDO29CQUNILE9BQU87d0JBQ0xBO29CQUNGLENBQUM7b0JBRURZLFNBQVMsSUFBSSxDQUFDWCxVQUFVLENBQUNXLE1BQU07Z0JBQ2pDO1lBQ0Y7Ozs7WUFFT1MsS0FBQUE7bUJBQVAsU0FBT0EsY0FBYztnQkFDbkIsSUFBTXJCLFdBQVcsR0FDWEMsYUFBYSxFQUFFLEVBQ2ZxQixhQUFhLElBekZGekIsV0F5RmlCRyxVQUFVQztnQkFFNUMsT0FBT3FCO1lBQ1Q7OztXQTVGbUJ6QiJ9
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91bmRvQnVmZmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVtcHR5T3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbi9lbXB0eVwiO1xuaW1wb3J0IEluc2VydE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb24vaW5zZXJ0XCI7XG5pbXBvcnQgRGVsZXRlT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbi9kZWxldGVcIjtcbmltcG9ydCB0cmFuc2Zvcm1PcGVyYXRpb25zIGZyb20gXCIuL3RyYW5zZm9ybS9vcGVyYXRpb25zXCI7XG5cbmNvbnN0IHsgY2xlYXIsIGZpbHRlciwgdW5zaGlmdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVuZG9CdWZmZXIge1xuICBjb25zdHJ1Y3Rvcih1bmRvT3BlcmF0aW9ucywgcmVkb09wZXJhdGlvbnMpIHtcbiAgICB0aGlzLnVuZG9PcGVyYXRpb25zID0gdW5kb09wZXJhdGlvbnM7XG4gICAgdGhpcy5yZWRvT3BlcmF0aW9ucyA9IHJlZG9PcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0VW5kb09wZXJhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudW5kb09wZXJhdGlvbnM7XG4gIH1cbiAgXG4gIGdldFJlZG9PcGVyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnJlZG9PcGVyYXRpb25zO1xuICB9XG5cbiAgdW5kbygpIHtcbiAgICBsZXQgdW5kb09wZXJhdGlvbiA9IG51bGw7XG5cbiAgICBjb25zdCB1bmRvT3BlcmF0aW9uc0xlbmd0aCA9IHRoaXMudW5kb09wZXJhdGlvbnMubGVuZ3RoO1xuXG4gICAgaWYgKHVuZG9PcGVyYXRpb25zTGVuZ3RoID4gMCkge1xuICAgICAgdW5kb09wZXJhdGlvbiA9IHRoaXMudW5kb09wZXJhdGlvbnMuc2hpZnQoKTtcblxuICAgICAgY29uc3QgaW52ZXJ0ZWRVbmRvT3BlcmF0aW9uID0gdW5kb09wZXJhdGlvbi5pbnZlcnQoSW5zZXJ0T3BlcmF0aW9uLCBEZWxldGVPcGVyYXRpb24pLFxuICAgICAgICAgICAgcmVkb09wZXJhdGlvbiA9IGludmVydGVkVW5kb09wZXJhdGlvbjsgIC8vL1xuXG4gICAgICB0aGlzLnJlZG9PcGVyYXRpb25zLnVuc2hpZnQocmVkb09wZXJhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZG9PcGVyYXRpb247XG4gIH1cblxuICByZWRvKCkge1xuICAgIGxldCByZWRvT3BlcmF0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHJlZG9PcGVyYXRpb25zTGVuZ3RoID0gdGhpcy5yZWRvT3BlcmF0aW9ucy5sZW5ndGg7XG5cbiAgICBpZiAocmVkb09wZXJhdGlvbnNMZW5ndGggPiAwKSB7XG4gICAgICByZWRvT3BlcmF0aW9uID0gdGhpcy5yZWRvT3BlcmF0aW9ucy5zaGlmdCgpO1xuXG4gICAgICBjb25zdCBpbnZlcnRlZFJlZG9PcGVyYXRpb24gPSByZWRvT3BlcmF0aW9uLmludmVydChJbnNlcnRPcGVyYXRpb24sIERlbGV0ZU9wZXJhdGlvbiksXG4gICAgICAgICAgICB1bmRvT3BlcmF0aW9uID0gaW52ZXJ0ZWRSZWRvT3BlcmF0aW9uOyAgLy8vXG5cbiAgICAgIHRoaXMudW5kb09wZXJhdGlvbnMudW5zaGlmdCh1bmRvT3BlcmF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVkb09wZXJhdGlvbjtcbiAgfVxuXG4gIHRyYW5zZm9ybShvcGVyYXRpb25zKSB7XG4gICAgdGhpcy51bmRvT3BlcmF0aW9ucyA9IHRyYW5zZm9ybU9wZXJhdGlvbnModGhpcy51bmRvT3BlcmF0aW9ucywgb3BlcmF0aW9ucyk7XG5cbiAgICB0aGlzLnJlZG9PcGVyYXRpb25zID0gdHJhbnNmb3JtT3BlcmF0aW9ucyh0aGlzLnJlZG9PcGVyYXRpb25zLCBvcGVyYXRpb25zKTtcbiAgICBcbiAgICBmaWx0ZXJFbXB0eU9wZXJhdGlvbnModGhpcy51bmRvT3BlcmF0aW9ucyk7XG5cbiAgICBmaWx0ZXJFbXB0eU9wZXJhdGlvbnModGhpcy5yZWRvT3BlcmF0aW9ucyk7XG4gIH1cblxuICBhZGRPcGVyYXRpb25zKG9wZXJhdGlvbnMpIHtcbiAgICBjb25zdCBpbnZlcnRlZE9wZXJhdGlvbnMgPSBpbnZlcnRPcGVyYXRpb25zKG9wZXJhdGlvbnMpLFxuICAgICAgICAgIHJldmVyc2VkSW52ZXJ0ZWRPcGVyYXRpb25zID0gcmV2ZXJzZU9wZXJhdGlvbnMoaW52ZXJ0ZWRPcGVyYXRpb25zKSxcbiAgICAgICAgICB1bmRvT3BlcmF0aW9ucyA9IHJldmVyc2VkSW52ZXJ0ZWRPcGVyYXRpb25zOyAgLy8vXG5cbiAgICB1bnNoaWZ0KHRoaXMudW5kb09wZXJhdGlvbnMsIHVuZG9PcGVyYXRpb25zKTtcblxuICAgIGNsZWFyKHRoaXMucmVkb09wZXJhdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKCkge1xuICAgIGNvbnN0IHVuZG9PcGVyYXRpb25zID0gW10sXG4gICAgICAgICAgcmVkb09wZXJhdGlvbnMgPSBbXSxcbiAgICAgICAgICB1bmRvQnVmZmVyID0gbmV3IFVuZG9CdWZmZXIodW5kb09wZXJhdGlvbnMsIHJlZG9PcGVyYXRpb25zKTtcblxuICAgIHJldHVybiB1bmRvQnVmZmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludmVydE9wZXJhdGlvbnMob3BlcmF0aW9ucykge1xuICBjb25zdCBpbnZlcnRlZE9wZXJhdGlvbnMgPSBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiB7XG4gICAgY29uc3QgaW52ZXJ0ZWRPcGVyYXRpb24gPSBvcGVyYXRpb24uaW52ZXJ0KEluc2VydE9wZXJhdGlvbiwgRGVsZXRlT3BlcmF0aW9uKTtcblxuICAgIHJldHVybiBpbnZlcnRlZE9wZXJhdGlvbjtcbiAgfSk7XG5cbiAgcmV0dXJuIGludmVydGVkT3BlcmF0aW9ucztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZU9wZXJhdGlvbnMob3BlcmF0aW9ucykge1xuICBjb25zdCByZXZlcnNlZE9wZXJhdGlvbnMgPSBvcGVyYXRpb25zLnJlZHVjZSgocmV2ZXJzZWRPcGVyYXRpb25zLCBvcGVyYXRpb24pID0+IHtcbiAgICBjb25zdCByZXZlcnNlZE9wZXJhdGlvbiA9IG9wZXJhdGlvbjsgIC8vL1xuXG4gICAgcmV2ZXJzZWRPcGVyYXRpb25zLnVuc2hpZnQocmV2ZXJzZWRPcGVyYXRpb24pO1xuXG4gICAgcmV0dXJuIHJldmVyc2VkT3BlcmF0aW9ucztcbiAgfSwgW10pO1xuXG4gIHJldHVybiByZXZlcnNlZE9wZXJhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckVtcHR5T3BlcmF0aW9ucyhvcGVyYXRpb25zKSB7XG4gIGZpbHRlcihvcGVyYXRpb25zLCAob3BlcmF0aW9uKSA9PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uRW1wdHlPcGVyYXRpb24gPSAob3BlcmF0aW9uIGluc3RhbmNlb2YgRW1wdHlPcGVyYXRpb24pO1xuXG4gICAgaWYgKCFvcGVyYXRpb25FbXB0eU9wZXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJVbmRvQnVmZmVyIiwiY2xlYXIiLCJhcnJheVV0aWxpdGllcyIsImZpbHRlciIsInVuc2hpZnQiLCJ1bmRvT3BlcmF0aW9ucyIsInJlZG9PcGVyYXRpb25zIiwiZ2V0VW5kb09wZXJhdGlvbnMiLCJnZXRSZWRvT3BlcmF0aW9ucyIsInVuZG8iLCJ1bmRvT3BlcmF0aW9uIiwidW5kb09wZXJhdGlvbnNMZW5ndGgiLCJsZW5ndGgiLCJzaGlmdCIsImludmVydGVkVW5kb09wZXJhdGlvbiIsImludmVydCIsIkluc2VydE9wZXJhdGlvbiIsIkRlbGV0ZU9wZXJhdGlvbiIsInJlZG9PcGVyYXRpb24iLCJyZWRvIiwicmVkb09wZXJhdGlvbnNMZW5ndGgiLCJpbnZlcnRlZFJlZG9PcGVyYXRpb24iLCJ0cmFuc2Zvcm0iLCJvcGVyYXRpb25zIiwidHJhbnNmb3JtT3BlcmF0aW9ucyIsImZpbHRlckVtcHR5T3BlcmF0aW9ucyIsImFkZE9wZXJhdGlvbnMiLCJpbnZlcnRlZE9wZXJhdGlvbnMiLCJpbnZlcnRPcGVyYXRpb25zIiwicmV2ZXJzZWRJbnZlcnRlZE9wZXJhdGlvbnMiLCJyZXZlcnNlT3BlcmF0aW9ucyIsImZyb21Ob3RoaW5nIiwidW5kb0J1ZmZlciIsIm1hcCIsIm9wZXJhdGlvbiIsImludmVydGVkT3BlcmF0aW9uIiwicmV2ZXJzZWRPcGVyYXRpb25zIiwicmVkdWNlIiwicmV2ZXJzZWRPcGVyYXRpb24iLCJvcGVyYXRpb25FbXB0eU9wZXJhdGlvbiIsIkVtcHR5T3BlcmF0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQVdxQkE7Ozt5QkFUVTswREFFSjsyREFDQzsyREFDQTsrREFDSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFaEMsSUFBUUMsUUFBMkJDLHlCQUFjLENBQXpDRCxPQUFPRSxTQUFvQkQseUJBQWMsQ0FBbENDLFFBQVFDLFVBQVlGLHlCQUFjLENBQTFCRTtBQUVSLElBQUEsQUFBTUosMkJBNkVsQixBQTdFWTthQUFNQSxXQUNQSyxjQUFjLEVBQUVDLGNBQWM7OEJBRHZCTjtRQUVqQixJQUFJLENBQUNLLGNBQWMsR0FBR0E7UUFDdEIsSUFBSSxDQUFDQyxjQUFjLEdBQUdBOztpQkFITE47O1lBTW5CTyxLQUFBQTttQkFBQUEsU0FBQUEsb0JBQW9CO2dCQUNsQixPQUFPLElBQUksQ0FBQ0YsY0FBYztZQUM1Qjs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQSxvQkFBb0I7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDRixjQUFjO1lBQzVCOzs7WUFFQUcsS0FBQUE7bUJBQUFBLFNBQUFBLE9BQU87Z0JBQ0wsSUFBSUMsZ0JBQWdCLElBQUk7Z0JBRXhCLElBQU1DLHVCQUF1QixJQUFJLENBQUNOLGNBQWMsQ0FBQ08sTUFBTTtnQkFFdkQsSUFBSUQsdUJBQXVCLEdBQUc7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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "easy-richtextarea",
3
3
  "author": "James Smith",
4
- "version": "4.0.19",
4
+ "version": "4.0.21",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/easy-richtextarea",
7
7
  "description": "A textarea element that handles and hands off events well.",
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ import { eventTypes } from "easy";
4
+
5
+ export const { CUT_EVENT_TYPE,
6
+ COPY_EVENT_TYPE,
7
+ BLUR_EVENT_TYPE,
8
+ PASTE_EVENT_TYPE,
9
+ INPUT_EVENT_TYPE,
10
+ FOCUS_EVENT_TYPE,
11
+ CHANGE_EVENT_TYPE,
12
+ SCROLL_EVENT_TYPE,
13
+ KEYDOWN_EVENT_TYPE,
14
+ CONTEXTMENU_EVENT_TYPE,
15
+ SELECTIONCHANGE_EVENT_TYPE } = eventTypes;
16
+
17
+ export const FIND_EVENT_TYPE = "find";
@@ -6,19 +6,11 @@ import { RichTextarea } from "../browser"; ///
6
6
 
7
7
  export default withStyle(RichTextarea)`
8
8
 
9
- color: #eee;
10
- width: 64rem;
9
+ width: 48rem;
10
+ border: solid 1px black;
11
11
  resize: none;
12
- height: 64rem;
12
+ height: 32rem;
13
13
  padding: 0.25rem;
14
- font-size: 1.6rem;
15
14
  font-family: monospace;
16
- margin-right: 2rem;
17
- background-color: #222;
18
-
19
- ::selection {
20
- color: #fff;
21
- background-color: #c80;
22
- }
23
15
 
24
16
  `;
@@ -3,63 +3,48 @@
3
3
  import RichTextarea from "./richTextarea";
4
4
 
5
5
  const content = "",
6
- activeRichTextarea =
6
+ richTextarea =
7
7
 
8
- <RichTextarea onChange={changeHandler} onScroll={scrollHandler} onFocus={focusHandler} onBlur={blurHandler} />
9
-
10
- ,
11
- inactiveRichTextarea =
12
-
13
- <RichTextarea />
8
+ <RichTextarea onFind={findHandler} onBlur={blurHandler} onFocus={focusHandler} onChange={changeHandler} onScroll={scrollHandler} />
14
9
 
15
10
  ;
16
11
 
17
- activeRichTextarea.setContent(content);
12
+ richTextarea.setContent(content);
18
13
 
19
- activeRichTextarea.activate();
14
+ richTextarea.activate();
20
15
 
21
16
  const View = (properties) =>
22
17
 
23
18
  <div className="view">
24
- {activeRichTextarea}
25
- {inactiveRichTextarea}
19
+ {richTextarea}
26
20
  </div>
27
21
 
28
22
  ;
29
23
 
30
24
  export default View;
31
25
 
32
- function changeHandler(event, element) {
33
- const contentChanged = activeRichTextarea.hasContentChanged(),
34
- selectionChanged = activeRichTextarea.hasSelectionChanged();
35
-
36
- console.log(contentChanged, selectionChanged)
37
-
38
- if (contentChanged) {
39
- const content = activeRichTextarea.getContent();
40
-
41
- inactiveRichTextarea.setContent(content);
42
- }
43
-
44
- if (selectionChanged) {
45
- const selection = activeRichTextarea.getSelection();
46
-
47
- inactiveRichTextarea.setSelection(selection);
48
- }
26
+ function findHandler(event, element) {
27
+ console.log("find")
49
28
  }
50
29
 
51
- function scrollHandler(event, element) {
52
- const scrollTop = activeRichTextarea.getScrollTop(),
53
- scrollLeft = activeRichTextarea.getScrollLeft();
54
-
55
- inactiveRichTextarea.setScrollTop(scrollTop);
56
- inactiveRichTextarea.setScrollLeft(scrollLeft);
30
+ function blurHandler(event, element) {
31
+ console.log("blur")
57
32
  }
58
33
 
59
34
  function focusHandler(event, element) {
60
35
  console.log("focus")
61
36
  }
62
37
 
63
- function blurHandler(event, element) {
64
- console.log("blur")
38
+ function changeHandler(event, element) {
39
+ const contentChanged = richTextarea.hasContentChanged(),
40
+ selectionChanged = richTextarea.hasSelectionChanged();
41
+
42
+ console.log(contentChanged, selectionChanged)
43
+ }
44
+
45
+ function scrollHandler(event, element) {
46
+ const scrollTop = richTextarea.getScrollTop(),
47
+ scrollLeft = richTextarea.getScrollLeft();
48
+
49
+ console.log(scrollTop, scrollLeft)
65
50
  }
package/src/keyCodes.js CHANGED
@@ -1,3 +1,4 @@
1
1
  "use strict";
2
2
 
3
+ export const F_KEY_CODE = 70;
3
4
  export const Z_KEY_CODE = 90;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import { Element, document, eventTypes } from "easy";
3
+ import { Element, document } from "easy";
4
4
 
5
5
  import Selection from "./selection"
6
6
  import UndoBuffer from "./undoBuffer";
@@ -10,20 +10,20 @@ import transformContent from "./transform/content";
10
10
  import transformSelection from "./transform/selection";
11
11
  import generateOperations from "./operations/generate";
12
12
 
13
- import { Z_KEY_CODE } from "./keyCodes";
14
13
  import { TEXT, EMPTY_STRING } from "./constants";
15
-
16
- const { CUT_EVENT_TYPE,
17
- COPY_EVENT_TYPE,
18
- BLUR_EVENT_TYPE,
19
- PASTE_EVENT_TYPE,
20
- INPUT_EVENT_TYPE,
21
- FOCUS_EVENT_TYPE,
22
- CHANGE_EVENT_TYPE,
23
- SCROLL_EVENT_TYPE,
24
- KEYDOWN_EVENT_TYPE,
25
- CONTEXTMENU_EVENT_TYPE,
26
- SELECTIONCHANGE_EVENT_TYPE } = eventTypes;
14
+ import { F_KEY_CODE, Z_KEY_CODE } from "./keyCodes";
15
+ import { CUT_EVENT_TYPE,
16
+ COPY_EVENT_TYPE,
17
+ FIND_EVENT_TYPE,
18
+ BLUR_EVENT_TYPE,
19
+ PASTE_EVENT_TYPE,
20
+ INPUT_EVENT_TYPE,
21
+ FOCUS_EVENT_TYPE,
22
+ CHANGE_EVENT_TYPE,
23
+ SCROLL_EVENT_TYPE,
24
+ KEYDOWN_EVENT_TYPE,
25
+ CONTEXTMENU_EVENT_TYPE,
26
+ SELECTIONCHANGE_EVENT_TYPE } from "./eventTypes";
27
27
 
28
28
  export default class RichTextarea extends Element {
29
29
  constructor(selector, focused, readOnly, undoBuffer, previousContent, previousSelection) {
@@ -132,6 +132,18 @@ export default class RichTextarea extends Element {
132
132
  }
133
133
  }
134
134
 
135
+ if (keyCode === F_KEY_CODE) {
136
+ const { ctrlKey, metaKey } = event;
137
+
138
+ if (ctrlKey || metaKey) {
139
+ this.find(event, element);
140
+
141
+ event.preventDefault();
142
+
143
+ return;
144
+ }
145
+ }
146
+
135
147
  defer(() => {
136
148
  this.intermediateHandler(event, element);
137
149
  });
@@ -313,18 +325,28 @@ export default class RichTextarea extends Element {
313
325
  }
314
326
  }
315
327
 
328
+ find(event, element) {
329
+ const eventType = FIND_EVENT_TYPE;
330
+
331
+ this.callHandlers(eventType, event, element);
332
+ }
333
+
316
334
  undo(event, element) {
317
- const operation = this.undoBuffer.undo();
335
+ const undoOperation = this.undoBuffer.undo();
336
+
337
+ if (undoOperation !== null) {
338
+ const operation = undoOperation; ///
318
339
 
319
- if (operation !== null) {
320
340
  this.revert(event, element, operation);
321
341
  }
322
342
  }
323
343
 
324
344
  redo(event, element) {
325
- const operation = this.undoBuffer.redo();
345
+ const redoOperation = this.undoBuffer.redo();
346
+
347
+ if (redoOperation !== null) {
348
+ const operation = redoOperation; ///
326
349
 
327
- if (operation !== null) {
328
350
  this.revert(event, element, operation);
329
351
  }
330
352
  }
@@ -433,6 +455,20 @@ export default class RichTextarea extends Element {
433
455
  this.removeClass("active");
434
456
  }
435
457
 
458
+ onFind(findHandler, element) {
459
+ const eventType = FIND_EVENT_TYPE,
460
+ handler = findHandler; ///
461
+
462
+ this.addEventListener(eventType, handler, element);
463
+ }
464
+
465
+ offFind(findHandler, element) {
466
+ const eventType = FIND_EVENT_TYPE,
467
+ handler = findHandler; ///
468
+
469
+ this.removeEventListener(eventType, handler, element);
470
+ }
471
+
436
472
  onBlur(blurHandler, element) {
437
473
  const eventType = BLUR_EVENT_TYPE,
438
474
  handler = blurHandler; ///
@@ -490,11 +526,12 @@ export default class RichTextarea extends Element {
490
526
  }
491
527
 
492
528
  didMount() {
493
- const { onChange, onScroll, onFocus, onBlur } = this.properties,
494
- changeHandler = onChange, ///
495
- scrollHandler = onScroll, ///
529
+ const { onFind, onBlur, onFocus, onChange, onScroll } = this.properties,
530
+ findHandler = onFind, ///
531
+ blurHandler = onBlur, ///
496
532
  focusHandler = onFocus, ///
497
- blurHandler = onBlur; ///
533
+ changeHandler = onChange, ///
534
+ scrollHandler = onScroll; ///
498
535
 
499
536
  const content = this.getContent(),
500
537
  selection = this.getSelection();
@@ -503,13 +540,15 @@ export default class RichTextarea extends Element {
503
540
 
504
541
  this.previousSelection = selection; ///
505
542
 
506
- changeHandler && this.onChange(changeHandler, this);
543
+ findHandler && this.onFind(findHandler, this);
507
544
 
508
- scrollHandler && this.onScroll(scrollHandler, this);
545
+ blurHandler && this.onBlur(blurHandler, this);
509
546
 
510
547
  focusHandler && this.onFocus(focusHandler, this);
511
548
 
512
- blurHandler && this.onBlur(blurHandler, this);
549
+ changeHandler && this.onChange(changeHandler, this);
550
+
551
+ scrollHandler && this.onScroll(scrollHandler, this);
513
552
 
514
553
  this.on(CUT_EVENT_TYPE, this.cutHandler);
515
554
 
@@ -523,19 +562,22 @@ export default class RichTextarea extends Element {
523
562
  }
524
563
 
525
564
  willUnmount() {
526
- const { onChange, onScroll, onFocus, onBlur } = this.properties,
527
- changeHandler = onChange, ///
528
- scrollHandler = onScroll, ///
529
- focusHandler = onFocus, ///
530
- blurHandler = onBlur; ///
565
+ const { onFind, onBlur, onFocus, onChange, onScroll } = this.properties,
566
+ findHandler = onFind, ///
567
+ blurHandler = onBlur, ///
568
+ focusHandler = onFocus, ///
569
+ changeHandler = onChange, ///
570
+ scrollHandler = onScroll; ///
531
571
 
532
- changeHandler && this.offChange(changeHandler, this);
572
+ findHandler && this.offFind(findHandler, this);
533
573
 
534
- scrollHandler && this.offScroll(scrollHandler, this);
574
+ blurHandler && this.offBlur(blurHandler, this);
535
575
 
536
576
  focusHandler && this.offFocus(focusHandler, this);
537
577
 
538
- blurHandler && this.offBlur(blurHandler, this);
578
+ changeHandler && this.offChange(changeHandler, this);
579
+
580
+ scrollHandler && this.offScroll(scrollHandler, this);
539
581
 
540
582
  this.off(CUT_EVENT_TYPE, this.cutHandler);
541
583
 
@@ -557,10 +599,11 @@ export default class RichTextarea extends Element {
557
599
  static tagName = "textarea";
558
600
 
559
601
  static ignoredProperties = [
602
+ "onFind",
603
+ "onBlur",
604
+ "onFocus",
560
605
  "onChange",
561
606
  "onScroll",
562
- "onFocus",
563
- "onBlur"
564
607
  ];
565
608
 
566
609
  static defaultProperties = {