-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pkp/pkp-lib#8940 changes after code review
- Loading branch information
Showing
5 changed files
with
191 additions
and
223 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/** | ||
* @defgroup plugins_pubIds_urn_js | ||
*/ | ||
/** | ||
* @file plugins/pubIds/urn/js/FieldUrn.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, a Vue.js component for URN custom suffix input text field, and a Vue.js component for URN suffix using a pattern. | ||
*/ | ||
|
||
/** 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)); | ||
|
||
/** Vue.js component for URN custom suffix input text field, and possibility to add 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-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' + | ||
' 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 | ||
} | ||
}, | ||
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); | ||
} | ||
}); | ||
|
||
/** Vue.js component for URN suffix that uses a pattern, considering also the check number */ | ||
pkp.Vue.component('field-pub-id-urn', { | ||
name: 'FieldPubIdUrn', | ||
extends: pkp.Vue.component('field-pub-id'), | ||
props: { | ||
applyCheckNumber: Boolean, | ||
}, | ||
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; | ||
} | ||
}, | ||
}); |
Oops, something went wrong.