Write, Bureaucrats, Administrators
4,332
edits
mNo edit summary |
mNo edit summary |
||
(19 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{Stamp| | {{Stamp|2018-04-09|4.4.5|1.3.5}} | ||
The value of the field will be the result of execution of the script defined in the field and executed in the entry context. | The value of the field will be the result of execution of the script defined in the field and executed in the entry context. | ||
Line 7: | Line 7: | ||
A script may consist of multiple operations, but only the result of the last operation will be entered into the field. For example: | A script may consist of multiple operations, but only the result of the last operation will be entered into the field. For example: | ||
<source lang="javascript"> | <source lang="javascript"> | ||
var i = 1 + 1 | var i = 1 + 1 // Result would be 2, if this were the final statement, | ||
i + 1 | i + 1 // but instead, this is the final statement, so the result will be 3 | ||
</source> | </source> | ||
{{FieldNameHint}} | |||
== Script == | |||
; Script itself | |||
: JavaScript script. The context of the script is the [[Triggers#Object Entry|'''Entry object''']]. The value returned is the last value assigned or expressed. | |||
; JavaScript Libraries | |||
: Choose additional JavaScript Libraries to be loaded. At this time, only moment.min.js is available. | |||
; Execute script in real time: | |||
:; No (default) | |||
:: Script will run only upon edit. Performance will be enhanced. | |||
:; Yes | |||
:: Script will run upon edit or display. | |||
== Display Options == | |||
{{FieldRoleRNDS}} | |||
{{FieldOnCard}} | |||
{{FieldFont}} | |||
{{FieldDepend}} | |||
== Fields of an entry == | == Fields of an entry == | ||
Function '''''field("fieldName")''''' is used to get access to the values of entry fields. | Function [[Triggers#field(name)|'''''field("fieldName")''''']] is used to get access to the values of entry fields. | ||
The type of the JavaScript object returned by the function depends on the field type. | The type of the JavaScript object returned by the function depends on the field type. | ||
Compatibility of Memento field types and JavaScript objects is shown in the table: | Compatibility of Memento field types and JavaScript objects is shown in the table: | ||
{ | {{FieldTypeReturnValues}} | ||
== Time of script execution == | == Time of script execution == | ||
Line 44: | Line 54: | ||
You can enable the integrated library [http://momentjs.com/ '''moment.js'''] to work with the date and time. Click '''''JavaScript Libraries''''' and choose '''''moment.min.js'''''. | You can enable the integrated library [http://momentjs.com/ '''moment.js'''] to work with the date and time. Click '''''JavaScript Libraries''''' and choose '''''moment.min.js'''''. | ||
Some examples. If | Some examples. If an entry contains the field Date whose value is 18 March 2016 14:55 | ||
Example of | '''Example of date formats''' | ||
<source lang="javascript"> | <source lang="javascript"> | ||
moment(field('Date')).format('MMMMM Do YYYYY') // March 18th 2016 | moment(field('Date')).format('MMMMM Do YYYYY') // March 18th 2016 | ||
moment(field('Date')).format('dddd') // Friday | moment(field('Date')).format('dddd') // Friday | ||
moment(field('Date')).format('dddd [Escaped] YYYY') // Friday Escaped 2016 | moment(field('Date')).format('dddd [Escaped] YYYY') // Friday Escaped 2016 | ||
moment(field('Date')).format('HH:mm') // 14:55 | moment(field('Date')).format('HH:mm') // 14:55 | ||
</source> | </source> | ||
Example of | '''Example of relative time''' | ||
<source lang="javascript"> | <source lang="javascript"> | ||
moment(field('Date')).fromNow() // 11 minutes ago | moment(field('Date')).fromNow() // 11 minutes ago | ||
moment(field('Date')).startOf('day').fromNow() // 15 hours ago | moment(field('Date')).startOf('day').fromNow() // 15 hours ago | ||
</source> | </source> | ||
Example of | '''Example of calendar time''' | ||
<source lang="javascript"> | <source lang="javascript"> | ||
moment(field('Date')).calendar() // Today at 2:55 PM | moment(field('Date')).calendar() // Today at 2:55 PM | ||
moment(field('Date')).add(1 , 'days').calendar() // Tomorrow at 2:55 PM | moment(field('Date')).add(1 , 'days').calendar() // Tomorrow at 2:55 PM | ||
</source> | </source> | ||
More information about library features on '''http://momentjs.com''' | More information about library features on '''[http://momentjs.com]''' | ||
== Examples == | == Examples == | ||
==== Example: | ==== Example: Product ==== | ||
The library contains the fields Price and Count. | |||
The JavaScript field '''Total price''' can be computed as follows: | |||
<source lang="javascript"> | <source lang="javascript"> | ||
field('Price')*field('Count') | field('Price')*field('Count'); | ||
</source> | </source> | ||
==== Example: Percentage ==== | ==== Example: Percentage ==== | ||
The library contains the fields Count and Total. | |||
The JavaScript field '''Percentage''' can be computed as follows: | |||
<source lang="javascript"> | <source lang="javascript"> | ||
var total = field('Total') | var total = field('Total'); | ||
if (total > 0) | if (total > 0) | ||
field('Count')*100/total + ' %' | field('Count')*100/total + ' %'; | ||
else | else | ||
' | 'None'; | ||
</source> | </source> | ||
==== Example: Days ==== | ==== Example: Days ==== | ||
The library contains DateTime (or Time) fields Start and End. | |||
The JavaScript field '''Days''' can be computed as follows: | |||
<source lang="javascript"> | <source lang="javascript"> | ||
moment(field('End')).diff(field('Start') , 'days') | moment(field('End')).diff(field('Start') , 'days'); | ||
</source> | </source> | ||
==== Example: Birthday==== | ==== Example: Birthday==== | ||
We have birthday field. If a person younger than 18 years we want | We have a birthday field. If a person is younger than 18 years old, we want to display the string "youth", otherwise the string "adult". | ||
<source lang="javascript"> | <source lang="javascript"> | ||
var years = moment().diff(field('Birthday') , 'years' ) | var years = moment().diff(field('Birthday') , 'years' ) | ||
if (years < 18) | if (years < 18) | ||
'Youth' | 'Youth'; | ||
else | else | ||
'Adult' | 'Adult'; | ||
</source> | |||
=== Examples of calculations on linked entries === | |||
If you have a many-to-many Link To Entry field — linking the current entry to zero or more entries in another library — and if you have an amount field in that other library, you may want to perform calculations on that field across those entries, in similar fashion to Memento aggregation functions. | |||
==== Example: Sum of linked amounts ==== | |||
<source lang="javascript"> | |||
var amountField = "Amount"; // CHANGE Amount to your amount field name | |||
var linkedEntries = field("Them"); // CHANGE Them to your link field name | |||
var numLE = linkedEntries.length; // The number of linked entries | |||
// Loop through linked entries, creating the sum | |||
for (var lex = 0, result = 0; lex < numLE; lex++) | |||
result += linkedEntries[lex].field(amountField); | |||
result; // The result is the SUM | |||
</source> | </source> | ||
== | ==== Example: Average of linked amounts ==== | ||
<source lang="javascript"> | |||
The | var amountField = "Amount"; // CHANGE Amount to your amount field name | ||
var linkedEntries = field("Them"); // CHANGE Them to your link field name | |||
var numLE = linkedEntries.length; // The number of linked entries | |||
// Loop through linked entries, creating the sum | |||
for (var lex = 0, result = 0; lex < numLE; lex++) | |||
result += linkedEntries[lex].field(amountField); | |||
if (numLE != 0) | |||
result / numLE; // The result is the AVERAGE | |||
</source> | |||
==== Example: Minimum of linked amounts ==== | |||
<source lang="javascript"> | |||
var amountField = "Amount"; // CHANGE Amount to your amount field name | |||
var linkedEntries = field("Them"); // CHANGE Them to your link field name | |||
var numLE = linkedEntries.length; // The number of linked entries | |||
var temp; | |||
// Loop through linked entries, finding the MINIMUM | |||
for (var lex = 0, result = 0; lex < numLE; lex++) { | |||
temp = linkedEntries[lex].field(amountField); | |||
if (temp < result) | |||
result = temp; | |||
} | |||
result; // The result is the MINIMUM | |||
</source> | |||
==== Example: Maximum of linked amounts ==== | |||
<source lang="javascript"> | |||
var amountField = "Amount"; // CHANGE Amount to your amount field name | |||
var linkedEntries = field("Them"); // CHANGE Them to your link field name | |||
var numLE = linkedEntries.length; // The number of linked entries | |||
var temp; | |||
// Loop through linked entries, finding the MAXIMUM | |||
for (var lex = 0, result = 0; lex < numLE; lex++) { | |||
temp = linkedEntries[lex].field(amountField); | |||
if (temp > result) | |||
result = temp; | |||
} | |||
result; // The result is the MAXIMUM | |||
</source> | |||
==== Example: Order containing items ==== | |||
The library Orders contains orders and the library Items contains items. Orders contains a link Items to library Items. Items contains the fields Quantity and Price. | |||
To calculate the cost of the order, the JavaScript field '''Cost''' can be computed as follows: | |||
<source lang="javascript"> | |||
var items = field('Items'); // CHANGE Items to your link field name | |||
var cost = 0; | |||
for (var i in items) | |||
cost += items[i].field('Quantity') * items[i].field('Price'); | |||
cost; // The result is the COMPUTED COST | |||
</source> | |||
==== Example: Controlling entry color ==== | |||
The color of an entry in the Entries List screen can be controlled using a JavaScript field. The JavaScript field merely returns a color string in the form "#RRGGBB", where RR is the hexadecimal (hex) value of the red component of the color, GG the hex value for the green component, and BB the hex value of the blue component. The user must identify the JavaScript field by editing the library and selecting the field for the Entry color parameter on the MAIN tab. | |||
You could have many entries with distinct colors indicating things like regions, categories, ranges, etc. | |||
For example, suppose you have an numeric field and want to color entries red if the field is negative and green if it is positive. Here's how you would do it... | |||
Create a JavaScript field, called anything, say "Color of entry". Maybe you have a Currency field called "Amount". You can set the script to be something like... | |||
<source lang="JavaScript"> | |||
var amount = field("Amount"); | |||
if (amount < 0) "#FF0000"; // Red | |||
else if (amount > 0) "#00FF00"; // Green | |||
</source> | |||
Now, go to the MAIN tab of the Library Edit screen. Tap Entry color and select your new JavaScript field, Color of entry. | |||
So, if your Amount field is negative, it will show in the entries list with a red bar on the left. | |||
If it is positive, it'll show with a green bar on the left. | |||
Otherwise it's zero, in which case it will have no bar on the left (barcolor dictated by the theme you're using -- white if you're using the light theme and black if using the dark theme). | |||
== References == | |||
You can find a full description of the language [https://developer.mozilla.org/docs/Web/JavaScript '''here''']. | |||
The implementation is based on the [https://www.mozilla.org/rhino/ '''Rhino library''']. | |||
== JavaScript links == | == JavaScript links == | ||
{{Template:JavaScriptLinks}} | {{Template:JavaScriptLinks}} | ||
[Category:Spec] | [[Category:en]] [[Category:Spec]] |