You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

129 lines
3.3 KiB

  1. /*!
  2. * jquery.fancytree.multi.js
  3. *
  4. * Allow multiple selection of nodes by mouse or keyboard.
  5. * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
  6. *
  7. * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)
  8. *
  9. * Released under the MIT license
  10. * https://github.com/mar10/fancytree/wiki/LicenseInfo
  11. *
  12. * @version 2.38.3
  13. * @date 2023-02-01T20:52:50Z
  14. */
  15. (function (factory) {
  16. if (typeof define === "function" && define.amd) {
  17. // AMD. Register as an anonymous module.
  18. define(["jquery", "./jquery.fancytree"], factory);
  19. } else if (typeof module === "object" && module.exports) {
  20. // Node/CommonJS
  21. require("./jquery.fancytree");
  22. module.exports = factory(require("jquery"));
  23. } else {
  24. // Browser globals
  25. factory(jQuery);
  26. }
  27. })(function ($) {
  28. "use strict";
  29. /*******************************************************************************
  30. * Private functions and variables
  31. */
  32. // var isMac = /Mac/.test(navigator.platform);
  33. /*******************************************************************************
  34. * Extension code
  35. */
  36. $.ui.fancytree.registerExtension({
  37. name: "multi",
  38. version: "2.38.3",
  39. // Default options for this extension.
  40. options: {
  41. allowNoSelect: false, //
  42. mode: "sameParent", //
  43. // Events:
  44. // beforeSelect: $.noop // Return false to prevent cancel/save (data.input is available)
  45. },
  46. treeInit: function (ctx) {
  47. this._superApply(arguments);
  48. this.$container.addClass("fancytree-ext-multi");
  49. if (ctx.options.selectMode === 1) {
  50. $.error(
  51. "Fancytree ext-multi: selectMode: 1 (single) is not compatible."
  52. );
  53. }
  54. },
  55. nodeClick: function (ctx) {
  56. var //pluginOpts = ctx.options.multi,
  57. tree = ctx.tree,
  58. node = ctx.node,
  59. activeNode = tree.getActiveNode() || tree.getFirstChild(),
  60. isCbClick = ctx.targetType === "checkbox",
  61. isExpanderClick = ctx.targetType === "expander",
  62. eventStr = $.ui.fancytree.eventToString(ctx.originalEvent);
  63. switch (eventStr) {
  64. case "click":
  65. if (isExpanderClick) {
  66. break;
  67. } // Default handler will expand/collapse
  68. if (!isCbClick) {
  69. tree.selectAll(false);
  70. // Select clicked node (radio-button mode)
  71. node.setSelected();
  72. }
  73. // Default handler will toggle checkbox clicks and activate
  74. break;
  75. case "shift+click":
  76. // node.debug("click")
  77. tree.visitRows(
  78. function (n) {
  79. // n.debug("click2", n===node, node)
  80. n.setSelected();
  81. if (n === node) {
  82. return false;
  83. }
  84. },
  85. {
  86. start: activeNode,
  87. reverse: activeNode.isBelowOf(node),
  88. }
  89. );
  90. break;
  91. case "ctrl+click":
  92. case "meta+click": // Mac: [Command]
  93. node.toggleSelected();
  94. return;
  95. }
  96. return this._superApply(arguments);
  97. },
  98. nodeKeydown: function (ctx) {
  99. var tree = ctx.tree,
  100. node = ctx.node,
  101. event = ctx.originalEvent,
  102. eventStr = $.ui.fancytree.eventToString(event);
  103. switch (eventStr) {
  104. case "up":
  105. case "down":
  106. tree.selectAll(false);
  107. node.navigate(event.which, true);
  108. tree.getActiveNode().setSelected();
  109. break;
  110. case "shift+up":
  111. case "shift+down":
  112. node.navigate(event.which, true);
  113. tree.getActiveNode().setSelected();
  114. break;
  115. }
  116. return this._superApply(arguments);
  117. },
  118. });
  119. // Value returned by `require('jquery.fancytree..')`
  120. return $.ui.fancytree;
  121. }); // End of closure