@atlaskit/editor-plugin-status
Version:
Status plugin for @atlaskit/editor-core
72 lines (71 loc) • 3.62 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getSuggestedStatuses = exports.MAX_SUGGESTED_STATUSES = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _excluded = ["distance"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var MAX_SUGGESTED_STATUSES = exports.MAX_SUGGESTED_STATUSES = 7;
var getStatusKey = function getStatusKey(_ref) {
var color = _ref.color,
text = _ref.text;
return "".concat(color, ":").concat(text.trim().toLowerCase());
};
var getDisplayText = function getDisplayText(status, shouldUppercaseText) {
return shouldUppercaseText && status.style !== 'mixedCase' ? status.text.toUpperCase() : status.text;
};
var getSuggestedStatuses = exports.getSuggestedStatuses = function getSuggestedStatuses(_ref2) {
var currentPos = _ref2.currentPos,
currentStatus = _ref2.currentStatus,
doc = _ref2.doc,
_ref2$limit = _ref2.limit,
limit = _ref2$limit === void 0 ? MAX_SUGGESTED_STATUSES : _ref2$limit,
_ref2$shouldUppercase = _ref2.shouldUppercaseText,
shouldUppercaseText = _ref2$shouldUppercase === void 0 ? false : _ref2$shouldUppercase;
var closestStatusesByKey = new Map();
var currentStatusKey = getStatusKey(currentStatus);
doc.descendants(function (node, pos) {
if (node.type.name !== 'status' || pos === currentPos) {
return;
}
var text = typeof node.attrs.text === 'string' ? node.attrs.text.trim() : '';
if (!text) {
return;
}
var status = {
color: node.attrs.color,
localId: node.attrs.localId,
style: node.attrs.style,
text: text
};
var statusKey = getStatusKey(status);
if (status.localId === currentStatus.localId || statusKey === currentStatusKey) {
return;
}
var existingStatus = closestStatusesByKey.get(statusKey);
var nextStatus = _objectSpread(_objectSpread({}, status), {}, {
distance: Math.abs(pos - currentPos),
displayText: getDisplayText(status, shouldUppercaseText)
});
if (!existingStatus || nextStatus.distance < existingStatus.distance) {
closestStatusesByKey.set(statusKey, nextStatus);
}
});
return Array.from(closestStatusesByKey.values()).sort(function (statusA, statusB) {
if (statusA.distance !== statusB.distance) {
return statusA.distance - statusB.distance;
}
if (statusA.displayText !== statusB.displayText) {
return statusA.displayText.localeCompare(statusB.displayText);
}
return statusA.color.localeCompare(statusB.color);
}).slice(0, limit).map(function (_ref3) {
var _distance = _ref3.distance,
status = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
return status;
});
};