<form class="form-horizontal" name="edgeJobForm"> <div class="col-sm-12 form-section-title"> Edge job configuration </div> <!-- name-input --> <div class="form-group"> <label for="edgejob_name" class="col-sm-1 control-label text-left">Name</label> <div class="col-sm-11"> <input type="text" class="form-control" ng-model="$ctrl.model.Name" ng-pattern="/^[a-zA-Z0-9][a-zA-Z0-9_.-]+$/" id="edgejob_name" name="edgejob_name" placeholder="backup-app-prod" required auto-focus /> </div> </div> <div class="form-group" ng-show="edgeJobForm.edgejob_name.$invalid"> <div class="col-sm-12 small text-warning"> <div ng-messages="edgeJobForm.edgejob_name.$error"> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field is required.</p> <p ng-message="pattern"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Allowed characters are: [a-zA-Z0-9_.-]</p> </div> </div> </div> <!-- !name-input --> <!-- cron-input --> <!-- edge-job-method-select --> <div class="col-sm-12 form-section-title"> Edge job configuration </div> <div class="form-group"></div> <div class="form-group" style="margin-bottom: 0;"> <div class="boxselector_wrapper"> <div> <input type="radio" id="config_basic" ng-model="$ctrl.formValues.cronMethod" value="basic" /> <label for="config_basic"> <div class="boxselector_header"> <i class="fa fa-calendar-alt" aria-hidden="true" style="margin-right: 2px;"></i> Basic configuration </div> <p>Select date from calendar</p> </label> </div> <div> <input type="radio" id="config_advanced" ng-model="$ctrl.formValues.cronMethod" value="advanced" /> <label for="config_advanced"> <div class="boxselector_header"> <i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px;"></i> Advanced configuration </div> <p>Write your own cron rule</p> </label> </div> </div> </div> <!-- !edge-job-method-select --> <!-- basic-edge-job --> <div ng-if="$ctrl.formValues.cronMethod === 'basic'"> <div class="form-group"> <label for="recurring" class="col-sm-2 control-label text-left">Recurring Edge job</label> <div class="col-sm-10"> <label class="switch" style="margin-left: 20px;"> <input type="checkbox" name="recurring" ng-model="$ctrl.model.Recurring" /><i></i> </label> </div> </div> <!-- not-recurring --> <div ng-if="!$ctrl.model.Recurring"> <div class="form-group"> <label for="edgejob_cron" class="col-sm-2 control-label text-left">Schedule date</label> <div class="col-sm-10"> <input class="form-control" moment-picker ng-model="$ctrl.formValues.datetime" format="YYYY-MM-DD HH:mm" /> </div> <div class="col-sm-12 small text-muted" style="margin-top: 10px;"> Time should be set according to the chosen endpoints' timezone. </div> <div ng-show="edgeJobForm.datepicker.$invalid"> <div class="col-sm-12 small text-warning"> <div ng-messages="edgeJobForm.datepicker.$error"> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field is required.</p> </div> </div> </div> </div> </div> <!-- !not-recurring --> <!-- recurring --> <div ng-if="$ctrl.model.Recurring"> <div class="form-group"> <label for="edgejob_value" class="col-sm-2 control-label text-left">Edge job time</label> <div class="col-sm-10"> <select id="edgejob_value" name="edgejob_value" class="form-control" ng-model="$ctrl.formValues.scheduleValue" ng-options="value.displayed for value in $ctrl.scheduleValues" required ></select> </div> <div ng-show="edgeJobForm.edgejob_value.$invalid"> <div class="col-sm-12 small text-warning"> <div ng-messages="edgeJobForm.edgejob_value.$error"> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field is required.</p> </div> </div> </div> </div> </div> <!-- !recurring --> </div> <!-- !basic-edge-job --> <!-- advanced-schedule --> <div ng-if="$ctrl.formValues.cronMethod === 'advanced'"> <div class="form-group"> <label for="edgejob_cron" class="col-sm-2 control-label text-left">Cron rule</label> <div class="col-sm-10"> <input type="text" class="form-control" ng-model="$ctrl.model.CronExpression" id="edgejob_cron" name="edgejob_cron" placeholder="0 2 * * *" required ng-pattern="$ctrl.cronRegex" /> </div> <div class="col-sm-12 small text-muted" style="margin-top: 10px;"> Time should be set according to the chosen endpoints' timezone. </div> </div> <div class="form-group" ng-show="edgeJobForm.edgejob_cron.$invalid && edgeJobForm.edgejob_cron.$dirty"> <div class="col-sm-12 small text-warning"> <div ng-messages="edgeJobForm.edgejob_cron.$error"> <p ng-message="required"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field is required.</p> <p ng-message="pattern"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This field format is invalid.</p> </div> </div> </div> </div> <!-- !advanced-schedule --> <!-- execution-method --> <div ng-if="!$ctrl.model.Id"> <div class="col-sm-12 form-section-title"> Job content </div> <div class="form-group"></div> <div class="form-group" style="margin-bottom: 0;"> <div class="boxselector_wrapper"> <div> <input type="radio" id="method_editor" ng-model="$ctrl.formValues.method" value="editor" /> <label for="method_editor"> <div class="boxselector_header"> <i class="fa fa-edit" aria-hidden="true" style="margin-right: 2px;"></i> Web editor </div> <p>Use our Web editor</p> </label> </div> <div> <input type="radio" id="method_upload" ng-model="$ctrl.formValues.method" value="upload" /> <label for="method_upload"> <div class="boxselector_header"> <i class="fa fa-upload" aria-hidden="true" style="margin-right: 2px;"></i> Upload </div> <p>Upload from your computer</p> </label> </div> </div> </div> </div> <!-- !execution-method --> <!-- web-editor --> <div ng-show="$ctrl.formValues.method === 'editor'"> <div class="col-sm-12 form-section-title"> Web editor </div> <div class="form-group"> <div class="col-sm-12"> <code-editor identifier="execute-edge-job-editor" placeholder="# Define or paste the content of your script file here" on-change="($ctrl.editorUpdate)" value="$ctrl.model.FileContent" ></code-editor> </div> </div> </div> <!-- !web-editor --> <!-- upload --> <div ng-show="$ctrl.formValues.method === 'upload'"> <div class="col-sm-12 form-section-title"> Upload </div> <div class="form-group"> <span class="col-sm-12 text-muted small"> You can upload a script file from your computer. </span> </div> <div class="form-group"> <div class="col-sm-12"> <button type="button" class="btn btn-sm btn-primary" ngf-select ng-model="$ctrl.model.File">Select file</button> <span style="margin-left: 5px;"> {{ $ctrl.model.File.name }} <i class="fa fa-times red-icon" ng-if="!$ctrl.model.File" aria-hidden="true"></i> </span> </div> </div> </div> <!-- !upload --> <div class="col-sm-12 form-section-title"> Target endpoints </div> <!-- node-selection --> <associated-endpoints-selector endpoint-ids="$ctrl.model.Endpoints" tags="$ctrl.tags" groups="$ctrl.groups" has-backend-pagination="true" on-associate="($ctrl.associateEndpoint)" on-dissociate="($ctrl.dissociateEndpoint)" ></associated-endpoints-selector> <!-- !node-selection --> <!-- actions --> <div class="col-sm-12 form-section-title"> Actions </div> <div class="form-group"> <div class="col-sm-12"> <button type="button" class="btn btn-primary btn-sm" ng-disabled="$ctrl.actionInProgress || !edgeJobForm.$valid || $ctrl.model.Endpoints.length === 0 || ($ctrl.formValues.method === 'upload' && !$ctrl.model.File) || ($ctrl.formValues.method === 'editor' && !$ctrl.model.FileContent) " ng-click="$ctrl.action()" button-spinner="$ctrl.actionInProgress" > <span ng-hide="$ctrl.actionInProgress">{{ $ctrl.formActionLabel }}</span> <span ng-show="$ctrl.actionInProgress">In progress...</span> </button> <span class="text-danger" ng-if="$ctrl.state.formValidationError" style="margin-left: 5px;"> {{ $ctrl.state.formValidationError }} </span> </div> </div> <!-- !actions --> </form>