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/example.js +239 -138
- package/lib/eventTypes.js +53 -0
- package/lib/example/richTextarea.js +2 -2
- package/lib/example/view.js +21 -26
- package/lib/keyCodes.js +13 -4
- package/lib/richTextarea.js +83 -49
- package/lib/undoBuffer.js +56 -51
- package/package.json +1 -1
- package/src/eventTypes.js +17 -0
- package/src/example/richTextarea.js +3 -11
- package/src/example/view.js +21 -36
- package/src/keyCodes.js +1 -0
- package/src/richTextarea.js +78 -35
- package/src/undoBuffer.js +67 -53
package/lib/undoBuffer.js
CHANGED
|
@@ -44,97 +44,102 @@ function _interopRequireDefault(obj) {
|
|
|
44
44
|
default: obj
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
var
|
|
47
|
+
var clear = _necessary.arrayUtilities.clear, filter = _necessary.arrayUtilities.filter, unshift = _necessary.arrayUtilities.unshift;
|
|
48
48
|
var UndoBuffer = /*#__PURE__*/ function() {
|
|
49
|
-
function UndoBuffer(
|
|
49
|
+
function UndoBuffer(undoOperations, redoOperations) {
|
|
50
50
|
_classCallCheck(this, UndoBuffer);
|
|
51
|
-
this.
|
|
52
|
-
this.
|
|
51
|
+
this.undoOperations = undoOperations;
|
|
52
|
+
this.redoOperations = redoOperations;
|
|
53
53
|
}
|
|
54
54
|
_createClass(UndoBuffer, [
|
|
55
55
|
{
|
|
56
|
-
key: "
|
|
57
|
-
value: function
|
|
58
|
-
return this.
|
|
56
|
+
key: "getUndoOperations",
|
|
57
|
+
value: function getUndoOperations() {
|
|
58
|
+
return this.undoOperations;
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
|
-
key: "
|
|
63
|
-
value: function
|
|
64
|
-
return this.
|
|
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
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var
|
|
75
|
-
|
|
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
|
|
77
|
+
return undoOperation;
|
|
78
78
|
}
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
key: "redo",
|
|
82
82
|
value: function redo() {
|
|
83
|
-
var
|
|
84
|
-
var
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
|
|
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
|
|
90
|
+
return redoOperation;
|
|
90
91
|
}
|
|
91
92
|
},
|
|
92
93
|
{
|
|
93
94
|
key: "transform",
|
|
94
95
|
value: function transform(operations) {
|
|
95
|
-
this.
|
|
96
|
-
this.
|
|
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
|
|
103
|
-
this.
|
|
104
|
-
|
|
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
|
|
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,
|
|
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.
|
|
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
|
-
|
|
10
|
-
|
|
9
|
+
width: 48rem;
|
|
10
|
+
border: solid 1px black;
|
|
11
11
|
resize: none;
|
|
12
|
-
height:
|
|
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
|
`;
|
package/src/example/view.js
CHANGED
|
@@ -3,63 +3,48 @@
|
|
|
3
3
|
import RichTextarea from "./richTextarea";
|
|
4
4
|
|
|
5
5
|
const content = "",
|
|
6
|
-
|
|
6
|
+
richTextarea =
|
|
7
7
|
|
|
8
|
-
<RichTextarea
|
|
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
|
-
|
|
12
|
+
richTextarea.setContent(content);
|
|
18
13
|
|
|
19
|
-
|
|
14
|
+
richTextarea.activate();
|
|
20
15
|
|
|
21
16
|
const View = (properties) =>
|
|
22
17
|
|
|
23
18
|
<div className="view">
|
|
24
|
-
{
|
|
25
|
-
{inactiveRichTextarea}
|
|
19
|
+
{richTextarea}
|
|
26
20
|
</div>
|
|
27
21
|
|
|
28
22
|
;
|
|
29
23
|
|
|
30
24
|
export default View;
|
|
31
25
|
|
|
32
|
-
function
|
|
33
|
-
|
|
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
|
|
52
|
-
|
|
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
|
|
64
|
-
|
|
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
package/src/richTextarea.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { Element, document
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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
|
|
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 {
|
|
494
|
-
|
|
495
|
-
|
|
529
|
+
const { onFind, onBlur, onFocus, onChange, onScroll } = this.properties,
|
|
530
|
+
findHandler = onFind, ///
|
|
531
|
+
blurHandler = onBlur, ///
|
|
496
532
|
focusHandler = onFocus, ///
|
|
497
|
-
|
|
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
|
-
|
|
543
|
+
findHandler && this.onFind(findHandler, this);
|
|
507
544
|
|
|
508
|
-
|
|
545
|
+
blurHandler && this.onBlur(blurHandler, this);
|
|
509
546
|
|
|
510
547
|
focusHandler && this.onFocus(focusHandler, this);
|
|
511
548
|
|
|
512
|
-
|
|
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 {
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
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
|
-
|
|
572
|
+
findHandler && this.offFind(findHandler, this);
|
|
533
573
|
|
|
534
|
-
|
|
574
|
+
blurHandler && this.offBlur(blurHandler, this);
|
|
535
575
|
|
|
536
576
|
focusHandler && this.offFocus(focusHandler, this);
|
|
537
577
|
|
|
538
|
-
|
|
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 = {
|