Add support for sending an event in a "Dry Run"

Akinori MUSHA 9 年之前
父节点
当前提交
bfbe2ac9a4
共有 1 个文件被更改,包括 55 次插入3 次删除
  1. 55 3
      app/assets/javascripts/components/utils.js.coffee

+ 55 - 3
app/assets/javascripts/components/utils.js.coffee

@@ -36,8 +36,60 @@ class @Utils
36 36
 
37 37
   @handleDryRunButton: (button, data = if button.form then $(':input[name!="_method"]', button.form).serialize() else '') ->
38 38
     $(button).prop('disabled', true)
39
+    cleanup = -> $(button).prop('disabled', false)
40
+
41
+    url = $(button).data('action-url')
42
+    with_event_mode = $(button).data('with-event-mode')
43
+
44
+    if with_event_mode is 'no'
45
+      return @invokeDryRun(url, data, cleanup)
46
+
47
+    Utils.showDynamicModal """
48
+      <h5>Event to send#{if with_event_mode is 'maybe' then ' (Optional)' else ''}</h5>
49
+      <form class="dry-run-form" method="post">
50
+        <div class="form-group">
51
+          <textarea rows="10" name="event" class="payload-editor" data-height="200">
52
+            {}
53
+          </textarea>
54
+        </div>
55
+        <div class="form-group">
56
+          <input value="Dry Run" class="btn btn-primary" type="submit" />
57
+        </div>
58
+      </form>
59
+      """,
60
+      body: (body) =>
61
+        form = $(body).find('.dry-run-form')
62
+        window.setupJsonEditor(form.find('.payload-editor'))
63
+        form.submit (e) =>
64
+          e.preventDefault()
65
+          json = $(e.target).find('.payload-editor').val()
66
+          json = '{}' if json == ''
67
+          try
68
+            payload = JSON.parse(json)
69
+            throw true unless payload.constructor is Object
70
+            if Object.keys(payload).length == 0
71
+              json = ''
72
+            else
73
+              json = JSON.stringify(payload)
74
+          catch
75
+            alert 'Invalid JSON object.'
76
+            return
77
+          if json == ''
78
+            if with_event_mode is 'yes'
79
+              alert 'Event is required for this agent to run.'
80
+              return
81
+            dry_run_data = data
82
+          else
83
+            dry_run_data = "event=#{encodeURIComponent(json)}&#{data}"
84
+          $(body).closest('[role=dialog]').on 'hidden.bs.modal', =>
85
+            @invokeDryRun(url, dry_run_data, cleanup)
86
+          .modal('hide')
87
+      title: 'Dry Run'
88
+      onHide: cleanup
89
+
90
+  @invokeDryRun: (url, data, callback) ->
39 91
     $('body').css(cursor: 'progress')
40
-    $.ajax type: 'POST', url: $(button).data('action-url'), dataType: 'json', data: data
92
+    $.ajax type: 'POST', url: url, dataType: 'json', data: data
41 93
       .always =>
42 94
         $('body').css(cursor: 'auto')
43 95
       .done (json) =>
@@ -55,7 +107,7 @@ class @Utils
55 107
               find('.agent-dry-run-events').text(json.events).end().
56 108
               find('.agent-dry-run-memory').text(json.memory)
57 109
           title: 'Dry Run Results',
58
-          onHide: -> $(button).prop('disabled', false)
110
+          onHide: callback
59 111
       .fail (xhr, status, error) ->
60 112
         alert('Error: ' + error)
61
-        $(button).prop('disabled', false)
113
+        callback()