first commit
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* @defgroup plugins_pubIds_urn_js
|
||||
*/
|
||||
/**
|
||||
* @file plugins/pubIds/urn/js/FieldPubIdUrn.js
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2003-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @brief A Vue.js component for URN field, that is used for pattern suffixes and that considers check number.
|
||||
*/
|
||||
|
||||
pkp.Vue.component('field-pub-id-urn', {
|
||||
name: 'FieldPubIdUrn',
|
||||
extends: pkp.Vue.component('field-pub-id'),
|
||||
props: {
|
||||
applyCheckNumber: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
generateId() {
|
||||
var id = pkp.Vue.component('field-pub-id').options.methods['generateId'].apply(this);
|
||||
return this.applyCheckNumber
|
||||
? id + $.pkp.plugins.generic.urn.getCheckNumber(id, this.prefix)
|
||||
: id;
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* @defgroup plugins_pubIds_urn_js
|
||||
*/
|
||||
/**
|
||||
* @file plugins/pubIds/urn/js/FieldTextUrn.js
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2003-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @brief A Vue.js component for URN text form field, that is used for custom suffixes, and that considers adding a check number.
|
||||
*/
|
||||
var template = pkp.Vue.compile('<div class="pkpFormField pkpFormField--text pkpFormField--urn" :class="classes">' +
|
||||
' <form-field-label' +
|
||||
' :controlId="controlId"' +
|
||||
' :label="label"' +
|
||||
' :localeLabel="localeLabel"' +
|
||||
' :isRequired="isRequired"' +
|
||||
' :requiredLabel="__(\'common.required\')"' +
|
||||
' :multilingualLabel="multilingualLabel"' +
|
||||
' />' +
|
||||
' <div' +
|
||||
' v-if="isPrimaryLocale && description"' +
|
||||
' class="pkpFormField__description"' +
|
||||
' v-strip-unsafe-html="description"' +
|
||||
' :id="describedByDescriptionId"' +
|
||||
' />' +
|
||||
' <div class="pkpFormField__control" :class="controlClasses">' +
|
||||
' <input' +
|
||||
' class="pkpFormField__input pkpFormField--text__input pkpFormField--urn__input"' +
|
||||
' ref="input"' +
|
||||
' v-model="currentValue"' +
|
||||
' :type="inputType"' +
|
||||
' :id="controlId"' +
|
||||
' :name="localizedName"' +
|
||||
' :aria-describedby="describedByIds"' +
|
||||
' :aria-invalid="!!errors.length"' +
|
||||
' :required="isRequired"' +
|
||||
' :style="inputStyles"' +
|
||||
' />' +
|
||||
' <button' +
|
||||
' v-if="applyCheckNumber"' +
|
||||
' class="pkpButton pkpFormField--urn__button"' +
|
||||
' @click.prevent="addCheckNumber"' +
|
||||
' >' +
|
||||
' {{ addCheckNumberLabel }}' +
|
||||
' </button>' +
|
||||
' <field-error' +
|
||||
' v-if="errors.length"' +
|
||||
' :id="describedByErrorId"' +
|
||||
' :messages="errors"' +
|
||||
' />' +
|
||||
' </div>' +
|
||||
' </div>' +
|
||||
' </div>');
|
||||
|
||||
pkp.Vue.component('field-text-urn', {
|
||||
name: 'FieldTextUrn',
|
||||
extends: pkp.Vue.component('field-text'),
|
||||
props: {
|
||||
addCheckNumberLabel: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
urnPrefix: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
applyCheckNumber: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Add a check number to the end of the URN
|
||||
*/
|
||||
addCheckNumber() {
|
||||
this.currentValue += $.pkp.plugins.generic.urn.getCheckNumber(this.currentValue, this.urnPrefix);
|
||||
}
|
||||
},
|
||||
render: function(h) {
|
||||
return template.render.call(this, h);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* @defgroup plugins_pubIds_urn_js
|
||||
*/
|
||||
/**
|
||||
* @file plugins/pubIds/urn/js/URNSettingsFormHandler.js
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2000-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class URNSettingsFormHandler.js
|
||||
* @ingroup plugins_pubIds_urn_js
|
||||
*
|
||||
* @brief Handle the URN Settings form.
|
||||
*/
|
||||
(function($) {
|
||||
|
||||
/** @type {Object} */
|
||||
$.pkp.plugins.pubIds.urn =
|
||||
$.pkp.plugins.pubIds.urn ||
|
||||
{ js: { } };
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*
|
||||
* @extends $.pkp.controllers.form.AjaxFormHandler
|
||||
*
|
||||
* @param {jQueryObject} $form the wrapped HTML form element.
|
||||
* @param {Object} options form options.
|
||||
*/
|
||||
$.pkp.plugins.pubIds.urn.js.URNSettingsFormHandler =
|
||||
function($form, options) {
|
||||
|
||||
this.parent($form, options);
|
||||
|
||||
$(':radio, :checkbox', $form).click(
|
||||
this.callbackWrapper(this.updatePatternFormElementStatus_));
|
||||
//ping our handler to set the form's initial state.
|
||||
this.callbackWrapper(this.updatePatternFormElementStatus_());
|
||||
};
|
||||
$.pkp.classes.Helper.inherits(
|
||||
$.pkp.plugins.pubIds.urn.js.URNSettingsFormHandler,
|
||||
$.pkp.controllers.form.AjaxFormHandler);
|
||||
|
||||
|
||||
/**
|
||||
* Callback to replace the element's content.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
$.pkp.plugins.pubIds.urn.js.URNSettingsFormHandler.prototype.
|
||||
updatePatternFormElementStatus_ =
|
||||
function() {
|
||||
var $element = this.getHtmlElement(), pattern, $contentChoices;
|
||||
if ($('[id^="urnSuffix"]').filter(':checked').val() == 'pattern') {
|
||||
$contentChoices = $element.find(':checkbox');
|
||||
pattern = new RegExp('enable(.*)URN');
|
||||
$contentChoices.each(function() {
|
||||
var patternCheckResult = pattern.exec($(this).attr('name')),
|
||||
$correspondingTextField = $element.find('[id*="' +
|
||||
patternCheckResult[1] + 'SuffixPattern"]').
|
||||
filter(':text');
|
||||
|
||||
if (patternCheckResult !== null &&
|
||||
patternCheckResult[1] !== 'undefined') {
|
||||
if ($(this).is(':checked')) {
|
||||
$correspondingTextField.removeAttr('disabled');
|
||||
} else {
|
||||
$correspondingTextField.attr('disabled', 'disabled');
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$element.find('[id*="SuffixPattern"]').filter(':text').
|
||||
attr('disabled', 'disabled');
|
||||
}
|
||||
};
|
||||
|
||||
/** @param {jQuery} $ jQuery closure. */
|
||||
}(jQuery));
|
||||
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
* @defgroup plugins_pubIds_urn_js
|
||||
*/
|
||||
/**
|
||||
* @file plugins/pubIds/urn/js/checkNumber.js
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2003-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @brief Function for determining and adding the check number for URNs
|
||||
*/
|
||||
(function($) {
|
||||
|
||||
/**
|
||||
* Add method to the pkp namespace
|
||||
*/
|
||||
$.pkp.plugins.generic.urn = {
|
||||
|
||||
/**
|
||||
* Get the last, check number.
|
||||
* Algorithm (s. http://www.persistent-identifier.de/?link=316):
|
||||
* every URN character is replaced with a number
|
||||
* according to the conversion table,
|
||||
* every number is multiplied by
|
||||
* it's position/index (beginning with 1),
|
||||
* the numbers' sum is calculated,
|
||||
* the sum is divided by the last number,
|
||||
* the last number of the quotient
|
||||
* before the decimal point is the check number.
|
||||
*
|
||||
* @param {string} urn
|
||||
* @param {string} urnPrefix
|
||||
*/
|
||||
getCheckNumber: function(urn, urnPrefix) {
|
||||
var newURN = '',
|
||||
conversionTable = {
|
||||
'9': '41', '8': '9', '7': '8', '6': '7',
|
||||
'5': '6', '4': '5', '3': '4', '2': '3',
|
||||
'1': '2', '0': '1', 'a': '18', 'b': '14',
|
||||
'c': '19', 'd': '15', 'e': '16', 'f': '21',
|
||||
'g': '22', 'h': '23', 'i': '24', 'j': '25',
|
||||
'k': '42', 'l': '26', 'm': '27', 'n': '13',
|
||||
'o': '28', 'p': '29', 'q': '31', 'r': '12',
|
||||
's': '32', 't': '33', 'u': '11', 'v': '34',
|
||||
'w': '35', 'x': '36', 'y': '37', 'z': '38',
|
||||
'-': '39', ':': '17', '_': '43', '/': '45',
|
||||
'.': '47', '+': '49'
|
||||
},
|
||||
i, j, char, sum, lastNumber, quot, quotRound, quotString, newSuffix;
|
||||
|
||||
suffix = urn.replace(urnPrefix, '').toLowerCase();
|
||||
for (i = 0; i < suffix.length; i++) {
|
||||
char = suffix.charAt(i);
|
||||
newURN += conversionTable[char];
|
||||
}
|
||||
sum = 0;
|
||||
for (j = 1; j <= newURN.length; j++) {
|
||||
sum = sum + (newURN.charAt(j - 1) * j);
|
||||
}
|
||||
lastNumber = newURN.charAt(newURN.length - 1);
|
||||
quot = sum / lastNumber;
|
||||
quotRound = Math.floor(quot);
|
||||
quotString = quotRound.toString();
|
||||
return parseInt(quotString.charAt(quotString.length - 1));
|
||||
}
|
||||
};
|
||||
|
||||
// Apply the check number when the button is clicked
|
||||
$('#checkNo').on('click', () => {
|
||||
var urnPrefix = $('[id^="urnPrefix"]').val(), urnSuffix = $('[id^="urnSuffix"]').val();
|
||||
urn = urnPrefix + urnSuffix;
|
||||
$('[id^="urnSuffix"]').val(urnSuffix + $.pkp.plugins.generic.urn.getCheckNumber(urn, urnPrefix));
|
||||
});
|
||||
|
||||
}(jQuery));
|
||||
Reference in New Issue
Block a user