mirror of
https://github.com/geekgeekrun/geekgeekrun.git
synced 2026-09-09 01:17:06 +08:00
enhance ux of job source
This commit is contained in:
@@ -24,10 +24,9 @@
|
|||||||
<div flex w-full flex-1>
|
<div flex w-full flex-1>
|
||||||
<template
|
<template
|
||||||
v-if="
|
v-if="
|
||||||
element.item.type === 'search' &&
|
element.type === 'search' &&
|
||||||
(!element.item?.children?.length ||
|
(!element?.children?.length ||
|
||||||
!element.item?.children?.some((it) => it.enabled) ||
|
element?.children?.every((it) => !(it.enabled && !!it.keyword?.trim())))
|
||||||
!element.item?.children?.some((it) => !!it.keyword?.trim()))
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<el-switch
|
<el-switch
|
||||||
@@ -37,12 +36,29 @@
|
|||||||
active-text="启用"
|
active-text="启用"
|
||||||
inactive-text="禁用"
|
inactive-text="禁用"
|
||||||
inline-prompt
|
inline-prompt
|
||||||
|
@click="
|
||||||
|
() => {
|
||||||
|
if (!element?.children?.length) {
|
||||||
|
Message.info({
|
||||||
|
message: '请添加一个要搜索的关键词',
|
||||||
|
grouping: true
|
||||||
|
})
|
||||||
|
} else if (
|
||||||
|
element?.children?.every((it) => !(it.enabled && !!it.keyword?.trim()))
|
||||||
|
) {
|
||||||
|
Message.info({
|
||||||
|
message: '请启用一个要搜索的关键词',
|
||||||
|
grouping: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
{{ element.label }}
|
{{ element.label }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="element.item.enabled"
|
v-model="element.enabled"
|
||||||
mr10px
|
mr10px
|
||||||
active-text="启用"
|
active-text="启用"
|
||||||
inactive-text="禁用"
|
inactive-text="禁用"
|
||||||
@@ -51,35 +67,47 @@
|
|||||||
{{ element.label }}
|
{{ element.label }}
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="element.item.type === 'search'">
|
<div v-if="element.type === 'search'">
|
||||||
<div flex flex-items-center>
|
<div flex flex-items-center>
|
||||||
<span color-orange align-self-end mr10px>
|
<span color-orange align-self-end mr10px>
|
||||||
<template v-if="!element.item?.children?.length">
|
<template v-if="!element?.children?.length">
|
||||||
添加一个关键词后方可启用->
|
添加一个关键词后方可启用->
|
||||||
</template>
|
</template>
|
||||||
<template
|
<template
|
||||||
v-else-if="
|
v-else-if="
|
||||||
element.item?.children?.every((it) => !(it.enabled && !!it.keyword?.trim()))
|
element.enabled &&
|
||||||
|
element?.children?.every((it) => !(it.enabled && !!it.keyword?.trim()))
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
至少启用下方任意一个不为空的关键词后方可启用
|
启用下方任一非空项后方可启用
|
||||||
</template>
|
</template>
|
||||||
<template
|
<template
|
||||||
v-else-if="element.item?.children?.some((it) => it.enabled && !it.keyword?.trim())"
|
v-else-if="
|
||||||
|
element.enabled &&
|
||||||
|
element?.children?.some((it) => it.enabled && !it.keyword?.trim())
|
||||||
|
"
|
||||||
>
|
>
|
||||||
留空的关键词会被跳过
|
空项会被跳过
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
<el-button p-0 h-fit type="text" @click="addSearchKeyword(element.item)"
|
<el-button
|
||||||
|
p-0
|
||||||
|
h-fit
|
||||||
|
type="text"
|
||||||
|
@click="
|
||||||
|
() => {
|
||||||
|
addSearchKeyword(element)
|
||||||
|
}
|
||||||
|
"
|
||||||
>添加关键词</el-button
|
>添加关键词</el-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="element.item.type === 'search' && element.item?.children?.length">
|
<div v-if="element.type === 'search' && element?.children?.length">
|
||||||
<draggable
|
<draggable
|
||||||
v-model="element.item.children"
|
v-model="element.children"
|
||||||
class="list-group"
|
class="list-group"
|
||||||
:component-data="{
|
:component-data="{
|
||||||
tag: 'ul',
|
tag: 'ul',
|
||||||
@@ -101,7 +129,7 @@
|
|||||||
<span class="inner-content">
|
<span class="inner-content">
|
||||||
<div flex w-full>
|
<div flex w-full>
|
||||||
<el-switch
|
<el-switch
|
||||||
v-if="element.item.enabled"
|
v-if="element.enabled && searchItem.keyword?.trim()"
|
||||||
v-model="searchItem.enabled"
|
v-model="searchItem.enabled"
|
||||||
mr10px
|
mr10px
|
||||||
active-text="启用"
|
active-text="启用"
|
||||||
@@ -116,6 +144,21 @@
|
|||||||
active-text="启用"
|
active-text="启用"
|
||||||
inactive-text="禁用"
|
inactive-text="禁用"
|
||||||
inline-prompt
|
inline-prompt
|
||||||
|
@click="
|
||||||
|
() => {
|
||||||
|
if (!searchItem.keyword?.trim()) {
|
||||||
|
Message.info({
|
||||||
|
message: '关键词为空,请输入要搜索的关键词',
|
||||||
|
grouping: true
|
||||||
|
})
|
||||||
|
} else if (!element.enabled) {
|
||||||
|
Message.info({
|
||||||
|
message: '请启用“通过搜索找到的职位”来源',
|
||||||
|
grouping: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="searchItem.keyword"
|
v-model="searchItem.keyword"
|
||||||
@@ -129,7 +172,7 @@
|
|||||||
h-fit
|
h-fit
|
||||||
type="danger"
|
type="danger"
|
||||||
link
|
link
|
||||||
@click="removeSearchKeywordByIndex(element.item, index)"
|
@click="removeSearchKeywordByIndex(element, index)"
|
||||||
>删除</el-button
|
>删除</el-button
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
@@ -146,7 +189,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import draggable from 'vuedraggable'
|
import draggable from 'vuedraggable'
|
||||||
|
import { ElMessage as Message } from 'element-plus'
|
||||||
defineProps({
|
defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: Array
|
type: Array
|
||||||
@@ -169,6 +212,7 @@ function addSearchKeyword(item) {
|
|||||||
if (!item.children) {
|
if (!item.children) {
|
||||||
item.children = []
|
item.children = []
|
||||||
}
|
}
|
||||||
|
item.enabled = true
|
||||||
item.children.push({
|
item.children.push({
|
||||||
type: 'search-kw',
|
type: 'search-kw',
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
|||||||
@@ -18,10 +18,35 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card class="config-section">
|
<el-card class="config-section">
|
||||||
<el-form-item prop="filter" mb0>
|
<el-form-item class="job-source-form-item" prop="__jobSourceList">
|
||||||
<div w-full>
|
<div w-full>
|
||||||
<div font-size-16px>职位来源及查找顺序</div>
|
<div ref="jobSourceFormItemSectionEl" font-size-16px>
|
||||||
<JobSourceDragOrderer v-model="formContent.__jobSourceList" />
|
<div>
|
||||||
|
职位来源及其查找顺序
|
||||||
|
<el-tooltip
|
||||||
|
effect="light"
|
||||||
|
placement="bottom-start"
|
||||||
|
@show="gtagRenderer('tooltip_show_about_job_source_ui')"
|
||||||
|
>
|
||||||
|
<template #content>
|
||||||
|
<div m0 line-height-1.5em w-fit-content >
|
||||||
|
<img block h-320px src="../resources/intro-of-job-source.png" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<el-button type="text" font-size-12px
|
||||||
|
><span><QuestionFilled w-1em h-1em mr2px /></span
|
||||||
|
>下方展示的各条目与Boss直聘界面对应关系是怎样的?</el-button
|
||||||
|
>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div font-size-12px>
|
||||||
|
拖放条目前方的手柄以调整职位来源查找顺序;点击条目前方的开关以启用/禁用对应的职位来源
|
||||||
|
</div>
|
||||||
|
<JobSourceDragOrderer
|
||||||
|
v-model="formContent.__jobSourceList"
|
||||||
|
class="job-source-drag-orderer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -729,7 +754,9 @@
|
|||||||
{{ getJobDetailRegExpMatchLogicConfig().logicText }}
|
{{ getJobDetailRegExpMatchLogicConfig().logicText }}
|
||||||
</div>
|
</div>
|
||||||
<el-form-item mb0 prop="expectJobTypeRegExpStr">
|
<el-form-item mb0 prop="expectJobTypeRegExpStr">
|
||||||
<div font-size-12px>职位类型正则(推荐填写,不区分大小写)</div>
|
<div ref="jobDetailRegExpSectionEl" font-size-12px>
|
||||||
|
职位类型正则(推荐填写,不区分大小写)
|
||||||
|
</div>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formContent.expectJobTypeRegExpStr"
|
v-model="formContent.expectJobTypeRegExpStr"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
@@ -1052,6 +1079,8 @@ electron.ipcRenderer.invoke('fetch-config-file-content').then((res) => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const jobSourceFormItemSectionEl = ref()
|
||||||
|
const jobDetailRegExpSectionEl = ref()
|
||||||
const formRules = {
|
const formRules = {
|
||||||
expectJobNameRegExpStr: {
|
expectJobNameRegExpStr: {
|
||||||
validator(_, value, cb) {
|
validator(_, value, cb) {
|
||||||
@@ -1066,6 +1095,7 @@ const formRules = {
|
|||||||
cb()
|
cb()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
cb(new Error(`正则无效:${err?.message}`))
|
cb(new Error(`正则无效:${err?.message}`))
|
||||||
|
jobDetailRegExpSectionEl.value?.scrollIntoViewIfNeeded()
|
||||||
gtagRenderer('invalid_reg_exp_for_expect_job_name')
|
gtagRenderer('invalid_reg_exp_for_expect_job_name')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1083,6 +1113,7 @@ const formRules = {
|
|||||||
cb()
|
cb()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
cb(new Error(`正则无效:${err?.message}`))
|
cb(new Error(`正则无效:${err?.message}`))
|
||||||
|
jobDetailRegExpSectionEl.value?.scrollIntoViewIfNeeded()
|
||||||
gtagRenderer('invalid_reg_exp_for_expect_job_type')
|
gtagRenderer('invalid_reg_exp_for_expect_job_type')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1100,9 +1131,41 @@ const formRules = {
|
|||||||
cb()
|
cb()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
cb(new Error(`正则无效:${err?.message}`))
|
cb(new Error(`正则无效:${err?.message}`))
|
||||||
|
jobDetailRegExpSectionEl.value?.scrollIntoViewIfNeeded()
|
||||||
gtagRenderer('invalid_reg_exp_for_expect_job_desc')
|
gtagRenderer('invalid_reg_exp_for_expect_job_desc')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
__jobSourceList: {
|
||||||
|
trigger: null,
|
||||||
|
validator(_, value, cb) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
cb()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (value.every((it) => !it.enabled)) {
|
||||||
|
cb(new Error(`将上方任一来源设置为“启用”后才能继续`))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const configMap = {}
|
||||||
|
for (const config of value) {
|
||||||
|
if (configMap[config.type]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
configMap[config.type] = config
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!configMap.expect.enabled &&
|
||||||
|
!configMap.recommend.enabled &&
|
||||||
|
configMap.search.enabled &&
|
||||||
|
!configMap.search?.children?.some((it) => it.enabled && it.keyword?.trim())
|
||||||
|
) {
|
||||||
|
cb(new Error(`将上方任一来源设置为“启用”后才能继续`))
|
||||||
|
jobSourceFormItemSectionEl.value?.scrollIntoViewIfNeeded()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1500,20 +1563,18 @@ function formatJobSourceConfigToFormValue(config = []) {
|
|||||||
|
|
||||||
return config.map((outerItem) => {
|
return config.map((outerItem) => {
|
||||||
return {
|
return {
|
||||||
item: outerItem,
|
...outerItem,
|
||||||
label: typeToNameKey[outerItem.type],
|
label: typeToNameKey[outerItem.type]
|
||||||
children:
|
|
||||||
outerItem.children && outerItem.type === 'search'
|
|
||||||
? (outerItem.children || []).map((innerItem) => ({
|
|
||||||
item: innerItem
|
|
||||||
}))
|
|
||||||
: null
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatJobSourceFormValueToConfig(formValue = []) {
|
function formatJobSourceFormValueToConfig(formValue = []) {
|
||||||
return formValue.map((it) => it.item)
|
return formValue.map((it) => {
|
||||||
|
it = { ...it }
|
||||||
|
delete it.label
|
||||||
|
return it
|
||||||
|
})
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -1579,5 +1640,25 @@ function formatJobSourceFormValueToConfig(formValue = []) {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.2em;
|
line-height: 1.2em;
|
||||||
}
|
}
|
||||||
|
.job-source-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
.job-source-drag-orderer {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid var(--el-card-border-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
&.is-error {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
.el-input__wrapper {
|
||||||
|
box-shadow: 0 0 0 1px var(--el-border-color) inset;
|
||||||
|
}
|
||||||
|
.job-source-drag-orderer {
|
||||||
|
background-color: var(--el-color-danger-light-9);
|
||||||
|
border: 1px solid var(--el-color-danger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 902 KiB |
Reference in New Issue
Block a user