Split viewing and editing a jobset

[?]
Feb 21, 2013, 1:33 AM
OX6NYJDVCDX2UCJ4QQMTRJVZ535NOMCJGYCHDLCADJPQI7RMCXPQC

Dependencies

  • [2] A6XVP6FE Make the hide/unhide actions a checkbox in the project settings
  • [3] ELABMHJI * hydra: layout changes
  • [4] 4WZQW2N6 Fix indentation and get rid of some unnecessary whitespace in the output
  • [5] OEPUOUNB Using twitter bootstrap for more consistent looks for Hydra
  • [6] ZI535LI6 * hydra: 'new' UI for project/jobset/job/build
  • [7] JY7BXXOP Split viewing and editing a project
  • [8] 2PKJFUTH remove unintentional committed line
  • [9] G4X5IUYJ Remove default logo, replaced by text for now. Hide template in jobset edit.
  • [10] RWFCW6ZN In the jobset evals lists, show what inputs changed between consecutive evals
  • [11] 6UESWI2Q Ensure that the first tab is selected
  • [12] IE3SRMWZ * Show global and per-project statistics.
  • [13] ADP54EI4 Fix the spacing around some <h3> headers
  • [14] JARRBLZD Bootstrapify the Hydra forms (except the project and jobset edit pages)
  • [15] 6KIJX24R Get rid of unnecessary [%- and -%] tags
  • [16] QL55ECJ6 - adapted ui for hydra, more in line with nixos.org website
  • [17] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [18] UMFB2767 Hydra/64: Leaving number of builds empty gives DBIx error
  • [19] MHX5I2GC remove delete jobset button until we actually have implemented the action properly
  • [20] 3U3CXCDW Nicer link to the rest of the jobset evals
  • [21] RO7REZL3 Remove unnecessary Javascript code
  • [22] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [23] Q4VDOA76 Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu.
  • [24] 3PNG7NIB Remove trailing whitespace
  • [25] 6QRHXIM3 * Speed up the jobset index page. Especially the query to get the
  • [26] CVWQXYKM use newer icons consistently
  • [27] TJPIS3UP hydra: minor improvements in hydra ui
  • [28] KG5AMUMG Cleanup
  • [29] C6ENW2KX Add time to evaluation error tab. Fixes #21.
  • [30] PMNWRTGJ Add multiple output support
  • [31] PZL3SZM3 Give every page a consistent title
  • [32] OOQ2D3KC * Refactoring: move fetchInput out of hydra_scheduler into a separate
  • [33] VS3OUK7D if no emailoverride specified, use empty string
  • [34] FGQPXZIX hydra: make nr of build to keep configurable per jobset
  • [35] FYO6NECE hydra
  • [36] 4D4U5IPY * Allow jobsets to be disabled.
  • [*] 3HZY24CX * Make jobsets viewable under
  • [*] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [*] IK53RV4V
  • [*] D5QIOJGP * Move everything up one directory.

