diff --git a/cmdb-ui/src/components/CMDBFilterComp/expression.vue b/cmdb-ui/src/components/CMDBFilterComp/expression.vue index 3facb3a..57fc851 100644 --- a/cmdb-ui/src/components/CMDBFilterComp/expression.vue +++ b/cmdb-ui/src/components/CMDBFilterComp/expression.vue @@ -106,7 +106,7 @@ <CIReferenceAttr v-if="getAttr(item.property).is_reference && (item.exp === 'is' || item.exp === '~is')" :style="{ width: '175px' }" - class="select-filter-component" + class="select-filter-component ops-select-bg" :referenceTypeId="getAttr(item.property).reference_type_id" :disabled="disabled" v-model="item.value" @@ -114,7 +114,7 @@ <a-select v-else-if="getAttr(item.property).is_bool && (item.exp === 'is' || item.exp === '~is')" v-model="item.value" - class="select-filter-component" + class="select-filter-component ops-select-bg" :style="{ width: '175px' }" :disabled="disabled" :placeholder="$t('placeholder2')" @@ -398,7 +398,6 @@ export default { /deep/ .ant-select-selection { height: 24px; - background: #f7f8fa; line-height: 24px; border: none; diff --git a/cmdb-ui/src/components/CMDBFilterComp/index.vue b/cmdb-ui/src/components/CMDBFilterComp/index.vue index 0a0f327..96fcff8 100644 --- a/cmdb-ui/src/components/CMDBFilterComp/index.vue +++ b/cmdb-ui/src/components/CMDBFilterComp/index.vue @@ -1,302 +1,302 @@ -<template> - <div> - <a-popover - v-if="isDropdown" - v-model="visible" - trigger="click" - :placement="placement" - overlayClassName="table-filter" - @visibleChange="visibleChange" - > - <slot name="popover_item"> - <a-button type="primary" ghost>{{ $t('cmdbFilterComp.conditionFilter') }}<a-icon type="filter"/></a-button> - </slot> - <template slot="content"> - <Expression - :needAddHere="needAddHere" - v-model="ruleList" - :canSearchPreferenceAttrList="canSearchPreferenceAttrList.filter((attr) => !attr.is_password)" - :disabled="disabled" - /> - <a-divider :style="{ margin: '10px 0' }" /> - <div style="width:554px"> - <a-space :style="{ display: 'flex', justifyContent: 'flex-end' }"> - <a-button type="primary" size="small" @click="handleSubmit">{{ $t('confirm') }}</a-button> - <a-button size="small" @click="handleClear">{{ $t('clear') }}</a-button> - </a-space> - </div> - </template> - </a-popover> - <Expression - :needAddHere="needAddHere" - v-else - v-model="ruleList" - :canSearchPreferenceAttrList="canSearchPreferenceAttrList.filter((attr) => !attr.is_password)" - :disabled="disabled" - /> - </div> -</template> - -<script> -import { v4 as uuidv4 } from 'uuid' -import Expression from './expression.vue' -import { advancedExpList, compareTypeList } from './constants' - -export default { - name: 'FilterComp', - components: { Expression }, - props: { - canSearchPreferenceAttrList: { - type: Array, - required: true, - default: () => [], - }, - expression: { - type: String, - default: '', - }, - regQ: { - type: String, - default: '(?<=q=).+(?=&)|(?<=q=).+$', - }, - placement: { - type: String, - default: 'bottomRight', - }, - isDropdown: { - type: Boolean, - default: true, - }, - needAddHere: { - type: Boolean, - default: false, - }, - disabled: { - type: Boolean, - default: false, - }, - }, - data() { - return { - advancedExpList, - compareTypeList, - visible: false, - ruleList: [], - filterExp: '', - } - }, - - methods: { - visibleChange(open, isInitOne = true) { - // isInitOne 初始化exp为空时,ruleList是否默认给一条 - // const regQ = /(?<=q=).+(?=&)|(?<=q=).+$/g - const exp = this.expression.match(new RegExp(this.regQ, 'g')) - ? this.expression.match(new RegExp(this.regQ, 'g'))[0] - : null - if (open && exp) { - const expArray = exp.split(',').map((item) => { - let has_not = '' - const key = item.split(':')[0] - const val = item - .split(':') - .slice(1) - .join(':') - let type, property, exp, value, min, max, compareType - if (key.includes('-')) { - type = 'or' - if (key.includes('~')) { - property = key.substring(2) - has_not = '~' - } else { - property = key.substring(1) - } - } else { - type = 'and' - if (key.includes('~')) { - property = key.substring(1) - has_not = '~' - } else { - property = key - } - } - - const in_reg = /(?<=\().+(?=\))/g - const range_reg = /(?<=\[).+(?=\])/g - const compare_reg = /(?<=>=|<=|>(?!=)|<(?!=)).+/ - if (val === '*') { - exp = has_not + 'value' - value = '' - } else if (in_reg.test(val)) { - exp = has_not + 'in' - value = val.match(in_reg)[0] - } else if (range_reg.test(val)) { - exp = has_not + 'range' - value = val.match(range_reg)[0] - min = value.split('_TO_')[0] - max = value.split('_TO_')[1] - } else if (compare_reg.test(val)) { - exp = has_not + 'compare' - value = val.match(compare_reg)[0] - const _compareType = val.substring(0, val.match(compare_reg)['index']) - const idx = compareTypeList.findIndex((item) => item.label === _compareType) - compareType = compareTypeList[idx].value - } else if (!val.includes('*')) { - exp = has_not + 'is' - value = val - } else { - const resList = [ - ['contain', /(?<=\*).*(?=\*)/g], - ['end_with', /(?<=\*).+/g], - ['start_with', /.+(?=\*)/g], - ] - for (let i = 0; i < 3; i++) { - const reg = resList[i] - if (reg[1].test(val)) { - exp = has_not + reg[0] - value = val.match(reg[1])[0] - break - } - } - } - return { - id: uuidv4(), - type, - property, - exp, - value, - min, - max, - compareType, - } - }) - this.ruleList = [...expArray] - } else if (open) { - const _canSearchPreferenceAttrList = this.canSearchPreferenceAttrList.filter((attr) => !attr.is_password) - this.ruleList = isInitOne - ? [ - { - id: uuidv4(), - type: 'and', - property: - _canSearchPreferenceAttrList && _canSearchPreferenceAttrList.length - ? _canSearchPreferenceAttrList[0].name - : undefined, - exp: 'is', - value: null, - }, - ] - : [] - } - }, - handleClear() { - this.ruleList = [ - { - id: uuidv4(), - type: 'and', - property: this.canSearchPreferenceAttrList[0].name, - exp: 'is', - value: null, - }, - ] - this.filterExp = '' - this.visible = false - this.$emit('setExpFromFilter', this.filterExp) - }, - handleSubmit() { - if (this.ruleList && this.ruleList.length) { - this.ruleList[0].type = 'and' // 增删后,以防万一第一个不是and - this.filterExp = '' - const expList = this.ruleList.map((rule) => { - let singleRuleExp = '' - let _exp = rule.exp - if (rule.type === 'or') { - singleRuleExp += '-' - } - if (rule.exp.includes('~')) { - singleRuleExp += '~' - _exp = rule.exp.split('~')[1] - } - singleRuleExp += `${rule.property}:` - if (_exp === 'is') { - singleRuleExp += `${rule.value ?? ''}` - } - if (_exp === 'contain') { - singleRuleExp += `*${rule.value ?? ''}*` - } - if (_exp === 'start_with') { - singleRuleExp += `${rule.value ?? ''}*` - } - if (_exp === 'end_with') { - singleRuleExp += `*${rule.value ?? ''}` - } - if (_exp === 'value') { - singleRuleExp += `*` - } - if (_exp === 'in') { - singleRuleExp += `(${rule.value ?? ''})` - } - if (_exp === 'range') { - singleRuleExp += `[${rule.min}_TO_${rule.max}]` - } - if (_exp === 'compare') { - const idx = compareTypeList.findIndex((item) => item.value === rule.compareType) - singleRuleExp += `${compareTypeList[idx].label}${rule.value ?? ''}` - } - return singleRuleExp - }) - this.filterExp = expList.join(',') - this.$emit('setExpFromFilter', this.filterExp) - } else { - this.$emit('setExpFromFilter', '') - } - this.visible = false - }, - }, -} -</script> - -<style lang="less" scoped> -.table-filter { - .table-filter-add { - margin-top: 10px; - & > a { - padding: 2px 8px; - &:hover { - background-color: #f0faff; - border-radius: 5px; - } - } - } - .table-filter-extra-icon { - padding: 0px 2px; - &:hover { - display: inline-block; - border-radius: 5px; - background-color: #f0faff; - } - } -} -</style> - -<style lang="less"> -.table-filter-extra-operation { - .ant-popover-inner-content { - padding: 3px 4px; - .operation { - cursor: pointer; - width: 90px; - height: 30px; - line-height: 30px; - padding: 3px 4px; - border-radius: 5px; - transition: all 0.3s; - &:hover { - background-color: #f0faff; - } - > .anticon { - margin-right: 10px; - } - } - } -} -</style> +<template> + <div> + <a-popover + v-if="isDropdown" + v-model="visible" + trigger="click" + :placement="placement" + overlayClassName="table-filter" + @visibleChange="visibleChange" + > + <slot name="popover_item"> + <a-button type="primary" ghost>{{ $t('cmdbFilterComp.conditionFilter') }}<a-icon type="filter"/></a-button> + </slot> + <template slot="content"> + <Expression + :needAddHere="needAddHere" + v-model="ruleList" + :canSearchPreferenceAttrList="canSearchPreferenceAttrList.filter((attr) => !attr.is_password)" + :disabled="disabled" + /> + <a-divider :style="{ margin: '10px 0' }" /> + <div style="width:554px"> + <a-space :style="{ display: 'flex', justifyContent: 'flex-end' }"> + <a-button type="primary" size="small" @click="handleSubmit">{{ $t('confirm') }}</a-button> + <a-button size="small" @click="handleClear">{{ $t('clear') }}</a-button> + </a-space> + </div> + </template> + </a-popover> + <Expression + :needAddHere="needAddHere" + v-else + v-model="ruleList" + :canSearchPreferenceAttrList="canSearchPreferenceAttrList.filter((attr) => !attr.is_password)" + :disabled="disabled" + /> + </div> +</template> + +<script> +import { v4 as uuidv4 } from 'uuid' +import Expression from './expression.vue' +import { advancedExpList, compareTypeList } from './constants' + +export default { + name: 'FilterComp', + components: { Expression }, + props: { + canSearchPreferenceAttrList: { + type: Array, + required: true, + default: () => [], + }, + expression: { + type: String, + default: '', + }, + regQ: { + type: String, + default: '(?<=q=).+(?=&)|(?<=q=).+$', + }, + placement: { + type: String, + default: 'bottomRight', + }, + isDropdown: { + type: Boolean, + default: true, + }, + needAddHere: { + type: Boolean, + default: false, + }, + disabled: { + type: Boolean, + default: false, + }, + }, + data() { + return { + advancedExpList, + compareTypeList, + visible: false, + ruleList: [], + filterExp: '', + } + }, + + methods: { + visibleChange(open, isInitOne = true) { + // isInitOne 初始化exp为空时,ruleList是否默认给一条 + // const regQ = /(?<=q=).+(?=&)|(?<=q=).+$/g + const exp = this.expression.match(new RegExp(this.regQ, 'g')) + ? this.expression.match(new RegExp(this.regQ, 'g'))[0] + : null + if (open && exp) { + const expArray = exp.split(',').map((item) => { + let has_not = '' + const key = item.split(':')[0] + const val = item + .split(':') + .slice(1) + .join(':') + let type, property, exp, value, min, max, compareType + if (key.includes('-')) { + type = 'or' + if (key.includes('~')) { + property = key.substring(2) + has_not = '~' + } else { + property = key.substring(1) + } + } else { + type = 'and' + if (key.includes('~')) { + property = key.substring(1) + has_not = '~' + } else { + property = key + } + } + + const in_reg = /(?<=\().+(?=\))/g + const range_reg = /(?<=\[).+(?=\])/g + const compare_reg = /(?<=>=|<=|>(?!=)|<(?!=)).+/ + if (val === '*') { + exp = has_not + 'value' + value = '' + } else if (in_reg.test(val)) { + exp = has_not + 'in' + value = val.match(in_reg)[0] + } else if (range_reg.test(val)) { + exp = has_not + 'range' + value = val.match(range_reg)[0] + min = value.split('_TO_')[0] + max = value.split('_TO_')[1] + } else if (compare_reg.test(val)) { + exp = has_not + 'compare' + value = val.match(compare_reg)[0] + const _compareType = val.substring(0, val.match(compare_reg)['index']) + const idx = compareTypeList.findIndex((item) => item.label === _compareType) + compareType = compareTypeList[idx].value + } else if (!val.includes('*')) { + exp = has_not + 'is' + value = val + } else { + const resList = [ + ['contain', /(?<=\*).*(?=\*)/g], + ['end_with', /(?<=\*).+/g], + ['start_with', /.+(?=\*)/g], + ] + for (let i = 0; i < 3; i++) { + const reg = resList[i] + if (reg[1].test(val)) { + exp = has_not + reg[0] + value = val.match(reg[1])[0] + break + } + } + } + return { + id: uuidv4(), + type, + property, + exp, + value, + min, + max, + compareType, + } + }) + this.ruleList = [...expArray] + } else if (open) { + const _canSearchPreferenceAttrList = this.canSearchPreferenceAttrList.filter((attr) => !attr.is_password) + this.ruleList = isInitOne + ? [ + { + id: uuidv4(), + type: 'and', + property: + _canSearchPreferenceAttrList && _canSearchPreferenceAttrList.length + ? _canSearchPreferenceAttrList[0].name + : undefined, + exp: 'is', + value: null, + }, + ] + : [] + } + }, + handleClear() { + this.ruleList = [ + { + id: uuidv4(), + type: 'and', + property: this.canSearchPreferenceAttrList[0].name, + exp: 'is', + value: null, + }, + ] + this.filterExp = '' + this.visible = false + this.$emit('setExpFromFilter', this.filterExp) + }, + handleSubmit() { + if (this.ruleList && this.ruleList.length) { + this.ruleList[0].type = 'and' // 增删后,以防万一第一个不是and + this.filterExp = '' + const expList = this.ruleList.map((rule) => { + let singleRuleExp = '' + let _exp = rule.exp + if (rule.type === 'or') { + singleRuleExp += '-' + } + if (rule.exp.includes('~')) { + singleRuleExp += '~' + _exp = rule.exp.split('~')[1] + } + singleRuleExp += `${rule.property}:` + if (_exp === 'is') { + singleRuleExp += `${rule.value ?? ''}` + } + if (_exp === 'contain') { + singleRuleExp += `*${rule.value ?? ''}*` + } + if (_exp === 'start_with') { + singleRuleExp += `${rule.value ?? ''}*` + } + if (_exp === 'end_with') { + singleRuleExp += `*${rule.value ?? ''}` + } + if (_exp === 'value') { + singleRuleExp += `*` + } + if (_exp === 'in') { + singleRuleExp += `(${rule.value ?? ''})` + } + if (_exp === 'range') { + singleRuleExp += `[${rule.min}_TO_${rule.max}]` + } + if (_exp === 'compare') { + const idx = compareTypeList.findIndex((item) => item.value === rule.compareType) + singleRuleExp += `${compareTypeList[idx].label}${rule.value ?? ''}` + } + return singleRuleExp + }) + this.filterExp = expList.join(',') + this.$emit('setExpFromFilter', this.filterExp) + } else { + this.$emit('setExpFromFilter', '') + } + this.visible = false + }, + }, +} +</script> + +<style lang="less" scoped> +.table-filter { + .table-filter-add { + margin-top: 10px; + & > a { + padding: 2px 8px; + &:hover { + background-color: @primary-color_5; + border-radius: 5px; + } + } + } + .table-filter-extra-icon { + padding: 0px 2px; + &:hover { + display: inline-block; + border-radius: 5px; + background-color: #f0faff; + } + } +} +</style> + +<style lang="less"> +.table-filter-extra-operation { + .ant-popover-inner-content { + padding: 3px 4px; + .operation { + cursor: pointer; + width: 90px; + height: 30px; + line-height: 30px; + padding: 3px 4px; + border-radius: 5px; + transition: all 0.3s; + &:hover { + background-color: #f0faff; + } + > .anticon { + margin-right: 10px; + } + } + } +} +</style> diff --git a/cmdb-ui/src/components/Crontab/Crontab.vue b/cmdb-ui/src/components/Crontab/Crontab.vue index 3576627..96345b5 100644 --- a/cmdb-ui/src/components/Crontab/Crontab.vue +++ b/cmdb-ui/src/components/Crontab/Crontab.vue @@ -341,7 +341,7 @@ export default { }, } </script> -<style scoped> +<style lang="less" scoped> .pop_btn { text-align: right; margin-top: 24px; diff --git a/cmdb-ui/src/modules/acl/views/module/resourceGroupModal.vue b/cmdb-ui/src/modules/acl/views/module/resourceGroupModal.vue index 62fbf7a..4d3f63f 100644 --- a/cmdb-ui/src/modules/acl/views/module/resourceGroupModal.vue +++ b/cmdb-ui/src/modules/acl/views/module/resourceGroupModal.vue @@ -226,16 +226,16 @@ export default { right: 4px; display: none; &:hover { - color: #1f78d1; + color: @primary-color; } } &:hover .ant-transfer-list-icon { display: inline; - background-color: #c0eaff; + background-color: @primary-color_4; border-radius: 4px; } } .ant-transfer-list-content-item-selected { - background-color: #f0faff; + background-color: ~'@{primary-color_8}35'; } </style> diff --git a/cmdb-ui/src/modules/acl/views/roles.vue b/cmdb-ui/src/modules/acl/views/roles.vue index d9bfe35..6332251 100644 --- a/cmdb-ui/src/modules/acl/views/roles.vue +++ b/cmdb-ui/src/modules/acl/views/roles.vue @@ -58,10 +58,7 @@ :title="$t('acl.visualRole')" :width="120" align="center" - :filters="[ - { label: $t('yes'), value: 1 }, - { label: $t('no'), value: 0 }, - ]" + :filters="visualRoleFilters" :filterMultiple="false" :filter-method=" ({ value, row }) => { @@ -155,6 +152,10 @@ export default { pageSizeOptions: ['20', '50', '100', '200'], searchName: '', filterTableValue: { user_role: 1, user_only: 0 }, + visualRoleFilters: [ + { label: this.$t('yes'), value: 1 }, + { label: this.$t('no'), value: 0 } + ] } }, computed: { diff --git a/cmdb-ui/src/modules/cmdb/components/attrMapTable/index.vue b/cmdb-ui/src/modules/cmdb/components/attrMapTable/index.vue index 815d507..19cd3e0 100644 --- a/cmdb-ui/src/modules/cmdb/components/attrMapTable/index.vue +++ b/cmdb-ui/src/modules/cmdb/components/attrMapTable/index.vue @@ -187,7 +187,7 @@ export default { width: 12px; height: 12px; background-color: @primary-color; - border: solid 3px #E2E7FC; + border: solid 3px @primary-color_4; border-radius: 50%; } diff --git a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/ciTypeGrant.vue b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/ciTypeGrant.vue index 85bcaa5..0c7b93a 100644 --- a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/ciTypeGrant.vue +++ b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/ciTypeGrant.vue @@ -1,150 +1,156 @@ -<template> - <div class="ci-type-grant"> - <vxe-table - ref="xTable" - size="mini" - stripe - class="ops-stripe-table" - :data="filterTableData" - :max-height="`${tableHeight}px`" - :row-style="(params) => getCurrentRowStyle(params, addedRids)" - > - <vxe-column field="name"></vxe-column> - <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> - <template #default="{row}"> - <ReadCheckbox - v-if="['read'].includes(col.split('_')[0])" - :value="row[col.split('_')[0]]" - :valueKey="col" - :rid="row.rid" - @openReadGrantModal="() => openReadGrantModal(col, row)" - /> - <a-checkbox v-else-if="col === 'grant'" :checked="row[col]" @click="clickGrant(col, row)"></a-checkbox> - <a-checkbox @change="(e) => handleChange(e, col, row)" v-else v-model="row[col]"></a-checkbox> - </template> - </vxe-column> - <template #empty> - <div v-if="loading()" style="height: 200px; line-height: 200px;color:#2F54EB"> - <a-icon type="loading" /> {{ $t('loading') }} - </div> - <div v-else> - <img :style="{ width: '100px' }" :src="require('@/assets/data_empty.png')" /> - <div>{{ $t('noData') }}</div> - </div> - </template> - </vxe-table> - <a-space> - <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> - <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> - </a-space> - </div> -</template> - -<script> -import _ from 'lodash' -import { permMap } from './constants.js' -import { grantCiType, revokeCiType } from '../../api/CIType' -import ReadCheckbox from './readCheckbox.vue' -import { getCurrentRowStyle } from './utils' - -export default { - name: 'CiTypeGrant', - components: { ReadCheckbox }, - inject: ['loading', 'isModal'], - props: { - CITypeId: { - type: Number, - default: null, - }, - tableData: { - type: Array, - default: () => [], - }, - grantType: { - type: String, - default: 'ci_type', - }, - addedRids: { - type: Array, - default: () => [], - }, - }, - computed: { - filterTableData() { - const _tableData = this.tableData.filter((data) => { - const _intersection = _.intersection( - Object.keys(data), - this.columns.map((col) => col.split('_')[0]) - ) - return _intersection && _intersection.length - }) - return _.uniqBy(_tableData, (item) => item.rid) - }, - columns() { - if (this.grantType === 'ci_type') { - return ['config', 'grant'] - } - return ['read_attr', 'read_ci', 'create', 'update', 'delete'] - }, - windowHeight() { - return this.$store.state.windowHeight - }, - tableHeight() { - if (this.isModal) { - return (this.windowHeight - 104) / 2 - } - return (this.windowHeight - 104) / 2 - 116 - }, - permMap() { - return permMap() - } - }, - methods: { - getCurrentRowStyle, - async handleChange(e, col, row) { - if (e.target.checked) { - await grantCiType(this.CITypeId, row.rid, { perms: [col] }).catch(() => { - this.$emit('getTableData') - }) - } else { - await revokeCiType(this.CITypeId, row.rid, { perms: [col] }).catch(() => { - this.$emit('getTableData') - }) - } - }, - grantDepart() { - this.$emit('grantDepart', this.grantType) - }, - grantRole() { - this.$emit('grantRole', this.grantType) - }, - openReadGrantModal(col, row) { - this.$emit('openReadGrantModal', col, row) - }, - clickGrant(col, row, rowIndex) { - if (!row[col]) { - this.handleChange({ target: { checked: true } }, col, row) - const _idx = this.tableData.findIndex((item) => item.rid === row.rid) - this.$set(this.tableData, _idx, { ...this.tableData[_idx], grant: true }) - } else { - const that = this - this.$confirm({ - title: that.$t('warning'), - content: that.$t('cmdb.components.confirmRevoke', { name: `${row.name}` }), - onOk() { - that.handleChange({ target: { checked: false } }, col, row) - const _idx = that.tableData.findIndex((item) => item.rid === row.rid) - that.$set(that.tableData, _idx, { ...that.tableData[_idx], grant: false }) - }, - }) - } - }, - }, -} -</script> - -<style lang="less" scoped> -.ci-type-grant { - padding: 10px 0; -} -</style> +<template> + <div class="ci-type-grant"> + <vxe-table + ref="xTable" + size="mini" + stripe + class="ops-stripe-table" + :data="filterTableData" + :max-height="`${tableHeight}px`" + :row-class-name="(params) => getCurrentRowClass(params, addedRids)" + > + <vxe-column field="name"></vxe-column> + <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> + <template #default="{row}"> + <ReadCheckbox + v-if="['read'].includes(col.split('_')[0])" + :value="row[col.split('_')[0]]" + :valueKey="col" + :rid="row.rid" + @openReadGrantModal="() => openReadGrantModal(col, row)" + /> + <a-checkbox v-else-if="col === 'grant'" :checked="row[col]" @click="clickGrant(col, row)"></a-checkbox> + <a-checkbox @change="(e) => handleChange(e, col, row)" v-else v-model="row[col]"></a-checkbox> + </template> + </vxe-column> + <template #empty> + <div v-if="loading()" class="ci-type-grant-loading"> + <a-icon type="loading" /> {{ $t('loading') }} + </div> + <div v-else> + <img :style="{ width: '100px' }" :src="require('@/assets/data_empty.png')" /> + <div>{{ $t('noData') }}</div> + </div> + </template> + </vxe-table> + <a-space> + <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> + <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> + </a-space> + </div> +</template> + +<script> +import _ from 'lodash' +import { permMap } from './constants.js' +import { grantCiType, revokeCiType } from '../../api/CIType' +import ReadCheckbox from './readCheckbox.vue' +import { getCurrentRowClass } from './utils' + +export default { + name: 'CiTypeGrant', + components: { ReadCheckbox }, + inject: ['loading', 'isModal'], + props: { + CITypeId: { + type: Number, + default: null, + }, + tableData: { + type: Array, + default: () => [], + }, + grantType: { + type: String, + default: 'ci_type', + }, + addedRids: { + type: Array, + default: () => [], + }, + }, + computed: { + filterTableData() { + const _tableData = this.tableData.filter((data) => { + const _intersection = _.intersection( + Object.keys(data), + this.columns.map((col) => col.split('_')[0]) + ) + return _intersection && _intersection.length + }) + return _.uniqBy(_tableData, (item) => item.rid) + }, + columns() { + if (this.grantType === 'ci_type') { + return ['config', 'grant'] + } + return ['read_attr', 'read_ci', 'create', 'update', 'delete'] + }, + windowHeight() { + return this.$store.state.windowHeight + }, + tableHeight() { + if (this.isModal) { + return (this.windowHeight - 104) / 2 + } + return (this.windowHeight - 104) / 2 - 116 + }, + permMap() { + return permMap() + } + }, + methods: { + getCurrentRowClass, + async handleChange(e, col, row) { + if (e.target.checked) { + await grantCiType(this.CITypeId, row.rid, { perms: [col] }).catch(() => { + this.$emit('getTableData') + }) + } else { + await revokeCiType(this.CITypeId, row.rid, { perms: [col] }).catch(() => { + this.$emit('getTableData') + }) + } + }, + grantDepart() { + this.$emit('grantDepart', this.grantType) + }, + grantRole() { + this.$emit('grantRole', this.grantType) + }, + openReadGrantModal(col, row) { + this.$emit('openReadGrantModal', col, row) + }, + clickGrant(col, row, rowIndex) { + if (!row[col]) { + this.handleChange({ target: { checked: true } }, col, row) + const _idx = this.tableData.findIndex((item) => item.rid === row.rid) + this.$set(this.tableData, _idx, { ...this.tableData[_idx], grant: true }) + } else { + const that = this + this.$confirm({ + title: that.$t('warning'), + content: that.$t('cmdb.components.confirmRevoke', { name: `${row.name}` }), + onOk() { + that.handleChange({ target: { checked: false } }, col, row) + const _idx = that.tableData.findIndex((item) => item.rid === row.rid) + that.$set(that.tableData, _idx, { ...that.tableData[_idx], grant: false }) + }, + }) + } + }, + }, +} +</script> + +<style lang="less" scoped> +.ci-type-grant { + padding: 10px 0; + + &-loading { + height: 200px; + line-height: 200px; + color: @primary-color; + } +} +</style> diff --git a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/grantComp.vue b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/grantComp.vue index bc10e44..6f71498 100644 --- a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/grantComp.vue +++ b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/grantComp.vue @@ -366,5 +366,9 @@ export default { .btn-wave-hover(@primary-color_4, -1); } + + .grant-table-row-focus { + background-color: @primary-color_8; + } } </style> diff --git a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/relationViewGrant.vue b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/relationViewGrant.vue index ddddb5a..57c1f25 100644 --- a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/relationViewGrant.vue +++ b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/relationViewGrant.vue @@ -1,98 +1,98 @@ -<template> - <div class="ci-relation-grant"> - <vxe-table - ref="xTable" - size="mini" - stripe - class="ops-stripe-table" - :data="tableData" - :max-height="`${tableHeight}px`" - :row-style="(params) => getCurrentRowStyle(params, addedRids)" - > - <vxe-column field="name"></vxe-column> - <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> - <template #default="{row}"> - <a-checkbox @change="(e) => handleChange(e, col, row)" v-model="row[col]"></a-checkbox> - </template> - </vxe-column> - </vxe-table> - <a-space> - <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> - <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> - </a-space> - </div> -</template> - -<script> -import { permMap } from './constants.js' -import { grantRelationView, revokeRelationView } from '../../api/preference.js' -import { getCurrentRowStyle } from './utils' - -export default { - name: 'RelationViewGrant', - inject: ['loading', 'isModal'], - props: { - resourceTypeName: { - type: String, - default: '', - }, - tableData: { - type: Array, - default: () => [], - }, - grantType: { - type: String, - default: 'relation_view', - }, - addedRids: { - type: Array, - default: () => [], - }, - }, - data() { - return { - columns: ['read', 'grant'], - } - }, - computed: { - windowHeight() { - return this.$store.state.windowHeight - }, - tableHeight() { - if (this.isModal) { - return (this.windowHeight - 104) / 2 - } - return (this.windowHeight - 104) / 2 - 116 - }, - permMap() { - return permMap() - } - }, - methods: { - getCurrentRowStyle, - grantDepart() { - this.$emit('grantDepart', this.grantType) - }, - grantRole() { - this.$emit('grantRole', this.grantType) - }, - handleChange(e, col, row) { - if (e.target.checked) { - grantRelationView(row.rid, { perms: [col], name: this.resourceTypeName }).catch(() => { - this.$emit('getTableData') - }) - } else { - revokeRelationView(row.rid, { perms: [col], name: this.resourceTypeName }).catch(() => { - this.$emit('getTableData') - }) - } - }, - }, -} -</script> - -<style lang="less" scoped> -.ci-relation-grant { - padding: 10px 0; -} -</style> +<template> + <div class="ci-relation-grant"> + <vxe-table + ref="xTable" + size="mini" + stripe + class="ops-stripe-table" + :data="tableData" + :max-height="`${tableHeight}px`" + :row-class-name="(params) => getCurrentRowClass(params, addedRids)" + > + <vxe-column field="name"></vxe-column> + <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> + <template #default="{row}"> + <a-checkbox @change="(e) => handleChange(e, col, row)" v-model="row[col]"></a-checkbox> + </template> + </vxe-column> + </vxe-table> + <a-space> + <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> + <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> + </a-space> + </div> +</template> + +<script> +import { permMap } from './constants.js' +import { grantRelationView, revokeRelationView } from '../../api/preference.js' +import { getCurrentRowClass } from './utils' + +export default { + name: 'RelationViewGrant', + inject: ['loading', 'isModal'], + props: { + resourceTypeName: { + type: String, + default: '', + }, + tableData: { + type: Array, + default: () => [], + }, + grantType: { + type: String, + default: 'relation_view', + }, + addedRids: { + type: Array, + default: () => [], + }, + }, + data() { + return { + columns: ['read', 'grant'], + } + }, + computed: { + windowHeight() { + return this.$store.state.windowHeight + }, + tableHeight() { + if (this.isModal) { + return (this.windowHeight - 104) / 2 + } + return (this.windowHeight - 104) / 2 - 116 + }, + permMap() { + return permMap() + } + }, + methods: { + getCurrentRowClass, + grantDepart() { + this.$emit('grantDepart', this.grantType) + }, + grantRole() { + this.$emit('grantRole', this.grantType) + }, + handleChange(e, col, row) { + if (e.target.checked) { + grantRelationView(row.rid, { perms: [col], name: this.resourceTypeName }).catch(() => { + this.$emit('getTableData') + }) + } else { + revokeRelationView(row.rid, { perms: [col], name: this.resourceTypeName }).catch(() => { + this.$emit('getTableData') + }) + } + }, + }, +} +</script> + +<style lang="less" scoped> +.ci-relation-grant { + padding: 10px 0; +} +</style> diff --git a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/topologyViewGrant.vue b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/topologyViewGrant.vue index 7c5e3ca..4f10e71 100644 --- a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/topologyViewGrant.vue +++ b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/topologyViewGrant.vue @@ -8,7 +8,7 @@ :data="tableData" :max-height="`${tableHeight}px`" :scroll-y="{enabled: true}" - :row-style="(params) => getCurrentRowStyle(params, addedRids)" + :row-class-name="(params) => getCurrentRowClass(params, addedRids)" > <vxe-column field="name"></vxe-column> <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> @@ -27,7 +27,7 @@ <script> import { permMap } from './constants.js' import { grantTopologyView, revokeTopologyView } from '@/modules/cmdb/api/topology.js' -import { getCurrentRowStyle } from './utils' +import { getCurrentRowClass } from './utils' export default { name: 'TopologyViewGrant', inject: ['loading', 'isModal'], @@ -73,7 +73,7 @@ export default { } }, methods: { - getCurrentRowStyle, + getCurrentRowClass, grantDepart() { this.$emit('grantDepart', this.grantType) }, diff --git a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/typeRelationGrant.vue b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/typeRelationGrant.vue index 2f5fdb3..4625cb3 100644 --- a/cmdb-ui/src/modules/cmdb/components/cmdbGrant/typeRelationGrant.vue +++ b/cmdb-ui/src/modules/cmdb/components/cmdbGrant/typeRelationGrant.vue @@ -1,100 +1,100 @@ -<template> - <div class="ci-relation-grant"> - <vxe-table - ref="xTable" - size="mini" - stripe - class="ops-stripe-table" - :data="tableData" - :max-height="`${tableHeight}px`" - :row-style="(params) => getCurrentRowStyle(params, addedRids)" - > - <vxe-column field="name"></vxe-column> - <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> - <template #default="{row}"> - <a-checkbox @change="(e) => handleChange(e, col, row)" v-model="row[col]"></a-checkbox> - </template> - </vxe-column> - </vxe-table> - <a-space> - <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> - <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> - </a-space> - </div> -</template> - -<script> -import { permMap } from './constants.js' -import { grantTypeRelation, revokeTypeRelation } from '../../api/CITypeRelation.js' -import { getCurrentRowStyle } from './utils' - -export default { - name: 'TypeRelationGrant', - inject: ['loading', 'isModal'], - props: { - tableData: { - type: Array, - default: () => [], - }, - grantType: { - type: String, - default: 'type_relation', - }, - typeRelationIds: { - type: Array, - default: null, - }, - addedRids: { - type: Array, - default: () => [], - }, - }, - data() { - return { - columns: ['create', 'grant', 'delete'], - } - }, - computed: { - windowHeight() { - return this.$store.state.windowHeight - }, - tableHeight() { - if (this.isModal) { - return (this.windowHeight - 104) / 2 - } - return (this.windowHeight - 104) / 2 - 116 - }, - permMap() { - return permMap() - } - }, - methods: { - getCurrentRowStyle, - grantDepart() { - this.$emit('grantDepart', this.grantType) - }, - grantRole() { - this.$emit('grantRole', this.grantType) - }, - handleChange(e, col, row) { - const first = this.typeRelationIds[0] - const second = this.typeRelationIds[1] - if (e.target.checked) { - grantTypeRelation(first, second, row.rid, { perms: [col] }).catch(() => { - this.$emit('getTableData') - }) - } else { - revokeTypeRelation(first, second, row.rid, { perms: [col] }).catch(() => { - this.$emit('getTableData') - }) - } - }, - }, -} -</script> - -<style lang="less" scoped> -.ci-relation-grant { - padding: 10px 0; -} -</style> +<template> + <div class="ci-relation-grant"> + <vxe-table + ref="xTable" + size="mini" + stripe + class="ops-stripe-table" + :data="tableData" + :max-height="`${tableHeight}px`" + :row-class-name="(params) => getCurrentRowClass(params, addedRids)" + > + <vxe-column field="name"></vxe-column> + <vxe-column v-for="col in columns" :key="col" :field="col" :title="permMap[col]"> + <template #default="{row}"> + <a-checkbox @change="(e) => handleChange(e, col, row)" v-model="row[col]"></a-checkbox> + </template> + </vxe-column> + </vxe-table> + <a-space> + <span class="grant-button" @click="grantDepart">{{ $t('cmdb.components.grantUser') }}</span> + <span class="grant-button" @click="grantRole">{{ $t('cmdb.components.grantRole') }}</span> + </a-space> + </div> +</template> + +<script> +import { permMap } from './constants.js' +import { grantTypeRelation, revokeTypeRelation } from '../../api/CITypeRelation.js' +import { getCurrentRowClass } from './utils' + +export default { + name: 'TypeRelationGrant', + inject: ['loading', 'isModal'], + props: { + tableData: { + type: Array, + default: () => [], + }, + grantType: { + type: String, + default: 'type_relation', + }, + typeRelationIds: { + type: Array, + default: null, + }, + addedRids: { + type: Array, + default: () => [], + }, + }, + data() { + return { + columns: ['create', 'grant', 'delete'], + } + }, + computed: { + windowHeight() { + return this.$store.state.windowHeight + }, + tableHeight() { + if (this.isModal) { + return (this.windowHeight - 104) / 2 + } + return (this.windowHeight - 104) / 2 - 116 + }, + permMap() { + return permMap() + } + }, + methods: { + getCurrentRowClass, + grantDepart() { + this.$emit('grantDepart', this.grantType) + }, + grantRole() { + this.$emit('grantRole', this.grantType) + }, + handleChange(e, col, row) { + const first = this.typeRelationIds[0] + const second = this.typeRelationIds[1] + if (e.target.checked) { + grantTypeRelation(first, second, row.rid, { perms: [col] }).catch(() => { + this.$emit('getTableData') + }) + } else { + revokeTypeRelation(first, second, row.rid, { perms: [col] }).catch(() => { + this.$emit('getTableData') + }) + } + }, + }, +} +</script> + +<style lang="less" scoped> +.ci-relation-grant { + padding: 10px 0; +} +</style> diff --git a/cmdb-ui/src/modules/cmdb/components/preferenceSearch/preferenceSearch.vue b/cmdb-ui/src/modules/cmdb/components/preferenceSearch/preferenceSearch.vue index e4d438f..39d9c74 100644 --- a/cmdb-ui/src/modules/cmdb/components/preferenceSearch/preferenceSearch.vue +++ b/cmdb-ui/src/modules/cmdb/components/preferenceSearch/preferenceSearch.vue @@ -16,12 +16,8 @@ <template v-for="(item, index) in preferenceSearchList.slice(0, 3)"> <span v-if="item.name.length > 6" - class="preference-search-tag" + :class="['preference-search-tag', item.id === currentPreferenceSearch ? 'preference-search-tag-focus' : '']" :key="`${item.id}_${index}`" - :style="{ - backgroundColor: item.id === currentPreferenceSearch ? '#2f54eb' : '', - color: item.id === currentPreferenceSearch ? '#fff' : '', - }" > <a-tooltip :title="item.name"> <span @click="clickPreferenceSearch(item)">{{ `${item.name.slice(0, 6)}...` }}</span> @@ -33,11 +29,7 @@ <span v-else :key="`${item.id}_${index}`" - class="preference-search-tag" - :style="{ - backgroundColor: item.id === currentPreferenceSearch ? '#2f54eb' : '', - color: item.id === currentPreferenceSearch ? '#fff' : '', - }" + :class="['preference-search-tag', item.id === currentPreferenceSearch ? 'preference-search-tag-focus' : '']" > <span @click="clickPreferenceSearch(item)">{{ item.name }}</span> <a-popconfirm :title="$t('cmdb.ciType.confirmDelete2')" @confirm="deletePreferenceSearch(item)"> @@ -193,6 +185,11 @@ export default { &:hover { color: @primary-color; } + + &-focus { + background-color: @primary-color; + color: #FFFFFF !important; + } } .preference-search-delete { color: #a9a9a9; diff --git a/cmdb-ui/src/modules/cmdb/components/searchForm/SearchForm.vue b/cmdb-ui/src/modules/cmdb/components/searchForm/SearchForm.vue index 6324910..3d7c25a 100644 --- a/cmdb-ui/src/modules/cmdb/components/searchForm/SearchForm.vue +++ b/cmdb-ui/src/modules/cmdb/components/searchForm/SearchForm.vue @@ -53,7 +53,7 @@ <a-icon type="search" slot="suffix" - :style="{ color: fuzzySearch ? '#2f54eb' : '#d9d9d9', cursor: 'pointer' }" + :class="['search-form-bar-input-icon', fuzzySearch ? 'search-form-bar-input-icon-focus' : '']" @click="emitRefresh" /> <a-tooltip slot="prefix" placement="bottom" :overlayStyle="{ maxWidth: '550px', whiteSpace: 'pre-line' }"> @@ -308,6 +308,16 @@ export default { justify-content: space-between; align-items: center; height: 32px; + + &-input-icon { + cursor: pointer; + color: #d9d9d9; + + &-focus { + color: @primary-color; + } + } + .search-form-bar-filter { .ops_display_wrapper(transparent); diff --git a/cmdb-ui/src/modules/cmdb/lang/en.js b/cmdb-ui/src/modules/cmdb/lang/en.js index 0549a80..c9f64eb 100644 --- a/cmdb-ui/src/modules/cmdb/lang/en.js +++ b/cmdb-ui/src/modules/cmdb/lang/en.js @@ -315,8 +315,9 @@ const cmdb_en = { ciGrantTip: `Filter conditions can be changed dynamically using {{}} referenced variables, currently user variables are supported, such as {{user.uid}},{{user.username}},{{user.email}},{{user.nickname}}`, searchInputTip: 'Please search for resource keywords', columnSearchInputTip: '192.168.1.1\n192.168.1.2\n192.168.1.3', - rowSearchMode: 'Single Row Search', - columnSearchMode: 'Multi Row Search', + rowSearchMode: 'Single Row', + columnSearchMode: 'Multi Row', + columnSearchTip: 'Supports retrieval of short texts only', resourceSearch: 'Resource Search', recentSearch: 'Recent Search', myCollection: 'My Collection', diff --git a/cmdb-ui/src/modules/cmdb/lang/zh.js b/cmdb-ui/src/modules/cmdb/lang/zh.js index f2f11d4..d5f0405 100644 --- a/cmdb-ui/src/modules/cmdb/lang/zh.js +++ b/cmdb-ui/src/modules/cmdb/lang/zh.js @@ -315,8 +315,9 @@ const cmdb_zh = { ciGrantTip: `筛选条件可使用{{}}引用变量实现动态变化,目前支持用户变量,如{{user.uid}},{{user.username}},{{user.email}},{{user.nickname}}`, searchInputTip: '请搜索资源关键字', columnSearchInputTip: '192.168.1.1\n192.168.1.2\n192.168.1.3', - rowSearchMode: '单行搜索', - columnSearchMode: '多行搜索', + rowSearchMode: '单行', + columnSearchMode: '多行', + columnSearchTip: '仅支持检索短文本', resourceSearch: '资源搜索', recentSearch: '最近搜索', myCollection: '我的收藏', diff --git a/cmdb-ui/src/modules/cmdb/views/batch/modules/UploadFileForm.vue b/cmdb-ui/src/modules/cmdb/views/batch/modules/UploadFileForm.vue index 780aeea..1215bdd 100644 --- a/cmdb-ui/src/modules/cmdb/views/batch/modules/UploadFileForm.vue +++ b/cmdb-ui/src/modules/cmdb/views/batch/modules/UploadFileForm.vue @@ -14,7 +14,7 @@ <p v-html="$t('cmdb.batch.drawTips1')"></p> <p v-html="$t('cmdb.batch.drawTips2')"></p> <div v-for="item in fileList" :key="item.name" class="cmdb-batch-upload-dragger-file"> - <span><a-icon type="file" :style="{ color: '#2F54EB', marginRight: '5px' }" />{{ item.name }}</span> + <span><a-icon type="file" class="cmdb-batch-upload-dragger-file-icon"/>{{ item.name }}</span> <a-progress :status="progressStatus" :percent="percent" /> </div> </a-upload-dragger> @@ -92,12 +92,7 @@ export default { } .ant-upload.ant-upload-drag { border: none; - background: linear-gradient(90deg, @text-color_5 50%, transparent 0) repeat-x, - linear-gradient(90deg, @text-color_5 50%, transparent 0) repeat-x, - linear-gradient(0deg, @text-color_5 50%, transparent 0) repeat-y, - linear-gradient(0deg, @text-color_5 50%, transparent 0) repeat-y; - background-size: 15px 1px, 15px 1px, 1px 15px, 1px 15px; - background-position: 0 0, 0 100%, 0 0, 100% 0; + background: ~'linear-gradient(90deg, @{text-color_5} 50%, transparent 0) repeat-x 0 0 / 15px 1px, linear-gradient(90deg, @{text-color_5} 50%, transparent 0) repeat-x 0 100% / 15px 1px, linear-gradient(0deg, @{text-color_5} 50%, transparent 0) repeat-y 0 0 / 1px 15px, linear-gradient(0deg, @{text-color_5} 50%, transparent 0) repeat-y 100% 0 / 1px 15px'; .ant-upload-drag-container > i { font-size: 60px; } @@ -106,13 +101,7 @@ export default { } &:hover { - background: linear-gradient(90deg, @primary-color_2 50%, transparent 0) repeat-x, - linear-gradient(90deg, @primary-color_2 50%, transparent 0) repeat-x, - linear-gradient(0deg, @primary-color_2 50%, transparent 0) repeat-y, - linear-gradient(0deg, @primary-color_2 50%, transparent 0) repeat-y; - background-size: 15px 1px, 15px 1px, 1px 15px, 1px 15px; - background-position: 0 0, 0 100%, 0 0, 100% 0; - background-color: @primary-color_7; + background: ~'linear-gradient(90deg, @{primary-color_2} 50%, transparent 0) repeat-x 0 0 / 15px 1px, linear-gradient(90deg, @{primary-color_2} 50%, transparent 0) repeat-x 0 100% / 15px 1px, linear-gradient(0deg, @{primary-color_2} 50%, transparent 0) repeat-y 0 0 / 1px 15px, linear-gradient(0deg, @{primary-color_2} 50%, transparent 0) repeat-y 100% 0 / 1px 15px, @{primary-color_7}'; } } .ant-upload.ant-upload-drag .ant-upload-drag-container { @@ -139,6 +128,11 @@ export default { white-space: nowrap; margin-right: 10px; } + + &-icon { + color: @primary-color; + margin-right: 5px; + } } .cmdb-batch-upload-tips { width: 50%; diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/attributeCard.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/attributeCard.vue index 1a67213..8a84c7c 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/attributeCard.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/attributeCard.vue @@ -47,8 +47,8 @@ <a-descriptions layout="horizontal" bordered size="small" :column="2"> <a-descriptions-item v-for="item in propertyList" :key="item.property" :label="item.label"> <ops-icon - :style="{ color: property[item.property] ? '#7f97fa' : '', fontSize: '10px' }" :type="`ops-${item.property}-disabled`" + :class="['attribute-card-footer-icon', property[item.property] ? 'attribute-card-footer-icon-mark' : '']" /> </a-descriptions-item> <a-descriptions-item label></a-descriptions-item> @@ -58,7 +58,7 @@ <ops-icon v-for="item in propertyList.filter((p) => property[p.property])" :key="item.property" - :style="{ color: '#7f97fa', fontSize: '10px' }" + class="attribute-card-footer-icon attribute-card-footer-icon-mark" :type="`ops-${item.property}-disabled`" /> </a-space> @@ -247,13 +247,13 @@ export default { .attribute-card { width: 172px; height: 75px; - background: @primary-color_6; + background-color: @primary-color_6; border-radius: 2px; position: relative; margin-bottom: 16px; transition: all 0.3s; &:hover { - box-shadow: 0 4px 12px #4e5ea066; + box-shadow: 0 4px 12px @primary-color_8; .attribute-card-operation { visibility: visible !important; } @@ -342,6 +342,15 @@ export default { padding: 2px 0 2px 5px; } } + +.attribute-card-footer-icon { + font-size: 10px; + + &-mark { + color: @primary-color_2; + } +} + .attribute-card-inherited { background: @primary-color_7; .attribute-card-footer { @@ -356,10 +365,10 @@ export default { justify-content: center; cursor: pointer; position: relative; - background-color: inherit; + background-color: inherit !important; &:hover { - box-shadow: none; - background-color: @primary-color_6; + box-shadow: none !important; + background-color: @primary-color_6 !important; } &:after { content: ''; diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/index.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/index.vue index 73265fd..bd8f223 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/index.vue @@ -140,7 +140,7 @@ :type="ci.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ ci.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ ci.name[0].toUpperCase() }}</span> </span> </div> <span class="ci-types-left-detail-title">{{ ci.alias || ci.name }}</span> diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/preValueArea.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/preValueArea.vue index a6b0649..8064494 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/preValueArea.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/preValueArea.vue @@ -35,7 +35,7 @@ :title="$t('cmdb.ciType.choiceWebhookTips')" > <a-icon - style="position:absolute;top:3px;left:-17px;color:#2f54eb;" + class="tab-webhook-filter-icon" type="question-circle" theme="filled" /> @@ -553,7 +553,7 @@ export default { &-tag { background-color: #E1EFFF; - color: #2F54EB; + color: @primary-color; font-size: 10px; font-weight: 400; padding: 0 3px; @@ -575,6 +575,13 @@ export default { } } +.tab-webhook-filter-icon { + position: absolute; + top: 3px; + left: -17px; + color: @primary-color; +} + .script-tip { font-size: 12px; line-height: 22px; diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/relationAD.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/relationAD.vue index 0353046..47e43ad 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/relationAD.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/relationAD.vue @@ -363,7 +363,7 @@ export default { width: 12px; height: 12px; background-color: @primary-color; - border: solid 3px #E2E7FC; + border: solid 3px @primary-color_4; border-radius: 50% } diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue index d4d9553..a6dd9c2 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/relationTable.vue @@ -31,7 +31,7 @@ <vxe-column field="source_ci_type_name" :title="$t('cmdb.ciType.sourceCIType')"></vxe-column> <vxe-column field="relation_type" :title="$t('cmdb.ciType.relationType')"> <template #default="{row}"> - <span style="color:#2f54eb" v-if="row.isParent">{{ $t('cmdb.ciType.isParent') }}</span> + <span class="primary-color" v-if="row.isParent">{{ $t('cmdb.ciType.isParent') }}</span> {{ row.relation_type }} </template> </vxe-column> @@ -700,7 +700,7 @@ export default { } /deep/ .relation-table-parent { - background-color: #f5f8ff !important; + background-color: @primary-color_5 !important; } } </style> diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/uniqueConstraint.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/uniqueConstraint.vue index 7f3598b..c728ec2 100644 --- a/cmdb-ui/src/modules/cmdb/views/ci_types/uniqueConstraint.vue +++ b/cmdb-ui/src/modules/cmdb/views/ci_types/uniqueConstraint.vue @@ -24,7 +24,7 @@ <vxe-column field="attr_ids" :title="$t('cmdb.ciType.attributes')" :edit-render="{}"> <template #default="{ row }"> <template v-for="(attr, index) in row.attr_ids"> - <span :key="attr" :style="{ color: '#2f54eb' }">{{ getDisplayName(attr) }}</span> + <span :key="attr" class="primary-color">{{ getDisplayName(attr) }}</span> <span :key="`_${attr}`" v-if="index !== row.attr_ids.length - 1"> + </span> </template> </template> diff --git a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chart.vue b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chart.vue index 8dd4e21..ae6e516 100644 --- a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chart.vue +++ b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chart.vue @@ -19,7 +19,7 @@ :type="ciType.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ ciType.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ ciType.name[0].toUpperCase() }}</span> </div> <span :style="{ ...options.fontConfig }">{{ toThousands(data) }}</span> </div> diff --git a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chartForm.vue b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chartForm.vue index 32a4040..f7950a1 100644 --- a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chartForm.vue +++ b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/chartForm.vue @@ -148,7 +148,7 @@ :type="ciType.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ ciType.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ ciType.name[0].toUpperCase() }}</span> </template> <span :style="{ color: '#000' }"> {{ form.name }}</span> </div> @@ -800,7 +800,7 @@ export default { } } .chart-right-type-box-selected { - background-color: #e5f1ff; + background-color: @primary-color_3; } } .chart-width { diff --git a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/customLayout.vue b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/customLayout.vue index 63b36ef..0105d94 100644 --- a/cmdb-ui/src/modules/cmdb/views/custom_dashboard/customLayout.vue +++ b/cmdb-ui/src/modules/cmdb/views/custom_dashboard/customLayout.vue @@ -63,7 +63,7 @@ :type="getCiType(item).icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ getCiType(item).name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ getCiType(item).name[0].toUpperCase() }}</span> </template> <span :style="{ color: item.options.chartType === 'count' ? item.options.fontColor : '#000' }">{{ item.options.name diff --git a/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimMain/rackGrid.vue b/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimMain/rackGrid.vue index 2fb8d15..497e8a4 100644 --- a/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimMain/rackGrid.vue +++ b/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimMain/rackGrid.vue @@ -268,18 +268,18 @@ export default { margin-right: 2px; font-size: 12px; font-weight: 400; - color: #3F75FF; + color: #2F54EB; } &-icon { font-size: 12px; - color: #3F75FF; + color: #2F54EB; } } &:hover { background-color: #FFFFFF; - box-shadow: 0px 22px 33px 0px rgba(41, 65, 126, 0.25); + box-shadow: ~'0px 22px 33px 0px @{primary-color}15'; z-index: 2; .rack-grid-item-name { diff --git a/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimTree.vue b/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimTree.vue index 7af0af0..d5d197c 100644 --- a/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimTree.vue +++ b/cmdb-ui/src/modules/cmdb/views/dcim/components/dcimTree.vue @@ -58,15 +58,11 @@ > <ops-icon :type="treeNodeData.icon" - class="dcim-tree-node-icon" - :style="{ color: treeNodeData.iconColor }" + :class="['dcim-tree-node-icon', treeNodeData.dcimType === DCIM_TYPE.REGION ? 'primary-color' : '']" /> <a-tooltip :title="treeNodeData.title"> <span - class="dcim-tree-node-title" - :style="{ - color: treeKey === treeNodeData.key ? '#2F54EB' : '' - }" + :class="['dcim-tree-node-title', treeKey === treeNodeData.key ? 'primary-color' : '']" > {{ treeNodeData.title }} </span> @@ -164,6 +160,7 @@ export default { DCIM_TYPE.REGION, DCIM_TYPE.IDC ], + DCIM_TYPE, viewDetailCITypeId: 0, viewDetailAttrObj: {}, @@ -365,6 +362,7 @@ export default { &-icon { font-size: 12px; flex-shrink: 0; + color: #A5A9BC; } &-title { diff --git a/cmdb-ui/src/modules/cmdb/views/dcim/components/rackDetail/rackView/rackUnitView.vue b/cmdb-ui/src/modules/cmdb/views/dcim/components/rackDetail/rackView/rackUnitView.vue index 26b06ee..6ee6c62 100644 --- a/cmdb-ui/src/modules/cmdb/views/dcim/components/rackDetail/rackView/rackUnitView.vue +++ b/cmdb-ui/src/modules/cmdb/views/dcim/components/rackDetail/rackView/rackUnitView.vue @@ -117,8 +117,8 @@ }" @click="addDevice(index)" > - <ops-icon - type="monitor-add" + <a-icon + type="plus-circle" class="rack-container-main-list-gap-icon" /> <span @@ -492,12 +492,13 @@ export default { &-icon { font-size: 12px; display: none; + color: @primary-color; } &-text { font-size: 12px; font-weight: 400; - color: rgba(0, 87, 255, 0.80); + color: @primary-color; margin-left: 6px; display: none; } @@ -508,7 +509,7 @@ export default { } &:hover { - background-color: #D5DDEE; + background-color: @primary-color_4; .rack-container-main-list-gap-icon { display: inline-block; diff --git a/cmdb-ui/src/modules/cmdb/views/discovery/discoveryCard.vue b/cmdb-ui/src/modules/cmdb/views/discovery/discoveryCard.vue index ba49ed2..07ef7d3 100644 --- a/cmdb-ui/src/modules/cmdb/views/discovery/discoveryCard.vue +++ b/cmdb-ui/src/modules/cmdb/views/discovery/discoveryCard.vue @@ -165,7 +165,7 @@ export default { display: inline-block; width: 180px; height: 105px; - box-shadow: 0px 2px 8px rgba(122, 140, 204, 0.25); + box-shadow: 0px 2px 8px @primary-color_3; border-radius: 4px; position: relative; margin-bottom: 40px; @@ -297,7 +297,7 @@ export default { &, &.discovery-card-small { &:hover { - box-shadow: 0px 6px 20px 0px rgba(122, 140, 204, 0.30); + box-shadow: 0px 6px 20px 0px @primary-color_3; } } @@ -314,7 +314,7 @@ export default { } &:hover { - box-shadow: 0px 6px 28px 0px rgba(122, 140, 204, 0.30); + box-shadow: 0px 6px 28px 0px @primary-color_3; } } } diff --git a/cmdb-ui/src/modules/cmdb/views/discovery/index.vue b/cmdb-ui/src/modules/cmdb/views/discovery/index.vue index fc932ab..2a92575 100644 --- a/cmdb-ui/src/modules/cmdb/views/discovery/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/discovery/index.vue @@ -70,7 +70,7 @@ class="setting-discovery-add" @click="handleOpenEditDrawer(null, 'add', DISCOVERY_CATEGORY_TYPE.PLUGIN)" > - <a-icon type="plus-circle" theme="twoTone" /> + <a-icon class="setting-discovery-add-icon" type="plus-circle" /> <span class="setting-discovery-add-text"> {{ $t('cmdb.ad.addPlugin') }} </span> @@ -380,6 +380,10 @@ export default { justify-content: center; cursor: pointer; + &-icon { + color: @primary-color_9; + } + &-text { color: @text-color_3; font-size: 12px; diff --git a/cmdb-ui/src/modules/cmdb/views/discoveryCI/index.vue b/cmdb-ui/src/modules/cmdb/views/discoveryCI/index.vue index 5d855fe..bd0e08e 100644 --- a/cmdb-ui/src/modules/cmdb/views/discoveryCI/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/discoveryCI/index.vue @@ -24,7 +24,7 @@ :type="ciType.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ ciType.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ ciType.name[0].toUpperCase() }}</span> </span> <span :title="ciType.alias || ciType.name" class="cmdb-adc-side-name">{{ ciType.alias || ciType.name }}</span> </div> diff --git a/cmdb-ui/src/modules/cmdb/views/ipam/components/ipamTree.vue b/cmdb-ui/src/modules/cmdb/views/ipam/components/ipamTree.vue index e2c3787..f5ffa9f 100644 --- a/cmdb-ui/src/modules/cmdb/views/ipam/components/ipamTree.vue +++ b/cmdb-ui/src/modules/cmdb/views/ipam/components/ipamTree.vue @@ -26,10 +26,7 @@ /> <a-tooltip :title="treeNodeData.title"> <span - class="ipam-tree-node-title" - :style="{ - color: treeKey === treeNodeData.key ? '#2F54EB' : '' - }" + :class="['ipam-tree-node-title', treeKey === treeNodeData.key ? 'primary-color' : '']" > {{ treeNodeData.title }} </span> diff --git a/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue b/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue index 40484b4..e664472 100644 --- a/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue +++ b/cmdb-ui/src/modules/cmdb/views/model_relation/modules/modelRelationTable.vue @@ -20,7 +20,7 @@ <vxe-column field="relation_type_id" :title="$t('cmdb.custom_dashboard.relation')" - :filters="[{ data: '' }]" + :filters="relationTypeList" :filter-multiple="false" > <template #default="{ row }"> @@ -144,7 +144,7 @@ export default { return { drawerVisible: false, tableData: [], - relationTypeList: null, + relationTypeList: [], type2attributes: {}, tableAttrList: [], } @@ -201,13 +201,6 @@ export default { async getRelationTypes() { const res = await getRelationTypes() this.relationTypeList = res.map((item) => ({ value: item.id, label: item.name })) - const $table = this.$refs.xTable - if ($table) { - const nameColumn = $table.getColumnByField('relation_type_id') - if (nameColumn) { - $table.setFilter(nameColumn, this.relationTypeList) - } - } }, // 转换关联关系 handleConstraint(constraintId) { @@ -359,5 +352,9 @@ export default { &-action { margin-left: 5px; } + + /deep/ .ant-select-selection { + box-shadow: none; + } } </style> diff --git a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/ciTable.vue b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/ciTable.vue index 108649c..92c20f5 100644 --- a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/ciTable.vue +++ b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/ciTable.vue @@ -30,7 +30,7 @@ <span>{{ column.title }}</span> <a-popover trigger="click" placement="bottom"> <a-icon class="filter" type="filter" theme="filled" /> - <a slot="content"> + <a class="filter-content" slot="content"> <a-input :placeholder="$t('cmdb.history.userTips')" size="small" @@ -453,4 +453,10 @@ export default { color: #606266; } } + +.filter-content { + display: flex; + align-items: center; + column-gap: 8px; +} </style> diff --git a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/relation.vue b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/relation.vue index d7fb859..42c0bfe 100644 --- a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/relation.vue +++ b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/relation.vue @@ -28,7 +28,7 @@ <span>{{ column.title }}</span> <a-popover trigger="click" placement="bottom"> <a-icon class="filter" type="filter" theme="filled" /> - <a slot="content"> + <a class="filter-content" slot="content"> <a-input :placeholder="$t('cmdb.history.userTips')" size="small" @@ -47,7 +47,7 @@ <span>{{ column.title }}</span> <a-popover trigger="click" placement="bottom"> <a-icon class="filter" type="filter" theme="filled" /> - <a slot="content"> + <a class="filter-content" slot="content"> <a-select v-model="queryParams.operate_type" :placeholder="$t('cmdb.history.filterOperate')" @@ -445,4 +445,10 @@ export default { color: #606266; } } + +.filter-content { + display: flex; + align-items: center; + column-gap: 8px; +} </style> diff --git a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/typeTable.vue b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/typeTable.vue index 486b0a0..9a4e222 100644 --- a/cmdb-ui/src/modules/cmdb/views/operation_history/modules/typeTable.vue +++ b/cmdb-ui/src/modules/cmdb/views/operation_history/modules/typeTable.vue @@ -26,7 +26,7 @@ <span>{{ column.title }}</span> <a-popover trigger="click" placement="bottom"> <a-icon class="filter" type="filter" theme="filled" /> - <a slot="content"> + <a class="filter-content" slot="content"> <a-select v-model="queryParams.operate_type" :placeholder="$t('cmdb.history.filterOperate')" @@ -563,4 +563,10 @@ export default { p { margin-bottom: 0; } + +.filter-content { + display: flex; + align-items: center; + column-gap: 8px; +} </style> diff --git a/cmdb-ui/src/modules/cmdb/views/preference/index.vue b/cmdb-ui/src/modules/cmdb/views/preference/index.vue index 4dc25f9..4bec9ac 100644 --- a/cmdb-ui/src/modules/cmdb/views/preference/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/preference/index.vue @@ -654,11 +654,11 @@ export default { height: 155px; border-radius: @border-radius-box; background-color: #fff; - box-shadow: 0px 2px 8px rgba(149, 160, 208, 0.25); + box-shadow: ~'0px 2px 8px @{primary-color}15'; margin: 0 20px 20px 0; padding: 12px; &:hover { - box-shadow: 4px 25px 30px rgba(50, 89, 134, 0.25); + box-shadow: ~'4px 25px 30px @{primary-color}15'; transform: scale(1.1); } .cmdb-preference-header { @@ -733,10 +733,10 @@ export default { align-items: center; gap: 3px; font-size: 12px; - color: rgba(0, 0, 0, 0.76); + color: @text-color_1; &:hover { - color: #1890ff; + color: @primary-color; } } diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/components/searchCondition.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/components/searchCondition.vue index 588d37b..9465d03 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/components/searchCondition.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/components/searchCondition.vue @@ -13,12 +13,11 @@ <div class="search-condition-control"> <treeselect :value="sourceCIType" - class="custom-treeselect custom-treeselect-bgcAndBorder filter-content-ciTypes" + class="custom-treeselect custom-treeselect-white filter-content-ciTypes" :style="{ width: '100%', zIndex: '1000', '--custom-height': '32px', - '--custom-bg-color': '#FFF', '--custom-multiple-lineHeight': '32px', }" :multiple="false" @@ -699,14 +698,14 @@ export default { cursor: pointer; &:hover { - background-color: #D9E4FA; + background-color: @primary-color_4; .search-condition-favor-name { - color: #2F54EB; + color: @primary-color; } .search-condition-favor-close { - color: #2F54EB; + color: @primary-color; } } } @@ -737,10 +736,10 @@ export default { } &:hover { - background-color: #D9E4FA; + background-color: @primary-color_4; .search-condition-hide-icon { - color: #2F54EB; + color: @primary-color_4; } } } diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/index.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/index.vue index 2c97883..630590d 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/relationSearch/index.vue @@ -656,15 +656,15 @@ export default { &:hover { .relation-search-expand-handle { - background-color: #D9E4FA; + background-color: @primary-color_4; } .relation-search-expand-icon { - color: #2F54EB; + color: @primary-color; } .relation-search-expand-text { - color: #2F54EB; + color: @primary-color; } } } diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceDetail.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceDetail.vue index 214116c..848c480 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceDetail.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceDetail.vue @@ -327,7 +327,7 @@ export default { &-header { width: 100%; height: 75px; - background-color: #EBF0F9; + background-color: @primary-color_3; overflow: hidden; position: relative; display: flex; @@ -342,7 +342,7 @@ export default { right: -20px; top: 0px; transform: rotate(40deg); - background: rgba(248, 249, 253, 0.60); + background-color: @primary-color_5; } &-line-2 { @@ -352,7 +352,7 @@ export default { right: -110px; top: 0px; transform: rotate(40deg); - background: rgba(248, 249, 253, 0.60); + background-color: @primary-color_5; } &-row { diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceList.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceList.vue index e536bc8..6188c6f 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceList.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/instanceList.vue @@ -431,7 +431,7 @@ export default { } &:hover { - box-shadow: 0px 2px 12px 0px rgba(147, 168, 223, 0.20); + box-shadow: ~'0px 2px 12px 0px @{primary-color}15'; .list-card-collect { display: inline-block; diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/searchInput.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/searchInput.vue index 4dee23c..6536b62 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/searchInput.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/components/searchInput.vue @@ -1,36 +1,48 @@ <template> - <div :class="['search-input', classType ? 'search-input-' + classType : '', { 'column-search-mode': isColumnSearch }]"> + <div :class="['search-input', classType ? 'search-input-' + classType : '']"> <div class="search-area"> - <div v-show="!isColumnSearch" class="input-wrapper"> - <a-input - :value="searchValue" - class="search-input-component" - :placeholder="$t('cmdb.ciType.searchInputTip')" - @change="handleChangeSearchValue" - @pressEnter="saveCondition(true, 'normal')" - /> + <a-input + v-show="searchMode === SEARCH_MODE.NORMAL" + :value="searchValue" + class="search-input-component" + :placeholder="$t('cmdb.ciType.searchInputTip')" + @change="handleChangeSearchValue" + @pressEnter="saveCondition(true)" + > <a-icon class="search-icon" + slot="prefix" type="search" - @click="saveCondition(true, 'normal')" + @click="saveCondition(true)" /> - </div> + </a-input> - <div v-show="isColumnSearch" class="textarea-wrapper"> - <div class="textarea-container"> - <a-textarea - :value="searchValue" - class="column-search-component" - :rows="4" - :placeholder="$t('cmdb.ciType.columnSearchInputTip')" - @change="handleChangeColumnSearchValue" - @pressEnter="handlePressEnter" - /> + <div + v-show="searchMode === SEARCH_MODE.COLUMN" + class="search-textarea-component" + > + <a-textarea + :value="searchValue" + :autosize="{ + minRows: 3, + maxRows: 3, + }" + :placeholder="$t('cmdb.ciType.columnSearchInputTip')" + @change="handleChangeSearchValue" + /> + <div class="search-textarea-icon-wrap"> <a-icon class="search-icon" type="search" - @click="saveCondition(true, 'column')" + @click="saveCondition(true)" /> + + <a-tooltip :title="$t('cmdb.ciType.columnSearchTip')"> + <a-icon + type="info-circle" + class="search-icon" + /> + </a-tooltip> </div> </div> @@ -46,11 +58,26 @@ @saveCondition="saveCondition" /> - <div class="column-search-btn" @click="toggleColumnSearch"> - <a-icon class="column-search-btn-icon" type="menu" /> - <span class="column-search-btn-title"> - {{ isColumnSearch ? $t('cmdb.ciType.rowSearchMode') : $t('cmdb.ciType.columnSearchMode') }} + <div class="search-mode-switch"> + <span + v-for="(item) in searchModeList" + :key="item.value" + :class="['search-mode-switch-item', searchMode === item.value ? 'search-mode-switch-item-active' : '']" + :style="{ + width: isZh ? '40px' : '65px' + }" + @click="updateSearchMode(item.value)" + > + {{ $t(item.label) }} </span> + + <span + class="search-mode-switch-slide" + :style="{ + left: searchMode === SEARCH_MODE.COLUMN ? (isZh ? '44px' : '69px') : '4px', + width: isZh ? '40px' : '65px' + }" + ></span> </div> </div> </div> @@ -68,6 +95,7 @@ </template> <script> +import { SEARCH_MODE } from '../constants.js' import FilterPopover from './filterPopover.vue' export default { @@ -100,12 +128,31 @@ export default { type: String, default: '' }, - isColumnSearch: { - type: Boolean, - default: false + searchMode: { + type: String, + default: SEARCH_MODE.NORMAL + } + }, + data() { + return { + SEARCH_MODE, + searchModeList: [ + { + value: SEARCH_MODE.NORMAL, + label: 'cmdb.ciType.rowSearchMode' + }, + { + value: SEARCH_MODE.COLUMN, + label: 'cmdb.ciType.columnSearchMode' + }, + ] } }, computed: { + isZh() { + return this.$i18n.locale === 'zh' + }, + // 复制文字展示,与实际文本复制内容区别在于,未选择模型时不展示所有模型拼接数据 copyText() { const regQ = /(?<=q=).+(?=&)|(?<=q=).+$/g @@ -119,14 +166,15 @@ export default { textArray.push(exp) } if (this.searchValue) { - let processedValue = this.searchValue - if (this.isColumnSearch) { + if ( + this.searchMode === SEARCH_MODE.COLUMN && + this.searchValue.includes('\n') + ) { const values = this.searchValue.split('\n').filter(v => v.trim()) - if (values.length) { - processedValue = `(${values.join(';')})` - } + textArray.push(`(${values.join(';')})`) + } else { + textArray.push(`*${this.searchValue}*`) } - textArray.push(`${!this.isColumnSearch ? '*' : ''}${processedValue}${!this.isColumnSearch ? '*' : ''}`) } return textArray.length ? `q=${textArray.join(',')}` : '' @@ -136,8 +184,8 @@ export default { updateAllAttributesList(value) { this.$emit('updateAllAttributesList', value) }, - saveCondition(isSubmit, searchType = 'normal') { - this.$emit('saveCondition', isSubmit, searchType) + saveCondition(isSubmit) { + this.$emit('saveCondition', isSubmit) }, handleChangeSearchValue(e) { const value = e.target.value @@ -163,9 +211,21 @@ export default { ciTypeIds.push(...ids) }) } - const copyText = `${ciTypeIds?.length ? `_type:(${ciTypeIds.join(';')})` : ''}${exp ? `,${exp}` : ''}${ - searchValue ? `,${!this.isColumnSearch ? '*' : ''}${searchValue}${!this.isColumnSearch ? '*' : ''}` : '' - }` + + let copySearchValue = '' + if (searchValue) { + if ( + this.searchMode === SEARCH_MODE.COLUMN && + this.searchValue.includes('\n') + ) { + const values = searchValue.split('\n').filter(v => v.trim()) + copySearchValue = `,(${values.join(';')})` + } else { + copySearchValue = `,*${searchValue}*` + } + } + + const copyText = `${ciTypeIds?.length ? `_type:(${ciTypeIds.join(';')})` : ''}${exp ? `,${exp}` : ''}${copySearchValue}` this.$copyText(copyText) .then(() => { @@ -176,33 +236,8 @@ export default { }) }, - toggleColumnSearch() { - this.$emit('toggleSearchMode', !this.isColumnSearch) - this.saveCondition(false, !this.isColumnSearch ? 'column' : 'normal') - }, - - handleChangeColumnSearchValue(e) { - const value = e.target.value - this.changeFilter({ - name: 'searchValue', - value - }) - }, - - handlePressEnter(e) { - if (this.isColumnSearch) { - // 列搜索模式下,按下 Enter 键时阻止默认行为并插入换行符 - e.preventDefault() - const value = this.searchValue || '' - const cursorPosition = e.target.selectionStart - const newValue = value.slice(0, cursorPosition) + '\n' + value.slice(cursorPosition) - this.changeFilter({ - name: 'searchValue', - value: newValue - }) - } else { - this.saveCondition(true, 'normal') - } + updateSearchMode(mode) { + this.$emit('updateSearchMode', mode) } } } @@ -211,115 +246,132 @@ export default { <style lang="less" scoped> .search-input { width: 100%; - display: flex; - flex-direction: column; - gap: 8px; margin-bottom: 16px; .search-area { - display: flex; - align-items: flex-start; - min-height: 48px; width: 100%; - } - - .input-wrapper { position: relative; - flex-grow: 1; .search-input-component { height: 48px; + line-height: 48px; + border-radius: 48px; width: 100%; background-color: #FFFFFF; - border: 1px solid #d9d9d9; font-size: 14px; - border-radius: 8px; - /deep/ input { - height: 100%; - padding-right: 40px; + &:hover { + /deep/ .ant-input { + background-color: @primary-color_5; + } + } + + /deep/ .ant-input { + border: none; + height: 48px; + line-height: 48px; + border-radius: 48px; + + &:focus { + border: solid 1px @primary-color; + background-color: #FFFFFF !important; + } + } + } + + .search-textarea-component { + position: relative; + + .search-textarea-icon-wrap { + position: absolute; + top: 10px; + left: 12px; + display: flex; + flex-direction: column; + row-gap: 6px; + } + + &:hover { + /deep/ .ant-input { + background-color: @primary-color_5; + } + } + + /deep/ .ant-input { + border: none; + padding-left: 36px; + resize: none; + + &:focus { + border: solid 1px @primary-color; + background-color: #FFFFFF !important; + } } } .search-icon { - position: absolute; - right: 12px; - top: 50%; - transform: translateY(-50%); - color: #2F54EB; + color: @primary-color; font-size: 14px; cursor: pointer; } } - .textarea-wrapper { - flex-grow: 1; + .operation-area { + position: absolute; + display: flex; + align-items: center; + right: 0px; + top: 0px; + height: 48px; + transform: translateX(100%); - .textarea-container { + .search-mode-switch { + display: flex; + align-items: center; + height: 32px; + background-color: @primary-color_3; + border-radius: 32px; position: relative; - width: 100%; - max-height: 200px; + padding: 0 4px; + margin-left: 14px; + cursor: pointer; - .column-search-component { - width: 100%; - max-height: 200px; - background-color: #FFFFFF; - border: 1px solid #d9d9d9; - font-size: 14px; - border-radius: 8px; - padding-right: 35px; - resize: none; - transition: all 0.3s; + &-item { + height: 24px; + width: 40px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 400; + color: @text-color_2; + z-index: 1; + position: relative; - &:hover, &:focus { - border-color: #40a9ff; - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + &-active { + color: @primary-color; } } - .search-icon { + &-slide { position: absolute; - right: 12px; - top: 12px; - color: #2F54EB; - font-size: 14px; - cursor: pointer; + transition: left 0.2s; + border-radius: 24px; + background-color: #FFFFFF; + height: 24px; + top: 4px; + width: 40px; + z-index: 0; } } } - .operation-area { - display: flex; - align-items: center; - height: 48px; - margin-left: 10px; - } - - .column-search-btn { - flex-shrink: 0; - display: flex; - align-items: center; - margin-left: 13px; - cursor: pointer; - - &-icon { - color: #2F54EB; - font-size: 12px; - } - - &-title { - font-size: 14px; - font-weight: 400; - color: #2F54EB; - margin-left: 3px; - } - } - .expression-display { display: flex; align-items: center; - margin-left: 20px; - max-width: 30%; + max-width: 100%; + width: fit-content; + margin-top: 8px; &-text { width: 100%; @@ -335,16 +387,9 @@ export default { } } - .search-input-component, - .column-search-component { - &:hover { - border-color: #40a9ff; - } - - &:focus { - border-color: #40a9ff; - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - outline: none; + &-after { + .search-area { + max-width: 420px; } } } diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/constants.js b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/constants.js new file mode 100644 index 0000000..8118c4e --- /dev/null +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/constants.js @@ -0,0 +1,4 @@ +export const SEARCH_MODE = { + NORMAL: 'normal', + COLUMN: 'column' +} diff --git a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/index.vue b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/index.vue index 1704840..1ee6fca 100644 --- a/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/resource_search_2/resourceSearch/index.vue @@ -15,11 +15,11 @@ :searchValue="searchValue" :selectCITypeIds="selectCITypeIds" :expression="expression" - :isColumnSearch="currentSearchType === 'column'" + :searchMode="currentSearchMode" @changeFilter="changeFilter" @updateAllAttributesList="updateAllAttributesList" @saveCondition="saveCondition" - @toggleSearchMode="handleToggleSearchMode" + @updateSearchMode="updateSearchMode" /> <HistoryList :recentList="recentList" @@ -48,11 +48,11 @@ :searchValue="searchValue" :selectCITypeIds="selectCITypeIds" :expression="expression" - :isColumnSearch="currentSearchType === 'column'" + :searchMode="currentSearchMode" @changeFilter="changeFilter" @updateAllAttributesList="updateAllAttributesList" @saveCondition="saveCondition" - @toggleSearchMode="handleToggleSearchMode" + @updateSearchMode="updateSearchMode" /> <HistoryList :recentList="recentList" @@ -127,6 +127,7 @@ import { getPreferenceSearch, savePreferenceSearch, getSubscribeAttributes, dele import { searchAttributes, getCITypeAttributesByTypeIds } from '@/modules/cmdb/api/CITypeAttr' import { searchCI } from '@/modules/cmdb/api/ci' import { getCITypes } from '@/modules/cmdb/api/CIType' +import { SEARCH_MODE } from './constants.js' import SearchInput from './components/searchInput.vue' import HistoryList from './components/historyList.vue' @@ -176,7 +177,7 @@ export default { showInstanceDetail: false, detailCIId: -1, detailCITypeId: -1, - currentSearchType: 'normal', + currentSearchMode: SEARCH_MODE.NORMAL, } }, computed: { @@ -245,9 +246,7 @@ export default { } }, - async saveCondition(isSubmit, searchType = 'normal') { - this.currentSearchType = searchType - + async saveCondition(isSubmit) { if ( this.searchValue || this.expression || @@ -261,7 +260,7 @@ export default { option.searchValue === this.searchValue && option.expression === this.expression && _.isEqual(option.ciTypeIds, this.selectCITypeIds) && - option.searchType === this.currentSearchType + option.searchMode === this.currentSearchMode ) { needDeleteList.push(item.id) } else { @@ -288,7 +287,7 @@ export default { expression: this.expression, ciTypeIds: this.selectCITypeIds, ciTypeNames, - searchType: this.currentSearchType + searchMode: this.currentSearchMode }, name: '__recent__' }) @@ -299,7 +298,7 @@ export default { this.isSearch = true this.currentPage = 1 this.hideDetail() - this.loadInstance(this.currentSearchType) + this.loadInstance() } }, @@ -316,19 +315,11 @@ export default { this.getRecentList() }, - async loadInstance(searchType = 'normal') { - const { selectCITypeIds, expression } = this - let { searchValue } = this + async loadInstance() { + const { selectCITypeIds, expression, searchValue } = this const regQ = /(?<=q=).+(?=&)|(?<=q=).+$/g const exp = expression.match(regQ) ? expression.match(regQ)[0] : null - if (searchType === 'column' && searchValue) { - const values = searchValue.split('\n').filter(v => v.trim()) - if (values.length) { - searchValue = `(${values.join(';')})` - } - } - const ciTypeIds = [...selectCITypeIds] if (!ciTypeIds.length) { this.CITypeGroup.forEach((item) => { @@ -337,10 +328,21 @@ export default { }) } + let querySearchValue = '' + if (searchValue) { + if ( + this.currentSearchMode === SEARCH_MODE.COLUMN && + searchValue.includes('\n') + ) { + const values = searchValue.split('\n').filter(v => v.trim()) + querySearchValue = `,(${values.join(';')})` + } else { + querySearchValue = `,*${searchValue}*` + } + } + const res = await searchCI({ - q: `${ciTypeIds?.length ? `_type:(${ciTypeIds.join(';')})` : ''}${exp ? `,${exp}` : ''}${ - searchValue ? `,${searchType === 'normal' ? '*' : ''}${searchValue}${searchType === 'normal' ? '*' : ''}` : '' - }`, + q: `${ciTypeIds?.length ? `_type:(${ciTypeIds.join(';')})` : ''}${exp ? `,${exp}` : ''}${querySearchValue}`, count: this.pageSize, page: this.currentPage, sort: '_type' @@ -406,6 +408,7 @@ export default { } this.ciTabList = ciTabList + // 处理引用属性 const allAttr = [] subscribedRes.map((item) => { allAttr.push(...item.attributes) @@ -493,21 +496,21 @@ export default { this.searchValue = data?.searchValue || '' this.expression = data?.expression || '' this.selectCITypeIds = data?.ciTypeIds || [] - this.currentSearchType = data?.searchType || 'normal' + this.currentSearchMode = data?.searchMode || 'normal' this.hideDetail() - this.loadInstance(this.currentSearchType) + this.loadInstance() }, handlePageSizeChange(_, pageSize) { this.pageSize = pageSize this.currentPage = 1 - this.loadInstance(this.currentSearchType) + this.loadInstance() }, changePage(page) { this.currentPage = page - this.loadInstance(this.currentSearchType) + this.loadInstance() }, changeFilter(data) { @@ -552,8 +555,8 @@ export default { this.showDetail(data) }, - handleToggleSearchMode(isColumn) { - this.currentSearchType = isColumn ? 'column' : 'normal' + updateSearchMode(mode) { + this.currentSearchMode = mode } } } @@ -567,7 +570,7 @@ export default { &-before { width: 100%; - max-width: 725px; + max-width: 718px; height: 100%; margin: 0 auto; padding-top: 100px; diff --git a/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue b/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue index 97f5aaf..e3efacd 100644 --- a/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue @@ -109,7 +109,7 @@ :type="topo.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ topo.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ topo.name[0].toUpperCase() }}</span> </span> </div> <span class="topo-left-detail-title">{{ topo.alias || topo.name }}</span> diff --git a/cmdb-ui/src/modules/cmdb/views/tree_views/index.vue b/cmdb-ui/src/modules/cmdb/views/tree_views/index.vue index f0e79cb..1b8306e 100644 --- a/cmdb-ui/src/modules/cmdb/views/tree_views/index.vue +++ b/cmdb-ui/src/modules/cmdb/views/tree_views/index.vue @@ -48,7 +48,7 @@ :type="ciType.icon.split('$$')[0]" /> </template> - <span :style="{ color: '#2f54eb' }" v-else>{{ ciType.name[0].toUpperCase() }}</span> + <span class="primary-color" v-else>{{ ciType.name[0].toUpperCase() }}</span> </span> <span class="tree-views-left-header-name">{{ ciType.alias || ciType.name }}</span> <div class="actions"> diff --git a/cmdb-ui/src/style/global.less b/cmdb-ui/src/style/global.less index f5b11ec..feb741b 100644 --- a/cmdb-ui/src/style/global.less +++ b/cmdb-ui/src/style/global.less @@ -824,6 +824,10 @@ body { color: @primary-color !important; } +.el-select-dropdown__item.hover { + background-color: @primary-color_5; +} + .ant-tabs-nav .ant-tabs-tab { margin-right: 16px; } @@ -969,7 +973,7 @@ body { // 白色背景 .custom-treeselect-white { .custom-vue-treeselect__control( - #fff, + ~'#fff !important', 1px solid #d9d9d9, none, @primary-color @@ -1064,7 +1068,7 @@ body { // } .vxe-body--row { &.row--stripe { - background-color: rgba(240, 245, 255, 0.4) !important; + background-color: @primary-color_6 !important; border-top: 1px solid rgba(0, 0, 0, 0.1) !important; border-radius: 5px !important; > td { @@ -1097,6 +1101,7 @@ body { &:focus { background-color: @primary-color_7; + border: solid 1px @primary-color; } } } @@ -1110,15 +1115,24 @@ body { color: #333; cursor: default; } +.ant-input:focus, +.ant-input-number:focus, +.ant-input-number-focused { + box-shadow: none; +} + +.ant-pagination-options-quick-jumper input:focus { + box-shadow: none; +} // vxe-table checkbox 选中 highlight .vxe-table--render-default .vxe-body--row.row--checked, .vxe-table--render-default .vxe-body--row.row--radio { - background: aliceblue !important; + background: @primary-color_5 !important; } .vxe-table--render-default .vxe-body--row.row--hover.row--checked, .vxe-table--render-default .vxe-body--row.row--hover.row--radio { - background: lightskyblue !important; + background: @primary-color_4 !important; } // vxe-table 颜色 @@ -1179,6 +1193,15 @@ body { border-color: @primary-color !important; } +.vxe-table--render-default .vxe-body--row.row--hover, +.vxe-table--render-default .vxe-body--row.row--hover.row--stripe { + background-color: @primary-color_7; +} + +.vxe-select-option:not(.is--disabled).is--hover { + background-color: @primary-color_5; +} + //批量操作 .ops-list-batch-action { display: inline-block; @@ -1262,7 +1285,7 @@ body { } .ant-btn-primary:not(.ant-btn-background-ghost) { - .btn-wave-hover(#3F75FF); + .btn-wave-hover(@primary-color_9); } // button @@ -1296,6 +1319,35 @@ body { } } +.ops-select-bg { + .ant-select-selection { + background-color: @primary-color_7; + } + + &:hover { + .ant-select-selection { + background-color: @primary-color_5; + } + } + + .ant-select-focused { + .ant-select-selection { + background-color: @primary-color_7; + border: solid 1px @primary-color; + } + } +} + +.ant-select-selection { + box-shadow: none !important; +} + +// date picker +.ant-calendar-today .ant-calendar-date { + color: @primary-color; + border-color: @primary-color; +} + //dropdown .ops-dropdown { .ant-dropdown-menu-item:hover, @@ -1305,6 +1357,11 @@ body { } } +// radio +.ant-radio-input:focus + .ant-radio-inner { + box-shadow: none; +} + //modal .ant-modal-content { .ant-modal-close-x { @@ -1396,6 +1453,14 @@ body { .el-input-number--small .el-input-number__decrease, .el-input-number--small .el-input-number__increase { width: 28px; + + &:hover { + color: @primary-color; + + &:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled) { + border-color: @primary-color; + } + } } .el-input-number--small { @@ -1466,3 +1531,16 @@ body { .ant-form-explain{ font-size: 12px; } + +.ant-message-info .anticon, +.ant-message-loading .anticon { + color: @primary-color_9; +} + +.primary-color { + color: @primary-color !important; +} + +.primary-bg-color { + background-color: @primary-color; +} diff --git a/cmdb-ui/src/style/static.less b/cmdb-ui/src/style/static.less index 4430d4c..db1f3b3 100644 --- a/cmdb-ui/src/style/static.less +++ b/cmdb-ui/src/style/static.less @@ -10,6 +10,7 @@ @primary-color_6: #f9fbff; @primary-color_7: #f7f8fa; @primary-color_8: #b1c9ff; +@primary-color_9: #3F75FF; @link-color: @primary-color; @@ -73,7 +74,8 @@ .btn-wave-hover( @hoverBgColor, - @bgZIndex: 0 + @bgZIndex: 0, + @duration: 0.3s ) { position: relative; overflow: hidden; @@ -99,10 +101,10 @@ transform: scale(0) translate(-50%, -50%); transform-origin: left top; - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transition: -webkit-transform @duration ease-out; + transition: -webkit-transform @duration ease-out; + transition: transform @duration ease-out; + transition: transform @duration ease-out, -webkit-transform @duration ease-out; } &:not([disabled]):hover { diff --git a/cmdb-ui/src/views/setting/companyStructure/index.vue b/cmdb-ui/src/views/setting/companyStructure/index.vue index b154142..674bfe3 100644 --- a/cmdb-ui/src/views/setting/companyStructure/index.vue +++ b/cmdb-ui/src/views/setting/companyStructure/index.vue @@ -100,7 +100,7 @@ /> </div> <!-- 筛选框 --> - <div class="Screening-box" v-if="activeGroupIndex === 1" style="background-color: rgb(240, 245, 255)"> + <div class="Screening-box" v-if="activeGroupIndex === 1"> <a-popover @visibleChange="visibleChange" trigger="click" @@ -1166,7 +1166,7 @@ export default { .Screening-box { margin-left: 10px; display: inline-block; - .ops_display_wrapper(#fff); + .ops_display_wrapper(@primary-color_5); .screening-box-scene-icon { color: @primary-color; font-size: 12px; diff --git a/cmdb-ui/src/views/setting/components/settingFilterComp/index.vue b/cmdb-ui/src/views/setting/components/settingFilterComp/index.vue index 8ff2bad..f2325f5 100644 --- a/cmdb-ui/src/views/setting/components/settingFilterComp/index.vue +++ b/cmdb-ui/src/views/setting/components/settingFilterComp/index.vue @@ -340,7 +340,7 @@ export default { & > a { padding: 2px 8px; &:hover { - background-color: #f0faff; + background-color: @primary-color_5; border-radius: 5px; } }