fluentd-ui/app/javascript/packs/in_tail_parse.js
2018-06-13 14:03:11 +09:00

121 lines
3.1 KiB
JavaScript

'use strict'
import 'lodash/lodash'
import 'popper.js/dist/popper'
import 'bootstrap/dist/js/bootstrap'
import OwnedPluginForm from './owned_plugin_form'
$(document).ready(() => {
new Vue({
el: '#in-tail-parse',
props: [
"targetFile",
"parseType",
],
data: () => {
return {
highlightedLines: null
}
},
computed: {
token: function() {
return Rails.csrfToken()
}
},
components: {
'owned-plugin-form': OwnedPluginForm
},
watch: {
'params.setting.regexp': function() {
this.preview();
},
'parseType': function() {
this.preview();
},
},
methods: {
updateHighlightedLines: function(matches) {
if (!matches) {
this.highlightedLines = null
return
}
let $container = $('<div>')
_.each(matches, (match) => {
const colors = ["#ff9", "#cff", "#fcf", "#dfd"]
const whole = match.whole
let html = ""
let _matches = []
let lastPos = 0
_.each(match.matches, (m) => {
let matched = m.matched
if (!matched) {
return
}
// Ignore empty matched with "foobar".match(/foo(.*?)bar/)[1] #=> ""
if (matched.length === 0) {
return
}
// rotate color
let currentColor = colors.shift()
colors.push(currentColor)
// create highlighted range HTML
let $highlighted = $("<span>").text(matched)
$highlighted.attr({
"class": "regexp-preview",
"data-toggle": "tooltip",
"data-placement": "top",
"title": match.key,
'style': 'background-color:' + currentColor
})
let highlightedHtml = $highlighted.wrap("<div>").parent().html()
let pos = {
start: match.pos[0],
ent: match.pos[1]
}
if (pos.start > 0) {
html += _.escape(whole.substring(lastPos, pos.start))
}
html += highlightedHtml
lastPos = pos.end
})
html += whole.substring(lastPos)
$container.append(html)
$container.append("<br>")
})
this.highlightedLines = $container.html()
},
preview: function() {
$.ajax({
method: "POST",
url: "/api/regexp_preview",
headers: {
'X-CSRF-Token': token
},
data: {
regexp: this.params.setting.regexp,
time_format: this.params.setting.time_format,
format: _.isEmpty(this.parseType) ? "regexp" : this.parseType,
params: this.params.setting,
file: this.targetFile
}
}).then(
(result) => {
this.params = _merge(this.params, result.params)
this.updateHighlightedLines(result.matches)
},
(error) => {
if (error.stack) {
console.error(error.stack)
}
})
}
}
})
})