Overview
Here you can check how to customize EF Portal interface.
Dynamic and interconnected dropdown menus
Here is an example about create a dynamic and interconnected dropdown menus (pulldowns) in a user interface, where selecting an option in one dropdown affects the available options in another dropdown. Specifically, an example where selecting a “queue” would automatically adjust the “number of available cores” shown in another dropdown or field.
The SDF snippet:
<ef:service id="abaqus.batch">
<ef:name>Abaqus</ef:name>
<ef:info>
<script type="text/javascript">initAbaqus()</script>
</ef:info>
<ef:option id="_username" type="hidden"/>
<ef:option id="_password" type="hidden"/>
<ef:option id="abq_jobname" label="Job name" width="50" type="text">New Abaqus job</ef:option>
<ef:option id="abq_version" label="Abaqus version" type="list">
<ef:option id="6142">6.14-2</ef:option>
<ef:option id="6111">6.11-1</ef:option>
<ef:option id="2016">2016</ef:option>
</ef:option>
<ef:option id="abq_jobtype" class="ncpu-toggle" label="Job type:" type="radio">
<ef:option label="Standard" selected="true">standard</ef:option>
<ef:option label="MPI">mpi</ef:option>
</ef:option>
<ef:option id="abq_explicit" label="Explicit" type="boolean">explicit</ef:option>
<ef:option id="abq_mp_host_split" label="MP Host Split" type="hidden">2</ef:option>
<ef:info>
<div id="standard_ncpus">
<ef:option id="abq_standard_ncpus" label="Number of CPUs" type="list">
<ef:option id="2">2</ef:option>
<ef:option id="4">4</ef:option>
<ef:option id="6">6</ef:option>
<ef:option id="8">8</ef:option>
<ef:option id="12">12</ef:option>
<!--<ef:option id="16">16</ef:option>-->
</ef:option>
</div>
<div id="mpi_ncpus">
<ef:option id="abq_mpi_ncpus" label="Number of CPUs" width="50" type="list">
<ef:option id="12">12</ef:option>
<ef:option id="24">24</ef:option>
<ef:option id="36">36</ef:option>
<ef:option id="48">48</ef:option>
<ef:option id="60">60</ef:option>
<ef:option id="72">72</ef:option>
<ef:option id="84">84</ef:option>
<ef:option id="96">96</ef:option>
</ef:option>
</div>
<div id="standard_queues">
<ef:option id="abq_queue" label="Execution queue" type="list">
<ef:option id="Abaqus_G7">Abaqus_G7</ef:option>
</ef:option>
</div>
<div id="mpi_queues">
<ef:option id="abq_queue_mpi" label="Execution queue" type="list" >
<ef:option id="Abaqus_G7_MPI">Abaqus_G7_MPI</ef:option>
<ef:option id="FEA_G9_MPI">FEA_G9_MPI</ef:option>
</ef:option>
</div>
</ef:info>
<ef:option id="abq_delay" class="delay-toggle" label="Start job" type="list">
<ef:option label="Immediately" selected="true">immediately</ef:option>
<ef:option label="After...">delay</ef:option>
</ef:option>
<ef:info>
<div id="abq-delay-container">
<ef:option id="abq_delay_hours" label="Hours" type="text" width="8" extra="(max 72)">8</ef:option>
<ef:option id="abq_delay_minutes" label="Minutes" type="text" width="8" extra="(0-59)">0</ef:option>
</div>
</ef:info>
<ef:option id="abq_ifile" label="Input file (.inp) or list file" width="50" type="rfb" base="/"
required="required" filter="type = 'folder' or name *= '*.inp'" />
<ef:option id="abq_rfile" label="Restart (.res)" width="50" type="rfb" base="/"
extra="(can be relative to input file directory)" filter="type = 'folder' or name *= '*.res'"/>
<ef:option id="abq_usub" label="User subroutine (.f)" width="50" type="rfb" base="/"
extra="(can be relative to input file directory)" filter="type = 'folder' or name *= '*.f'"/>
<ef:option id="abq_sfile" label="Input substructure file (.odb)" width="50" type="rfb" base="/"
filter="type = 'folder' or name *= '*.odb'" />
<ef:action id="submit" label="Submit job" result="text/xml"><![CDATA[
"${EF_ROOT}/[PATH_TO_YOUR_SCRIPT]
]]></ef:action>
</ef:service>
The javascript snippet:
function initAbaqus() {
$(document).ready(function () {
toggleNcpu();
toggleDelay();
togglePythonHome();
$('.ncpu-toggle').click(function () {
toggleNcpu();
});
$('.delay-toggle').click(function () {
toggleDelay();
});
$('.pyhome-toggle').click(function () {
togglePythonHome();
});
$('#serviceform').submit(function () {
var hours, minutes;
if ($('#serviceopt_abq_delay option:selected').val() === 'delay') {
hours = $('#serviceopt_abq_delay_hours').val();
minutes = $('#serviceopt_abq_delay_minutes').val();
if (!isInt(hours) || (hours < 0 || hours > 72)) {
alert('Please specify a valid value for start delay hours');
return false;
}
if (!isInt(minutes) || (minutes < 0 || minutes > 59)) {
alert('Please specify a valid value for start delay minutes');
return false;
}
}
return true;
});
});
}
function toggleNcpu() {
if ($('#serviceopt_abq_jobtype_sid_standard').is(':checked')) {
$('#standard_ncpus').show();
$('#standard_queues').show();
//$('#row_serviceopt_abq_queue').show();
$('#row_serviceopt_abq_sfile').show();
$('#mpi_ncpus').hide();
$('#mpi_queues').hide();
}
else {
$('#mpi_ncpus').show();
$('#mpi_queues').show();
//$('#row_serviceopt_abq_queue').hide();
$('#row_serviceopt_abq_sfile').show();
$('#standard_ncpus').hide();
$('#standard_queues').hide();
}
}
function toggleDelay() {
if ($('#serviceopt_abq_delay option:selected').val() === 'immediately') {
$('#abq-delay-container').hide();
}
else {
$('#abq-delay-container').show();
}
}
function togglePythonHome() {
if ($('#serviceopt_abq_py_syspy').is(':checked')) {
$('#abq-py-syspy-container').show();
}
else {
$('#abq-py-syspy-container').hide();
}
}
var isInt = (function (value) {
return ((value) && (typeof +value === 'number') && ((+value % 1) === 0));
});
The javascript must be included into the layout xsl of the specific SDF.