Author: olamy
Date: Fri Oct 26 12:58:01 2012
New Revision: 1402492
URL: http://svn.apache.org/viewvc?rev=1402492&view=rev
Log:
[MRM-1705] Feature to add custom parameters and/or headers when requesting an
external repositories.
implements ui to add extraParameters.
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/repositories.html
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js?rev=1402492&r1=1402491&r2=1402492&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/repositories.js
Fri Oct 26 12:58:01 2012
@@ -690,7 +690,7 @@ function(jquery,i18n,jqueryTmpl,bootstra
RemoteRepository=function(id,name,layout,indexDirectory,url,userName,password,timeout,downloadRemoteIndex,remoteIndexUrl,
remoteDownloadNetworkProxyId,cronExpression,remoteDownloadTimeout,downloadRemoteIndexOnStartup,
- description){
+
description,extraParametersEntries,extraHeadersEntries){
var self=this;
@@ -762,6 +762,16 @@ function(jquery,i18n,jqueryTmpl,bootstra
return "no label";
}
+
this.extraParametersEntries=ko.observableArray(extraParametersEntries==null?new
Array():extraParametersEntries);
+ this.extraParametersEntries.subscribe(function(newValue){
+ self.modified(true);
+ });
+
+ this.extraHeadersEntries=ko.observableArray(extraHeadersEntries==null?new
Array():extraHeadersEntries);
+ this.extraHeadersEntries.subscribe(function(newValue){
+ self.modified(true);
+ });
+
this.modified=ko.observable(false);
}
@@ -769,9 +779,25 @@ function(jquery,i18n,jqueryTmpl,bootstra
if (data==null){
return null;
}
+
+ var extraParametersEntries = data.extraParametersEntries == null ? []:
$.each(data.extraParametersEntries,function(item){
+ return new Entry(item.key, item.value);
+ });
+ if (!$.isArray(extraParametersEntries)){
+ extraParametersEntries=[];
+ }
+
+ var extraHeadersEntries = data.extraHeadersEntries == null ? []:
$.each(data.extraHeadersEntries,function(item){
+ return new Entry(item.key, item.value);
+ });
+ if (!$.isArray(extraHeadersEntries)){
+ extraHeadersEntries=[];
+ }
+
return new
RemoteRepository(data.id,data.name,data.layout,data.indexDirectory,data.url,data.userName,data.password,
data.timeout,data.downloadRemoteIndex,data.remoteIndexUrl,data.remoteDownloadNetworkProxyId,
-
data.cronExpression,data.remoteDownloadTimeout,data.downloadRemoteIndexOnStartup,data.description);
+
data.cronExpression,data.remoteDownloadTimeout,data.downloadRemoteIndexOnStartup,data.description,
+ extraParametersEntries,extraHeadersEntries);
}
mapRemoteRepositories=function(data){
@@ -847,6 +873,21 @@ function(jquery,i18n,jqueryTmpl,bootstra
displayGrid=function(){
activateRemoteRepositoriesGridTab();
}
+
+ addExtraParameter=function(){
+
+ var mainContent=$("#main-content");
+ var key=mainContent.find("#extraParameter-key").val();
+ var value=mainContent.find("#extraParameter-value").val();
+ $.log("addExtraParameter="+key+":"+value);
+ var oldTab = self.remoteRepository.extraParametersEntries();
+ oldTab.push(new Entry(key,value));
+ self.remoteRepository.extraParametersEntries(oldTab);
+ mainContent.find("#extraParameter-key").val("");
+ mainContent.find("#extraParameter-value").val("");
+ self.remoteRepository.modified(true);
+ }
+
}
RemoteRepositoriesViewModel=function(){
@@ -864,10 +905,11 @@ function(jquery,i18n,jqueryTmpl,bootstra
var viewModel = new
RemoteRepositoryViewModel(remoteRepository,true,self);
viewModel.networkProxies(mapNetworkProxies(data));
var mainContent = $("#main-content");
+
ko.applyBindings(viewModel,mainContent.find("#remote-repository-edit").get(0));
activateRemoteRepositoryEditTab();
mainContent.find("#remote-repository-edit-li
a").html($.i18n.prop('edit'));
- activateRemoteRepositoryFormValidation();
+ activateRemoteRepositoryFormValidation(false);
activatePopoverDoc();
}
})
@@ -969,22 +1011,40 @@ function(jquery,i18n,jqueryTmpl,bootstra
}
}
- activateRemoteRepositoryFormValidation=function(){
+ /**
+ *
+ * @param validateId to validate if id already exists: not needed for update
!
+ */
+ activateRemoteRepositoryFormValidation=function(validateId){
// FIXME find a way to activate cronExpression validation only if
downloadRemote is activated !
- var validator = $("#main-content"
).find("#remote-repository-edit-form").validate({
- rules: {
- id: {
- required: true,
- remote: {
- url:
"restServices/archivaUiServices/dataValidatorService/remoteRepositoryIdNotExists",
- type: "get"
+ var validator = null;
+ if (validateId){
+ validator = $("#main-content"
).find("#remote-repository-edit-form").validate({
+ rules: {
+ id: {
+ required: true,
+ remote: {
+ url:
"restServices/archivaUiServices/dataValidatorService/remoteRepositoryIdNotExists",
+ type: "get"
+ }
+ }
+ },
+ showErrors: function(validator, errorMap, errorList) {
+ customShowError("#main-content
#remote-repository-edit-form",validator,errorMap,errorMap);
+ }
+ });
+ } else {
+ validator = $("#main-content"
).find("#remote-repository-edit-form").validate({
+ rules: {
+ id: {
+ required: true
}
+ },
+ showErrors: function(validator, errorMap, errorList) {
+ customShowError("#main-content
#remote-repository-edit-form",validator,errorMap,errorMap);
}
- },
- showErrors: function(validator, errorMap, errorList) {
- customShowError("#main-content
#remote-repository-edit-form",validator,errorMap,errorMap);
- }
- });
+ });
+ }
validator.settings.messages["cronExpression"]=$.i18n.prop("cronExpression.notvalid");
validator.settings.messages["id"]=$.i18n.prop("id.required.or.alreadyexists");
}
@@ -1145,8 +1205,8 @@ function(jquery,i18n,jqueryTmpl,bootstra
remoteRepo.cronExpression("0 0 08 ? * SUN");
var viewModel = new
RemoteRepositoryViewModel(remoteRepo,false,remoteRepositoriesViewModel);
viewModel.networkProxies(mapNetworkProxies(data));
- ko.applyBindings(viewModel,$("#main-content"
).find("#remote-repository-edit").get(0));
- activateRemoteRepositoryFormValidation();
+
ko.applyBindings(viewModel,mainContent.find("#remote-repository-edit").get(0));
+ activateRemoteRepositoryFormValidation(true);
activatePopoverDoc();
}
})
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/repositories.html
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/repositories.html?rev=1402492&r1=1402491&r2=1402492&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/repositories.html
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/repositories.html
Fri Oct 26 12:58:01 2012
@@ -71,7 +71,146 @@
</table>
<div id="remote-repositoriesPagination"></div>
</div>
- <div id="remote-repository-edit" class="pill-pane"
data-bind='template: {name:"remote-repository-edit-tmpl"}'>
+ <div id="remote-repository-edit" class="pill-pane">
+
+
+ <form id="remote-repository-edit-form" class="well
form-horizontal">
+ <fieldset id="remote-repository-edit-fieldset">
+ <div class="control-group">
+ <label class="control-label"
for="id">${$.i18n.prop('id')}</label>
+ <div class="controls">
+ {{if update}}
+ <span
class="uneditable-input">${$data.remoteRepository.id}</span>
+ {{else}}
+ <input type="text" class="input-xlarge required"
id="id" name="id" size="50"
+ data-bind="value:
remoteRepository.id,css:{'uneditable-input': update},readonly:update"/>
+ {{/if}}
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="name">${$.i18n.prop('name')}</label>
+ <div class="controls">
+ <input type="text" class="input-xlarge required"
id="name" name="name" size="50"
+ data-bind="value: remoteRepository.name"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="url">${$.i18n.prop('url')}</label>
+ <div class="controls">
+ <input type="text" class="input-xxlarge required"
id="url" name="location" size="50" data-bind="value: remoteRepository.url"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="userName">${$.i18n.prop('username')}</label>
+ <div class="controls">
+ <input type="text" class="input-xlarge"
id="userName" name="userName" size="50" data-bind="value:
remoteRepository.userName"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="password">${$.i18n.prop('password')}</label>
+ <div class="controls">
+ <input type="password" class="input-xlarge"
id="password" name="password" size="50" data-bind="value:
remoteRepository.password"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="timeout">${$.i18n.prop('timeout')}</label>
+ <div class="controls">
+ <input type="text" id="timeout" class="digits"
name="daysOlder" size="5" data-bind="value: remoteRepository.timeout"/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label"
for="layout">${$.i18n.prop('type')}</label>
+ <div class="controls">
+ <select id="layout" data-bind="options:
availableLayouts,optionsText: 'label',optionsValue:'type',value:
remoteRepository.layout"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="downloadRemoteIndex">${$.i18n.prop('downloadRemoteIndex')}</label>
+ <div class="controls">
+ <input type="checkbox" id="downloadRemoteIndex"
name="downloadRemoteIndex" size="5" data-bind="checked:
remoteRepository.downloadRemoteIndex"/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label"
for="remoteIndexUrl">${$.i18n.prop('remoteIndexUrl')}</label>
+ <div class="controls">
+ <input type="text" class="input-xxlarge"
id="remoteIndexUrl" name="remoteIndexUrl" size="5" data-bind="value:
remoteRepository.remoteIndexUrl"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="cronExpression">${$.i18n.prop('cronExpression')}</label>
+ <div class="controls">
+ <input type="text" id="cronExpression"
name="cronExpression" size="40" data-bind="value:
remoteRepository.cronExpression"/>
+ <a class="btn btn-warning btn-mini popover-doc"
id="cronExpression-info-button"
+
data-original-title="${$.i18n.prop('cronExpression.help.title')}"
+
data-content="${$.i18n.prop('cronExpression.help.content')}">
+ <i class="icon-question-sign icon-white"></i>
+ </a>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="indexDirectory">${$.i18n.prop('index.directory')}</label>
+ <div class="controls">
+ <input type="text" class="input-xlarge"
id="indexDirectory" name="indexDirectory" size="50" data-bind="value:
remoteRepository.indexDirectory"/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label"
for="remoteDownloadTimeout">${$.i18n.prop('remoteDownloadTimeout')}</label>
+ <div class="controls">
+ <input type="text" id="remoteDownloadTimeout"
class="digits" name="remoteDownloadTimeout" size="5"
+ data-bind="value:
remoteRepository.remoteDownloadTimeout"/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label"
for="remoteDownloadNetworkProxyId">${$.i18n.prop('remoteDownloadNetworkProxyId')}</label>
+ <div class="controls">
+ <select id="remoteDownloadNetworkProxyId"
data-bind="options: networkProxies, optionsText: 'id',optionsValue:'id', value:
remoteRepository.remoteDownloadNetworkProxyId, optionsCaption:
'Choose...'"></select>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label"
for="downloadRemoteIndexOnStartup">${$.i18n.prop('downloadRemoteIndexOnStartup')}</label>
+ <div class="controls">
+ <input type="checkbox"
id="downloadRemoteIndexOnStartup" name="downloadRemoteIndexOnStartup"
+ data-bind="checked:
remoteRepository.downloadRemoteIndexOnStartup"/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label"
for="daysOlder">${$.i18n.prop('description')}</label>
+ <div class="controls">
+ <textarea rows="3" id="description"
name="description" data-bind="value: remoteRepository.description"></textarea>
+ </div>
+ </div>
+
+ <div class="row-fluid">
+ <div class="control-group span6">
+
<h4>${$.i18n.prop('remoteRepository.extraParametersEntries')}</h4>
+ <table class="table">
+ <thead>
+ <th><input type="text"
id="extraParameter-key"/></th>
+ <th><input type="text"
id="extraParameter-value"/></th>
+ <th><a href="#" data-bind="click: function(){
addExtraParameter() }">${$.i18n.prop('add')}</a></th>
+ </thead>
+ <tbody data-bind="foreach:
remoteRepository.extraParametersEntries">
+ <tr>
+ <td data-bind="text: key"></td>
+ <td data-bind="text: value"></td>
+ <td><a href="#" data-bind="click: function(){
$parent.deleteExtraParameter(key)}">${$.i18n.prop('delete')}</a></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ </fieldset>
+ <button data-bind="click: save"
data-loading-text="${$.i18n.prop('common.loading')}"
id="remote-repository-save-button" class="btn">${$.i18n.prop('save')}</button>
+ <button data-bind="click: displayGrid"
class="btn">${$.i18n.prop('cancel')}</button>
+ </form>
+
+
</div>
</div>
</div>
@@ -513,121 +652,7 @@
<script id="remote-repository-edit-tmpl" type='text/html'>
- <form id="remote-repository-edit-form" class="well form-horizontal">
- <fieldset id="remote-repository-edit-fieldset">
- <div class="control-group">
- <label class="control-label" for="id">${$.i18n.prop('id')}</label>
- <div class="controls">
- {{if update}}
- <span
class="uneditable-input">${$data.remoteRepository.id}</span>
- {{else}}
- <input type="text" class="input-xlarge required" id="id"
name="id" size="50"
- data-bind="value:
remoteRepository.id,css:{'uneditable-input': update},readonly:update"/>
- {{/if}}
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="name">${$.i18n.prop('name')}</label>
- <div class="controls">
- <input type="text" class="input-xlarge required" id="name"
name="name" size="50"
- data-bind="value: remoteRepository.name"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label" for="url">${$.i18n.prop('url')}</label>
- <div class="controls">
- <input type="text" class="input-xxlarge required" id="url"
name="location" size="50" data-bind="value: remoteRepository.url"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="userName">${$.i18n.prop('username')}</label>
- <div class="controls">
- <input type="text" class="input-xlarge" id="userName"
name="userName" size="50" data-bind="value: remoteRepository.userName"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="password">${$.i18n.prop('password')}</label>
- <div class="controls">
- <input type="password" class="input-xlarge" id="password"
name="password" size="50" data-bind="value: remoteRepository.password"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="timeout">${$.i18n.prop('timeout')}</label>
- <div class="controls">
- <input type="text" id="timeout" class="digits" name="daysOlder"
size="5" data-bind="value: remoteRepository.timeout"/>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label"
for="layout">${$.i18n.prop('type')}</label>
- <div class="controls">
- <select id="layout" data-bind="options:
availableLayouts,optionsText: 'label',optionsValue:'type',value:
remoteRepository.layout"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="downloadRemoteIndex">${$.i18n.prop('downloadRemoteIndex')}</label>
- <div class="controls">
- <input type="checkbox" id="downloadRemoteIndex"
name="downloadRemoteIndex" size="5" data-bind="checked:
remoteRepository.downloadRemoteIndex"/>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label"
for="remoteIndexUrl">${$.i18n.prop('remoteIndexUrl')}</label>
- <div class="controls">
- <input type="text" class="input-xxlarge" id="remoteIndexUrl"
name="remoteIndexUrl" size="5" data-bind="value:
remoteRepository.remoteIndexUrl"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="cronExpression">${$.i18n.prop('cronExpression')}</label>
- <div class="controls">
- <input type="text" id="cronExpression" name="cronExpression"
size="40" data-bind="value: remoteRepository.cronExpression"/>
- <a class="btn btn-warning btn-mini popover-doc"
id="cronExpression-info-button"
-
data-original-title="${$.i18n.prop('cronExpression.help.title')}"
- data-content="${$.i18n.prop('cronExpression.help.content')}">
- <i class="icon-question-sign icon-white"></i>
- </a>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="indexDirectory">${$.i18n.prop('index.directory')}</label>
- <div class="controls">
- <input type="text" class="input-xlarge" id="indexDirectory"
name="indexDirectory" size="50" data-bind="value:
remoteRepository.indexDirectory"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="remoteDownloadTimeout">${$.i18n.prop('remoteDownloadTimeout')}</label>
- <div class="controls">
- <input type="text" id="remoteDownloadTimeout" class="digits"
name="remoteDownloadTimeout" size="5"
- data-bind="value: remoteRepository.remoteDownloadTimeout"/>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label"
for="remoteDownloadNetworkProxyId">${$.i18n.prop('remoteDownloadNetworkProxyId')}</label>
- <div class="controls">
- <select id="remoteDownloadNetworkProxyId" data-bind="options:
networkProxies, optionsText: 'id',optionsValue:'id', value:
remoteRepository.remoteDownloadNetworkProxyId, optionsCaption:
'Choose...'"></select>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label"
for="downloadRemoteIndexOnStartup">${$.i18n.prop('downloadRemoteIndexOnStartup')}</label>
- <div class="controls">
- <input type="checkbox" id="downloadRemoteIndexOnStartup"
name="downloadRemoteIndexOnStartup"
- data-bind="checked:
remoteRepository.downloadRemoteIndexOnStartup"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label"
for="daysOlder">${$.i18n.prop('description')}</label>
- <div class="controls">
- <textarea rows="3" id="description" name="description"
data-bind="value: remoteRepository.description"></textarea>
- </div>
- </div>
-
- </fieldset>
- <button data-bind="click: save"
data-loading-text="${$.i18n.prop('common.loading')}"
id="remote-repository-save-button" class="btn">${$.i18n.prop('save')}</button>
- <button data-bind="click: displayGrid"
class="btn">${$.i18n.prop('cancel')}</button>
- </form>
</script>
<script id="remote-repository-scan-modal-tmpl" type='text/html'>