47e7853abca87d0c7d0815fa85097476919d3632d9793b42391d1537d75b5c5de8ec7d2b9c5415960086620a99bfce26c92f7f87ceac2aacef055ee3dd6ca4 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import {objectEach, isObject, extend} from './../../helpers/object';
  2. import {arrayEach} from './../../helpers/array';
  3. import {
  4. SEPARATOR,
  5. ITEMS,
  6. predefinedItems
  7. } from './predefinedItems';
  8. /**
  9. * Predefined items class factory for menu items.
  10. *
  11. * @class ItemsFactory
  12. * @plugin ContextMenu
  13. */
  14. class ItemsFactory {
  15. constructor(hotInstance, orderPattern = null) {
  16. this.hot = hotInstance;
  17. this.predefinedItems = predefinedItems();
  18. this.defaultOrderPattern = orderPattern;
  19. }
  20. /**
  21. * Set predefined items.
  22. *
  23. * @param {Array} predefinedItems Array of predefined items.
  24. */
  25. setPredefinedItems(predefinedItems) {
  26. let items = {};
  27. this.defaultOrderPattern.length = 0;
  28. objectEach(predefinedItems, (value, key) => {
  29. let menuItemKey = '';
  30. if (value.name === SEPARATOR) {
  31. items[SEPARATOR] = value;
  32. menuItemKey = SEPARATOR;
  33. // Menu item added as a property to array
  34. } else if (isNaN(parseInt(key, 10))) {
  35. value.key = value.key === void 0 ? key : value.key;
  36. items[key] = value;
  37. menuItemKey = value.key;
  38. } else {
  39. items[value.key] = value;
  40. menuItemKey = value.key;
  41. }
  42. this.defaultOrderPattern.push(menuItemKey);
  43. });
  44. this.predefinedItems = items;
  45. }
  46. /**
  47. * Get all menu items based on pattern.
  48. *
  49. * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default
  50. * pattern will be used.
  51. * @returns {Array}
  52. */
  53. getItems(pattern = null) {
  54. return getItems(pattern, this.defaultOrderPattern, this.predefinedItems);
  55. }
  56. }
  57. function getItems(pattern = null, defaultPattern = [], items = {}) {
  58. let result = [];
  59. if (pattern && pattern.items) {
  60. pattern = pattern.items;
  61. } else if (!Array.isArray(pattern)) {
  62. pattern = defaultPattern;
  63. }
  64. if (isObject(pattern)) {
  65. objectEach(pattern, (value, key) => {
  66. let item = items[typeof value === 'string' ? value : key];
  67. if (!item) {
  68. item = value;
  69. }
  70. if (isObject(value)) {
  71. extend(item, value);
  72. } else if (typeof item === 'string') {
  73. item = {name: item};
  74. }
  75. if (item.key === void 0) {
  76. item.key = key;
  77. }
  78. result.push(item);
  79. });
  80. } else {
  81. arrayEach(pattern, (name, key) => {
  82. let item = items[name];
  83. // Item deleted from settings `allowInsertRow: false` etc.
  84. if (!item && ITEMS.indexOf(name) >= 0) {
  85. return;
  86. }
  87. if (!item) {
  88. item = {name, key: `${key}`};
  89. }
  90. if (isObject(name)) {
  91. extend(item, name);
  92. }
  93. if (item.key === void 0) {
  94. item.key = key;
  95. }
  96. result.push(item);
  97. });
  98. }
  99. return result;
  100. }
  101. export default ItemsFactory;