Best JavaScript code snippet using root
dragular.js
Source:dragular.js
1(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){2'use strict';3/**4 * dragular Directive by Luckylooke https://github.com/luckylooke/dragular5 * Angular version of dragula https://github.com/bevacqua/dragula6 */7 var dragularModule = require('./dragularModule');8dragularModule.directive('dragular', ["dragularService", function(dragularService) {9 return {10 restrict: 'A',11 link: function($scope, iElm, iAttrs) {12 var drake,13 options = $scope.$eval(iAttrs.dragular) || tryJson(iAttrs.dragular) || {};14 function tryJson(json) {15 try { // I dont like try catch solutions but I havent find sattisfying way of chcecking json validity.16 return JSON.parse(json);17 } catch (e) {18 return undefined;19 }20 }21 if(options && options.containersModel && typeof options.containersModel === 'string'){22 options.containersModel = $scope.$eval(options.containersModel);23 }24 if(options && options.dynamicModelAttribute){25 // watch for model changes26 $scope.$watch(function () {27 return $scope.$eval(iAttrs.dragularModel);28 }, function (newVal) {29 if(newVal){30 drake.containersModel = drake.sanitizeContainersModel($scope.$eval(newVal));31 }32 });33 }else if(iAttrs.dragularModel){34 // bind once and keep reference35 options.containersModel = $scope.$eval(iAttrs.dragularModel);36 }37 if(iAttrs.dragularNameSpace){38 options.nameSpace = iAttrs.dragularNameSpace.split(' ');39 }40 drake = dragularService(iElm[0], options);41 }42 };43}]);44},{"./dragularModule":2}],2:[function(require,module,exports){45/* global angular */46'use strict';47/**48 * Dragular 3.4.0 by Luckylooke https://github.com/luckylooke/dragular49 * Angular version of dragula https://github.com/bevacqua/dragula50 */51module.exports = angular.module('dragularModule', []);52({"dragularDirective":require("./dragularDirective.js"),"dragularService":require("./dragularService.js")});53},{"./dragularDirective.js":1,"./dragularService.js":3}],3:[function(require,module,exports){54(function (global){55/* global angular */56'use strict';57/**58 * dragular Service by Luckylooke https://github.com/luckylooke/dragular59 * Angular version of dragula https://github.com/bevacqua/dragula60 */61var dragularModule = require('./dragularModule'),62 shared = { // sahred object between all service instances63 classesCache: {}, // classes lookup cache64 containersCtx: {}, // containers model65 containers: {}, // containers66 mirror: null, // mirror image67 source: null, // source container68 item: null, // item being dragged69 copy: null, // copy flag70 sourceItem: null, // item originaly dragged if copy is enabled71 sourceModel: null, // source container model72 sourceFilteredModel: null, // source container filtered model if relevant73 target: null, // droppable container under drag item74 targetCtx: null, // target container context75 targetModel: null, // target container model76 lastDropTarget: null, // last container item was over77 offsetX: null, // reference x78 offsetY: null, // reference y79 moveX: null, // reference move x80 moveY: null, // reference move y81 offsetXr: null, // reference x right for boundingBox feature82 offsetYb: null, // reference y bottom for boundingBox feature83 clientX: null, // cache client x, init at grab, update at drag84 clientY: null, // cache client y, init at grab, update at drag85 mirrorWidth: null, // mirror width for boundingBox feature86 mirrorHeight: null, // mirror height for boundingBox feature87 initialSibling: null, // reference sibling when grabbed88 currentSibling: null, // reference sibling now89 initialIndex: null, // reference model index when grabbed90 currentIndex: null, // reference model index now91 tempModel: null, // if o.isContainer is used, model can be provided as well, it is temporary saved here during drags92 dragOverEvents: {}, // drag over events fired on element behind cursor93 lastElementBehindCursor: null, // last element behind cursor94 grabbed: null // holds mousedown context until first mousemove95 };96dragularModule.factory('dragularService', ["$rootScope", function dragularServiceFunction($rootScope) {97 // abbreviations98 var doc = document,99 docElm = doc.documentElement;100 // clean common/shared objects101 service.cleanEnviroment = function cleanEnviroment() {102 shared.classesCache = {};103 shared.containersCtx = {};104 shared.containers = {};105 shared.mirror = undefined;106 };107 service.shared = shared;108 return service;109 // service definition110 function service(arg0, arg1) {111 var initialContainers = arg0 || [],112 options = arg1 || {},113 o, // shorthand for options114 g = getBool, // shorthand for getBool115 // defaults116 defaultClasses = {117 mirror: 'gu-mirror',118 hide: 'gu-hide',119 unselectable: 'gu-unselectable',120 transit: 'gu-transit'121 },122 defaultEventNames = {123 // drag-over DOM events124 dragularenter: 'dragularenter',125 dragularleave: 'dragularleave',126 dragularrelease: 'dragularrelease',127 // $scope events128 dragularcloned: 'dragularcloned',129 dragulardrag: 'dragulardrag',130 dragularcancel: 'dragularcancel',131 dragulardrop: 'dragulardrop',132 dragularremove: 'dragularremove',133 dragulardragend: 'dragulardragend',134 dragularshadow: 'dragularshadow',135 dragularover: 'dragularover',136 dragularout: 'dragularout'137 },138 defaultOptions = { // options with defaults139 copyOptions: false, // copy options object when provided140 classes: defaultClasses, // classes used by dragular141 eventNames: defaultEventNames, // event names used by dragular142 containers: false, // initial containers provided via options object (are provided via parameter by default)143 containersModel: false, // if provided, model will be synced with DOM144 containersFilteredModel: false, // if provided, dragular will handle filtered model cases145 isContainer: never, // potential target can be forced to be container by custom logic146 isContainerModel: getEmptyObject, // if isContainer function is provided, you can provide also respective model147 moves: always, // can drag start?148 accepts: always, // can target accept dragged item? (target context used)149 canBeAccepted: always, // can be dragged item accepted by target? (source context used)150 copy: false, // dragged item will be copy of source? flag or function151 copySortSource: false, // enable sorting in source when copying item152 dontCopyModel: false, // dont make copy of model when coping item (#61)153 invalid: never, // target (in)validity function154 revertOnSpill: false, // item returns to original place155 removeOnSpill: false, // item will be removed if not placed into valid target156 lockX: false, // lock movement into x-axis157 lockY: false, // lock movement into y-axis158 boundingBox: false, // lock movement inside this element boundaries159 mirrorContainer: doc.body, // element for appending mirror160 ignoreInputTextSelection: true // text selection in inputs wont be considered as drag161 },162 drake = {163 containers: shared.containers,164 containersCtx: shared.containersCtx,165 sanitizeContainersModel: sanitizeContainersModel,166 isContainer: isContainer,167 start: manualStart,168 end: end,169 cancel: cancel,170 remove: remove,171 destroy: destroy,172 dragging: false173 };174 processServiceArguments(); // both arguments (containers and options) are optional, this function handle this175 extendOptions();176 processOptionsObject();177 registerEvents();178 return drake;179 // Function definitions: ==============================================================================================================180 // Initial functions: -----------------------------------------------------------------------------------------------------------------181 function sanitizeContainersModel(containersModel) {182 if (typeof(containersModel) === 'function') {183 return containersModel;184 }185 if (Array.isArray(containersModel)) {186 // |-------- is 2D array? -----------|187 return Array.isArray(containersModel[0]) ? containersModel : [containersModel];188 } else {189 return [];190 }191 }192 function processServiceArguments(){193 if (arguments.length === 1 && // if there is only one argument we need to distinguish if it is options object or container(s) reference194 !Array.isArray(arg0) && // array of containers elements195 !angular.isElement(arg0) && // one container element196 !arg0[0] && // array-like object with containers elements197 typeof arg0 !== 'string') { // selector198 // then arg0 is options object199 options = arg0 || {};200 initialContainers = []; // containers are not provided on init201 } else if (typeof arg0 === 'string') {202 initialContainers = document.querySelectorAll(arg0);203 }204 o = options.copyOptions ? angular.copy(options) : options;205 }206 function extendOptions(){207 var tmp = angular.extend({}, defaultOptions, o); // tmp for keeping defaults untouched208 angular.extend(o, tmp); // merge defaults back into options209 if(o.classes){210 tmp = angular.extend({}, defaultClasses, o.classes);211 angular.extend(o.classes, tmp);212 }213 if(o.eventNames){214 tmp = angular.extend({}, defaultEventNames, o.eventNames);215 angular.extend(o.eventNames, tmp);216 }217 }218 function processOptionsObject(){219 // bounding box must be pure DOM element, not jQuery wrapper or something else..220 if (!isElement(o.boundingBox)) {221 o.boundingBox = false;222 }223 // initial containers provided via options are higher priority then by parameter224 if(o.containers){225 initialContainers = o.containers;226 }227 // sanitize initialContainers228 initialContainers = makeArray(initialContainers);229 // sanitize o.containersModel230 o.containersModel = sanitizeContainersModel(o.containersModel);231 // sanitize o.containersFilteredModel232 if (Array.isArray(o.containersFilteredModel)) {233 // |-------- is 2D array? -----------|234 o.containersFilteredModel = Array.isArray(o.containersFilteredModel[0]) ? o.containersFilteredModel : [o.containersFilteredModel];235 } else {236 o.containersFilteredModel = [];237 }238 // feed containers groups and optionaly do same for models239 if (!o.nameSpace) {240 o.nameSpace = ['dragularCommon'];241 }242 if (!Array.isArray(o.nameSpace)) {243 o.nameSpace = [o.nameSpace];244 }245 o.nameSpace.forEach(function eachNameSpace(nameSpace) {246 if (!shared.containers[nameSpace]) {247 shared.containers[nameSpace] = [];248 shared.containersCtx[nameSpace] = [];249 }250 var len = initialContainers.length,251 shLen = shared.containers[nameSpace].length;252 for (var i = 0; i < len; i++) {253 shared.containers[nameSpace][i + shLen] = initialContainers[i];254 shared.containersCtx[nameSpace][i + shLen] = {255 o: o,256 m: getContainersModel()[i], // can be undefined257 fm: o.containersFilteredModel[i] // can be undefined258 };259 }260 });261 }262 function registerEvents(remove) {263 var op = remove ? 'off' : 'on';264 regEvent(docElm, op, 'mouseup', release);265 // regEvent(docElm, op, 'mousemove', startBecauseMouseMoved);266 initialContainers.forEach(function addMouseDown(container) {267 regEvent(container, 'on', 'mousedown', grab);268 });269 if(!remove){ // create dragular DOM events270 angular.forEach(['dragularenter', 'dragularleave', 'dragularrelease'], function prepareDragOverEvents(name) {271 var eventName = o.eventNames[name];272 if(!shared.dragOverEvents[eventName]){273 if (doc.createEvent) {274 shared.dragOverEvents[eventName] = doc.createEvent('HTMLEvents');275 shared.dragOverEvents[eventName].initEvent(eventName, true, true);276 } else {277 shared.dragOverEvents[eventName] = doc.createEventObject();278 shared.dragOverEvents[eventName].eventType = eventName;279 }280 }281 });282 }283 }284 // Event handlers functions (end of initial functions): -----------------------------------------------------------------------------------------------------------------285 function grab(e) {286 // filter some odd situations287 if (whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey) {288 return; // we only care about honest-to-god left clicks and touch events289 }290 // set itial values291 shared.moveX = e.clientX;292 shared.moveY = e.clientY;293 var context = canStart(e.target);294 if (!context || !context.item) {295 return;296 }297 shared.grabbed = context;298 eventualMovements();299 if (e.type === 'mousedown') {300 if (isInput(context.item)) { // see also: https://github.com/bevacqua/dragula/issues/208301 context.item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176302 } else {303 e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155304 }305 }306 }307 function release(e) {308 ungrab();309 if (!drake.dragging) {310 return;311 }312 shared.clientX = getCoord('clientX', e);313 shared.clientY = getCoord('clientY', e);314 var elementBehindCursor = getElementBehindPoint(shared.mirror, shared.clientX, shared.clientY),315 dropTarget = findDropTarget(elementBehindCursor, shared.clientX, shared.clientY);316 if (dropTarget && ((shared.copy && g(o.copySortSource)) || (!shared.copy || dropTarget !== shared.source))) {317 // found valid target and (is not copy case or target is not initial container)318 drop(shared.item, dropTarget);319 } else if (g(o.removeOnSpill)) {320 remove();321 } else {322 cancel();323 }324 // after release there is no container hovered325 shared.target = null;326 if (shared.lastElementBehindCursor) {327 fireEvent(shared.lastElementBehindCursor, shared.dragOverEvents.dragularrelease, elementBehindCursor);328 }329 if (o.scope) {330 o.scope.$emit(o.eventNames.dragularrelease, shared.item, shared.source);331 }332 }333 // Main logic functions (end of event handler functions): -----------------------------------------------------------------------------------------------------------------334 function isContainer(el) {335 if(!el){336 return false;337 }338 var i = o.nameSpace.length;339 while (i--) {340 if (shared.containers[o.nameSpace[i]].indexOf(el) !== -1) {341 return true;342 }343 }344 if (o.isContainer(el)) {345 shared.tempModel = o.isContainerModel(el);346 return true;347 } else {348 shared.tempModel = null;349 }350 return false;351 }352 function getContainersModel() {353 return (typeof(o.containersModel) === 'function') ? sanitizeContainersModel(o.containersModel(drake, shared)) : o.containersModel;354 }355 function removeContainers(all) {356 $rootScope.$applyAsync(function applyDestroyed() {357 var changes = Array.isArray(all) ? all : makeArray(all);358 changes.forEach(function forEachContainer(container) {359 angular.forEach(o.nameSpace, function forEachNs(nameSpace) {360 var index;361 index = shared.containers[nameSpace].indexOf(container);362 shared.containers[nameSpace].splice(index, 1);363 shared.containersCtx[nameSpace].splice(index, 1);364 });365 });366 });367 }368 function eventualMovements(remove) {369 var op = remove ? 'off' : 'on';370 regEvent(docElm, op, 'mousemove', startBecauseMouseMoved);371 }372 function movements(remove) {373 var op = remove ? 'off' : 'on';374 regEvent(docElm, op, 'selectstart', preventGrabbed); // IE8375 regEvent(docElm, op, 'click', preventGrabbed);376 regEvent(docElm, op, 'touchmove', preventGrabbed); // fixes touch devices scrolling while drag377 }378 function destroy() {379 registerEvents(true);380 removeContainers(initialContainers);381 release({});382 }383 function startBecauseMouseMoved(e) {384 if (!shared.grabbed || drake.dragging) {385 return;386 }387 if (whichMouseButton(e) === 0) {388 release({});389 return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope390 }391 // truthy check fixes dragula-#239, equality fixes dragula-#207392 if (e.clientX && e.clientX === shared.moveX && e.clientY && e.clientY === shared.moveY) {393 return;394 }395 if (g(o.ignoreInputTextSelection)) {396 var clientX = getCoord('clientX', e),397 clientY = getCoord('clientY', e),398 elementBehindCursor = doc.elementFromPoint(clientX, clientY);399 if (isInput(elementBehindCursor)) {400 return;401 }402 }403 var grabbed = shared.grabbed; // calling end() unsets shared.grabbed404 eventualMovements('remove'); // remove mousemove listener405 movements();406 end();407 start(grabbed);408 // automaticly detect direction of elements if not set in options409 if (!o.direction && getParent(shared.sourceItem)) {410 var parent = shared.sourceItem.parentNode,411 parentHeight = parent.offsetHeight,412 parentWidth = parent.offsetWidth,413 childHeight = shared.sourceItem.clientHeight,414 childWidth = shared.sourceItem.clientWidth;415 o.direction = parentHeight / childHeight < parentWidth / childWidth ? 'horizontal' : 'vertical';416 }417 // get initial coordinates, used to render shared.mirror for first time418 var offset = getOffset(shared.sourceItem);419 shared.offsetX = getCoord('pageX', e) - offset.left;420 shared.offsetY = getCoord('pageY', e) - offset.top;421 shared.clientX = getCoord('clientX', e);422 shared.clientY = getCoord('clientY', e);423 // limiting area of shared.mirror movement, get initial coordinates424 if (o.boundingBox) {425 shared.offsetXr = getCoord('pageX', e) - offset.right;426 shared.offsetYb = getCoord('pageY', e) - offset.bottom;427 }428 e.preventDefault();429 addClass(shared.item, o.classes.transit);430 renderMirrorImage();431 // initial position432 shared.mirror.style.left = shared.clientX - shared.offsetX + 'px';433 shared.mirror.style.top = shared.clientY - shared.offsetY + 'px';434 drag(e);435 }436 function canStart(item) {437 if (drake.dragging && shared.mirror) {438 console.log('usecase?');439 return; // already dragging440 }441 var handle = item;442 while (getParent(item) && !isContainer(getParent(item))) {443 // break loop if user tries to drag item which is considered invalid handle444 if (o.invalid(item, handle)) {445 return;446 }447 item = getParent(item); // drag target should be immediate child of container448 if (!item) {449 return;450 }451 }452 var source = getParent(item);453 if (!source ||454 o.invalid(item, handle) ||455 !o.moves(item, source, handle, nextEl(item))) {456 return;457 }458 return {459 item: item,460 source: source461 };462 }463 function manualStart(item) {464 var context = canStart(item);465 if (context) {466 start(context);467 }468 }469 function start(context) {470 shared.sourceItem = shared.item = context.item;471 shared.source = context.source;472 shared.initialSibling = shared.currentSibling = nextEl(context.item);473 if (g(o.copy, [context.item, context.source])) {474 shared.item = context.item.cloneNode(true);475 shared.copy = true;476 if (o.scope) {477 o.scope.$emit(o.eventNames.dragularcloned, shared.item, context.item);478 }479 } else {480 shared.copy = false;481 }482 // prepare models operations483 var containerIndex = initialContainers.indexOf(context.source);484 shared.sourceModel = getContainersModel()[containerIndex];485 shared.sourceFilteredModel = o.containersFilteredModel[containerIndex];486 shared.initialIndex = domIndexOf(context.item, context.source);487 drake.dragging = true;488 if (o.scope) {489 o.scope.$emit(o.eventNames.dragulardrag, shared.sourceItem, shared.source);490 }491 return true;492 }493 function end() {494 if (!drake.dragging || !shared.item) {495 return;496 }497 drop(shared.item, getParent(shared.item));498 }499 function ungrab() {500 shared.grabbed = false;501 eventualMovements('remove');502 movements('remove');503 }504 function drop(item, target) {505 if (shared.copy && g(o.copySortSource) && target === shared.source && getParent(item)) {506 item.parentNode.removeChild(shared.sourceItem);507 }508 if (shared.sourceModel && !isInitialPlacement(target)) {509 var dropIndex = domIndexOf(item, target);510 if(shared.targetCtx.fm){ // target has filtered model511 // convert index from index-in-filteredModel to index-in-model512 dropIndex = shared.targetCtx.m.indexOf(shared.targetCtx.fm[dropIndex]);513 }514 if(shared.sourceFilteredModel){ // target has filtered model515 // convert index from index-in-filteredModel to index-in-model516 shared.initialIndex = shared.sourceModel.indexOf(shared.sourceFilteredModel[shared.initialIndex]);517 }518 $rootScope.$applyAsync(function applyDrop() {519 if (target === shared.source) {520 shared.sourceModel.splice(dropIndex, 0, shared.sourceModel.splice(shared.initialIndex, 1)[0]);521 } else {522 shared.dropElmModel = shared.copy && !o.dontCopyModel ? angular.copy(shared.sourceModel[shared.initialIndex]) : shared.sourceModel[shared.initialIndex];523 if (!shared.tempModel) {524 shared.targetModel = shared.targetCtx.m;525 } else {526 shared.targetModel = shared.tempModel;527 }528 target.removeChild(item); // element must be removed for ngRepeat to apply correctly529 if (!shared.copy) {530 shared.sourceModel.splice(shared.initialIndex, 1);531 }532 shared.targetModel.splice(dropIndex, 0, shared.dropElmModel);533 }534 if (getParent(item)) {535 item.parentNode.removeChild(item);536 }537 emitDropEvent();538 cleanup();539 });540 } else {541 emitDropEvent();542 cleanup();543 }544 function emitDropEvent() {545 if (o.scope) {546 if (isInitialPlacement(target)) {547 o.scope.$emit(o.eventNames.dragularcancel, item, shared.source, shared.sourceModel, shared.initialIndex);548 } else {549 o.scope.$emit(o.eventNames.dragulardrop, item, target, shared.source, shared.sourceModel, shared.initialIndex, shared.targetModel, dropIndex);550 }551 }552 }553 }554 function remove() {555 if (!drake.dragging) {556 return;557 }558 var parent = getParent(shared.item);559 if (parent) {560 parent.removeChild(shared.item);561 }562 if (shared.sourceModel) {563 $rootScope.$applyAsync(function removeModel() {564 shared.sourceModel.splice(shared.initialIndex, 1);565 cleanup();566 });567 }568 if (o.scope) {569 o.scope.$emit(shared.copy ? o.eventNames.dragularcancel : o.eventNames.dragularremove, shared.item, parent, shared.sourceModel, shared.initialIndex);570 }571 if (!shared.sourceModel) {572 cleanup();573 }574 }575 function cancel(revert) {576 if (!drake.dragging) {577 return;578 }579 var reverts = arguments.length > 0 ? revert : g(o.revertOnSpill),580 parent = getParent(shared.item);581 var initial = isInitialPlacement(parent);582 if (!initial && !shared.copy && reverts) {583 shared.source.insertBefore(shared.item, shared.initialSibling);584 }585 if (shared.sourceModel && !shared.copy && !reverts) {586 drop(shared.item, parent);587 } else if (o.scope) {588 if (initial || reverts) {589 o.scope.$emit(o.eventNames.dragularcancel, shared.item, shared.source);590 }591 }592 if (!shared.sourceModel || shared.copy || reverts || initial) {593 cleanup();594 }595 }596 function cleanup() {597 ungrab();598 removeMirrorImage();599 if (shared.item) {600 rmClass(shared.item, o.classes.transit);601 }602 drake.dragging = false;603 if (g(o.removeOnSpill) === true) {604 spillOut();605 }606 if (o.scope) {607 if(shared.lastDropTarget){608 o.scope.$emit(o.eventNames.dragularout, shared.item, shared.lastDropTarget, shared.source);609 }610 o.scope.$emit(o.eventNames.dragulardragend, shared.item);611 }612 shared.source = shared.item = shared.sourceItem = shared.initialSibling = shared.currentSibling = shared.sourceModel = null;613 shared.initialIndex = shared.currentIndex = shared.lastDropTarget = shared.tempModel = shared.targetModel = null;614 shared.dropElmModel = shared.targetCtx = shared.copy = shared.moveX = shared.moveY = null;615 }616 // is item currently placed in original container and original position?617 function isInitialPlacement(target, s) { // watch performance - running each move several times!618 var sibling = s || (shared.mirror ? shared.currentSibling : nextEl(shared.item));619 return target === shared.source && sibling === shared.initialSibling;620 }621 // find valid drop container622 function findDropTarget(elementBehindCursor, clientX, clientY) { // watch performance - running each move!623 var target = elementBehindCursor;624 while (target && !accepted()) {625 target = getParent(target);626 }627 return target;628 function accepted() {629 var accepts = false;630 if (isContainer(target)) { // is droppable?631 var immediate = getImmediateChild(target, elementBehindCursor),632 reference = getReference(target, immediate, clientX, clientY),633 initial = isInitialPlacement(target, reference),634 i = o.nameSpace.length;635 while (i--) {636 if (shared.containers[o.nameSpace[i]].indexOf(target) !== -1) {637 shared.targetCtx = shared.containersCtx[o.nameSpace[i]][shared.containers[o.nameSpace[i]].indexOf(target)];638 break;639 }640 if (!shared.targetCtx) {641 shared.targetCtx = shared.containersCtx.dragularCommon[shared.containers.dragularCommon.indexOf(target)];642 }643 }644 accepts = initial ||645 (shared.targetCtx.o.accepts(shared.item, target, shared.source, reference, shared.sourceModel, shared.initialIndex) &&646 o.canBeAccepted(shared.item, target, shared.source, reference, shared.sourceModel, shared.initialIndex));647 if (shared.target !== target) { // used for scroll issue648 shared.target = target;649 }650 }651 return accepts;652 }653 }654 function drag(e) { // watch performance - running each move!655 if (!shared.mirror) {656 return;657 }658 // update coordinates659 shared.clientX = getCoord('clientX', e);660 shared.clientY = getCoord('clientY', e);661 // count mirror coordiates662 var x = shared.clientX - shared.offsetX,663 y = shared.clientY - shared.offsetY,664 pageX,665 pageY,666 offsetBox;667 // fill extra properties if boundingBox is used668 if (o.boundingBox) {669 pageX = getCoord('pageX', e);670 pageY = getCoord('pageY', e);671 offsetBox = getOffset(o.boundingBox);672 }673 if (!o.lockY) {674 if (!o.boundingBox || (pageX > offsetBox.left + shared.offsetX && pageX < offsetBox.right + shared.offsetXr)) {675 shared.mirror.style.left = x + 'px';676 } else if (o.boundingBox) { // check again in case user scrolled the view677 if (pageX < offsetBox.left + shared.offsetX) {678 shared.mirror.style.left = shared.clientX - (pageX - offsetBox.left) + 'px';679 } else {680 shared.mirror.style.left = shared.clientX - shared.mirrorWidth - (pageX - offsetBox.right) + 'px';681 }682 }683 }684 if (!o.lockX) {685 if (!o.boundingBox || (pageY > offsetBox.top + shared.offsetY && pageY < offsetBox.bottom + shared.offsetYb)) {686 shared.mirror.style.top = y + 'px';687 } else if (o.boundingBox) { // check again in case user scrolled the view688 if (pageY < offsetBox.top + shared.offsetY) {689 shared.mirror.style.top = shared.clientY - (pageY - offsetBox.top) + 'px';690 } else {691 shared.mirror.style.top = shared.clientY - shared.mirrorHeight - (pageY - offsetBox.bottom) + 'px';692 }693 }694 }695 var elementBehindCursor = getElementBehindPoint(shared.mirror, shared.clientX, shared.clientY),696 dropTarget = findDropTarget(elementBehindCursor, shared.clientX, shared.clientY),697 changed = dropTarget !== shared.lastDropTarget;698 if (elementBehindCursor !== shared.lastElementBehindCursor) {699 fireEvent(elementBehindCursor, shared.dragOverEvents.dragularenter, !!dropTarget);700 if (shared.lastElementBehindCursor) {701 fireEvent(shared.lastElementBehindCursor, shared.dragOverEvents.dragularleave, elementBehindCursor);702 }703 shared.lastElementBehindCursor = elementBehindCursor;704 }705 if (changed) {706 if (shared.lastDropTarget) {707 moved('out');708 }709 shared.lastDropTarget = dropTarget;710 moved('over');711 }712 // do not copy in same container713 if (dropTarget === shared.source && shared.copy && !g(o.copySortSource)) {714 if (getParent(shared.item)) {715 shared.item.parentNode.removeChild(shared.item);716 }717 return;718 }719 var reference,720 immediate = getImmediateChild(dropTarget, elementBehindCursor);721 if (immediate !== null) {722 reference = getReference(dropTarget, immediate, shared.clientX, shared.clientY);723 } else if (g(o.revertOnSpill) === true && !shared.copy) {724 // the case that mirror is not over valid target and reverting is on and copy is off725 reference = shared.initialSibling;726 dropTarget = shared.source;727 } else {728 // the case that mirror is not over valid target and removing is on or copy is on729 if (shared.copy && getParent(shared.item)) {730 // remove item or copy of item731 shared.item.parentNode.removeChild(shared.item);732 }733 return;734 }735 if (reference === null ||736 reference !== shared.item &&737 reference !== nextEl(shared.item) &&738 reference !== shared.currentSibling) {739 // moving item/copy to new container from previous one740 shared.currentSibling = reference;741 dropTarget.insertBefore(shared.item, reference); // if reference is null item is inserted at the end742 if (o.scope) {743 o.scope.$emit(o.eventNames.dragularshadow, shared.item, dropTarget);744 }745 }746 function moved(type) {747 if (o.scope) {748 o.scope.$emit(o.eventNames['dragular' + type], shared.item, shared.lastDropTarget, shared.source);749 }750 if (g(o.removeOnSpill) === true) {751 type === 'over' ? spillOver() : spillOut();752 }753 }754 }755 function spillOver() {756 rmClass(shared.item, o.classes.hide);757 }758 function spillOut() {759 if (drake.dragging) {760 addClass(shared.item, o.classes.hide);761 }762 }763 function scrollContainer(e) {764 if (shared.target) {765 var before = shared.target.scrollTop;766 shared.target.scrollTop += e.deltaY;767 // block scroll of the document when container can be scrolled768 if (before !== shared.target.scrollTop) {769 e.stopPropagation();770 e.preventDefault();771 }772 }773 }774 function renderMirrorImage() {775 if (shared.mirror) {776 return;777 }778 var rect = shared.sourceItem.getBoundingClientRect();779 shared.mirror = shared.sourceItem.cloneNode(true);780 shared.mirrorWidth = rect.width;781 shared.mirrorHeight = rect.height;782 shared.mirror.style.width = getRectWidth(rect) + 'px';783 shared.mirror.style.height = getRectHeight(rect) + 'px';784 rmClass(shared.mirror, o.classes.transit);785 addClass(shared.mirror, o.classes.mirror);786 o.mirrorContainer.appendChild(shared.mirror);787 regEvent(docElm, 'on', 'mousemove', drag);788 addClass(doc.body, o.classes.unselectable);789 regEvent(shared.mirror, 'on', 'wheel', scrollContainer);790 if (o.scope) {791 o.scope.$emit(o.eventNames.dragularcloned, shared.mirror, shared.sourceItem);792 }793 }794 function removeMirrorImage() {795 if (shared.mirror) {796 rmClass(doc.body, o.classes.unselectable);797 regEvent(docElm, 'off', 'mousemove', drag);798 regEvent(shared.mirror, 'off', 'wheel', scrollContainer);799 if(getParent(shared.mirror)){800 shared.mirror.parentNode.removeChild(shared.mirror);801 }802 shared.mirror = null;803 }804 }805 function getImmediateChild(dropTarget, target) { // watch performance - running each move several times!806 var immediate = target;807 while (immediate !== dropTarget && getParent(immediate) !== dropTarget) {808 immediate = getParent(immediate);809 }810 if (immediate === docElm) {811 return null;812 }813 return immediate;814 }815 function getReference(dropTarget, target, x, y) { // watch performance - running each move several times!816 var horizontal = o.direction === 'horizontal';817 return target !== dropTarget ? inside() : outside();818 function outside() { // slower, but able to figure out any position819 var len = dropTarget.children.length,820 i, el, rect;821 for (i = 0; i < len; i++) {822 el = dropTarget.children[i];823 rect = el.getBoundingClientRect();824 if (horizontal && rect.left > x) {825 return el;826 }827 if (!horizontal && rect.top > y) {828 return el;829 }830 }831 return null;832 }833 function inside() { // faster, but only available if dropped inside a child element834 var rect = target.getBoundingClientRect();835 if (horizontal) {836 return resolve(x > rect.left + getRectWidth(rect) / 2);837 }838 return resolve(y > rect.top + getRectHeight(rect) / 2);839 }840 function resolve(after) {841 return after ? nextEl(target) : target;842 }843 }844 function getElementBehindPoint(point, x, y) { // watch performance - running each move!845 var p = point || {},846 state = p.className,847 el;848 p.className += ' ' + o.classes.hide;849 el = doc.elementFromPoint(x, y);850 p.className = state;851 return el;852 }853 } // end of service854 /****************************************************************************************************************************/855 /****************************************************************************************************************************/856 /****************************************************************************************************************************/857 // HELPERS FUNCTIONS:858 function regEvent(el, op, type, fn) {859 var touch = {860 mouseup: 'touchend',861 mousedown: 'touchstart',862 mousemove: 'touchmove'863 },864 pointers = {865 mouseup: 'pointerup',866 mousedown: 'pointerdown',867 mousemove: 'pointermove'868 },869 microsoft = {870 mouseup: 'MSPointerUp',871 mousedown: 'MSPointerDown',872 mousemove: 'MSPointerMove'873 },874 $el = angular.element(el);875 if (global.navigator.pointerEnabled) {876 $el[op](pointers[type], fn);877 } else if (global.navigator.msPointerEnabled) {878 $el[op](microsoft[type], fn);879 } else if (touch[type]) {880 $el[op](touch[type], fn);881 }882 $el[op](type, fn);883 }884 function never() {885 return false;886 }887 function always() {888 return true;889 }890 // make array from array-like objects or from single element (based on bevacqua/atoa)891 function makeArray(all, startIndex) {892 if (Array.isArray(all)) {893 return all;894 }895 if (all.length) { // is array-like896 return Array.prototype.slice.call(all, startIndex); // convert to vanilla js array897 } else { // is one element898 return [all];899 }900 }901 function whichMouseButton (e) {902 if (e.touches !== void 0) { return e.touches.length; }903 if (e.buttons !== undefined) { return e.buttons; }904 if (e.which !== undefined) { return e.which; }905 var button = e.button;906 if (button !== undefined) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575907 return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0);908 }909 }910 function preventGrabbed(e) {911 if (shared.grabbed) {912 e.preventDefault();913 }914 }915 function getScroll(scrollProp, offsetProp) {916 if (typeof window[offsetProp] !== 'undefined') {917 return window[offsetProp];918 }919 if (docElm.clientHeight) {920 return docElm[scrollProp];921 }922 return doc.body[scrollProp];923 }924 function getOffset(el) { // watch performance - running each move!925 var rect = el.getBoundingClientRect(),926 scrollTop = getScroll('scrollTop', 'pageYOffset'),927 scrollLeft = getScroll('scrollLeft', 'pageXOffset');928 return {929 left: rect.left + scrollLeft,930 right: rect.right + scrollLeft,931 top: rect.top + scrollTop,932 bottom: rect.bottom + scrollTop933 };934 }935 function getRectWidth(rect) {936 return rect.width || (rect.right - rect.left);937 }938 function getRectHeight(rect) {939 return rect.height || (rect.bottom - rect.top);940 }941 function getEmptyObject() {942 return {};943 }944 function nextEl(el) {945 return el.nextElementSibling || manually();946 function manually() {947 var sibling = el;948 do {949 sibling = sibling.nextSibling;950 } while (sibling && sibling.nodeType !== 1);951 return sibling;952 }953 }954 //Cannot use angular.isElement because we need to check plain dom element, no jQlite wrapped955 function isElement(obj) {956 return (957 typeof HTMLElement === 'object' ? obj instanceof HTMLElement : //DOM2958 obj && typeof obj === 'object' && obj !== null && obj.nodeType === 1 && typeof obj.nodeName === 'string'959 );960 }961 function lookupClass(className) {962 var cached = shared.classesCache[className];963 if (cached) {964 cached.lastIndex = 0;965 } else {966 shared.classesCache[className] = cached = new RegExp('(?:^|\\s)' + className + '(?:\\s|$)', 'g');967 }968 return cached;969 }970 function addClass(el, className) {971 var current = el.className;972 if (!current.length) {973 el.className = className;974 } else if (!lookupClass(className).test(current)) {975 el.className += ' ' + className;976 }977 }978 function rmClass(el, className) {979 el.className = el.className.replace(lookupClass(className), ' ').trim();980 }981 function getEventHost(e) {982 // on touchend event, we have to use `e.changedTouches`983 // see http://stackoverflow.com/questions/7192563/touchend-event-properties984 // see https://github.com/bevacqua/dragula/issues/34985 if (e.targetTouches && e.targetTouches.length) {986 return e.targetTouches[0];987 }988 if (e.changedTouches && e.changedTouches.length) {989 return e.changedTouches[0];990 }991 return e;992 }993 function getCoord(coord, e) { // watch performance - running each move several times!994 var host = getEventHost(e);995 var missMap = {996 pageX: 'clientX', // IE8997 pageY: 'clientY' // IE8998 };999 if (coord in missMap && !(coord in host) && missMap[coord] in host) {1000 coord = missMap[coord];1001 }1002 // Adding support for touch events, as they are not functional in the original1003 if (!host.type || host.type.indexOf('touch') < 0) {1004 return host[coord];1005 } else {1006 if (host.type.indexOf('end') === -1) {1007 // No clientX or clientY in a touch event1008 return host.originalEvent.touches[0][coord.replace('client', 'page')];1009 }1010 // Nothing should happen for touchend1011 return false;1012 }1013 }1014 function getParent (el) { // watch performance - running each move!1015 return el.parentNode === document ? null : el.parentNode;1016 }1017 function isInput (el) {1018 return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el);1019 }1020 function isEditable (el) {1021 if (!el) { return false; } // no parents were editable1022 if (el.contentEditable === 'false') { return false; } // stop the lookup1023 if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain1024 return isEditable(getParent(el)); // contentEditable is set to 'inherit'1025 }1026 function domIndexOf(child, parent) {1027 return Array.prototype.indexOf.call(angular.element(parent).children(), child);1028 }1029 function fireEvent(target, e, extra) { // watch performance - running each move!1030 if (!target) {1031 return;1032 }1033 shared.extra = extra;1034 if (target.dispatchEvent) {1035 target.dispatchEvent(e);1036 } else {1037 target.fireEvent('on' + e.eventType, e);1038 }1039 }1040 1041 function getBool(prop, args, context){1042 if(angular.isFunction(prop)){1043 return !!prop.apply(context || this, args || shared);1044 }else{1045 return !!prop;1046 }1047 }1048}]);1049}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})...
dragularService.js
Source:dragularService.js
1/* global angular */2'use strict';3/**4 * dragular Service by Luckylooke https://github.com/luckylooke/dragular5 * Angular version of dragula https://github.com/bevacqua/dragula6 */7var dragularModule = require('./dragularModule'),8 shared = { // sahred object between all service instances9 classesCache: {}, // classes lookup cache10 containersCtx: {}, // containers model11 containers: {}, // containers12 mirror: null, // mirror image13 source: null, // source container14 item: null, // item being dragged15 copy: null, // copy flag16 sourceItem: null, // item originaly dragged if copy is enabled17 sourceModel: null, // source container model18 sourceFilteredModel: null, // source container filtered model if relevant19 target: null, // droppable container under drag item20 targetCtx: null, // target container context21 targetModel: null, // target container model22 lastDropTarget: null, // last container item was over23 offsetX: null, // reference x24 offsetY: null, // reference y25 moveX: null, // reference move x26 moveY: null, // reference move y27 offsetXr: null, // reference x right for boundingBox feature28 offsetYb: null, // reference y bottom for boundingBox feature29 clientX: null, // cache client x, init at grab, update at drag30 clientY: null, // cache client y, init at grab, update at drag31 mirrorWidth: null, // mirror width for boundingBox feature32 mirrorHeight: null, // mirror height for boundingBox feature33 initialSibling: null, // reference sibling when grabbed34 currentSibling: null, // reference sibling now35 initialIndex: null, // reference model index when grabbed36 currentIndex: null, // reference model index now37 tempModel: null, // if o.isContainer is used, model can be provided as well, it is temporary saved here during drags38 dragOverEvents: {}, // drag over events fired on element behind cursor39 lastElementBehindCursor: null, // last element behind cursor40 grabbed: null // holds mousedown context until first mousemove41 };42dragularModule.factory('dragularService', function dragularServiceFunction($rootScope) {43 // abbreviations44 var doc = document,45 docElm = doc.documentElement;46 // clean common/shared objects47 service.cleanEnviroment = function cleanEnviroment() {48 shared.classesCache = {};49 shared.containersCtx = {};50 shared.containers = {};51 shared.mirror = undefined;52 };53 service.shared = shared;54 return service;55 // service definition56 function service(arg0, arg1) {57 var initialContainers = arg0 || [],58 options = arg1 || {},59 o, // shorthand for options60 g = getBool, // shorthand for getBool61 // defaults62 defaultClasses = {63 mirror: 'gu-mirror',64 hide: 'gu-hide',65 unselectable: 'gu-unselectable',66 transit: 'gu-transit'67 },68 defaultEventNames = {69 // drag-over DOM events70 dragularenter: 'dragularenter',71 dragularleave: 'dragularleave',72 dragularrelease: 'dragularrelease',73 // $scope events74 dragularcloned: 'dragularcloned',75 dragulardrag: 'dragulardrag',76 dragularcancel: 'dragularcancel',77 dragulardrop: 'dragulardrop',78 dragularremove: 'dragularremove',79 dragulardragend: 'dragulardragend',80 dragularshadow: 'dragularshadow',81 dragularover: 'dragularover',82 dragularout: 'dragularout'83 },84 defaultOptions = { // options with defaults85 copyOptions: false, // copy options object when provided86 classes: defaultClasses, // classes used by dragular87 eventNames: defaultEventNames, // event names used by dragular88 containers: false, // initial containers provided via options object (are provided via parameter by default)89 containersModel: false, // if provided, model will be synced with DOM90 containersFilteredModel: false, // if provided, dragular will handle filtered model cases91 isContainer: never, // potential target can be forced to be container by custom logic92 isContainerModel: getEmptyObject, // if isContainer function is provided, you can provide also respective model93 moves: always, // can drag start?94 accepts: always, // can target accept dragged item? (target context used)95 canBeAccepted: always, // can be dragged item accepted by target? (source context used)96 copy: false, // dragged item will be copy of source? flag or function97 copySortSource: false, // enable sorting in source when copying item98 dontCopyModel: false, // dont make copy of model when coping item (#61)99 invalid: never, // target (in)validity function100 revertOnSpill: false, // item returns to original place101 removeOnSpill: false, // item will be removed if not placed into valid target102 lockX: false, // lock movement into x-axis103 lockY: false, // lock movement into y-axis104 boundingBox: false, // lock movement inside this element boundaries105 mirrorContainer: doc.body, // element for appending mirror106 ignoreInputTextSelection: true // text selection in inputs wont be considered as drag107 },108 drake = {109 containers: shared.containers,110 containersCtx: shared.containersCtx,111 sanitizeContainersModel: sanitizeContainersModel,112 isContainer: isContainer,113 start: manualStart,114 end: end,115 cancel: cancel,116 remove: remove,117 destroy: destroy,118 dragging: false119 };120 processServiceArguments(); // both arguments (containers and options) are optional, this function handle this121 extendOptions();122 processOptionsObject();123 registerEvents();124 return drake;125 // Function definitions: ==============================================================================================================126 // Initial functions: -----------------------------------------------------------------------------------------------------------------127 function sanitizeContainersModel(containersModel) {128 if (typeof(containersModel) === 'function') {129 return containersModel;130 }131 if (Array.isArray(containersModel)) {132 // |-------- is 2D array? -----------|133 return Array.isArray(containersModel[0]) ? containersModel : [containersModel];134 } else {135 return [];136 }137 }138 function processServiceArguments(){139 if (arguments.length === 1 && // if there is only one argument we need to distinguish if it is options object or container(s) reference140 !Array.isArray(arg0) && // array of containers elements141 !angular.isElement(arg0) && // one container element142 !arg0[0] && // array-like object with containers elements143 typeof arg0 !== 'string') { // selector144 // then arg0 is options object145 options = arg0 || {};146 initialContainers = []; // containers are not provided on init147 } else if (typeof arg0 === 'string') {148 initialContainers = document.querySelectorAll(arg0);149 }150 o = options.copyOptions ? angular.copy(options) : options;151 }152 function extendOptions(){153 var tmp = angular.extend({}, defaultOptions, o); // tmp for keeping defaults untouched154 angular.extend(o, tmp); // merge defaults back into options155 if(o.classes){156 tmp = angular.extend({}, defaultClasses, o.classes);157 angular.extend(o.classes, tmp);158 }159 if(o.eventNames){160 tmp = angular.extend({}, defaultEventNames, o.eventNames);161 angular.extend(o.eventNames, tmp);162 }163 }164 function processOptionsObject(){165 // bounding box must be pure DOM element, not jQuery wrapper or something else..166 if (!isElement(o.boundingBox)) {167 o.boundingBox = false;168 }169 // initial containers provided via options are higher priority then by parameter170 if(o.containers){171 initialContainers = o.containers;172 }173 // sanitize initialContainers174 initialContainers = makeArray(initialContainers);175 // sanitize o.containersModel176 o.containersModel = sanitizeContainersModel(o.containersModel);177 // sanitize o.containersFilteredModel178 if (Array.isArray(o.containersFilteredModel)) {179 // |-------- is 2D array? -----------|180 o.containersFilteredModel = Array.isArray(o.containersFilteredModel[0]) ? o.containersFilteredModel : [o.containersFilteredModel];181 } else {182 o.containersFilteredModel = [];183 }184 // feed containers groups and optionaly do same for models185 if (!o.nameSpace) {186 o.nameSpace = ['dragularCommon'];187 }188 if (!Array.isArray(o.nameSpace)) {189 o.nameSpace = [o.nameSpace];190 }191 o.nameSpace.forEach(function eachNameSpace(nameSpace) {192 if (!shared.containers[nameSpace]) {193 shared.containers[nameSpace] = [];194 shared.containersCtx[nameSpace] = [];195 }196 var len = initialContainers.length,197 shLen = shared.containers[nameSpace].length;198 for (var i = 0; i < len; i++) {199 shared.containers[nameSpace][i + shLen] = initialContainers[i];200 shared.containersCtx[nameSpace][i + shLen] = {201 o: o,202 m: getContainersModel()[i], // can be undefined203 fm: o.containersFilteredModel[i] // can be undefined204 };205 }206 });207 }208 function registerEvents(remove) {209 var op = remove ? 'off' : 'on';210 regEvent(docElm, op, 'mouseup', release);211 // regEvent(docElm, op, 'mousemove', startBecauseMouseMoved);212 initialContainers.forEach(function addMouseDown(container) {213 regEvent(container, 'on', 'mousedown', grab);214 });215 if(!remove){ // create dragular DOM events216 angular.forEach(['dragularenter', 'dragularleave', 'dragularrelease'], function prepareDragOverEvents(name) {217 var eventName = o.eventNames[name];218 if(!shared.dragOverEvents[eventName]){219 if (doc.createEvent) {220 shared.dragOverEvents[eventName] = doc.createEvent('HTMLEvents');221 shared.dragOverEvents[eventName].initEvent(eventName, true, true);222 } else {223 shared.dragOverEvents[eventName] = doc.createEventObject();224 shared.dragOverEvents[eventName].eventType = eventName;225 }226 }227 });228 }229 }230 // Event handlers functions (end of initial functions): -----------------------------------------------------------------------------------------------------------------231 function grab(e) {232 // filter some odd situations233 if (whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey) {234 return; // we only care about honest-to-god left clicks and touch events235 }236 // set itial values237 shared.moveX = e.clientX;238 shared.moveY = e.clientY;239 var context = canStart(e.target);240 if (!context || !context.item) {241 return;242 }243 shared.grabbed = context;244 eventualMovements();245 if (e.type === 'mousedown') {246 if (isInput(context.item)) { // see also: https://github.com/bevacqua/dragula/issues/208247 context.item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176248 } else {249 e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155250 }251 }252 }253 function release(e) {254 ungrab();255 if (!drake.dragging) {256 return;257 }258 shared.clientX = getCoord('clientX', e);259 shared.clientY = getCoord('clientY', e);260 var elementBehindCursor = getElementBehindPoint(shared.mirror, shared.clientX, shared.clientY),261 dropTarget = findDropTarget(elementBehindCursor, shared.clientX, shared.clientY);262 if (dropTarget && ((shared.copy && g(o.copySortSource)) || (!shared.copy || dropTarget !== shared.source))) {263 // found valid target and (is not copy case or target is not initial container)264 drop(shared.item, dropTarget);265 } else if (g(o.removeOnSpill)) {266 remove();267 } else {268 cancel();269 }270 // after release there is no container hovered271 shared.target = null;272 if (shared.lastElementBehindCursor) {273 fireEvent(shared.lastElementBehindCursor, shared.dragOverEvents.dragularrelease, elementBehindCursor);274 }275 if (o.scope) {276 o.scope.$emit(o.eventNames.dragularrelease, shared.item, shared.source);277 }278 }279 // Main logic functions (end of event handler functions): -----------------------------------------------------------------------------------------------------------------280 function isContainer(el) {281 if(!el){282 return false;283 }284 var i = o.nameSpace.length;285 while (i--) {286 if (shared.containers[o.nameSpace[i]].indexOf(el) !== -1) {287 return true;288 }289 }290 if (o.isContainer(el)) {291 shared.tempModel = o.isContainerModel(el);292 return true;293 } else {294 shared.tempModel = null;295 }296 return false;297 }298 function getContainersModel() {299 return (typeof(o.containersModel) === 'function') ? sanitizeContainersModel(o.containersModel(drake, shared)) : o.containersModel;300 }301 function removeContainers(all) {302 $rootScope.$applyAsync(function applyDestroyed() {303 var changes = Array.isArray(all) ? all : makeArray(all);304 changes.forEach(function forEachContainer(container) {305 angular.forEach(o.nameSpace, function forEachNs(nameSpace) {306 var index;307 index = shared.containers[nameSpace].indexOf(container);308 shared.containers[nameSpace].splice(index, 1);309 shared.containersCtx[nameSpace].splice(index, 1);310 });311 });312 });313 }314 function eventualMovements(remove) {315 var op = remove ? 'off' : 'on';316 regEvent(docElm, op, 'mousemove', startBecauseMouseMoved);317 }318 function movements(remove) {319 var op = remove ? 'off' : 'on';320 regEvent(docElm, op, 'selectstart', preventGrabbed); // IE8321 regEvent(docElm, op, 'click', preventGrabbed);322 regEvent(docElm, op, 'touchmove', preventGrabbed); // fixes touch devices scrolling while drag323 }324 function destroy() {325 registerEvents(true);326 removeContainers(initialContainers);327 release({});328 }329 function startBecauseMouseMoved(e) {330 if (!shared.grabbed || drake.dragging) {331 return;332 }333 if (whichMouseButton(e) === 0) {334 release({});335 return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope336 }337 // truthy check fixes dragula-#239, equality fixes dragula-#207338 if (e.clientX && e.clientX === shared.moveX && e.clientY && e.clientY === shared.moveY) {339 return;340 }341 if (g(o.ignoreInputTextSelection)) {342 var clientX = getCoord('clientX', e),343 clientY = getCoord('clientY', e),344 elementBehindCursor = doc.elementFromPoint(clientX, clientY);345 if (isInput(elementBehindCursor)) {346 return;347 }348 }349 var grabbed = shared.grabbed; // calling end() unsets shared.grabbed350 eventualMovements('remove'); // remove mousemove listener351 movements();352 end();353 start(grabbed);354 // automaticly detect direction of elements if not set in options355 if (!o.direction && getParent(shared.sourceItem)) {356 var parent = shared.sourceItem.parentNode,357 parentHeight = parent.offsetHeight,358 parentWidth = parent.offsetWidth,359 childHeight = shared.sourceItem.clientHeight,360 childWidth = shared.sourceItem.clientWidth;361 o.direction = parentHeight / childHeight < parentWidth / childWidth ? 'horizontal' : 'vertical';362 }363 // get initial coordinates, used to render shared.mirror for first time364 var offset = getOffset(shared.sourceItem);365 shared.offsetX = getCoord('pageX', e) - offset.left;366 shared.offsetY = getCoord('pageY', e) - offset.top;367 shared.clientX = getCoord('clientX', e);368 shared.clientY = getCoord('clientY', e);369 // limiting area of shared.mirror movement, get initial coordinates370 if (o.boundingBox) {371 shared.offsetXr = getCoord('pageX', e) - offset.right;372 shared.offsetYb = getCoord('pageY', e) - offset.bottom;373 }374 e.preventDefault();375 addClass(shared.item, o.classes.transit);376 renderMirrorImage();377 // initial position378 shared.mirror.style.left = shared.clientX - shared.offsetX + 'px';379 shared.mirror.style.top = shared.clientY - shared.offsetY + 'px';380 drag(e);381 }382 function canStart(item) {383 if (drake.dragging && shared.mirror) {384 console.log('usecase?');385 return; // already dragging386 }387 var handle = item;388 while (getParent(item) && !isContainer(getParent(item))) {389 // break loop if user tries to drag item which is considered invalid handle390 if (o.invalid(item, handle)) {391 return;392 }393 item = getParent(item); // drag target should be immediate child of container394 if (!item) {395 return;396 }397 }398 var source = getParent(item);399 if (!source ||400 o.invalid(item, handle) ||401 !o.moves(item, source, handle, nextEl(item))) {402 return;403 }404 return {405 item: item,406 source: source407 };408 }409 function manualStart(item) {410 var context = canStart(item);411 if (context) {412 start(context);413 }414 }415 function start(context) {416 shared.sourceItem = shared.item = context.item;417 shared.source = context.source;418 shared.initialSibling = shared.currentSibling = nextEl(context.item);419 if (g(o.copy, [context.item, context.source])) {420 shared.item = context.item.cloneNode(true);421 shared.copy = true;422 if (o.scope) {423 o.scope.$emit(o.eventNames.dragularcloned, shared.item, context.item);424 }425 } else {426 shared.copy = false;427 }428 // prepare models operations429 var containerIndex = initialContainers.indexOf(context.source);430 shared.sourceModel = getContainersModel()[containerIndex];431 shared.sourceFilteredModel = o.containersFilteredModel[containerIndex];432 shared.initialIndex = domIndexOf(context.item, context.source);433 drake.dragging = true;434 if (o.scope) {435 o.scope.$emit(o.eventNames.dragulardrag, shared.sourceItem, shared.source);436 }437 return true;438 }439 function end() {440 if (!drake.dragging || !shared.item) {441 return;442 }443 drop(shared.item, getParent(shared.item));444 }445 function ungrab() {446 shared.grabbed = false;447 eventualMovements('remove');448 movements('remove');449 }450 function drop(item, target) {451 if (shared.copy && g(o.copySortSource) && target === shared.source && getParent(item)) {452 item.parentNode.removeChild(shared.sourceItem);453 }454 if (shared.sourceModel && !isInitialPlacement(target)) {455 var dropIndex = domIndexOf(item, target);456 if(shared.targetCtx.fm){ // target has filtered model457 // convert index from index-in-filteredModel to index-in-model458 dropIndex = shared.targetCtx.m.indexOf(shared.targetCtx.fm[dropIndex]);459 }460 if(shared.sourceFilteredModel){ // target has filtered model461 // convert index from index-in-filteredModel to index-in-model462 shared.initialIndex = shared.sourceModel.indexOf(shared.sourceFilteredModel[shared.initialIndex]);463 }464 $rootScope.$applyAsync(function applyDrop() {465 if (target === shared.source) {466 shared.sourceModel.splice(dropIndex, 0, shared.sourceModel.splice(shared.initialIndex, 1)[0]);467 } else {468 shared.dropElmModel = shared.copy && !o.dontCopyModel ? angular.copy(shared.sourceModel[shared.initialIndex]) : shared.sourceModel[shared.initialIndex];469 if (!shared.tempModel) {470 shared.targetModel = shared.targetCtx.m;471 } else {472 shared.targetModel = shared.tempModel;473 }474 target.removeChild(item); // element must be removed for ngRepeat to apply correctly475 if (!shared.copy) {476 shared.sourceModel.splice(shared.initialIndex, 1);477 }478 shared.targetModel.splice(dropIndex, 0, shared.dropElmModel);479 }480 if (getParent(item)) {481 item.parentNode.removeChild(item);482 }483 emitDropEvent();484 cleanup();485 });486 } else {487 emitDropEvent();488 cleanup();489 }490 function emitDropEvent() {491 if (o.scope) {492 if (isInitialPlacement(target)) {493 o.scope.$emit(o.eventNames.dragularcancel, item, shared.source, shared.sourceModel, shared.initialIndex);494 } else {495 o.scope.$emit(o.eventNames.dragulardrop, item, target, shared.source, shared.sourceModel, shared.initialIndex, shared.targetModel, dropIndex);496 }497 }498 }499 }500 function remove() {501 if (!drake.dragging) {502 return;503 }504 var parent = getParent(shared.item);505 if (parent) {506 parent.removeChild(shared.item);507 }508 if (shared.sourceModel) {509 $rootScope.$applyAsync(function removeModel() {510 shared.sourceModel.splice(shared.initialIndex, 1);511 cleanup();512 });513 }514 if (o.scope) {515 o.scope.$emit(shared.copy ? o.eventNames.dragularcancel : o.eventNames.dragularremove, shared.item, parent, shared.sourceModel, shared.initialIndex);516 }517 if (!shared.sourceModel) {518 cleanup();519 }520 }521 function cancel(revert) {522 if (!drake.dragging) {523 return;524 }525 var reverts = arguments.length > 0 ? revert : g(o.revertOnSpill),526 parent = getParent(shared.item);527 var initial = isInitialPlacement(parent);528 if (!initial && !shared.copy && reverts) {529 shared.source.insertBefore(shared.item, shared.initialSibling);530 }531 if (shared.sourceModel && !shared.copy && !reverts) {532 drop(shared.item, parent);533 } else if (o.scope) {534 if (initial || reverts) {535 o.scope.$emit(o.eventNames.dragularcancel, shared.item, shared.source);536 }537 }538 if (!shared.sourceModel || shared.copy || reverts || initial) {539 cleanup();540 }541 }542 function cleanup() {543 ungrab();544 removeMirrorImage();545 if (shared.item) {546 rmClass(shared.item, o.classes.transit);547 }548 drake.dragging = false;549 if (g(o.removeOnSpill) === true) {550 spillOut();551 }552 if (o.scope) {553 if(shared.lastDropTarget){554 o.scope.$emit(o.eventNames.dragularout, shared.item, shared.lastDropTarget, shared.source);555 }556 o.scope.$emit(o.eventNames.dragulardragend, shared.item);557 }558 shared.source = shared.item = shared.sourceItem = shared.initialSibling = shared.currentSibling = shared.sourceModel = null;559 shared.initialIndex = shared.currentIndex = shared.lastDropTarget = shared.tempModel = shared.targetModel = null;560 shared.dropElmModel = shared.targetCtx = shared.copy = shared.moveX = shared.moveY = null;561 }562 // is item currently placed in original container and original position?563 function isInitialPlacement(target, s) { // watch performance - running each move several times!564 var sibling = s || (shared.mirror ? shared.currentSibling : nextEl(shared.item));565 return target === shared.source && sibling === shared.initialSibling;566 }567 // find valid drop container568 function findDropTarget(elementBehindCursor, clientX, clientY) { // watch performance - running each move!569 var target = elementBehindCursor;570 while (target && !accepted()) {571 target = getParent(target);572 }573 return target;574 function accepted() {575 var accepts = false;576 if (isContainer(target)) { // is droppable?577 var immediate = getImmediateChild(target, elementBehindCursor),578 reference = getReference(target, immediate, clientX, clientY),579 initial = isInitialPlacement(target, reference),580 i = o.nameSpace.length;581 while (i--) {582 if (shared.containers[o.nameSpace[i]].indexOf(target) !== -1) {583 shared.targetCtx = shared.containersCtx[o.nameSpace[i]][shared.containers[o.nameSpace[i]].indexOf(target)];584 break;585 }586 if (!shared.targetCtx) {587 shared.targetCtx = shared.containersCtx.dragularCommon[shared.containers.dragularCommon.indexOf(target)];588 }589 }590 accepts = initial ||591 (shared.targetCtx.o.accepts(shared.item, target, shared.source, reference, shared.sourceModel, shared.initialIndex) &&592 o.canBeAccepted(shared.item, target, shared.source, reference, shared.sourceModel, shared.initialIndex));593 if (shared.target !== target) { // used for scroll issue594 shared.target = target;595 }596 }597 return accepts;598 }599 }600 function drag(e) { // watch performance - running each move!601 if (!shared.mirror) {602 return;603 }604 // update coordinates605 shared.clientX = getCoord('clientX', e);606 shared.clientY = getCoord('clientY', e);607 // count mirror coordiates608 var x = shared.clientX - shared.offsetX,609 y = shared.clientY - shared.offsetY,610 pageX,611 pageY,612 offsetBox;613 // fill extra properties if boundingBox is used614 if (o.boundingBox) {615 pageX = getCoord('pageX', e);616 pageY = getCoord('pageY', e);617 offsetBox = getOffset(o.boundingBox);618 }619 if (!o.lockY) {620 if (!o.boundingBox || (pageX > offsetBox.left + shared.offsetX && pageX < offsetBox.right + shared.offsetXr)) {621 shared.mirror.style.left = x + 'px';622 } else if (o.boundingBox) { // check again in case user scrolled the view623 if (pageX < offsetBox.left + shared.offsetX) {624 shared.mirror.style.left = shared.clientX - (pageX - offsetBox.left) + 'px';625 } else {626 shared.mirror.style.left = shared.clientX - shared.mirrorWidth - (pageX - offsetBox.right) + 'px';627 }628 }629 }630 if (!o.lockX) {631 if (!o.boundingBox || (pageY > offsetBox.top + shared.offsetY && pageY < offsetBox.bottom + shared.offsetYb)) {632 shared.mirror.style.top = y + 'px';633 } else if (o.boundingBox) { // check again in case user scrolled the view634 if (pageY < offsetBox.top + shared.offsetY) {635 shared.mirror.style.top = shared.clientY - (pageY - offsetBox.top) + 'px';636 } else {637 shared.mirror.style.top = shared.clientY - shared.mirrorHeight - (pageY - offsetBox.bottom) + 'px';638 }639 }640 }641 var elementBehindCursor = getElementBehindPoint(shared.mirror, shared.clientX, shared.clientY),642 dropTarget = findDropTarget(elementBehindCursor, shared.clientX, shared.clientY),643 changed = dropTarget !== shared.lastDropTarget;644 if (elementBehindCursor !== shared.lastElementBehindCursor) {645 fireEvent(elementBehindCursor, shared.dragOverEvents.dragularenter, !!dropTarget);646 if (shared.lastElementBehindCursor) {647 fireEvent(shared.lastElementBehindCursor, shared.dragOverEvents.dragularleave, elementBehindCursor);648 }649 shared.lastElementBehindCursor = elementBehindCursor;650 }651 if (changed) {652 if (shared.lastDropTarget) {653 moved('out');654 }655 shared.lastDropTarget = dropTarget;656 moved('over');657 }658 // do not copy in same container659 if (dropTarget === shared.source && shared.copy && !g(o.copySortSource)) {660 if (getParent(shared.item)) {661 shared.item.parentNode.removeChild(shared.item);662 }663 return;664 }665 var reference,666 immediate = getImmediateChild(dropTarget, elementBehindCursor);667 if (immediate !== null) {668 reference = getReference(dropTarget, immediate, shared.clientX, shared.clientY);669 } else if (g(o.revertOnSpill) === true && !shared.copy) {670 // the case that mirror is not over valid target and reverting is on and copy is off671 reference = shared.initialSibling;672 dropTarget = shared.source;673 } else {674 // the case that mirror is not over valid target and removing is on or copy is on675 if (shared.copy && getParent(shared.item)) {676 // remove item or copy of item677 shared.item.parentNode.removeChild(shared.item);678 }679 return;680 }681 if (reference === null ||682 reference !== shared.item &&683 reference !== nextEl(shared.item) &&684 reference !== shared.currentSibling) {685 // moving item/copy to new container from previous one686 shared.currentSibling = reference;687 dropTarget.insertBefore(shared.item, reference); // if reference is null item is inserted at the end688 if (o.scope) {689 o.scope.$emit(o.eventNames.dragularshadow, shared.item, dropTarget);690 }691 }692 function moved(type) {693 if (o.scope) {694 o.scope.$emit(o.eventNames['dragular' + type], shared.item, shared.lastDropTarget, shared.source);695 }696 if (g(o.removeOnSpill) === true) {697 type === 'over' ? spillOver() : spillOut();698 }699 }700 }701 function spillOver() {702 rmClass(shared.item, o.classes.hide);703 }704 function spillOut() {705 if (drake.dragging) {706 addClass(shared.item, o.classes.hide);707 }708 }709 function scrollContainer(e) {710 if (shared.target) {711 var before = shared.target.scrollTop;712 shared.target.scrollTop += e.deltaY;713 // block scroll of the document when container can be scrolled714 if (before !== shared.target.scrollTop) {715 e.stopPropagation();716 e.preventDefault();717 }718 }719 }720 function renderMirrorImage() {721 if (shared.mirror) {722 return;723 }724 var rect = shared.sourceItem.getBoundingClientRect();725 shared.mirror = shared.sourceItem.cloneNode(true);726 shared.mirrorWidth = rect.width;727 shared.mirrorHeight = rect.height;728 shared.mirror.style.width = getRectWidth(rect) + 'px';729 shared.mirror.style.height = getRectHeight(rect) + 'px';730 rmClass(shared.mirror, o.classes.transit);731 addClass(shared.mirror, o.classes.mirror);732 o.mirrorContainer.appendChild(shared.mirror);733 regEvent(docElm, 'on', 'mousemove', drag);734 addClass(doc.body, o.classes.unselectable);735 regEvent(shared.mirror, 'on', 'wheel', scrollContainer);736 if (o.scope) {737 o.scope.$emit(o.eventNames.dragularcloned, shared.mirror, shared.sourceItem);738 }739 }740 function removeMirrorImage() {741 if (shared.mirror) {742 rmClass(doc.body, o.classes.unselectable);743 regEvent(docElm, 'off', 'mousemove', drag);744 regEvent(shared.mirror, 'off', 'wheel', scrollContainer);745 if(getParent(shared.mirror)){746 shared.mirror.parentNode.removeChild(shared.mirror);747 }748 shared.mirror = null;749 }750 }751 function getImmediateChild(dropTarget, target) { // watch performance - running each move several times!752 var immediate = target;753 while (immediate !== dropTarget && getParent(immediate) !== dropTarget) {754 immediate = getParent(immediate);755 }756 if (immediate === docElm) {757 return null;758 }759 return immediate;760 }761 function getReference(dropTarget, target, x, y) { // watch performance - running each move several times!762 var horizontal = o.direction === 'horizontal';763 return target !== dropTarget ? inside() : outside();764 function outside() { // slower, but able to figure out any position765 var len = dropTarget.children.length,766 i, el, rect;767 for (i = 0; i < len; i++) {768 el = dropTarget.children[i];769 rect = el.getBoundingClientRect();770 if (horizontal && rect.left > x) {771 return el;772 }773 if (!horizontal && rect.top > y) {774 return el;775 }776 }777 return null;778 }779 function inside() { // faster, but only available if dropped inside a child element780 var rect = target.getBoundingClientRect();781 if (horizontal) {782 return resolve(x > rect.left + getRectWidth(rect) / 2);783 }784 return resolve(y > rect.top + getRectHeight(rect) / 2);785 }786 function resolve(after) {787 return after ? nextEl(target) : target;788 }789 }790 function getElementBehindPoint(point, x, y) { // watch performance - running each move!791 var p = point || {},792 state = p.className,793 el;794 p.className += ' ' + o.classes.hide;795 el = doc.elementFromPoint(x, y);796 p.className = state;797 return el;798 }799 } // end of service800 /****************************************************************************************************************************/801 /****************************************************************************************************************************/802 /****************************************************************************************************************************/803 // HELPERS FUNCTIONS:804 function regEvent(el, op, type, fn) {805 var touch = {806 mouseup: 'touchend',807 mousedown: 'touchstart',808 mousemove: 'touchmove'809 },810 pointers = {811 mouseup: 'pointerup',812 mousedown: 'pointerdown',813 mousemove: 'pointermove'814 },815 microsoft = {816 mouseup: 'MSPointerUp',817 mousedown: 'MSPointerDown',818 mousemove: 'MSPointerMove'819 },820 $el = angular.element(el);821 if (global.navigator.pointerEnabled) {822 $el[op](pointers[type], fn);823 } else if (global.navigator.msPointerEnabled) {824 $el[op](microsoft[type], fn);825 } else if (touch[type]) {826 $el[op](touch[type], fn);827 }828 $el[op](type, fn);829 }830 function never() {831 return false;832 }833 function always() {834 return true;835 }836 // make array from array-like objects or from single element (based on bevacqua/atoa)837 function makeArray(all, startIndex) {838 if (Array.isArray(all)) {839 return all;840 }841 if (all.length) { // is array-like842 return Array.prototype.slice.call(all, startIndex); // convert to vanilla js array843 } else { // is one element844 return [all];845 }846 }847 function whichMouseButton (e) {848 if (e.touches !== void 0) { return e.touches.length; }849 if (e.buttons !== undefined) { return e.buttons; }850 if (e.which !== undefined) { return e.which; }851 var button = e.button;852 if (button !== undefined) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575853 return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0);854 }855 }856 function preventGrabbed(e) {857 if (shared.grabbed) {858 e.preventDefault();859 }860 }861 function getScroll(scrollProp, offsetProp) {862 if (typeof window[offsetProp] !== 'undefined') {863 return window[offsetProp];864 }865 if (docElm.clientHeight) {866 return docElm[scrollProp];867 }868 return doc.body[scrollProp];869 }870 function getOffset(el) { // watch performance - running each move!871 var rect = el.getBoundingClientRect(),872 scrollTop = getScroll('scrollTop', 'pageYOffset'),873 scrollLeft = getScroll('scrollLeft', 'pageXOffset');874 return {875 left: rect.left + scrollLeft,876 right: rect.right + scrollLeft,877 top: rect.top + scrollTop,878 bottom: rect.bottom + scrollTop879 };880 }881 function getRectWidth(rect) {882 return rect.width || (rect.right - rect.left);883 }884 function getRectHeight(rect) {885 return rect.height || (rect.bottom - rect.top);886 }887 function getEmptyObject() {888 return {};889 }890 function nextEl(el) {891 return el.nextElementSibling || manually();892 function manually() {893 var sibling = el;894 do {895 sibling = sibling.nextSibling;896 } while (sibling && sibling.nodeType !== 1);897 return sibling;898 }899 }900 //Cannot use angular.isElement because we need to check plain dom element, no jQlite wrapped901 function isElement(obj) {902 return (903 typeof HTMLElement === 'object' ? obj instanceof HTMLElement : //DOM2904 obj && typeof obj === 'object' && obj !== null && obj.nodeType === 1 && typeof obj.nodeName === 'string'905 );906 }907 function lookupClass(className) {908 var cached = shared.classesCache[className];909 if (cached) {910 cached.lastIndex = 0;911 } else {912 shared.classesCache[className] = cached = new RegExp('(?:^|\\s)' + className + '(?:\\s|$)', 'g');913 }914 return cached;915 }916 function addClass(el, className) {917 var current = el.className;918 if (!current.length) {919 el.className = className;920 } else if (!lookupClass(className).test(current)) {921 el.className += ' ' + className;922 }923 }924 function rmClass(el, className) {925 el.className = el.className.replace(lookupClass(className), ' ').trim();926 }927 function getEventHost(e) {928 // on touchend event, we have to use `e.changedTouches`929 // see http://stackoverflow.com/questions/7192563/touchend-event-properties930 // see https://github.com/bevacqua/dragula/issues/34931 if (e.targetTouches && e.targetTouches.length) {932 return e.targetTouches[0];933 }934 if (e.changedTouches && e.changedTouches.length) {935 return e.changedTouches[0];936 }937 return e;938 }939 function getCoord(coord, e) { // watch performance - running each move several times!940 var host = getEventHost(e);941 var missMap = {942 pageX: 'clientX', // IE8943 pageY: 'clientY' // IE8944 };945 if (coord in missMap && !(coord in host) && missMap[coord] in host) {946 coord = missMap[coord];947 }948 // Adding support for touch events, as they are not functional in the original949 if (!host.type || host.type.indexOf('touch') < 0) {950 return host[coord];951 } else {952 if (host.type.indexOf('end') === -1) {953 // No clientX or clientY in a touch event954 return host.originalEvent.touches[0][coord.replace('client', 'page')];955 }956 // Nothing should happen for touchend957 return false;958 }959 }960 function getParent (el) { // watch performance - running each move!961 return el.parentNode === document ? null : el.parentNode;962 }963 function isInput (el) {964 return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el);965 }966 function isEditable (el) {967 if (!el) { return false; } // no parents were editable968 if (el.contentEditable === 'false') { return false; } // stop the lookup969 if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain970 return isEditable(getParent(el)); // contentEditable is set to 'inherit'971 }972 function domIndexOf(child, parent) {973 return Array.prototype.indexOf.call(angular.element(parent).children(), child);974 }975 function fireEvent(target, e, extra) { // watch performance - running each move!976 if (!target) {977 return;978 }979 shared.extra = extra;980 if (target.dispatchEvent) {981 target.dispatchEvent(e);982 } else {983 target.fireEvent('on' + e.eventType, e);984 }985 }986 987 function getBool(prop, args, context){988 if(angular.isFunction(prop)){989 return !!prop.apply(context || this, args || shared);990 }else{991 return !!prop;992 }993 }...
DocumentSharedForm.js
Source:DocumentSharedForm.js
1/**2 * ææ¡£å
±äº«è¡¨å3 * 4 */5var DocumentSharedForm = function(docId) {6 this.docId = docId;7};8/**9 * æ¾ç¤ºè§å¾10 * 11 * @return {}12 */13DocumentSharedForm.prototype.getView = function() {14 var docId = this.docId;15 var formPanel = new Ext.FormPanel({16 id : 'documentSharedForm',17 bodyStyle : 'padding:4px 10px 4px 10px',18 items : [{19 xtype : 'hidden',20 name : 'docId',21 id:'docId',22 value : this.docId23 }, {24 xtype : 'fieldset',25 border : false,26 layout : 'column',27 items : [{28 xtype : 'label',29 text : 'å
±äº«äººå',30 width : 10031 }, {32 xtype : 'hidden',33 name : 'sharedUserIds',34 id : 'sharedUserIds'35 }, {36 xtype : 'textarea',37 name : 'sharedUserNames',38 id : 'sharedUserNames',39 width : 30040 }, {41 xtype : 'button',42 text : 'éæ©',43 iconCls:'btn-select',44 width : 80,45 handler : function() {46 //æ¾ç¤ºéæ©å¨ï¼å¹¶ä¸è®¾ç½®ç¨æ·47 UserSelector.getView(48 function(uIds, fnames) {49 var sharedUserIds = Ext50 .getCmp('sharedUserIds');51 var sharedUserNames = Ext52 .getCmp('sharedUserNames');53 if (sharedUserIds.getValue() == '') {//è¥å没æå¼ï¼åç´æ¥è®¾ç½®54 sharedUserIds.setValue(','+uIds+',');55 sharedUserNames.setValue(fnames);56 return;57 }else{58 //å»æéå¤ç人å59 var vIds = sharedUserIds.getValue()60 .split(',');61 var fnms = sharedUserNames.getValue()62 .split(',');63 sharedUserIds64 .setValue(uniqueArray(vIds65 .concat(uIds66 .split(',')))+',');67 sharedUserNames68 .setValue(uniqueArray(fnms69 .concat(fnames70 .split(','))));71 72 }73 }).show();74 }75 }, {76 xtype : 'button',77 iconCls:'btn-clear',78 text : 'æ¸
空',79 handler:function(){80 var sharedUserIds = Ext.getCmp('sharedUserIds');81 var sharedUserNames = Ext.getCmp('sharedUserNames');82 83 sharedUserIds.setValue('');84 sharedUserNames.setValue('');85 },86 width : 8087 }]88 }, {89 xtype : 'fieldset',90 border : false,91 layout : 'column',92 items : [{93 xtype : 'label',94 text : 'å
±äº«é¨é¨',95 width : 10096 }, {97 name : 'sharedDepIds',98 id : 'sharedDepIds',99 xtype : 'hidden'100 }, {101 name : 'sharedDepNames',102 id : 'sharedDepNames',103 xtype : 'textarea',104 width : 300105 }, {106 xtype : 'button',107 text : 'éæ©',108 iconCls:'btn-select',109 width : 80,110 handler : function() {111 DepSelector.getView(function(ids, names) {112 var sharedDepIds = Ext.getCmp('sharedDepIds');113 var sharedDepNames = Ext.getCmp('sharedDepNames');114 if (sharedDepIds.getValue() == '') {//è¥å没æå¼ï¼åç´æ¥è®¾ç½®115 sharedDepIds.setValue(','+ids+',');116 sharedDepNames.setValue(names);117 return;118 }119 //å»æéå¤çé¨é¨120 var vIds = sharedDepIds.getValue().split(',');121 var fnms = sharedDepNames.getValue().split(',');122 sharedDepIds.setValue(uniqueArray(vIds123 .concat(ids.split(',')))+',');124 sharedDepNames.setValue(uniqueArray(fnms125 .concat(names.split(','))));126 }).show();127 }128 }, {129 xtype : 'button',130 text : 'æ¸
空',131 iconCls:'btn-clear',132 handler:function(){133 var sharedDepIds = Ext.getCmp('sharedDepIds');134 var sharedDepNames = Ext.getCmp('sharedDepNames');135 136 sharedDepIds.setValue('');137 sharedDepNames.setValue('');138 },139 width : 80140 }]141 }, {142 xtype : 'fieldset',143 border : false,144 layout : 'column',145 items : [{146 xtype : 'label',147 text : 'å
±äº«è§è²',148 width : 100149 }, {150 xtype : 'hidden',151 id : 'sharedRoleIds',152 name : 'sharedRoleIds'153 }, {154 name : 'sharedRoleNames',155 id : 'sharedRoleNames',156 xtype : 'textarea',157 width : 300158 }, {159 xtype : 'button',160 text : 'éæ©',161 iconCls:'btn-select',162 width : 80,163 handler : function() {164 RoleSelector.getView(function(ids, names) {165 var sharedRoleIds = Ext.getCmp('sharedRoleIds');166 var sharedRoleNames = Ext.getCmp('sharedRoleNames');167 if (sharedRoleIds.getValue() == '') {//è¥å没æå¼ï¼åç´æ¥è®¾ç½®168 sharedRoleIds.setValue(','+ids+',');169 sharedRoleNames.setValue(names);170 return;171 }172 //å»æéå¤çé¨é¨173 var vIds = sharedRoleIds.getValue().split(',');174 var fnms = sharedRoleNames.getValue().split(',');175 sharedRoleIds.setValue(uniqueArray(vIds.concat(ids.split(',')))+',');176 sharedRoleNames.setValue(uniqueArray(fnms.concat(names.split(','))));177 }).show();178 }179 }, {180 xtype : 'button',181 text : 'æ¸
空',182 iconCls:'btn-clear',183 handler:function(){184 var sharedRoleIds = Ext.getCmp('sharedRoleIds');185 var sharedRoleNames = Ext.getCmp('sharedRoleNames');186 187 sharedRoleIds.setValue('');188 sharedRoleNames.setValue('');189 },190 width : 80191 }]192 }]193 });194 195 var window = new Ext.Window({196 title : 'ææ¡£ææä¿¡æ¯',197 width : 620,198 iconCls:'menu-mail_folder',199 height : 380,200 modal : true,201 layout : 'anchor',202 plain : true,203 bodyStyle : 'padding:5px;',204 scope : this,205 buttonAlign : 'center',206 items : formPanel,207 buttons : [{208 xtype : 'button',209 text : 'å
±äº«',210 iconCls:'btn-ok',211 handler : function() {212 formPanel.getForm().submit({213 url:__ctxPath+'/document/shareDocument.do',214 method:'post',215 waitMsg:'æ£å¨æ交...',216 success:function(fp,action){217 window.close();218 }219 }220 );221 }222 },{223 xtype:'button',224 iconCls:'btn-cancel',225 text:'å
³é',226 handler:function(){227 window.close();228 }229 }]230 });231 return window;...
webpack.config.js
Source:webpack.config.js
1/* This Source Code Form is subject to the terms of the Mozilla Public2 * License, v. 2.0. If a copy of the MPL was not distributed with this3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */4/* eslint-env node */5/* eslint max-len: [0] */6"use strict";7const path = require("path");8const { NormalModuleReplacementPlugin } = require("webpack");9const { toolboxConfig } = require("./node_modules/devtools-launchpad/index");10const { getConfig } = require("./bin/configure");11let webpackConfig = {12 entry: {13 netmonitor: [path.join(__dirname, "index.js")]14 },15 module: {16 loaders: [17 {18 test: /\.(png|svg)$/,19 loader: "file-loader?name=[path][name].[ext]",20 },21 ]22 },23 output: {24 path: path.join(__dirname, "assets/build"),25 filename: "[name].js",26 publicPath: "/assets/build",27 libraryTarget: "umd",28 },29 // Fallback compatibility for npm link30 resolve: {31 fallback: path.join(__dirname, "node_modules"),32 alias: {33 "react": path.join(__dirname, "node_modules/react"),34 "devtools/client/framework/devtools": path.join(__dirname, "../../client/shims/devtools"),35 "devtools/client/framework/menu": "devtools-modules/src/menu",36 "devtools/client/framework/menu-item": path.join(__dirname, "../../client/framework/menu-item"),37 "devtools/client/locales": path.join(__dirname, "../../client/locales/en-US"),38 "devtools/client/netmonitor/src/utils/menu": "devtools-contextmenu",39 "devtools/client/shared/components/autocomplete-popup": path.join(__dirname, "../../client/shared/components/autocomplete-popup"),40 "devtools/client/shared/components/reps/reps": path.join(__dirname, "../../client/shared/components/reps/reps"),41 "devtools/client/shared/components/search-box": path.join(__dirname, "../../client/shared/components/search-box"),42 "devtools/client/shared/components/splitter/draggable": path.join(__dirname, "../../client/shared/components/splitter/draggable"),43 "devtools/client/shared/components/splitter/split-box": path.join(__dirname, "../../client/shared/components/splitter/split-box"),44 "devtools/client/shared/components/stack-trace": path.join(__dirname, "../../client/shared/components/stack-trace"),45 "devtools/client/shared/components/tabs/tabbar": path.join(__dirname, "../../client/shared/components/tabs/tabbar"),46 "devtools/client/shared/components/tabs/tabs": path.join(__dirname, "../../client/shared/components/tabs/tabs"),47 "devtools/client/shared/components/tree/tree-view": path.join(__dirname, "../../client/shared/components/tree/tree-view"),48 "devtools/client/shared/components/tree/tree-row": path.join(__dirname, "../../client/shared/components/tree/tree-row"),49 "devtools/client/shared/curl": path.join(__dirname, "../../client/shared/curl"),50 "devtools/client/shared/file-saver": path.join(__dirname, "../../client/shared/file-saver"),51 "devtools/client/shared/keycodes": path.join(__dirname, "../../client/shared/keycodes"),52 "devtools/client/shared/key-shortcuts": path.join(__dirname, "../../client/shared/key-shortcuts"),53 "devtools/client/shared/prefs": path.join(__dirname, "../../client/shared/prefs"),54 "devtools/client/shared/scroll": path.join(__dirname, "../../client/shared/scroll"),55 "devtools/client/shared/source-utils": path.join(__dirname, "../../client/shared/source-utils"),56 "devtools/client/shared/vendor/immutable": "immutable",57 "devtools/client/shared/vendor/react": "react",58 "devtools/client/shared/vendor/react-dom": "react-dom",59 "devtools/client/shared/vendor/react-redux": "react-redux",60 "devtools/client/shared/vendor/redux": "redux",61 "devtools/client/shared/vendor/reselect": "reselect",62 "devtools/client/shared/vendor/jszip": "jszip",63 "devtools/client/shared/widgets/tooltip/HTMLTooltip": path.join(__dirname, "../../client/shared/widgets/tooltip/HTMLTooltip"),64 "devtools/client/shared/widgets/tooltip/ImageTooltipHelper": path.join(__dirname, "../../client/shared/widgets/tooltip/ImageTooltipHelper"),65 "devtools/client/shared/widgets/tooltip/TooltipToggle": path.join(__dirname, "../../client/shared/widgets/tooltip/TooltipToggle"),66 "devtools/client/shared/widgets/Chart": path.join(__dirname, "../../client/shared/widgets/Chart"),67 "devtools/client/sourceeditor/editor": "devtools-source-editor/src/source-editor",68 "devtools/shared/async-utils": path.join(__dirname, "../../shared/async-utils"),69 "devtools/shared/defer": path.join(__dirname, "../../shared/defer"),70 "devtools/shared/event-emitter": "devtools-modules/src/utils/event-emitter",71 "devtools/shared/fronts/timeline": path.join(__dirname, "../../shared/shims/fronts/timeline"),72 "devtools/shared/l10n": path.join(__dirname, "../../shared/l10n"),73 "devtools/shared/locales": path.join(__dirname, "../../shared/locales/en-US"),74 "devtools/shared/platform/clipboard": path.join(__dirname, "../../shared/platform/content/clipboard"),75 "devtools/shared/plural-form": path.join(__dirname, "../../shared/plural-form"),76 "devtools/shared/task": path.join(__dirname, "../../shared/task"),77 "toolkit/locales": path.join(__dirname, "../../../toolkit/locales/en-US"),78 "Services": "devtools-modules/src/Services",79 },80 },81};82const mappings = [83 [84 /chrome:\/\/devtools\/skin/,85 (result) => {86 result.request = result.request87 .replace("./chrome://devtools/skin", path.join(__dirname, "../themes"));88 }89 ],90 [91 /chrome:\/\/devtools\/content/,92 (result) => {93 result.request = result.request94 .replace("./chrome://devtools/content", path.join(__dirname, ".."));95 }96 ],97 [98 /resource:\/\/devtools/,99 (result) => {100 result.request = result.request101 .replace("./resource://devtools/client", path.join(__dirname, ".."));102 }103 ],104];105webpackConfig.plugins = mappings.map(([regex, res]) =>106 new NormalModuleReplacementPlugin(regex, res));107// Exclude to transpile all scripts in devtools/ but not for this folder108const basePath = path.join(__dirname, "../../").replace(/\\/g, "\\\\");109const baseName = path.basename(__dirname);110webpackConfig.babelExcludes = new RegExp(`^${basePath}(.(?!${baseName}))*$`);111let config = toolboxConfig(webpackConfig, getConfig());112// Remove loaders from devtools-launchpad's webpack.config.js113// * For svg-inline loader:114// Netmonitor uses file loader to bundle image assets instead of svg-inline loader115// * For raw loader:116// devtools/shared/l10n has preloaded raw loader in require.context117config.module.loaders = config.module.loaders118 .filter((loader) => !["svg-inline", "raw"].includes(loader.loader));...
sharedDeviceAccess.service.js
Source:sharedDeviceAccess.service.js
1import httpStatus from 'http-status';2import { pick } from 'lodash';3import SharedDeviceAccess from '../models/sharedDeviceAccess.model';4import AppError from '../utils/AppError';5import { getQueryOptions } from '../utils/service.util';6const checkDuplicateSharedDeviceAccessService = async (deviceId, email, excludeDeviceId) => {7 const sharedDeviceAccess = await SharedDeviceAccess.findOne({ deviceId, email, _id: { $ne: excludeDeviceId } });8 if (sharedDeviceAccess) {9 throw new AppError(httpStatus.BAD_REQUEST, 'User already have access to device');10 }11};12const checkAccessIfExists = async (deviceId, email) => {13 const sharedDeviceAccess = await SharedDeviceAccess.findOne({ deviceId, email });14 if (!sharedDeviceAccess) {15 throw new AppError(httpStatus.FORBIDDEN, "User doesn't have access to the device");16 }17 return sharedDeviceAccess;18};19const createSharedDeviceAccessService = async sharedDeviceAccessBody => {20 await checkDuplicateSharedDeviceAccessService(sharedDeviceAccessBody.deviceId, sharedDeviceAccessBody.email);21 return SharedDeviceAccess.create(sharedDeviceAccessBody);22};23const getSharedDeviceAccessByIdService = async id => {24 const sharedDeviceAccess = await SharedDeviceAccess.findById(id);25 if (!sharedDeviceAccess) {26 throw new AppError(httpStatus.NOT_FOUND, 'No shared device access found with this id');27 }28 return sharedDeviceAccess;29};30const getSharedDeviceAccessesService = async query => {31 const filter = pick(query, ['id', 'deviceId', 'email', 'sharedBy', 'isDisabled']);32 const options = getQueryOptions(query);33 return SharedDeviceAccess.find(filter, null, options);34};35const deleteSharedDeviceAccessByDeviceIdService = async deviceId => {36 const sharedDeviceAccesses = await SharedDeviceAccess.find({ deviceId });37 return Promise.all(sharedDeviceAccesses.map(sharedDeviceAccess => sharedDeviceAccess.remove()));38};39const updateSharedDeviceAccessService = async (id, updateBody) => {40 const sharedDeviceAccess = await getSharedDeviceAccessByIdService(id);41 if (updateBody.deviceId || updateBody.email) {42 await checkDuplicateSharedDeviceAccessService(updateBody.deviceId, updateBody.email, id);43 }44 Object.assign(sharedDeviceAccess, updateBody);45 await sharedDeviceAccess.save();46 return sharedDeviceAccess;47};48const updateSharedDeviceAccessEmailService = async (oldEmail, newEmail) => {49 const sharedDeviceAccesses = await SharedDeviceAccess.find({ email: oldEmail });50 return Promise.all(51 sharedDeviceAccesses.map(async sharedDeviceAccess => {52 Object.assign(sharedDeviceAccess, { email: newEmail });53 await sharedDeviceAccess.save();54 return sharedDeviceAccess;55 })56 );57};58const deleteSharedDeviceAccessService = async id => {59 const sharedDeviceAccess = await getSharedDeviceAccessByIdService(id);60 await sharedDeviceAccess.remove();61 return sharedDeviceAccess;62};63const checkAndDeleteAccessIfExists = async (deviceId, email) => {64 const sharedDeviceAccesses = await SharedDeviceAccess.find({ deviceId, email });65 return Promise.all(sharedDeviceAccesses.map(sharedDeviceAccess => sharedDeviceAccess.remove()));66};67const deleteSharedDeviceAccessByUserEmailService = async email => {68 const sharedDeviceAccesses = await SharedDeviceAccess.find({ email });69 return Promise.all(sharedDeviceAccesses.map(sharedDeviceAccess => sharedDeviceAccess.remove()));70};71const getSharedDeviceAccessByDeviceIdService = deviceId => {72 return SharedDeviceAccess.find({ deviceId, isDisabled: false });73};74const getSharedDeviceAccessByEmailService = email => {75 return SharedDeviceAccess.find({ email, isDisabled: false });76};77module.exports = {78 checkDuplicateSharedDeviceAccessService,79 createSharedDeviceAccessService,80 getSharedDeviceAccessByIdService,81 getSharedDeviceAccessesService,82 updateSharedDeviceAccessService,83 updateSharedDeviceAccessEmailService,84 deleteSharedDeviceAccessByDeviceIdService,85 deleteSharedDeviceAccessService,86 deleteSharedDeviceAccessByUserEmailService,87 checkAndDeleteAccessIfExists,88 getSharedDeviceAccessByDeviceIdService,89 getSharedDeviceAccessByEmailService,90 checkAccessIfExists,...
index.js
Source:index.js
1/*2 * Licensed to Elasticsearch B.V. under one or more contributor3 * license agreements. See the NOTICE file distributed with4 * this work for additional information regarding copyright5 * ownership. Elasticsearch B.V. licenses this file to you under6 * the Apache License, Version 2.0 (the "License"); you may7 * not use this file except in compliance with the License.8 * You may obtain a copy of the License at9 *10 * http://www.apache.org/licenses/LICENSE-2.011 *12 * Unless required by applicable law or agreed to in writing,13 * software distributed under the License is distributed on an14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY15 * KIND, either express or implied. See the License for the16 * specific language governing permissions and limitations17 * under the License.18 */19const Path = require('path');20exports.distDir = Path.resolve(__dirname, 'target');21exports.jsDepFilenames = ['kbn-ui-shared-deps.@elastic.js'];22exports.jsFilename = 'kbn-ui-shared-deps.js';23exports.baseCssDistFilename = 'kbn-ui-shared-deps.css';24exports.lightCssDistFilename = 'kbn-ui-shared-deps.v7.light.css';25exports.lightV8CssDistFilename = 'kbn-ui-shared-deps.v8.light.css';26exports.darkCssDistFilename = 'kbn-ui-shared-deps.v7.dark.css';27exports.darkV8CssDistFilename = 'kbn-ui-shared-deps.v8.dark.css';28exports.externals = {29 // stateful deps30 angular: '__kbnSharedDeps__.Angular',31 '@kbn/i18n': '__kbnSharedDeps__.KbnI18n',32 '@kbn/i18n/angular': '__kbnSharedDeps__.KbnI18nAngular',33 '@kbn/i18n/react': '__kbnSharedDeps__.KbnI18nReact',34 jquery: '__kbnSharedDeps__.Jquery',35 moment: '__kbnSharedDeps__.Moment',36 'moment-timezone': '__kbnSharedDeps__.MomentTimezone',37 react: '__kbnSharedDeps__.React',38 'react-dom': '__kbnSharedDeps__.ReactDom',39 'react-dom/server': '__kbnSharedDeps__.ReactDomServer',40 'react-intl': '__kbnSharedDeps__.ReactIntl',41 'react-router': '__kbnSharedDeps__.ReactRouter',42 'react-router-dom': '__kbnSharedDeps__.ReactRouterDom',43 '@kbn/monaco': '__kbnSharedDeps__.KbnMonaco',44 // this is how plugins/consumers from npm load monaco45 'monaco-editor/esm/vs/editor/editor.api': '__kbnSharedDeps__.MonacoBarePluginApi',46 /**47 * big deps which are locked to a single version48 */49 rxjs: '__kbnSharedDeps__.Rxjs',50 'rxjs/operators': '__kbnSharedDeps__.RxjsOperators',51 numeral: '__kbnSharedDeps__.ElasticNumeral',52 '@elastic/numeral': '__kbnSharedDeps__.ElasticNumeral',53 '@elastic/charts': '__kbnSharedDeps__.ElasticCharts',54 '@elastic/eui': '__kbnSharedDeps__.ElasticEui',55 '@elastic/eui/lib/services': '__kbnSharedDeps__.ElasticEuiLibServices',56 '@elastic/eui/lib/services/format': '__kbnSharedDeps__.ElasticEuiLibServicesFormat',57 '@elastic/eui/dist/eui_charts_theme': '__kbnSharedDeps__.ElasticEuiChartsTheme',58 '@elastic/eui/dist/eui_theme_light.json': '__kbnSharedDeps__.ElasticEuiLightTheme',59 '@elastic/eui/dist/eui_theme_dark.json': '__kbnSharedDeps__.ElasticEuiDarkTheme',60 /**61 * massive deps that we should really get rid of or reduce in size substantially62 */63 elasticsearch: '__kbnSharedDeps__.ElasticsearchBrowser',64 'elasticsearch-browser': '__kbnSharedDeps__.ElasticsearchBrowser',65 'elasticsearch-browser/elasticsearch': '__kbnSharedDeps__.ElasticsearchBrowser',66};...
Using AI Code Generation
1var root = require('../');2root.doSomething();3var child = require('./');4child.doSomething();5var root = require('../');6root.doSomething();7var child = require('./');8child.doSomething();9var root = require('../');10root.doSomething();11var child = require('./');12child.doSomething();13var root = require('../');14root.doSomething();15var child = require('./');16child.doSomething();17var root = require('../');18root.doSomething();19var child = require('./');20child.doSomething();21var root = require('../');22root.doSomething();23var child = require('./');24child.doSomething();25var root = require('../');26root.doSomething();27var child = require('./');28child.doSomething();29var root = require('../');30root.doSomething();31var child = require('./');32child.doSomething();33var root = require('../');34root.doSomething();35var child = require('./');36child.doSomething();37var root = require('../');38root.doSomething();39var child = require('./');40child.doSomething();41var root = require('../');42root.doSomething();43var child = require('./');44child.doSomething();45var root = require('../');46root.doSomething();
Using AI Code Generation
1var root = require('./root.js');2root.sharedMethod();3module.exports = {4 sharedMethod: function() {5 console.log('I am a shared method');6 }7}8object. It is important to note that you cannot use9var root = require('./root.js');10root.sharedMethod();11exports.sharedMethod = function() {12 console.log('I am a shared method');13}14var root = require('./root.js');15root.sharedMethod();16module.exports.sharedMethod = function() {17 console.log('I am a shared method');18}19var root = require('./root.js');20root.sharedMethod();
Using AI Code Generation
1var root = require('app-root-path');2var shared = require(root + '/shared');3shared.doSomething();4var shared = {};5shared.doSomething = function() {6};7module.exports = shared;
Using AI Code Generation
1var root = require('./root');2console.log(root.sharedMethod());3module.exports.sharedMethod = function(){4 return 'shared method';5};6var root = require('./root');7console.log(root.sharedMethod());8module.exports.sharedMethod = function(){9 return 'shared method';10};11var root = require('./root');12console.log(root.sharedMethod());13module.exports.sharedMethod = function(){14 return 'shared method';15};16var root = require('./root');17console.log(root.sharedMethod());18module.exports.sharedMethod = function(){19 return 'shared method';20};21var root = require('./root');22console.log(root.sharedMethod());23module.exports.sharedMethod = function(){24 return 'shared method';25};26var root = require('./root');27console.log(root.sharedMethod());28module.exports.sharedMethod = function(){29 return 'shared method';30};31var root = require('./root');32console.log(root.sharedMethod());33module.exports.sharedMethod = function(){34 return 'shared method';35};36var root = require('./root');37console.log(root.sharedMethod());38module.exports.sharedMethod = function(){39 return 'shared method';40};41var root = require('./root');42console.log(root.sharedMethod());
Using AI Code Generation
1var root = require('./root');2root.sharedMethod();3exports.sharedMethod = function(){4}5exports.sharedMethod = function(){6}7module.exports = function(){8}9var root = require('./root')();
Using AI Code Generation
1var root = require('root');2root.test();3var root = {};4root.test = function(){5 console.log('test');6}7module.exports = root;8var myFunc = function(){9 console.log('hello');10}11module.exports = myFunc;12var myOtherModule = require('myOtherModule');13myOtherModule();14var myObj = {15 myFunc: function(){16 console.log('hello');17 }18}19module.exports = myObj;20var myOtherModule = require('myOtherModule');21myOtherModule.myFunc();22var module_2 = require('./module_2.js');23module.exports = function() {24 console.log('Hello World');25 module_2();26}27module.exports = function() {28 console.log('Hello World 2');29}30var module_1 = require('./module_1.js');31module_1();32Save this as a file called module_1.js module_1.js var module_2 = require('./module_2.js'); module.exports = function() { console.log('Hello World'); module_2(); } Save this as a file called module_2.js module_2.js module.exports = function() { console
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!