fluentd-ui 1.0.0.alpha.3 → 1.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd-ui might be problematic. Click here for more details.

Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +45 -0
  3. data/.travis.yml +17 -3
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +62 -63
  6. data/README.md +11 -0
  7. data/app/controllers/api/config_definitions_controller.rb +41 -17
  8. data/app/controllers/concerns/setting_concern.rb +0 -4
  9. data/app/controllers/fluentd/settings/in_tail_controller.rb +1 -1
  10. data/app/form_builders/fluentd_form_builder.rb +18 -6
  11. data/app/javascript/packs/application.js +20 -20
  12. data/app/javascript/packs/aws_credential.js +61 -0
  13. data/app/javascript/packs/codemirror.js +33 -37
  14. data/app/javascript/packs/config_field.js +93 -0
  15. data/app/javascript/packs/fluent_log.js +10 -9
  16. data/app/javascript/packs/in_tail_parse.js +77 -76
  17. data/app/javascript/packs/nested_settings.js +17 -16
  18. data/app/javascript/packs/notification.js +14 -14
  19. data/app/javascript/packs/out_forward_setting.js +14 -0
  20. data/app/javascript/packs/out_s3_setting.js +14 -0
  21. data/app/javascript/packs/owned_plugin_form.js +60 -57
  22. data/app/javascript/packs/parser_multiline_form.js +15 -14
  23. data/app/javascript/packs/plugin_setting.js +13 -13
  24. data/app/javascript/packs/settings.js +23 -18
  25. data/app/javascript/packs/transport_config.js +62 -0
  26. data/app/javascript/packs/transport_section.js +72 -0
  27. data/app/javascript/packs/treeview.js +11 -10
  28. data/app/models/concerns/fluentd/setting/configurable.rb +1 -3
  29. data/app/models/concerns/fluentd/setting/plugin.rb +29 -1
  30. data/app/models/concerns/fluentd/setting/plugin_config.rb +32 -8
  31. data/app/models/concerns/fluentd/setting/plugin_parameter.rb +74 -21
  32. data/app/models/concerns/fluentd/setting/registry_loader.rb +38 -0
  33. data/app/models/concerns/fluentd/setting/section_config.rb +52 -0
  34. data/app/models/concerns/fluentd/setting/section_parser.rb +25 -18
  35. data/app/models/fluentd/setting/in_forward.rb +29 -10
  36. data/app/models/fluentd/setting/in_syslog.rb +6 -6
  37. data/app/models/fluentd/setting/out_forward.rb +15 -3
  38. data/app/models/fluentd/setting/out_mongo.rb +0 -11
  39. data/app/models/fluentd/setting/out_s3.rb +17 -3
  40. data/app/models/fluentd/setting/out_tdlog.rb +3 -2
  41. data/app/models/fluentd/setting/section.rb +4 -0
  42. data/app/models/fluentd/setting/type/object.rb +17 -0
  43. data/app/views/fluentd/settings/in_forward/_form.html.haml +5 -3
  44. data/app/views/fluentd/settings/out_forward/_form.html.haml +18 -0
  45. data/app/views/fluentd/settings/out_s3/_form.html.haml +18 -0
  46. data/app/views/shared/settings/_form.html.haml +14 -10
  47. data/app/views/shared/settings/show.html.haml +2 -2
  48. data/app/views/shared/vue/_aws_credential.html.haml +22 -0
  49. data/app/views/shared/vue/_config_field.html.haml +49 -0
  50. data/app/views/shared/vue/_out_forward_setting.html.haml +13 -0
  51. data/app/views/shared/vue/_out_s3_setting.html.haml +19 -0
  52. data/app/views/shared/vue/_owned_plugin_form.html.haml +8 -48
  53. data/app/views/shared/vue/_transport_config.html.haml +20 -0
  54. data/app/views/shared/vue/_transport_section.html.haml +30 -0
  55. data/config/initializers/dig.rb +8 -0
  56. data/config/initializers/dummy_logger.rb +1 -0
  57. data/config/initializers/types.rb +2 -1
  58. data/config/locales/translation_ja.yml +2 -2
  59. data/fluentd-ui.gemspec +1 -0
  60. data/gemfiles/ruby2.2.gemfile +28 -0
  61. data/lib/dummy_logger.rb +13 -0
  62. data/lib/fluentd-ui/version.rb +1 -1
  63. data/package.json +5 -0
  64. data/spec/features/fluentd/setting/in_forward_spec.rb +1 -2
  65. data/spec/features/fluentd/setting/in_http_spec.rb +1 -2
  66. data/spec/features/fluentd/setting/in_monitor_agent_spec.rb +1 -2
  67. data/spec/features/fluentd/setting/out_forward_spec.rb +3 -5
  68. data/spec/features/fluentd/setting/out_stdout_spec.rb +1 -2
  69. data/spec/features/out_elasticsearch_spec.rb +3 -3
  70. data/spec/features/out_forward_spec.rb +6 -5
  71. data/spec/features/out_tdlog_spec.rb +3 -2
  72. data/spec/features/shared_examples/configurable_daemon_settings.rb +2 -2
  73. data/spec/features/source_and_output_spec.rb +2 -0
  74. data/spec/models/fluentd/setting/in_forward_spec.rb +65 -9
  75. data/spec/models/fluentd/setting/in_syslog_spec.rb +12 -7
  76. data/spec/models/fluentd/setting/in_tail_spec.rb +6 -0
  77. data/spec/models/fluentd/setting/out_mongo_spec.rb +2 -3
  78. data/spec/models/fluentd/setting/out_tdlog_spec.rb +1 -2
  79. data/spec/spec_helper.rb +5 -0
  80. data/yarn.lock +466 -12
  81. metadata +90 -39
  82. data/app/helpers/settings_helper.rb +0 -144
  83. data/app/models/concerns/fluentd/setting/section_validator.rb +0 -21
  84. data/app/views/fluentd/settings/_form.html.haml +0 -43
