mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-10 19:43:16 +00:00
451 lines
13 KiB
JavaScript
451 lines
13 KiB
JavaScript
(function (window) {
|
|
|
|
function checkVocabId(VocabularyId) {
|
|
if (typeof VocabularyId === 'undefined')
|
|
VocabularyId = null;
|
|
|
|
if (VocabularyId === '')
|
|
VocabularyId = null;
|
|
|
|
return VocabularyId;
|
|
}
|
|
|
|
var recordFieldValue = function (meta_id, value, VocabularyId) {
|
|
|
|
VocabularyId = checkVocabId(VocabularyId);
|
|
|
|
this.datas = {
|
|
meta_id: meta_id,
|
|
value: value,
|
|
VocabularyId: VocabularyId
|
|
};
|
|
|
|
var $this = this;
|
|
};
|
|
|
|
recordFieldValue.prototype = {
|
|
getValue: function () {
|
|
return this.datas.value;
|
|
},
|
|
getMetaId: function () {
|
|
return this.datas.meta_id;
|
|
},
|
|
getVocabularyId: function () {
|
|
return this.datas.VocabularyId;
|
|
},
|
|
setValue: function (value, VocabularyId) {
|
|
|
|
this.datas.value = value;
|
|
this.datas.VocabularyId = checkVocabId(VocabularyId);
|
|
return this;
|
|
},
|
|
remove: function () {
|
|
this.datas.value = '';
|
|
this.datas.VocabularyId = null;
|
|
|
|
return this;
|
|
}
|
|
};
|
|
|
|
var databoxField = function (name, label, meta_struct_id, options) {
|
|
|
|
var defaults = {
|
|
multi: false,
|
|
required: false,
|
|
readonly: false,
|
|
maxLength: null,
|
|
minLength: null,
|
|
type: 'string',
|
|
separator: null,
|
|
vocabularyControl: null,
|
|
vocabularyRestricted: false
|
|
},
|
|
options = (typeof options == 'object') ? options : {};
|
|
|
|
if (isNaN(meta_struct_id)) {
|
|
throw 'meta_struct_id should be a number';
|
|
}
|
|
|
|
this.name = name;
|
|
this.label = label;
|
|
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;
|
|
},
|
|
getName: function () {
|
|
return this.name;
|
|
},
|
|
getLabel: function () {
|
|
return this.label;
|
|
},
|
|
isMulti: function () {
|
|
return this.options.multi;
|
|
},
|
|
isRequired: function () {
|
|
return this.options.required;
|
|
},
|
|
isReadonly: function () {
|
|
return this.options.readonly;
|
|
},
|
|
getMaxLength: function () {
|
|
return this.options.maxLength;
|
|
},
|
|
getMinLength: function () {
|
|
return this.options.minLength;
|
|
},
|
|
getType: function () {
|
|
return this.options.type;
|
|
},
|
|
getSeparator: function () {
|
|
return this.options.separator;
|
|
}
|
|
};
|
|
|
|
var recordField = function (databoxField, arrayValues) {
|
|
|
|
this.databoxField = databoxField;
|
|
this.options = {
|
|
dirty: false
|
|
};
|
|
this.datas = new Array();
|
|
|
|
if (arrayValues instanceof Array) {
|
|
if (arrayValues.length > 1 && !databoxField.isMulti())
|
|
throw 'You can not add multiple values to a non multi field ' + databoxField.getName();
|
|
|
|
var first = true;
|
|
|
|
for (v in arrayValues) {
|
|
if (typeof arrayValues[v] !== 'object') {
|
|
if (window.console) {
|
|
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) {
|
|
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 = {
|
|
getName: function () {
|
|
return this.databoxField.getName();
|
|
},
|
|
getMetaStructId: function () {
|
|
return this.databoxField.getMetaStructId();
|
|
},
|
|
isMulti: function () {
|
|
return this.databoxField.isMulti();
|
|
},
|
|
isRequired: function () {
|
|
return this.databoxField.isRequired();
|
|
},
|
|
isDirty: function () {
|
|
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)) {
|
|
if (window.console) {
|
|
console.log('adding new multi value ', value);
|
|
}
|
|
this.datas.push(new recordFieldValue(null, value, VocabularyId));
|
|
this.options.dirty = true;
|
|
}
|
|
else {
|
|
if (window.console) {
|
|
console.log('already have ', value);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (merge === true && this.isEmpty() === false && VocabularyId === null) {
|
|
if (window.console) {
|
|
console.log('Merging value ', value);
|
|
}
|
|
this.datas[0].setValue(this.datas[0].getValue() + ' ' + value, VocabularyId);
|
|
|
|
this.options.dirty = true;
|
|
}
|
|
else {
|
|
if (merge === true && this.isEmpty() === false && VocabularyId !== null) {
|
|
if (window.console) {
|
|
console.error('Cannot merge vocabularies');
|
|
}
|
|
this.datas[0].setValue(value, VocabularyId);
|
|
}
|
|
else {
|
|
|
|
if (!this.hasValue(value, VocabularyId)) {
|
|
if (this.datas.length === 0) {
|
|
if (window.console) {
|
|
console.log('Adding new value ', value);
|
|
}
|
|
this.datas.push(new recordFieldValue(null, value, VocabularyId));
|
|
}
|
|
else {
|
|
if (window.console) {
|
|
console.log('Updating value ', value);
|
|
}
|
|
this.datas[0].setValue(value, VocabularyId);
|
|
}
|
|
this.options.dirty = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return this;
|
|
},
|
|
hasValue: function (value, VocabularyId) {
|
|
|
|
if (typeof value === 'undefined') {
|
|
if (window.console) {
|
|
console.error('Trying to check the presence of an undefined value');
|
|
}
|
|
}
|
|
|
|
VocabularyId = checkVocabId(VocabularyId);
|
|
|
|
for (d in this.datas) {
|
|
if (VocabularyId !== null) {
|
|
if (this.datas[d].getVocabularyId() === VocabularyId) {
|
|
if (window.console) {
|
|
console.log('already got the vocab ID');
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
else if (this.datas[d].getVocabularyId() === null && this.datas[d].getValue() == value) {
|
|
if (window.console) {
|
|
console.log('already got this value');
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
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) {
|
|
console.log('loopin... ', this.datas[d].getValue());
|
|
}
|
|
if (this.datas[d].getVocabularyId() !== null) {
|
|
if (this.datas[d].getVocabularyId() == vocabularyId) {
|
|
if (window.console) {
|
|
console.log('Found within the vocab ! removing... ');
|
|
}
|
|
this.datas[d].remove();
|
|
this.options.dirty = true;
|
|
}
|
|
}
|
|
else if (this.datas[d].getValue() == value) {
|
|
if (window.console) {
|
|
console.log('Found ! removing... ');
|
|
}
|
|
this.datas[d].remove();
|
|
this.options.dirty = true;
|
|
}
|
|
}
|
|
return this;
|
|
},
|
|
isEmpty: function () {
|
|
var empty = true;
|
|
|
|
for (d in this.datas) {
|
|
if (this.datas[d].getValue() !== '')
|
|
empty = false;
|
|
}
|
|
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();
|
|
this.options.dirty = true;
|
|
}
|
|
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(' ; ');
|
|
},
|
|
replaceValue: function (search, replace) {
|
|
|
|
if (this.databoxField.isReadonly()) {
|
|
if (window.console) {
|
|
console.error('Unable to set a value to a readonly field');
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
return n;
|
|
},
|
|
exportDatas: function () {
|
|
|
|
var returnValue = new Array();
|
|
|
|
for (d in this.datas) {
|
|
var temp = {
|
|
meta_id: this.datas[d].getMetaId() ? this.datas[d].getMetaId() : '',
|
|
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);
|