diff options
author | Olivier Lamy <olamy@apache.org> | 2012-10-16 11:54:21 +0000 |
---|---|---|
committer | Olivier Lamy <olamy@apache.org> | 2012-10-16 11:54:21 +0000 |
commit | 67b8b5254cb0ecccde3c77a704b25406e60fbe9a (patch) | |
tree | 9a9750c0b157cc868c3d67870d751bff793531ae | |
parent | b2c8b7464e385859c2e1437df876ce86691a4f94 (diff) | |
download | archiva-67b8b5254cb0ecccde3c77a704b25406e60fbe9a.tar.gz archiva-67b8b5254cb0ecccde3c77a704b25406e60fbe9a.zip |
use knockout-2.2.0rc
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1398751 13f79535-47bb-0310-9956-ffa450edef68
19 files changed, 331 insertions, 165 deletions
diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/index.html b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/index.html index 26ba918f6..f3cd08915 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/index.html +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/index.html @@ -29,7 +29,7 @@ <link rel="stylesheet" href="css/bootstrap.2.1.1.css"> <link rel="stylesheet" href="css/archiva.css"> <link rel="shortcut icon" href="favicon.ico"/> - <link rel="stylesheet" href="css/prettify.css"/> + <link rel="stylesheet" href="css/prettify.css"/> <script type="text/javascript" src="js/jquery-1.8.1.min.js"></script> <script type="text/javascript" src="js/jquery-ui-1.8.23.custom.min.js"></script> diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/archiva.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/archiva.js index 4b6be7144..429d274fe 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/archiva.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/archiva.js @@ -69,7 +69,7 @@ $.ajax({ "choosen": "chosen.jquery-0.9.8", "jquery.validate": "jquery.validate-1.9.0", "jquery.json": "jquery.json-2.3.min", - "knockout": "knockout-2.0.0.debug", + "knockout": "knockout-2.2.0rc.debug", "knockout.simpleGrid": "knockout.simpleGrid", "knockout.sortable": "knockout-sortable", "jquery.iframe.transport": "jquery.iframe-transport-1.4", diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js index 73add9ed0..61cf260b2 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js @@ -18,7 +18,7 @@ */ define("archiva.artifacts-management",["jquery","i18n","utils","jquery.tmpl","knockout", "knockout.simpleGrid","jquery.validate","bootstrap","jquery.fileupload","jquery.fileupload.ui"] - , function() { + , function(jquery,i18n,utils,jqueryTmpl,ko) { ArtifactUpload=function(classifier,pomFile){ this.classifier=classifier; diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/general-admin.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/general-admin.js index d1701d836..f7b435a8f 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/general-admin.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/general-admin.js @@ -18,7 +18,7 @@ */ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout","knockout.simpleGrid", "knockout.sortable","jquery.validate","bootstrap"] - , function() { + , function(jquery,i18n,utils,jqueryTmpl,ko) { //------------------------- // legacy path part diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/main.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/main.js index be47ce83c..57590873d 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/main.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/main.js @@ -21,7 +21,7 @@ define("archiva.main",["jquery","jquery.ui","sammy","jquery.tmpl",'i18n',"jquery "redback.roles","redback","archiva.general-admin","archiva.repositories", "archiva.network-proxies","archiva.proxy-connectors","archiva.repository-groups","archiva.artifacts-management", "archiva.proxy-connectors-rules","archiva.docs"], -function(jquery,ui,sammy,tmpl) { +function(jquery,ui,sammy,tmpl,i18n,jqueryCookie,bootstrap,archivaSearch,jqueryValidate,jqueryJson,ko) { /** * reccord a cookie for session with the logged user diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/network-proxies.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/network-proxies.js index aa0fa78fc..13a5a8cd8 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/network-proxies.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/network-proxies.js @@ -17,7 +17,7 @@ * under the License. */ define("archiva.network-proxies",["jquery","i18n","jquery.tmpl","bootstrap","jquery.validate","knockout" - ,"knockout.simpleGrid"], function() { + ,"knockout.simpleGrid"], function(jquery,i18n,jqueryTmpl,bootstrap,jqueryValidate,ko) { NetworkProxy=function(id,protocol,host,port,username,password,useNtlm){ diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors-rules.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors-rules.js index 3ba35ced9..5ef25a11c 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors-rules.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors-rules.js @@ -17,12 +17,14 @@ * under the License. */ define("archiva.proxy-connectors-rules",["jquery","i18n","jquery.tmpl","bootstrap","jquery.ui","knockout" - ,"knockout.simpleGrid","knockout.sortable","archiva.proxy-connectors"], function() { + ,"knockout.simpleGrid","knockout.sortable","archiva.proxy-connectors"], + function(jquery,i18n,jqueryTmpl,bootstrap,jqueryUi,ko) { ProxyConnectorRulesViewModel=function(proxyConnectorRules,proxyConnectors){ var self=this; - this.proxyConnectorRules=ko.observableArray(proxyConnectorRules?proxyConnectorRules:[]); - this.proxyConnectors=proxyConnectors; + self.proxyConnectorRules=ko.observableArray(proxyConnectorRules?proxyConnectorRules:[]); + self.proxyConnectors=ko.observableArray(proxyConnectors); + self.proxyConnectors.id="select"; // FIXME get that from a REST service // FIXME i18n @@ -163,17 +165,25 @@ define("archiva.proxy-connectors-rules",["jquery","i18n","jquery.tmpl","bootstra } + remove=function(){ + $.log("remove"); + } + } ProxyConnectorRuleViewModel=function(proxyConnectorRule,proxyConnectorRulesViewModel,update){ var self=this; this.proxyConnectorRule=proxyConnectorRule; this.proxyConnectorRulesViewModel=proxyConnectorRulesViewModel; - this.availableProxyConnectors=ko.observableArray(proxyConnectorRulesViewModel.proxyConnectors); + this.availableProxyConnectors=proxyConnectorRulesViewModel.proxyConnectors; + this.availableProxyConnectors.id="availableProxyConnectors"; this.update=update; proxyConnectorMoved=function(arg){ $.log("repositoryMoved:"+arg.sourceIndex+" to " + arg.targetIndex); + self.proxyConnectorRule.modified(true); + ///arg.sourceParent.remove(arg.item); + //arg.targetParent.push(arg.item); } saveProxyConnectorRule=function(){ diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors.js index 32ad305ee..3defdd4b2 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/proxy-connectors.js @@ -17,7 +17,8 @@ * under the License. */ define("archiva.proxy-connectors",["jquery","i18n","jquery.tmpl","bootstrap","jquery.validate","knockout" - ,"knockout.simpleGrid","knockout.sortable"], function() { + ,"knockout.simpleGrid","knockout.sortable"], + function(jquery,i18n,jqueryTmpl,bootstrap,jqueryValidate,ko) { ProxyConnector=function(sourceRepoId,targetRepoId,proxyId,blackListPatterns,whiteListPatterns,policiesEntries,propertiesEntries, disabled,order){ diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js index 0de22a82c..87a541393 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js @@ -17,7 +17,7 @@ * under the License. */ define("archiva.repositories",["jquery","i18n","jquery.tmpl","bootstrap","jquery.validate","knockout","knockout.simpleGrid"], - function() { +function(jquery,i18n,jqueryTmpl,bootstrap,jqueryValidate,ko) { // FIXME this must be dynamic if we do a plugin mechanism with dynamic repositories types // FIXME i18n diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repository-groups.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repository-groups.js index 21444ab26..f52236f4e 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repository-groups.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repository-groups.js @@ -18,7 +18,7 @@ */ define("archiva.repository-groups",["jquery","i18n","jquery.tmpl","bootstrap","jquery.validate","jquery.ui","knockout" ,"knockout.simpleGrid","knockout.sortable"], -function() { +function(jquery,i18n,jqueryTmpl,bootstrap,jqueryValidate,jqueryUi,ko) { RepositoryGroup=function(id,repositories){ diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js index b1ac8efea..40c69f400 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/search.js @@ -17,7 +17,7 @@ * under the License. */ define("archiva.search",["jquery","i18n","jquery.tmpl","choosen","knockout","knockout.simpleGrid","jqueryFileTree","prettify"] -, function() { +, function(jquery,i18n,jqueryTmpl,choosen,ko,koSimpleGrid) { //----------------------------------------- // browse part diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/startup.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/startup.js index 964b18376..d158b0573 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/startup.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/startup.js @@ -18,12 +18,12 @@ */ define("startup",["jquery","sammy","utils"], -function() { +function(jquery,sammy,utils) { // define a container object with various datas window.archivaModel = {}; - $.log("devMode:"+window.archivaDevMode); + //$.log("devMode:"+window.archivaDevMode); // no cache for ajax queries as we get datas from servers so preventing caching !! jQuery.ajaxSetup( { diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/utils.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/utils.js index 8e17df8f8..3572799a8 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/utils.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/utils.js @@ -17,7 +17,7 @@ * under the License. */ -require(["jquery","jquery.tmpl","i18n"], function(jquery,jqueryTmpl,i18n) { +require(["jquery","jquery.tmpl","i18n","knockout"], function(jquery,jqueryTmpl,i18n,ko) { loadi18n=function(loadCallback){ $.log("loadi18n"); diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-sortable.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-sortable.js index 8eccf1300..f4259528b 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-sortable.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-sortable.js @@ -1,140 +1,285 @@ -//knockout-sortable | (c) 2012 Ryan Niemeyer | http://www.opensource.org/licenses/mit-license -define("knockout.sortable",["jquery","utils","knockout"], function() { - -(function(ko, $, undefined) { - var prepareTemplateOptions = function(valueAccessor) { - var result = {}, - options = ko.utils.unwrapObservable(valueAccessor()); - - //build our options to pass to the template engine - if (options.data) { - result.foreach = options.data; - result.name = options.template; - result.afterAdd = options.afterAdd; - result.beforeRemove = options.beforeRemove; - result.afterRender = options.afterRender; - result.includeDestroyed = options.includeDestroyed; - result.templateEngine = options.templateEngine; - } else { - result.foreach = valueAccessor(); - } - - //use an afterRender function to add meta-data - if (options.afterRender) { - //wrap the existing function, if it was passed - result.afterRender = function(element, data) { - ko.bindingHandlers.sortable.afterRender.call(data, element, data); - options.afterRender.call(data, element, data); - }; - } else { - result.afterRender = ko.bindingHandlers.sortable.afterRender; - } - - //return options to pass to the template binding - return result; - }; - - //connect items with observableArrays - ko.bindingHandlers.sortable = { - init: function(element, valueAccessor, allBindingsAccessor, data, context) { - var value = ko.utils.unwrapObservable(valueAccessor()), - templateOptions = prepareTemplateOptions(valueAccessor), - sortable = ko.bindingHandlers.sortable, - connectClass = value.connectClass || sortable.connectClass, - allowDrop = value.allowDrop === undefined ? sortable.allowDrop : value.allowDrop, - beforeMove = value.beforeMove || sortable.beforeMove, - afterMove = value.afterMove || sortable.afterMove, - options = value.options || sortable.options; - - //if allowDrop is an observable or a function, then execute it in a computed observable - if (ko.isObservable(allowDrop) || typeof allowDrop == "function") { - ko.computed({ - read: function() { - var value = ko.utils.unwrapObservable(allowDrop), - shouldAdd = typeof value == "function" ? value.call(this, templateOptions.foreach) : value; - ko.utils.toggleDomNodeCssClass(element, connectClass, shouldAdd); - }, - disposeWhenNodeIsRemoved: element - }, this); - } else { - ko.utils.toggleDomNodeCssClass(element, connectClass, allowDrop); - } - - //attach meta-data - $(element).data("ko_sortList", templateOptions.foreach); - $(element).sortable(ko.utils.extend(options, { - update: function(event, ui) { - var sourceParent, targetParent, targetIndex, arg, - item = ui.item.data("ko_sortItem"); - - if (item) { - //identify parents - sourceParent = ui.item.data("ko_parentList"); - targetParent = ui.item.parent().data("ko_sortList"); - targetIndex = ko.utils.arrayIndexOf(ui.item.parent().children(), ui.item[0]); - - if (beforeMove || afterMove) { - arg = { - item: item, - sourceParent: sourceParent, - sourceIndex: sourceParent.indexOf(item), - targetParent: targetParent, - targetIndex: targetIndex, - cancelDrop: false - }; - } - - if (beforeMove) { - beforeMove.call(this, arg, event, ui); - if (arg.cancelDrop) { - $(ui.sender).sortable('cancel'); - return; - } - } - - if (targetIndex >= 0) { - sourceParent.remove(item); - targetParent.splice(targetIndex, 0, item); - } - //rendering is handled by manipulating the observableArray; ignore dropped element - ui.item.remove(); - - //allow binding to accept a function to execute after moving the item - if (afterMove) { - afterMove.call(this, arg, event, ui); - } - } - }, - connectWith: "." + connectClass - })); - - //handle disposal - ko.utils.domNodeDisposal.addDisposeCallback(element, function() { - $(element).sortable("destroy"); - }); - //we are wrapping the template binding - return ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context); - }, - update: function(element, valueAccessor, allBindingsAccessor, data, context) { - var templateOptions = prepareTemplateOptions(valueAccessor); - - //call the actual template binding - ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context); - }, - afterRender: function(elements, data) { - ko.utils.arrayForEach(elements, function(element) { - if (element.nodeType === 1) { - $(element).data("ko_sortItem", data); - $(element).data("ko_parentList", $(element).parent().data("ko_sortList")); - } - }); - }, - connectClass: 'ko_container', - allowDrop: true, - afterMove: null, - beforeMove: null, - options: {} - }; -})(ko, jQuery); - -})
\ No newline at end of file +//knockout-sortable 0.6.6 | (c) 2012 Ryan Niemeyer | http://www.opensource.org/licenses/mit-license +(function(factory) { + if (typeof define === "function" && define.amd) { + // AMD anonymous module + define(["knockout", "jquery", "jquery.ui"], factory); + } else { + // No module loader (plain <script> tag) - put directly in global namespace + factory(window.ko, jQuery); + } +})(function(ko, $, undefined) { + var ITEMKEY = "ko_sortItem", + LISTKEY = "ko_sortList", + PARENTKEY = "ko_parentList", + DRAGKEY = "ko_dragItem"; + + //internal afterRender that adds meta-data to children + var addMetaDataAfterRender = function(elements, data) { + ko.utils.arrayForEach(elements, function(element) { + if (element.nodeType === 1) { + ko.utils.domData.set(element, ITEMKEY, data); + ko.utils.domData.set(element, PARENTKEY, ko.utils.domData.get(element.parentNode, LISTKEY)); + } + }); + }; + + //prepare the proper options for the template binding + var prepareTemplateOptions = function(valueAccessor, dataName) { + var result = {}, + options = ko.utils.unwrapObservable(valueAccessor()), + actualAfterRender; + + //build our options to pass to the template engine + if (options.data) { + result[dataName] = options.data; + result.name = options.template; + } else { + result[dataName] = valueAccessor(); + } + + ko.utils.arrayForEach(["afterAdd", "afterRender", "beforeRemove", "includeDestroyed", "templateEngine", "templateOptions"], function (option) { + result[option] = options[option] || ko.bindingHandlers.sortable[option]; + }); + + //use an afterRender function to add meta-data + if (dataName === "foreach") { + if (result.afterRender) { + //wrap the existing function, if it was passed + actualAfterRender = result.afterRender; + result.afterRender = function(element, data) { + addMetaDataAfterRender.call(data, element, data); + actualAfterRender.call(data, element, data); + }; + } else { + result.afterRender = addMetaDataAfterRender; + } + } + + //return options to pass to the template binding + return result; + }; + + //connect items with observableArrays + ko.bindingHandlers.sortable = { + init: function(element, valueAccessor, allBindingsAccessor, data, context) { + var $element = $(element), + value = ko.utils.unwrapObservable(valueAccessor()) || {}, + templateOptions = prepareTemplateOptions(valueAccessor, "foreach"), + sortable = {}, + startActual, updateActual; + + //remove leading/trailing text nodes from anonymous templates + ko.utils.arrayForEach(element.childNodes, function(node) { + if (node && node.nodeType === 3) { + node.parentNode.removeChild(node); + } + }); + + //build a new object that has the global options with overrides from the binding + $.extend(true, sortable, ko.bindingHandlers.sortable); + if (value.options && sortable.options) { + ko.utils.extend(sortable.options, value.options); + delete value.options; + } + ko.utils.extend(sortable, value); + + //if allowDrop is an observable or a function, then execute it in a computed observable + if (sortable.connectClass && (ko.isObservable(sortable.allowDrop) || typeof sortable.allowDrop == "function")) { + ko.computed({ + read: function() { + var value = ko.utils.unwrapObservable(sortable.allowDrop), + shouldAdd = typeof value == "function" ? value.call(this, templateOptions.foreach) : value; + ko.utils.toggleDomNodeCssClass(element, sortable.connectClass, shouldAdd); + }, + disposeWhenNodeIsRemoved: element + }, this); + } else { + ko.utils.toggleDomNodeCssClass(element, sortable.connectClass, sortable.allowDrop); + } + + //wrap the template binding + ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context); + + //keep a reference to start/update functions that might have been passed in + startActual = sortable.options.start; + updateActual = sortable.options.update; + + //initialize sortable binding after template binding has rendered in update function + setTimeout(function() { + var dragItem; + $element.sortable(ko.utils.extend(sortable.options, { + start: function(event, ui) { + //make sure that fields have a chance to update model + ui.item.find("input:focus").change(); + if (startActual) { + startActual.apply(this, arguments); + } + }, + receive: function(event, ui) { + dragItem = ko.utils.domData.get(ui.item[0], DRAGKEY); + if (dragItem && dragItem.clone) { + dragItem = dragItem.clone(); + } + }, + update: function(event, ui) { + var sourceParent, targetParent, targetIndex, i, targetUnwrapped, arg, + el = ui.item[0], + item = ko.utils.domData.get(el, ITEMKEY) || dragItem; + + dragItem = null; + + if (this === ui.item.parent()[0] && item) { + //identify parents + sourceParent = ko.utils.domData.get(el, PARENTKEY); + targetParent = ko.utils.domData.get(el.parentNode, LISTKEY); + targetIndex = ko.utils.arrayIndexOf(ui.item.parent().children(), el); + + //take destroyed items into consideration + if (!templateOptions.includeDestroyed) { + if(targetParent){ + targetUnwrapped = $.isFunction(targetParent)?targetParent():targetParent; + for (i = 0; i < targetIndex; i++) { + //add one for every destroyed item we find before the targetIndex in the target array + if (targetUnwrapped[i] && targetUnwrapped[i]._destroy) { + targetIndex++; + } + } + } + } + + if (sortable.beforeMove || sortable.afterMove) { + arg = { + item: item, + sourceParent: sourceParent, + sourceParentNode: sourceParent && el.parentNode, + sourceIndex: sourceParent && sourceParent.indexOf(item), + targetParent: targetParent, + targetIndex: targetIndex, + cancelDrop: false + }; + } + + if (sortable.beforeMove) { + sortable.beforeMove.call(this, arg, event, ui); + if (arg.cancelDrop) { + //call cancel on the correct list + if (arg.sourceParent) { + $(arg.sourceParent === arg.targetParent ? this : ui.sender).sortable('cancel'); + } + //for a draggable item just remove the element + else { + $(el).remove(); + } + + return; + } + } + + if (targetIndex >= 0) { + if (sourceParent) { + if( $.isFunction(sourceParent.remove)) sourceParent.remove(item); + } + + targetParent.splice(targetIndex, 0, item); + } + + //rendering is handled by manipulating the observableArray; ignore dropped element + ko.utils.domData.set(el, ITEMKEY, null); + ui.item.remove(); + + //allow binding to accept a function to execute after moving the item + if (sortable.afterMove) { + sortable.afterMove.call(this, arg, event, ui); + } + } + + if (updateActual) { + updateActual.apply(this, arguments); + } + }, + connectWith: sortable.connectClass ? "." + sortable.connectClass : false + })); + + //handle enabling/disabling sorting + if (sortable.isEnabled !== undefined) { + ko.computed({ + read: function() { + $element.sortable(ko.utils.unwrapObservable(sortable.isEnabled) ? "enable" : "disable"); + }, + disposeWhenNodeIsRemoved: element + }); + } + }, 0); + + //handle disposal + ko.utils.domNodeDisposal.addDisposeCallback(element, function() { + $element.sortable("destroy"); + }); + + return { 'controlsDescendantBindings': true }; + }, + update: function(element, valueAccessor, allBindingsAccessor, data, context) { + var templateOptions = prepareTemplateOptions(valueAccessor, "foreach"); + + //attach meta-data + ko.utils.domData.set(element, LISTKEY, templateOptions.foreach); + + //call template binding's update with correct options + ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context); + }, + connectClass: 'ko_container', + allowDrop: true, + afterMove: null, + beforeMove: null, + options: {} + }; + + //create a draggable that is appropriate for dropping into a sortable + ko.bindingHandlers.draggable = { + init: function(element, valueAccessor, allBindingsAccessor, data, context) { + var value = ko.utils.unwrapObservable(valueAccessor()) || {}, + options = value.options || {}, + draggableOptions = ko.utils.extend({}, ko.bindingHandlers.draggable.options), + templateOptions = prepareTemplateOptions(valueAccessor, "data"), + connectClass = value.connectClass || ko.bindingHandlers.draggable.connectClass, + isEnabled = value.isEnabled !== undefined ? value.isEnabled : ko.bindingHandlers.draggable.isEnabled; + + value = value.data || value; + + //set meta-data + ko.utils.domData.set(element, DRAGKEY, value); + + //override global options with override options passed in + ko.utils.extend(draggableOptions, options); + + //setup connection to a sortable + + draggableOptions.connectToSortable = connectClass ? "." + connectClass : false; + + //initialize draggable + $(element).draggable(draggableOptions); + + //handle enabling/disabling sorting + if (isEnabled !== undefined) { + ko.computed({ + read: function() { + $(element).draggable(ko.utils.unwrapObservable(isEnabled) ? "enable" : "disable"); + }, + disposeWhenNodeIsRemoved: element + }); + } + + return ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context); + }, + update: function(element, valueAccessor, allBindingsAccessor, data, context) { + var templateOptions = prepareTemplateOptions(valueAccessor, "data"); + + return ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context); + }, + connectClass: ko.bindingHandlers.sortable.connectClass, + options: { + helper: "clone" + } + }; + +}); diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout.simpleGrid.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout.simpleGrid.js index 7d45b2f44..9e1638cd2 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout.simpleGrid.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout.simpleGrid.js @@ -10,8 +10,16 @@ // ... etc -define("knockout.simpleGrid",["jquery","utils","i18n","knockout"], function() { -(function (ko, $) { + + (function(factory) { + if (typeof define === "function" && define.amd) { + // AMD anonymous module + define("knockout.simpleGrid",["jquery","knockout","utils","i18n"], factory); + } else { + // No module loader (plain <script> tag) - put directly in global namespace + factory(window.ko, jQuery); + } + })(function ($,ko,utils,i18n) { ko.simpleGrid = { @@ -73,6 +81,5 @@ define("knockout.simpleGrid",["jquery","utils","i18n","knockout"], function() { if (viewModel.pageLinksUpdateCallBack) viewModel.pageLinksUpdateCallBack(); } }; -})(ko, jQuery); +}) -})
\ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/redback.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/redback.js index 1a7cbe341..3ee11c3e0 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/redback.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/redback.js @@ -17,7 +17,7 @@ * under the License. */ define("redback",["jquery","utils","jquery.validate","jquery.json","knockout", - "knockout.simpleGrid","redback.roles","redback.user","redback.users"], function() { + "knockout.simpleGrid","redback.roles","redback.user","redback.users"], function(jquery,utils,jqueryValidate,jqueryJson,ko) { // define a container object with various datas window.redbackModel = {userOperationNames:null,key:null,i18n:$.i18n.map}; diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/roles.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/roles.js index 53c5e1970..b4881e9c4 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/roles.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/roles.js @@ -16,7 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -define("redback.roles",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], function() { +define("redback.roles",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], +function(jquery,utils,i18n,jqueryValidate,ko,koSimpleGrid) { Role = function(name,description,assignable,childRoleNames,parentRoleNames,users,parentsRolesUsers,permissions,otherUsers){ diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/user.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/user.js index 8ff9f5136..3655ca61a 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/user.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/user.js @@ -16,7 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -define("redback.user",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], function() { +define("redback.user",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], +function(jquery,utils,i18n,jqueryValidate,ko,koSimpleGrid) { /** * object model for user with some function to create/update/delete users diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/users.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/users.js index ce8c0b435..871d00dde 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/users.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/redback/users.js @@ -16,7 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -define("redback.users",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], function() { +define("redback.users",["jquery","utils","i18n","jquery.validate","knockout","knockout.simpleGrid"], +function(jquery,utils,i18n,jqueryValidate,ko,koSimpleGrid) { /** * view model used for users grid |