@@ -14,15 +14,11 @@ module SettingConcern
14
14
  @storage = @setting.create_storage
15
15
  @parser = @setting.create_parser
16
16
  @formatter = @setting.create_formatter
17
- @_used_param = {}
18
- @_used_section = {}
19
17
  render "shared/settings/show"
20
18
  end
21
19
 
22
20
  def finish
23
21
  @setting = target_class.new(setting_params)
24
- @_used_param = {}
25
- @_used_section = {}
26
22
  unless @setting.valid?
27
23
  return render "shared/settings/show"
28
24
  end
@@ -58,7 +58,7 @@ class Fluentd::Settings::InTailController < ApplicationController
58
58
  permit_params = target_class._types.keys
59
59
  permit_params << :parse_type
60
60
  section_class = Fluentd::Setting.const_get("parser_#{params.dig(:setting, :parse_type)}".classify)
61
- permit_params << { parse: section_class._types.keys }
61
+ permit_params << { parse: section_class._types.keys + [:type] }
62
62
  params.require(:setting).permit(*permit_params)
63
63
  end
64
64
 
@@ -24,17 +24,22 @@ class FluentdFormBuilder < ActionView::Helpers::FormBuilder
24
24
  when :bool
25
25
  bool_field(key, options)
26
26
  else
27
- other_field(key, options)
27
+ if key.to_sym == :log_level
28
+ log_level_field(key, options)
29
+ else
30
+ other_field(key, options)
31
+ end
28
32
  end
29
33
  end
30
34
 
31
35
  def enum_field(key, options)
32
36
  label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key)) +
33
- select(key, object.list_of(key), options, { class: "enum" })
37
+ select(key, object.list_of(key), options, { class: "enum form-control" })
34
38
  end
35
39
 
36
40
  def bool_field(key, options)
37
- check_box(key, options, "true", "false") + " " +
41
+ return unless object.respond_to?(key)
42
+ check_box(key, options, true, false) + " " +
38
43
  label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key))
39
44
  end
40
45
 
@@ -44,13 +49,20 @@ class FluentdFormBuilder < ActionView::Helpers::FormBuilder
44
49
  text_field(key, class: "form-control", **options)
45
50
  end
46
51
 
52
+ def log_level_field(key, options)
53
+ return unless object.respond_to?(key)
54
+ label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key)) +
55
+ select(key, Fluent::Log::LEVEL_TEXT, { include_blank: true }, { class: "form-control" })
56
+ end
57
+
47
58
  def render_section(key, options)
48
59
  section_class = object.class._sections[key]
49
60
  children = object.__send__(key) || { "0" => {} }
50
61
  html = ""
