Files
crawlab/frontend/src/components/Common/ParametersDialog.vue
yaziming aeaa4493a7 * 增加Docker开发环境
* 更新Dockerfile构建文件,升级NodeJS依赖版本。
 * 遵循ESLint重新格式化代码,修复部分警告
 * 登录Token失效增加登出提示
 * 网络请求问题增加错误错误提示
 * 升级UI依赖库
2020-06-19 16:57:00 +08:00

221 lines
5.5 KiB
Vue

<template>
<el-dialog
:title="$t('Parameters')"
:visible="visible"
:before-close="beforeClose"
class="parameters-dialog"
width="720px"
>
<div class="action-wrapper">
<el-button
type="primary"
size="small"
@click="onAdd"
>
{{ $t('Add') }}
</el-button>
</div>
<el-table
:data="paramData"
border
:header-cell-style="{background:'rgb(48, 65, 86)',color:'white'}"
>
<el-table-column
:label="$t('Parameter Type')"
width="100px"
>
<template slot-scope="scope">
<el-select v-model="scope.row.type" size="small">
<el-option
:label="$t('Spider')"
value="spider"
/>
<el-option
:label="$t('Setting')"
value="setting"
/>
<el-option
:label="$t('Other')"
value="other"
/>
</el-select>
</template>
</el-table-column>
<el-table-column
:label="$t('Parameter Name')"
width="240px"
>
<template slot-scope="scope">
<el-autocomplete
v-if="scope.row.type === 'setting'"
v-model="scope.row.name"
size="small"
suffix-icon="el-icon-edit"
:fetch-suggestions="querySearch"
/>
<el-input
v-else-if="scope.row.type === 'spider'"
v-model="scope.row.name"
size="small"
suffix-icon="el-icon-edit"
/>
<div v-else style="text-align: center">
N/A
</div>
</template>
</el-table-column>
<el-table-column
:label="$t('Parameter Value')"
>
<template slot-scope="scope">
<el-input v-model="scope.row.value" size="small" suffix-icon="el-icon-edit" />
</template>
</el-table-column>
<el-table-column
:label="$t('Action')"
width="60px"
align="center"
>
<template slot-scope="scope">
<div class="action-btn-wrapper">
<el-button type="danger" icon="el-icon-delete" size="mini" circle @click="onRemove(scope.$index)" />
</div>
</template>
</el-table-column>
</el-table>
<template slot="footer">
<el-button type="plain" size="small" @click="$emit('close')">{{ $t('Cancel') }}</el-button>
<el-button type="primary" size="small" @click="onConfirm">
{{ $t('Confirm') }}
</el-button>
</template>
</el-dialog>
</template>
<script>
export default {
name: 'ParametersDialog',
props: {
visible: {
type: Boolean,
default: false
},
param: {
type: String,
default: ''
}
},
data() {
return {
paramData: []
}
},
watch: {
visible(value) {
if (value) this.initParamData()
}
},
methods: {
beforeClose() {
this.$emit('close')
},
initParamData() {
const mArr = this.param.match(/((?:-[-a-zA-Z0-9] )?(?:\w+=)?\w+)/g)
if (!mArr) {
this.paramData = []
this.paramData.push({ type: 'spider', name: '', value: '' })
return
}
this.paramData = []
mArr.forEach(s => {
s = s.trim()
const d = {}
const arr = s.split(' ')
if (arr.length === 1) {
d.type = 'other'
d.value = s
} else {
const arr2 = arr[1].split('=')
d.name = arr2[0]
d.value = arr2[1]
if (arr[0] === '-a') {
d.type = 'spider'
} else if (arr[0] === '-s') {
d.type = 'setting'
} else {
d.type = 'other'
d.value = s
}
}
this.paramData.push(d)
})
if (this.paramData.length === 0) {
this.paramData.push({ type: 'spider', name: '', value: '' })
}
},
onConfirm() {
const param = this.paramData
.filter(d => d.value)
.map(d => {
let s = ''
if (d.type === 'setting') {
s = `-s ${d.name}=${d.value}`
} else if (d.type === 'spider') {
s = `-a ${d.name}=${d.value}`
} else if (d.type === 'other') {
s = d.value
}
return s
})
.filter(s => !!s)
.join(' ')
this.$emit('confirm', param)
},
onRemove(index) {
this.paramData.splice(index, 1)
},
onAdd() {
this.paramData.push({ type: 'spider', name: '', value: '' })
},
querySearch(queryString, cb) {
let data = this.$utils.scrapy.settingParamNames
if (!queryString) {
return cb(data.map(s => {
return { value: s, label: s }
}))
}
data = data
.filter(s => s.match(new RegExp(queryString, 'i')))
.sort((a, b) => a < b ? 1 : -1)
cb(data.map(s => {
return { value: s, label: s }
}))
}
}
}
</script>
<style scoped>
.parameters-dialog >>> .el-table td,
.parameters-dialog >>> .el-table td .cell {
padding: 0;
margin: 0;
}
.parameters-dialog >>> .el-table td .cell .el-autocomplete {
width: 100%;
}
.parameters-dialog >>> .el-table td .cell .el-input__inner {
border: none;
}
.parameters-dialog .action-wrapper {
margin-bottom: 10px;
text-align: right;
}
.parameters-dialog .action-btn-wrapper {
}
</style>