EF Interface customization

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.

Hide hosts based in ACL

You can edit the file /opt/nisp/enginframe/2025.0-r/enginframe/plugins/vdi/lib/xml/topmenu.xml and wrap the hosts display like this:

 <ef:apply-acl select="admin-only">

  <ef:item-action class="ef-monitor">
    <ef:name>Hosts</ef:name>
    <efactions:open uri="//com.enginframe.grid/list.hosts"/>
  </ef:item-action>

 </ef:apply-acl>