62
+ html_class = "js-nested-column #{section_class.multi ? "js-multiple" : ""}"
51
63
 
52
64
  children.each do |index, child|
53
- html << content_tag("div", class: "js-nested-column #{section_class.multi ? "js-multiple" : ""}") do
65
+ html << content_tag("div", class: html_class) do
54
66
  _html = ""
55
67
  _html << append_and_remove_links if section_class.multi
56
68
  _html << label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key))
@@ -73,8 +85,8 @@ class FluentdFormBuilder < ActionView::Helpers::FormBuilder
73
85
  end
74
86
 
75
87
  def append_and_remove_links
76
- %Q!<a class="btn btn-xs btn-default js-append">#{icon('fa-plus')}</a> ! +
77
- %Q!<a class="btn btn-xs btn-default js-remove" style="display:none">#{icon('fa-minus')}</a> !
88
+ %Q!<a class="btn btn-xs js-append">#{icon('fa-plus')}</a> ! +
89
+ %Q!<a class="btn btn-xs js-remove" style="display:none">#{icon('fa-minus')}</a> !
78
90
  end
79
91
 
80
92
  def icon(classes, inner=nil)
@@ -7,34 +7,34 @@
7
7
  // To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
8
8
  // layout file, like app/views/layouts/application.html.erb
9
9
 
10
- console.log('Hello World from Webpacker')
10
+ console.log("Hello World from Webpacker");
11
11
 
12
- import jQuery from 'jquery/dist/jquery'
12
+ import jQuery from "jquery/dist/jquery";
13
13
 
14
- window.$ = jQuery
15
- window.jQuery = jQuery
14
+ window.$ = jQuery;
15
+ window.jQuery = jQuery;
16
16
 
17
- import Rails from 'rails-ujs/lib/assets/compiled/rails-ujs.js'
17
+ import Rails from "rails-ujs/lib/assets/compiled/rails-ujs.js";
18
18
 
19
- window.Rails = Rails
20
- Rails.start()
19
+ window.Rails = Rails;
20
+ Rails.start();
21
21
 
22
- import 'popper.js/dist/popper'
23
- import 'bootstrap/dist/js/bootstrap'
24
- import 'datatables.net/js/jquery.dataTables'
25
- import 'startbootstrap-sb-admin/js/sb-admin'
26
- import 'startbootstrap-sb-admin/js/sb-admin-datatables'
22
+ import "popper.js/dist/popper";
23
+ import "bootstrap/dist/js/bootstrap";
24
+ import "datatables.net/js/jquery.dataTables";
25
+ import "startbootstrap-sb-admin/js/sb-admin";
26
+ import "startbootstrap-sb-admin/js/sb-admin-datatables";
27
27
 
28
- import Vue from 'vue/dist/vue.esm'
28
+ import Vue from "vue/dist/vue.esm";
29
29
 
30
- Vue.filter('to_json', function (value) {
31
- return JSON.stringify(value);
32
- })
30
+ Vue.filter("to_json", function (value) {
31
+ return JSON.stringify(value);
32
+ });
33
33
 
34
- window.Vue = Vue
34
+ window.Vue = Vue;
35
35
 
36
- import '../stylesheets/application.scss'
36
+ import "../stylesheets/application.scss";
37
37
 
38
38
  $(document).ready(() => {
39
- $("[data-toggle=tooltip]").tooltip()
40
- })
39
+ $("[data-toggle=tooltip]").tooltip();
40
+ });
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ import ConfigField from "./config_field";
4
+
5
+ const AwsCredential = {
6
+ template: "#vue-aws-credential",
7
+ components: {
8
+ "config-field": ConfigField,
9
+ },
10
+ props: [
11
+ "id",
12
+ "pluginType",
13
+ "pluginName",
14
+ ],
15
+ data: () => {
16
+ return {
17
+ credentialType: null,
18
+ credentialOptions: [],
19
+ options: [
20
+ "simple",
21
+ "assumeRoleCredentials",
22
+ "instanceProfileCredentials",
23
+ "sharedCredentials"
24
+ ]
25
+ };
26
+ },
27
+
28
+ computed: {
29
+ token: function() {
30
+ return Rails.csrfToken();
31
+ }
32
+ },
33
+
34
+ mounted: function() {
35
+
36
+ },
37
+
38
+ methods: {
39
+ onChange: function() {
40
+ this.updateSection();
41
+ },
42
+
43
+ updateSection: function() {
44
+ $.ajax({
45
+ method: "GET",
46
+ url: "/api/config_definitions",
47
+ headers: {
48
+ "X-CSRF-Token": this.token
49
+ },
50
+ data: {
51
+ type: this.pluginType,
52
+ name: this.pluginName
53
+ }
54
+ }).then((data) => {
55
+ this.credentialOptions = data["awsCredentialOptions"][this.credentialType];
56
+ });
57
+ }
58
+ }
59
+ };
60
+
61
+ export { AwsCredential as default };
@@ -1,10 +1,12 @@
1
- import CodeMirror from 'codemirror/lib/codemirror'
2
- import 'lodash/lodash'
1
+ /* global _ */
2
+ "use strict";
3
+ import CodeMirror from "codemirror/lib/codemirror";
4
+ import "lodash/lodash";
3
5
 