Change contents

  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 118
    [3.637][3.637:678]()
    $c->stash->{template} = 'jobset.tt';
    [3.637]
    [3.678]
    $c->stash->{template} = 'edit-jobset.tt';
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 238
    [3.2272][3.72:145](),[3.121][3.0:81](),[3.145][3.0:81]()
    , enabled => trim($c->request->params->{enabled}) eq "1" ? 1 : 0
    , enableemail => trim($c->request->params->{enableemail}) eq "1" ? 1 : 0
    [3.2272]
    [3.0]
    , enabled => defined $c->request->params->{enabled} ? 1 : 0
    , enableemail => defined $c->request->params->{enableemail} ? 1 : 0
  • replacement in src/lib/Hydra/Controller/Project.pm at line 113
    [3.2235][3.4930:4971](),[3.4930][3.4930:4971]()
    $c->stash->{template} = 'jobset.tt';
    [3.2235]
    [3.4971]
    $c->stash->{template} = 'edit-jobset.tt';
  • edit in src/root/common.tt at line 196
    [3.3799][3.3799:3804](),[3.3804][3.6948:6949](),[3.6948][3.6948:6949](),[3.3350][3.7078:7079](),[3.7078][3.7078:7079](),[3.7079][3.3805:4008]()
    END;
    BLOCK maybeButton;
    IF uri %]<a class="btn btn-mini" [% HTML.attributes(href => uri); IF confirmmsg %]onclick="javascript:return confirm('[% confirmmsg %]')"[% END; content %]</a>[% ELSE; content; END;
  • edit in src/root/common.tt at line 221
    [3.4117][3.4117:4129](),[3.4129][3.7462:7464](),[3.7462][3.7462:7464](),[3.7464][3.4130:4153](),[3.4153][3.3584:3597](),[3.7490][3.3584:3597](),[3.3597][3.7504:7663](),[3.7504][3.7504:7663]()
    END;
    END;
    BLOCK maybeEditString;
    IF edit %]
    <input type="text" class="string [% extraClass %]" [% HTML.attributes(id => param, name => param, value => value) %] />
    [% ELSE;
    HTML.escape(value);
  • replacement in src/root/common.tt at line 225
    [3.4168][3.96:276]()
    BLOCK editString;
    IF edit %]
    <input type="text" class="string" [% HTML.attributes(id => param, name => param, value => value) %] />
    [% ELSE;
    HTML.escape(value);
    END;
    [3.4168]
    [3.276]
    BLOCK editString; %]
    <input type="text" class="string" [% HTML.attributes(id => param, name => param, value => value) %] />
  • file addition: edit-jobset.tt (----------)
    [41.1486]
    [% WRAPPER layout.tt title=(create ? "Create jobset in project $project.name" : "Editing jobset $project.name:$jobset.name") %]
    [% PROCESS common.tt %]
    [% BLOCK renderInputAlt %]
    <button type="button" class="btn btn-warning" onclick='$(this).parents(".inputalt").remove()'><i class="icon-trash icon-white"></i></button>
    <input type="text" [% HTML.attributes(value => alt.value, name => name) %]></input>
    <br />
    [% END %]
    [% BLOCK renderInput %]
    <tr class="input [% extraClass %]" [% IF id %]id="[% id %]"[% END %]>
    <td>
    <button type="button" class="btn btn-warning" onclick='$(this).parents(".input").remove()'><i class="icon-trash icon-white"></i></button>
    <tt><input type="text" name="[% baseName %]-name" [% HTML.attributes(value => input.name) %]></input>
    </td>
    <td>
    [% INCLUDE renderSelection curValue=input.type param="$baseName-type" options=inputTypes %]
    </td>
    <td class="inputalts" id="[% baseName %]">
    [% FOREACH alt IN input.jobsetinputalts %]
    <span class="inputalt">
    [% INCLUDE renderInputAlt alt=alt name="$baseName-values" %]
    </span>
    [% END %]
    [% IF edit %]<button type="button" class="add-inputalt btn btn-success" onclick='return false'><i class="icon-plus icon-white"></i></button>[% END %]
    </td>
    </tr>
    [% END %]
    [% BLOCK renderInputs %]
    <table class="table table-striped table-condensed">
    <thead>
    <tr><th>Input name</th><th>Type</th><th>Values</th></tr>
    </thead>
    <tbody class="inputs">
    [% FOREACH input IN jobset.jobsetinputs %]
    [% INCLUDE renderInput input=input baseName="input-$input.name" %]
    [% END %]
    <tr>
    <td colspan="3" style="text-align: center;"><button type="button" class="add-input btn btn-success"><i class="icon-plus icon-white"></i> Add a new input</button></td
    </tr>
    </tbody>
    </table>
    [% END %]
    <form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-jobset/submit') %][% ELSE %][% c.uri_for('/jobset' project.name jobset.name 'submit') %][% END %]" method="post">
    <fieldset>
    <div class="control-group">
    <div class="controls">
    <label class="checkbox">
    <input type="checkbox" name="enabled" [% IF jobset.enabled; 'checked="checked"'; END %]></input>Enabled
    </label>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Identifier</label>
    <div class="controls">
    <input type="text" class="span3" name="name" [% HTML.attributes(value => jobset.name) %]></input>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Description</label>
    <div class="controls">
    <input type="text" class="span3" name="description" [% HTML.attributes(value => jobset.description) %]></input>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Nix expression</label>
    <div class="controls">
    <input type="text" class="span3" name="nixexprpath" [% HTML.attributes(value => jobset.nixexprpath) %]></input>
    in
    <input type="text" class="span3" name="nixexprinput" [% HTML.attributes(value => jobset.nixexprinput) %]></input>
    </div>
    </div>
    <div class="control-group">
    <div class="controls">
    <label class="checkbox">
    <input type="checkbox" name="enableemail" [% IF jobset.enableemail; 'checked="checked"'; END %]></input>Email notification
    </label>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Email override</label>
    <div class="controls">
    <input type="text" class="span3" name="emailoverride" [% HTML.attributes(value => jobset.emailoverride) %]></input>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Number of builds to keep</label>
    <div class="controls">
    <input type="number" class="span3" name="keepnr" [% HTML.attributes(value => jobset.keepnr) %]></input>
    </div>
    </div>
    [% INCLUDE renderInputs %]
    <div class="form-actions">
    <button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create %]Create[% ELSE %]Apply changes[% END %]</button>
    </div>
    </fieldset>
    <table class="hidden">
    [% INCLUDE renderInput input="" extraClass="template" id="input-template" baseName="input-template" %]
    </table>
    <tt class="inputalt hidden" id="inputalt-template">
    [% INCLUDE renderInputAlt alt=alt %]
    </tt>
    <script type="text/javascript">
    $(document).ready(function() {
    var id = 0;
    $(".add-input").click(function() {
    var newid = "input-" + id++;
    var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show();
    $("#input-template-name", x).attr("name", newid + "-name");
    $("#input-template-type", x).attr("name", newid + "-type");
    $("#input-template", x).attr("id", newid);
    return false;
    });
    $(".add-inputalt").click(function() {
    var x = $("#inputalt-template").clone(true).insertBefore($(this)).attr("id", "").show();
    $("input", x).attr("name", x.parents(".inputalts").attr("id") + "-values");
    });
    });
    </script>
    </form>
    [% END %]
  • replacement in src/root/edit-project.tt at line 11
    [2.425][2.425:556]()
    <input type="checkbox" name="enabled" value="enabled" [% IF project.enabled; 'checked="checked"'; END %]></input>Enabled
    [2.425]
    [2.556]
    <input type="checkbox" name="enabled" [% IF project.enabled; 'checked="checked"'; END %]></input>Enabled
  • replacement in src/root/edit-project.tt at line 16
    [2.648][2.648:803]()
    <input type="checkbox" name="visible" value="visible" [% IF !project.hidden; 'checked="checked"'; END %]></input>Visible in the list of projects
    [2.648]
    [2.803]
    <input type="checkbox" name="visible" [% IF !project.hidden; 'checked="checked"'; END %]></input>Visible in the list of projects
  • replacement in src/root/jobset.tt at line 1
    [3.8409][3.2237:2412]()
    [% WRAPPER layout.tt title=(edit ? (create ? "Create jobset in project $project.name" : "Editing jobset $project.name:$jobset.name") : "Jobset $project.name:$jobset.name") %]
    [3.8409]
    [3.8600]
    [% WRAPPER layout.tt title="Jobset $project.name:$jobset.name" %]
  • edit in src/root/jobset.tt at line 3
    [3.8625][3.8625:8640](),[3.8640][3.7497:7711](),[3.7711][3.8830:8840](),[3.8830][3.8830:8840]()
    [% IF edit %]
    <form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-jobset/submit') %][% ELSE %][% c.uri_for('/jobset' project.name jobset.name 'submit') %][% END %]" method="post">
    [% END %]
  • edit in src/root/jobset.tt at line 5
    [3.9006][3.9006:9049](),[3.9049][3.7712:7857](),[3.7857][3.9192:9254](),[3.9192][3.9192:9254](),[3.9254][3.23917:23928](),[3.23928][3.9267:9366](),[3.9267][3.9267:9366]()
    [% BLOCK renderInputAlt %]
    [% IF edit %]
    <button type="button" class="btn btn-warning" onclick='$(this).parents(".inputalt").remove()'><i class="icon-trash icon-white"></i></button>
    [% INCLUDE maybeEditString param=param value=alt.value %]
    <br />
    [% ELSE %]
    [% INCLUDE maybeEditString param=param value=alt.value %]
    [% END %]
    [% END %]
  • edit in src/root/jobset.tt at line 6
    [3.9390][3.9390:9391]()
  • replacement in src/root/jobset.tt at line 8
    [3.9472][3.5376:5542](),[3.5542][3.2159:2244]()
    [% IF edit %]<button type="button" class="btn btn-warning" onclick='$(this).parents(".input").remove()'><i class="icon-trash icon-white"></i></button>[% END %]
    <tt>[% INCLUDE maybeEditString param="$baseName-name" value=input.name %]</tt>
    [3.9472]
    [3.9747]
    <tt>[% HTML.escape(input.name) %]</tt>
  • replacement in src/root/jobset.tt at line 16
    [3.10001][3.10001:10052]()
    [% IF input.type == "string" && !edit %]
    [3.10001]
    [3.10052]
    [% IF input.type == "string" %]
  • replacement in src/root/jobset.tt at line 19
    [3.10116][3.10116:10190]()
    [% INCLUDE renderInputAlt alt=alt param="$baseName-values" %]
    [3.10116]
    [3.10190]
    [% HTML.escape(alt.value) %]
  • edit in src/root/jobset.tt at line 23
    [3.10240][3.8026:8182]()
    [% IF edit %]<button type="button" class="add-inputalt btn btn-success" onclick='return false'><i class="icon-plus icon-white"></i></button>[% END %]
  • edit in src/root/jobset.tt at line 25
    [3.10363][3.10363:10364]()
  • replacement in src/root/jobset.tt at line 29
    [3.19568][3.23929:24213](),[3.24213][3.5593:5656](),[3.5656][3.24277:24758](),[3.24277][3.24277:24758](),[3.20058][3.10518:10519](),[3.24758][3.10518:10519](),[3.10518][3.10518:10519]()
    <h3>Inputs</h3>
    <table class="tablesorter table table-striped table-condensed">
    <thead>
    <tr><th>Input name</th><th>Type</th><th>Values</th></tr>
    </thead>
    <tbody class="inputs">
    [% FOREACH input IN jobset.jobsetinputs %]
    [% INCLUDE renderInput input=input baseName="input-$input.name" %]
    [% END %]
    [% IF edit %]
    <tr>
    <td colspan="3" style="text-align: center;"><button type="button" class="add-input btn btn-success"><i class="icon-plus icon-white"></i> Add a new input</button></td>
    </tr>
    [% END %]
    </tbody>
    </table>
    [3.19568]
    [3.20059]
    <h3>Inputs</h3>
    <table class="tablesorter table table-striped table-condensed">
    <thead>
    <tr><th>Input name</th><th>Type</th><th>Values</th></tr>
    </thead>
    <tbody class="inputs">
    [% FOREACH input IN jobset.jobsetinputs %]
    [% INCLUDE renderInput input=input baseName="input-$input.name" %]
    [% END %]
    </tbody>
    </table>
  • replacement in src/root/jobset.tt at line 43
    [3.11583][3.256:290](),[3.290][3.5657:5688](),[3.24802][3.5657:5688](),[3.5688][3.291:396](),[3.396][3.5689:5852](),[3.24924][3.5689:5852](),[3.5852][3.25088:25308](),[3.25088][3.25088:25308]()
    <ul class="nav nav-tabs">
    [% IF !edit %]
    <li class="active"><a href="#tabs-information" data-toggle="tab">Jobset</a></li>
    [% IF jobset.errormsg %]<li><a href="#tabs-errors" data-toggle="tab"><img src="/static/images/error_16.png" /> Evaluation errors</a></li>[% END %]
    <li><a href="#tabs-jobs" data-toggle="tab">Jobs ([% activeJobs.size %])</a></li>
    [% END %]
    <li><a href="#tabs-setup" data-toggle="tab">Setup</a></li>
    </ul>
    [3.11583]
    [3.25308]
    <ul class="nav nav-tabs">
    <li class="active"><a href="#tabs-information" data-toggle="tab">Jobset</a></li>
    [% IF jobset.errormsg %]
    <li><a href="#tabs-errors" data-toggle="tab"><img src="/static/images/error_16.png" /> Evaluation errors</a></li>
    [% END %]
    <li><a href="#tabs-jobs" data-toggle="tab">Jobs ([% activeJobs.size %])</a></li>
    <li><a href="#tabs-setup" data-toggle="tab">Configuration</a></li>
    </ul>
  • edit in src/root/jobset.tt at line 53
    [3.5282][3.25310:25370](),[3.25370][3.5853:5904](),[3.1104][3.105:158](),[3.5904][3.105:158](),[3.25422][3.105:158](),[3.105][3.105:158](),[3.158][3.25423:25562](),[3.300][3.413:439](),[3.1262][3.413:439](),[3.2937][3.413:439](),[3.25562][3.413:439](),[3.413][3.413:439](),[3.439][3.5905:5956](),[3.5956][3.25615:25870](),[3.25615][3.25615:25870](),[3.25870][3.20895:20925](),[3.20895][3.20895:20925](),[3.20925][3.25871:25931](),[3.25931][3.5957:6035](),[3.6035][3.26010:26200](),[3.26010][3.26010:26200](),[3.26200][3.21196:21308](),[3.21196][3.21196:21308](),[3.21308][3.26201:26426](),[3.26426][3.1485:1591](),[3.21471][3.1485:1591](),[3.1591][3.26427:26734](),[3.26734][3.6036:6088](),[3.6088][3.26787:27044](),[3.26787][3.26787:27044]()
    <div id="tabs-information" class="tab-pane active">
    [% IF !edit && evals.size() > 0 %]
    <h2>Most recent evaluations</h2>
    [% INCLUDE renderEvals linkToAll=c.uri_for(c.controller('Jobset').action_for('evals'), [project.name, jobset.name]) %]
    [% END %]
    [% IF !edit && activeJobsStatus %]
    <h2>Status</h2>
    <table class="table table-striped table-condensed">
    <thead><tr><th>Job</th>[% FOREACH s IN systems %]<th>[% s.system %]</th>[% END %]</tr></thead>
    <tbody>
    [% odd = 0 %]
    [% FOREACH j IN activeJobsStatus %]
    <tr class="[% IF odd %] odd [% END; odd = !odd %]">
    <td>[% INCLUDE renderJobName project=project.name jobset = jobset.name job = j.get_column('job') %]</td>
    [% FOREACH s IN systems %]
    [% system = s.system %]
    [% systemStatus = j.get_column(system) %]
    <td class="centered">
    [% IF systemStatus != undef %]
    <a href="[% c.uri_for('/build' j.get_column(system _ '-build') ) %]">
    [% INCLUDE renderBuildStatusIcon buildstatus=systemStatus size=16 %]
    </a>
    [% END %]
    </td>
    [% END %]
    </tr>
    [% END %]
    </tbody>
    </table>
    [% END %]
    [% IF !edit && !activeJobsStatus %]
    <h2>Status</h2>
    <p>
    [ <a href="[% c.uri_for('/jobset' project.name jobset.name 'with-status' ) %]">Show status overview</a> ]
    </p>
    [% END %]
  • replacement in src/root/jobset.tt at line 54
    [3.11600][3.27045:27060](),[3.27060][3.6089:6112]()
    </div>
    [% IF !edit %]
    [3.11600]
    [3.27084]
    <div id="tabs-information" class="tab-pane active">
  • replacement in src/root/jobset.tt at line 56
    [3.27085][3.6113:6154](),[3.6154][3.27127:27228](),[3.27127][3.27127:27228](),[3.27228][3.0:148](),[3.89][3.0:148](),[3.148][3.27229:27516]()
    [% IF jobset.errormsg %]
    <div id="tabs-errors" class="tab-pane">
    <h2>Evaluation errors</h2>
    <p>
    Errors occurred at <tt>[% INCLUDE renderDateTime timestamp=jobset.errortime %]</tt>.
    </p>
    <pre class="multiLineMsg error">[% HTML.escape(jobset.errormsg) %]</pre>
    </div>
    [% END %]
    [% END %]
    <div id="tabs-setup" class="tab-pane [% IF edit %]active[% END %]">
    <h2>Information</h2>
    [3.27085]
    [3.27516]
    [% IF evals.size() > 0 %]
    <h2>Most recent evaluations</h2>
    [% INCLUDE renderEvals linkToAll=c.uri_for(c.controller('Jobset').action_for('evals'), [project.name, jobset.name]) %]
    [% END %]
  • replacement in src/root/jobset.tt at line 61
    [3.27517][3.27517:28197](),[3.28197][3.2245:2484](),[3.2484][3.28486:29228](),[3.28486][3.28486:29228](),[3.29228][3.528:706](),[3.23395][3.528:706]()
    <table class="layoutTable">
    [% IF edit %]
    <tr>
    <th>Identifier:</th>
    <td>[% INCLUDE maybeEditString param="name" value=jobset.name %]</td>
    </tr>
    [% END %]
    <tr>
    <th>Description:</th>
    <td>[% INCLUDE maybeEditString param="description" value=jobset.description %]</td>
    </tr>
    <tr>
    <th>Nix expression:</th>
    <td>
    <tt>[% INCLUDE maybeEditString param="nixexprpath" value=jobset.nixexprpath %]</tt> in input
    <tt>[% INCLUDE maybeEditString param="nixexprinput" value=jobset.nixexprinput %]</tt>
    </td>
    </tr>
    <tr>
    <th>Enabled:</th>
    <td>
    [% INCLUDE renderSelection param="enabled" curValue=jobset.enabled radiobuttons=1 options={"1" = "Yes", "0" = "No"} %]
    </td>
    </tr>
    <tr>
    <th>Enable email notification:</th>
    <td>
    [% INCLUDE renderSelection param="enableemail" curValue=jobset.enableemail radiobuttons=1 options={"1" = "Yes", "0" = "No"} %]
    </td>
    </tr>
    <tr>
    <th>Email override:</th>
    <td>
    [% INCLUDE maybeEditString param="emailoverride" value=jobset.emailoverride %]
    [3.27517]
    [3.706]
    [% IF activeJobsStatus %]
    <h2>Status</h2>
    <table class="table table-striped table-condensed">
    <thead><tr><th>Job</th>[% FOREACH s IN systems %]<th>[% s.system %]</th>[% END %]</tr></thead>
    <tbody>
    [% odd = 0 %]
    [% FOREACH j IN activeJobsStatus %]
    <tr class="[% IF odd %] odd [% END; odd = !odd %]">
    <td>[% INCLUDE renderJobName project=project.name jobset = jobset.name job = j.get_column('job') %]</td>
    [% FOREACH s IN systems %]
    [% system = s.system %]
    [% systemStatus = j.get_column(system) %]
    <td class="centered">
    [% IF systemStatus != undef %]
    <a href="[% c.uri_for('/build' j.get_column(system _ '-build') ) %]">
    [% INCLUDE renderBuildStatusIcon buildstatus=systemStatus size=16 %]
    </a>
    [% END %]
  • replacement in src/root/jobset.tt at line 80
    [3.728][3.728:964](),[3.964][3.29229:29447](),[3.29447][3.6155:6298](),[3.6298][3.29592:29960](),[3.29592][3.29592:29960]()
    </tr>
    <tr>
    <th>Number of builds to keep:</th>
    <td>
    [% INCLUDE maybeEditString param="keepnr" value=jobset.keepnr %]
    </td>
    </tr>
    [% IF !edit %]
    <tr>
    <th>Last checked:</th>
    <td>
    [% IF jobset.lastcheckedtime %]
    [% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %][% IF jobset.errormsg %]<em>, with errors!</em>
    [% ELSE %], <em>no errors</em>
    [% END %]
    [% ELSE %]
    <em>never</em>
    [% END %]
    </td>
    </tr>
    [% END %]
    </table>
    [3.728]
    [3.13216]
    [% END %]
    </tr>
    [% END %]
    </tbody>
    </table>
    [% ELSE %]
    <h2>Status</h2>
    <p>
    [ <a href="[% c.uri_for('/jobset' project.name jobset.name 'with-status' ) %]">Show status overview</a> ]
    </p>
    [% END %]
  • edit in src/root/jobset.tt at line 92
    [3.13217]
    [3.1987]
    </div>
  • replacement in src/root/jobset.tt at line 94
    [3.1988][3.29961:30035](),[3.30035][3.6299:6322](),[3.6322][3.30059:30113](),[3.30059][3.30059:30113]()
    [% INCLUDE renderInputs %]
    </div>
    [% IF !edit %]
    <div id="tabs-jobs" class="tab-pane">
    [3.1988]
    [3.30113]
    [% IF jobset.errormsg %]
    <div id="tabs-errors" class="tab-pane">
    <h2>Evaluation errors</h2>
    <p>
    Errors occurred at <tt>[% INCLUDE renderDateTime timestamp=jobset.errortime %]</tt>.
    </p>
    <pre class="multiLineMsg error">[% HTML.escape(jobset.errormsg) %]</pre>
    </div>
    [% END %]
  • replacement in src/root/jobset.tt at line 104
    [3.30114][3.30114:30152]()
    <h2>Jobs</h2>
    [3.30114]
    [3.30152]
    <div id="tabs-setup" class="tab-pane">
    <h2>Information</h2>
  • replacement in src/root/jobset.tt at line 107
    [3.30153][3.30153:30253]()
    <p>This jobset currently contains the following [% activeJobs.size %] jobs:
    [3.30153]
    [3.30253]
    <table class="layoutTable">
    <tr>
    <th>Description:</th>
    <td>[% HTML.escape(jobset.description) %]</td>
    </tr>
    <tr>
    <th>Nix expression:</th>
    <td>
    <tt>[% HTML.escape(jobset.nixexprpath) %]</tt> in input
    <tt>[% HTML.escape(jobset.nixexprinput) %]</tt>
    </td>
    </tr>
    <tr>
    <th>Enabled:</th>
    <td>[% jobset.enabled ? "Yes" : "No" %]</td>
    </tr>
    <tr>
    <th>Enable email notification:</th>
    <td>[% jobset.enableemail ? "Yes" : "No" %]</td>
    </tr>
    <tr>
    <th>Email override:</th>
    <td>[% HTML.escape(jobset.emailoverride) %]</td>
    </tr>
    <tr>
    <th>Number of builds to keep:</th>
    <td>[% jobset.keepnr %]</td>
    </tr>
    <tr>
    <th>Last checked:</th>
    <td>
    [% IF jobset.lastcheckedtime %]
    [% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %][% IF jobset.errormsg %]<em>, with errors!</em>[% ELSE %], <em>no errors</em>[% END %]
    [% ELSE %]
    <em>never</em>
    [% END %]
    </td>
    </tr>
    </table>
  • replacement in src/root/jobset.tt at line 147
    [3.30254][3.30254:30375](),[3.30375][3.15023:15168](),[3.15168][3.30517:30586](),[3.30517][3.30517:30586]()
    <blockquote>
    [% IF activeJobs.size == 0 %]<em>(none)</em>[% END %]
    [% FOREACH j IN activeJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
    </blockquote>
    </p>
    [3.30254]
    [3.30586]
    [% INCLUDE renderInputs %]
    </div>
  • replacement in src/root/jobset.tt at line 150
    [3.30587][3.30587:30686]()
    <p>This jobset used to contain the following [% inactiveJobs.size %] jobs:
    [3.30587]
    [3.30686]
    <div id="tabs-jobs" class="tab-pane">
  • replacement in src/root/jobset.tt at line 152
    [3.30687][3.30687:30810](),[3.30810][3.15169:15316](),[3.15316][3.30954:30994](),[3.30954][3.30954:30994]()
    <blockquote>
    [% IF inactiveJobs.size == 0 %]<em>(none)</em>[% END %]
    [% FOREACH j IN inactiveJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
    </blockquote>
    [3.30687]
    [3.30994]
    <p>This jobset currently contains the following [% activeJobs.size %] jobs:
  • replacement in src/root/jobset.tt at line 154
    [3.30995][3.30995:31024]()
    </p>
    [3.30995]
    [3.13217]
    <blockquote>
    [% IF activeJobs.size == 0 %]<em>(none)</em>[% END %]
    [% FOREACH j IN activeJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
    </blockquote>
    </p>
  • replacement in src/root/jobset.tt at line 160
    [3.13218][3.31025:31066]()
    </div>
    [% END %]
    [3.13218]
    [3.31066]
    <p>This jobset used to contain the following [% inactiveJobs.size %] jobs:
  • replacement in src/root/jobset.tt at line 162
    [3.31067][3.25464:25471](),[3.13218][3.25464:25471](),[3.25542][3.13229:13244](),[3.13229][3.13229:13244]()
    </div>
    [% IF edit %]
    [3.31067]
    [3.13244]
    <blockquote>
    [% IF inactiveJobs.size == 0 %]<em>(none)</em>[% END %]
    [% FOREACH j IN inactiveJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
    </blockquote>
    </p>
  • edit in src/root/jobset.tt at line 168
    [3.13245][3.13245:13464](),[3.13464][3.31115:31116](),[3.31116][3.13469:14324](),[3.13469][3.13469:14324](),[3.14324][3.31117:31118](),[3.31118][3.2413:2589]()
    <table class="template"> <!-- dummy wrapper needed because “hidden” trs are visible anyway -->
    [% INCLUDE renderInput input="" extraClass="template" id="input-template" baseName="input-template" %]
    </table>
    <tt class="inputalt template" id="inputalt-template">
    [% INCLUDE renderInputAlt alt=alt %]
    </tt>
    <script type="text/javascript">
    $(document).ready(function() {
    var id = 0;
    $(".add-input").click(function() {
    var newid = "input-" + id++;
    var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show();
    $("#input-template-name", x).attr("name", newid + "-name");
    $("#input-template-type", x).attr("name", newid + "-type");
    $("#input-template", x).attr("id", newid);
    return false;
    });
    $(".add-inputalt").click(function() {
    var x = $("#inputalt-template").clone(true).insertBefore($(this)).attr("id", "").show();
    $("input", x).attr("name", x.parents(".inputalts").attr("id") + "-values");
    });
    });
    </script>
    <div class="form-actions">
    <button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create %]Create[% ELSE %]Apply changes[% END %]</button>
  • replacement in src/root/jobset.tt at line 170
    [3.14463][3.14463:14473]()
    </form>
    [3.14463]
    [3.14907]
    </div>
  • edit in src/root/jobset.tt at line 173
    [3.14935][3.14935:14947]()
    [% END %]