diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Language.php b/lib/Alchemy/Phrasea/Controller/Prod/Language.php index 062bb55485..3fe97e5ea4 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Language.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Language.php @@ -95,6 +95,7 @@ class Language implements ControllerProviderInterface $out['FeedBackDuration'] = _('Time for feedback (days)'); $out['send'] = _('Send'); $out['Recept'] = _('Accuse de reception'); + $out['nFieldsChanged'] = _('%d fields have been updated'); $out['FeedBackNoUsersSelected'] = _('No users selected'); $Serializer = $app['Core']['Serializer']; diff --git a/www/include/js/jquery.Edit.js b/www/include/js/jquery.Edit.js index 7ca3765ad9..63c6fd2ad2 100644 --- a/www/include/js/jquery.Edit.js +++ b/www/include/js/jquery.Edit.js @@ -1,6 +1,6 @@ (function( window ) { - + function checkVocabId(VocabularyId) { if(typeof VocabularyId === 'undefined') @@ -8,23 +8,23 @@ if(VocabularyId === '') VocabularyId = null; - + return VocabularyId; } - + var recordFieldValue = function(meta_id, value, VocabularyId) { - + VocabularyId = checkVocabId(VocabularyId); - + this.datas = { - meta_id:meta_id, - value:value, + meta_id:meta_id, + value:value, VocabularyId:VocabularyId }; - + var $this = this; }; - + recordFieldValue.prototype = { getValue : function() { return this.datas.value; @@ -36,7 +36,7 @@ return this.datas.VocabularyId; }, setValue : function(value, VocabularyId) { - + this.datas.value = value; this.datas.VocabularyId = checkVocabId(VocabularyId); return this; @@ -44,13 +44,13 @@ remove : function() { this.datas.value = ''; this.datas.VocabularyId = null; - + return this; } }; - + var databoxField = function(name, meta_struct_id, options) { - + var defaults = { multi : false, required : false, @@ -63,23 +63,23 @@ vocabularyRestricted : false }, options = (typeof options == 'object') ? options : {}; - + if(isNaN(meta_struct_id)) { throw 'meta_struct_id should be a number'; } - + this.name = name; this.meta_struct_id = meta_struct_id; this.options = jQuery.extend(defaults, options); - + if(this.options.multi === true && this.options.separator === null) { this.options.separator = ';'; } - + }; - + databoxField.prototype = { getMetaStructId : function() { return this.meta_struct_id; @@ -109,9 +109,9 @@ return this.options.separator; } }; - + var recordField = function(databoxField, arrayValues) { - + this.databoxField = databoxField; this.options = { dirty : false @@ -122,9 +122,9 @@ { if(arrayValues.length > 1 && !databoxField.isMulti()) throw 'You can not add multiple values to a non multi field'; - + var first = true; - + for(v in arrayValues) { if(typeof arrayValues[v] !== 'object') @@ -133,20 +133,20 @@ { console.error('Trying to add a non-recordFieldValue to the field...'); } - + continue; } - + if(isNaN(arrayValues[v].getMetaId())) { if(window.console) { console.error('Trying to add a recordFieldValue without metaId...'); } - + continue; } - + if(!first && this.options.multi === false) { if(window.console) @@ -154,17 +154,17 @@ console.error('Trying to add multi values in a non-multi field'); } } - + if(window.console) { console.log('adding a value : ', arrayValues[v]); } - + this.datas.push(arrayValues[v]); first = false; } } - + var $this = this; } recordField.prototype = { @@ -184,26 +184,26 @@ return this.options.dirty; }, addValue : function(value, merge, VocabularyId) { - + VocabularyId = checkVocabId(VocabularyId); - + merge = !!merge; - + if(this.databoxField.isReadonly()) { if(window.console) { console.error('Unable to set a value to a readonly field'); } - + return; } - + if(window.console) { console.log('adding value ',value,' vocId : ', VocabularyId , ' ; merge is ',merge); } - + if(this.isMulti()) { if(!this.hasValue(value, VocabularyId)) @@ -232,10 +232,10 @@ console.log('Merging value ',value); } this.datas[0].setValue(this.datas[0].getValue() + ' ' + value, VocabularyId); - + this.options.dirty = true; } - else + else { if(merge === true && this.isEmpty() === false && VocabularyId !== null) { @@ -247,7 +247,7 @@ } else { - + if(!this.hasValue(value, VocabularyId)) { if(this.datas.length === 0) @@ -271,11 +271,11 @@ } } } - + return this; }, hasValue : function(value, VocabularyId) { - + if(typeof value === 'undefined') { if(window.console) @@ -283,9 +283,9 @@ console.error('Trying to check the presence of an undefined value'); } } - + VocabularyId = checkVocabId(VocabularyId); - + for(d in this.datas) { if(VocabularyId !== null) @@ -311,24 +311,24 @@ return false; }, removeValue : function(value, vocabularyId) { - + if(this.databoxField.isReadonly()) { if(window.console) { console.error('Unable to set a value to a readonly field'); } - + return; } - + vocabularyId = checkVocabId(vocabularyId); - + if(window.console) { console.log('Try to remove value ', value, vocabularyId, this.datas); } - + for(d in this.datas) { if(window.console) @@ -361,7 +361,7 @@ }, isEmpty : function() { var empty = true; - + for(d in this.datas) { if(this.datas[d].getValue() !== '') @@ -370,17 +370,17 @@ return empty; }, empty : function() { - + if(this.databoxField.isReadonly()) { if(window.console) { console.error('Unable to set a value to a readonly field'); } - + return; } - + for(d in this.datas) { this.datas[d].remove(); @@ -389,100 +389,101 @@ return this; }, getValue : function() { - + if(this.isMulti()) throw 'This field is multi, I can not give you a single value'; - + if(this.isEmpty()) return null; - + return this.datas[0]; }, getValues : function() { - + if(!this.isMulti()) { throw 'This field is not multi, I can not give you multiple values'; } - + if(this.isEmpty()) return new Array(); - + var arrayValues = []; - + for(d in this.datas) { if(this.datas[d].getValue() === '') continue; - + arrayValues.push(this.datas[d]); } - + return arrayValues; }, sort : function(algo) { this.datas.sort(algo); - + return this; }, getSerializedValues : function() { var arrayValues = []; var values = this.getValues(); - + for(v in values) { arrayValues.push(values[v].getValue()); } - + return arrayValues.join(' ' + this.databoxField.getSeparator() + ' '); }, replaceValue : function(search, replace) { - + if(this.databoxField.isReadonly()) { if(window.console) { console.error('Unable to set a value to a readonly field'); } - - return; + + return 0; } - + + var n = 0; + for(d in this.datas) { if(this.datas[d].getVocabularyId() !== null) { continue; } - + var value = this.datas[d].getValue(); var replacedValue = value.replace(search, replace); - + if(value === replacedValue) { continue; } + + n++; + this.removeValue(value); - + if(!this.hasValue(replacedValue)) { this.addValue(replacedValue); } - + this.options.dirty = true; } - - /** - * cleanup and remove duplicates - */ - - return this; + + return n; }, exportDatas : function() { - + var returnValue = new Array(); - + for(d in this.datas) { var temp = { @@ -490,22 +491,22 @@ meta_struct_id : this.getMetaStructId(), value : this.datas[d].getValue() }; - + if(this.datas[d].getVocabularyId()) { temp.vocabularyId = this.datas[d].getVocabularyId(); } returnValue.push(temp); } - + return returnValue; } }; window.p4 = window.p4 || {}; - + window.p4.databoxField = databoxField; window.p4.recordFieldValue = recordFieldValue; window.p4.recordField = recordField; - + })(window); \ No newline at end of file diff --git a/www/prod/jquery.edit.js b/www/prod/jquery.edit.js index c194d4b743..11ab49f658 100644 --- a/www/prod/jquery.edit.js +++ b/www/prod/jquery.edit.js @@ -1454,7 +1454,7 @@ function replace() search = new RegExp(r_search, commut); - var r, f; + var r, f, n = 0; for(r in p4.edit.T_records) { if(!p4.edit.T_records[r]._selected) @@ -1463,10 +1463,13 @@ function replace() { if(field == '' || field==f) { - p4.edit.T_records[r].fields[f].replaceValue(search, replace); + n += p4.edit.T_records[r].fields[f].replaceValue(search, replace); } } } + + humane.info($.sprintf(language.nFieldsChanged, n)); + updateEditSelectedRecords(null); }