4
6
  // See: http://codemirror.net/doc/manual.html#modeapi
5
7
  // and sample mode files: https://github.com/codemirror/CodeMirror/tree/master/mode
6
8
 
7
- CodeMirror.defineMode('fluentd', function(){
9
+ CodeMirror.defineMode("fluentd", function(){
8
10
  return {
9
11
  startState: function(aa){
10
12
  return { "context" : null };
@@ -21,40 +23,34 @@ CodeMirror.defineMode('fluentd', function(){
21
23
  }
22
24
 
23
25
  switch(stream.peek()){
24
- case "#":
25
- stream.skipToEnd();
26
- return "comment";
27
- break;
28
- case "<":
29
- state.context = "inner-bracket";
30
- stream.pos += 1;
26
+ case "#":
27
+ stream.skipToEnd();
28
+ return "comment";
29
+ case "<":
30
+ state.context = "inner-bracket";
31
+ stream.pos += 1;
32
+ return "keyword";
33
+ case ">":
34
+ stream.pos += 1;
35
+ state.context = "inner-definition";
36
+ return "keyword";
37
+ default:
38
+ switch(state.context){
39
+ case "inner-bracket":
40
+ stream.eat(/[^#<>]+/);
31
41
  return "keyword";
32
- break;
33
- case ">":
34
- stream.pos += 1;
42
+ case "inner-definition":
43
+ stream.eatWhile(/[^ \t#]/);
44
+ state.context = "inner-definition-keyword-appeared";
45
+ return "variable";
46
+ case "inner-definition-keyword-appeared":
47
+ stream.eatWhile(/[^#]/);
35
48
  state.context = "inner-definition";
36
- return "keyword";
37
- break;
49
+ return "builtin";
38
50
  default:
39
- switch(state.context){
40
- case "inner-bracket":
41
- stream.eat(/[^#<>]+/);
42
- return "keyword";
43
- break;
44
- case "inner-definition":
45
- var key = stream.eatWhile(/[^ \t#]/);
46
- state.context = "inner-definition-keyword-appeared";
47
- return "variable";
48
- break;
49
- case "inner-definition-keyword-appeared":
50
- var key = stream.eatWhile(/[^#]/);
51
- state.context = "inner-definition";
52
- return "builtin";
53
- break;
54
- default:
55
- stream.eat(/[^<>#]+/);
56
- return "string";
57
- }
51
+ stream.eat(/[^<>#]+/);
52
+ return "string";
53
+ }
58
54
  }
59
55
  }
60
56
  };
@@ -70,18 +66,18 @@ function codemirrorify(el) {
70
66
  }
71
67
 
72
68
  $(function(){
73
- $('.js-fluentd-config-editor').each(function(_, el){
69
+ $(".js-fluentd-config-editor").each(function(_, el){
74
70
  codemirrorify(el);
75
71
  });
76
72
  });
77
73
 
78
- Vue.directive('config-editor', {
74
+ Vue.directive("config-editor", {
79
75
  bind: function(el, binding, vnode, oldVnode){
80
76
  // NOTE: needed delay for waiting CodeMirror setup
81
77
  _.delay(function(textarea){
82
78
  let cm = codemirrorify(textarea);
83
79
  // textarea.codemirror = cm; // for test, but doesn't work for now (working on Chrome, but Poltergeist not)
84
- cm.on('change', function(code_mirror){
80
+ cm.on("change", function(code_mirror){
85
81
  // bridge Vue - CodeMirror world
86
82
  el.dataset.content = code_mirror.getValue();
87
83
  });
@@ -0,0 +1,93 @@
1
+ /* global _ */
2
+ "use strict";
3
+ import "lodash/lodash";
4
+
5
+ const ConfigField = {
6
+ template: "#vue-config-field",
7
+ props: [
8
+ "pluginType",
9
+ "option",
10
+ "initialExpression",
11
+ "initialTimeFormat",
12
+ "initialTextValue",
13
+ ],
14
+
15
+ data: function() {
16
+ return {
17
+ expression: null,
18
+ timeFormat: null,
19
+ textValue: null,
20
+ };
21
+ },
22
+
23
+ filters: {
24
+ humanize: function(value) {
25
+ return _.capitalize(value.replace(/_/g, " "));
26
+ }
27
+ },
28
+
29
+ mounted: function() {
30
+ if (this.option.name === "expression") {
31
+ this.expression = this.initialExpression;
32
+ } else if (this.option.name === "time_format") {
33
+ this.timeFormat = this.initialTimeFormat;
34
+ } else {
35
+ this.textValue = this.initialTextValue || this.option.default;
36
+ }
37
+ },
38
+
39
+ updated: function() {
40
+ if (this.option.name === "expression") {
41
+ this.expression = this.initialExpression;
42
+ }
43
+ if (this.option.name === "time_format") {
44
+ this.timeFormat = this.initialTimeFormat;
45
+ }
46
+ this.$nextTick(() => {
47
+ console.log("config-field updated");
48
+ $("[data-toggle=tooltip]").tooltip("dispose");
49
+ $("[data-toggle=tooltip]").tooltip("enable");
50
+ });
51
+ },
52
+
53
+ watch: {
54
+ "expression": function(_newValue, _oldValue) {
55
+ this.$emit("change-parse-config", {
56
+ "expression": this.expression,
57
+ "timeFormat": this.timeFormat
58
+ });
59
+ },
60
+ "timeFormat": function(_newValue, _oldValue) {
61
+ this.$emit("change-parse-config", {
62
+ "expression": this.expression,
63
+ "timeFormat": this.timeFormat
64
+ });
65
+ }
66
+ },
67
+
68
+ methods: {
69
+ inputId: function(pluginType, option) {
70
+ if (pluginType === "output") {
71
+ return `setting_${option.name}`;
72
+ } else {
73
+ return `setting_${_.snakeCase(pluginType)}_0__${option.name}`;
74
+ }
75
+ },
76
+ inputName: function(pluginType, option) {
77
+ if (pluginType === "output") {
78
+ return `setting[${option.name}]`;
79
+ } else {
80
+ return `setting[${_.snakeCase(pluginType)}[0]][${option.name}]`;
81
+ }
82
+ },
83
+ checked: function(checked) {
84
+ if (checked === true || checked === "true") {
85
+ return "checked";
86
+ } else {
87
+ return "";
88
+ }
89
+ }
90
+ }
91
+ };
92
+
93
+ export { ConfigField as default };
@@ -1,15 +1,22 @@
1
- 'use strict';
1
+ "use strict";
2
2
  $(document).ready(()=> {
3
3
  new Vue({
4
4
  el: "#fluent-log",
5
- props: ["logUrl", "initialAutoReload"],
6
5
  data: {
6
+ "logUrl": "",
7
+ "initialAutoReload": false,
7
8
  "autoFetch": false,
8
9
  "logs": [],
9
10
  "limit": 30,
10
11
  "processing": false
11
12
  },
12
13
 
14
+ computed: {
15
+ isPresentedLogs: function(){
16
+ return this.logs.length > 0;
17
+ }
18
+ },
19
+
13
20
  beforeMount: function() {
14
21
  this.logUrl = this.$el.attributes.logUrl.nodeValue;
15
22
  this.initialAutoReload = this.$el.attributes.initialAutoReload.nodeValue;
@@ -36,12 +43,6 @@ $(document).ready(()=> {
36
43
  }
37
44
  },
38
45
 
39
- computed: {
40
- isPresentedLogs: function(){
41
- return this.logs.length > 0;
42
- }
43
- },
44
-
45
46
  methods: {
46
47
  fetchLogs: function() {
47
48
  if(this.processing) return;
@@ -54,7 +55,7 @@ $(document).ready(()=> {
54
55
  setTimeout(function(){
55
56
  self.processing = false;
56
57
  }, 256); // delay to reduce flicking loading icon
57
- })["catch"](function(error){
58
+ })["catch"](function(_error){
58
59
  self.processing = false;
59
60
  });
60
61
  }
@@ -1,136 +1,137 @@
1
- 'use strict'
2
- import 'lodash/lodash'
3
- import 'popper.js/dist/popper'
4
- import 'bootstrap/dist/js/bootstrap'
5
- import OwnedPluginForm from './owned_plugin_form'
1
+ /* global _ */
2
+ "use strict";
3
+ import "lodash/lodash";
4
+ import "popper.js/dist/popper";
5
+ import "bootstrap/dist/js/bootstrap";
6
+ import OwnedPluginForm from "./owned_plugin_form";
6
7
 
7
8
  $(document).ready(() => {
8
9
  new Vue({
9
- el: '#in-tail-parse',
10
- props: [
11
- "path",
12
- "parseType"
13
- ],
10
+ el: "#in-tail-parse",
11
+ components: {
12
+ "owned-plugin-form": OwnedPluginForm
13
+ },
14
14
  data: function() {
15
15
  return {
16
- highlightedLines: null
17
- }
16
+ "path": "",
17
+ "parseType": "",
18
+ "highlightedLines": null
19
+ };
18
20
  },
19
21
  computed: {
20
22
  token: function() {
21
- return Rails.csrfToken()
23
+ return Rails.csrfToken();
22
24
  }
23
25
  },
24
- components: {
25
- 'owned-plugin-form': OwnedPluginForm
26
- },
27
26
  watch: {
28
- 'parse.expression': function() {
29
- console.log(`parse.expression: ${this.parse.expression}`)
30
- this.preview()
27
+ "parse.expression": function() {
28
+ console.log(`parse.expression: ${this.parse.expression}`);
29
+ this.preview();
31
30
  },
32
- 'parse.time_format': function() {
33
- console.log(`parse.time_format: ${this.parse.time_format}`)
34
- this.preview()
31
+ "parse.time_format": function() {
32
+ console.log(`parse.time_format: ${this.parse.time_format}`);
33
+ this.preview();
35
34
  },
36
- 'parseType': function() {
37
- this.preview()
35
+ "parseType": function() {
36
+ this.preview();
38
37
  },
39
38
  },
40
39
  beforeMount: function() {
41
40
  this.path = this.$el.attributes.path.nodeValue;
42
41
  },
43
42
  mounted: function() {
44
- this.parse = {}
43
+ this.parse = {};
45
44
  this.$on("hook:updated", () => {
46
- $("[data-toggle=tooltip]").tooltip("dispose")
47
- $("[data-toggle=tooltip]").tooltip("enable")
48
- })
45
+ this.$nextTick(() => {
46
+ $("[data-toggle=tooltip]").tooltip("dispose");
47
+ $("[data-toggle=tooltip]").tooltip("enable");
48
+ });
49
+ });
49
50
  },
50
51
  methods: {
51
52
  onChangePluginName: function(name) {
52
- console.log("onChangePluginName")
53
- this.parseType = name
54
- this.parse = {} // clear parser plugin configuration
53
+ console.log("#in-tail-parse onChangePluginName", name);
54
+ this.parseType = name;
55
+ this.parse = {}; // clear parser plugin configuration
55
56
  },
56
57
  onChangeParseConfig: function(data) {
57
- console.log("onChangeParseConfig", data)
58
- _.merge(this.parse, data)
59
- this.preview()
58
+ console.log("#in-tail-parse onChangeParseConfig", data);
59
+ _.merge(this.parse, data);
60
+ this.preview();
60
61
  },
61
62
  onChangeFormats: function(data) {
62
- console.log("in_tail_parse:onChangeFormats", data)
63
- _.merge(this.parse, data)
64
- this.preview()
63
+ console.log("in_tail_parse:onChangeFormats", data);
64
+ _.merge(this.parse, data);
65
+ this.preview();
65
66
  },
66
67
  updateHighlightedLines: function(matches) {
67
68
  if (!matches) {
68
- this.highlightedLines = null
69
- return
69
+ this.highlightedLines = null;
70
+ return;
70
71
  }
71
72
 
72
- let $container = $('<div>')
73
+ let $container = $("<div>");
73
74
  _.each(matches, (match) => {
74
- const colors = ["#ff9", "#cff", "#fcf", "#dfd"]
75
- const whole = match.whole
76
- let html = ""
77
- let _matches = []
78
- let lastPos = 0
75
+ const colors = ["#ff9", "#cff", "#fcf", "#dfd"];
76
+ const whole = match.whole;
77
+ let html = "";
78
+ let _matches = [];
79
+ let lastPos = 0;
79
80
 
80
81
  _.each(match.matches, (m) => {
81
- let matched = m.matched
82
+ let matched = m.matched;
82
83
  if (!matched) {
83
- return
84
+ return;
84
85
  }
85
86
  // Ignore empty matched with "foobar".match(/foo(.*?)bar/)[1] #=> ""
86
87
  if (matched.length === 0) {
87
- return
88
+ return;
88
89
  }
89
90
  // rotate color
90
- let currentColor = colors.shift()
91
- colors.push(currentColor)
91
+ let currentColor = colors.shift();
92
+ colors.push(currentColor);
92
93
 
93
94
  // create highlighted range HTML
94
- let $highlighted = $("<span>").text(matched)
95
+ let $highlighted = $("<span>").text(matched);
95
96
  $highlighted.attr({
96
97
  "class": "regexp-preview",
97
98
  "data-toggle": "tooltip",
98
99
  "data-placement": "top",
99
100
  "title": m.key,
100
- 'style': 'background-color:' + currentColor
101
- })
102
- let highlightedHtml = $highlighted.wrap("<div>").parent().html()
101
+ "style": "background-color:" + currentColor
102
+ });
103
+ let highlightedHtml = $highlighted.wrap("<div>").parent().html();
103
104
  let pos = {
104
105
  start: m.pos[0],
105
106
  end: m.pos[1]
106
- }
107
+ };
107
108
  if (pos.start > 0) {
108
- html += _.escape(whole.substring(lastPos, pos.start))
109
+ html += _.escape(whole.substring(lastPos, pos.start));
109
110
  }
110
- html += highlightedHtml
111
- lastPos = pos.end
112
- })
113
- html += whole.substring(lastPos)
111
+ html += highlightedHtml;
112
+ lastPos = pos.end;
113
+ });
114
+ html += whole.substring(lastPos);
114
115
 
115
- $container.append(html)
116
- $container.append("<br>")
117
- })
116
+ $container.append(html);
117
+ $container.append("<br>");
118
+ });
118
119
 
119
- this.highlightedLines = $container.html()
120
- this.$emit("hook:updated")
120
+ this.highlightedLines = $container.html();
121
+ this.$emit("hook:updated");
121
122
  },
122
123
 
123
124
  preview: function() {
124
- console.log("preview!!!!")
125
+ console.log("preview!!!!");
125
126
  if (this.previewAjax && this.previewAjax.state() === "pending") {
126
- this.previewAjax.abort()
127
+ this.previewAjax.abort();
127
128
  }
128
129
 
129
130
  this.previewAjax = $.ajax({
130
131
  method: "POST",
131
132
  url: "/api/regexp_preview",
132
133
  headers: {
133
- 'X-CSRF-Token': this.token
134
+ "X-CSRF-Token": this.token
134
135
  },
135
136
  data: {
136
137
  parse_type: _.isEmpty(this.parseType) ? "regexp" : this.parseType,
@@ -140,20 +141,20 @@ $(document).ready(() => {
140
141
  }).then(
141
142
  (result) => {
142
143
  if (result.matches) {
143
- this.updateHighlightedLines(result.matches)
144
+ this.updateHighlightedLines(result.matches);
144
145
  } else {
145
- console.error(result.error)
146
- this.previewError = result.error
146
+ console.error(result.error);
147
+ this.previewError = result.error;
147
148
  }
148
149
  },
149
150
  (error) => {
150
- this.highlightedLines = null
151
+ this.highlightedLines = null;
151
152
  // console.error(error.responseText)
152
153
  if (error.stack) {
153
- console.error(error.stack)
154
+ console.error(error.stack);
154
155
  }
155
- })
156
+ });
156
157
  }
157
158
  }
158
- })
159
- })
159
+ });
160
+ });