diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.eot b/frontend/desktop/src/assets/fonts/bksops-icon.eot index d8c71d9d0f..0ed6cf8ed2 100644 Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.eot and b/frontend/desktop/src/assets/fonts/bksops-icon.eot differ diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.svg b/frontend/desktop/src/assets/fonts/bksops-icon.svg index 0b4dc054f8..e1c5106cd9 100644 --- a/frontend/desktop/src/assets/fonts/bksops-icon.svg +++ b/frontend/desktop/src/assets/fonts/bksops-icon.svg @@ -587,7 +587,7 @@ - + diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.ttf b/frontend/desktop/src/assets/fonts/bksops-icon.ttf index ed11d935cb..59bf7604dd 100644 Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.ttf and b/frontend/desktop/src/assets/fonts/bksops-icon.ttf differ diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.woff b/frontend/desktop/src/assets/fonts/bksops-icon.woff index f42a17ea0d..d89befc02a 100644 Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.woff and b/frontend/desktop/src/assets/fonts/bksops-icon.woff differ diff --git a/frontend/desktop/src/components/common/RenderForm/FormGroup.vue b/frontend/desktop/src/components/common/RenderForm/FormGroup.vue index 4b7041edf2..dd592e4b9f 100644 --- a/frontend/desktop/src/components/common/RenderForm/FormGroup.vue +++ b/frontend/desktop/src/components/common/RenderForm/FormGroup.vue @@ -104,7 +104,7 @@ .rf-tag-form { + margin-right: 58px; + } + .hook-icon { + padding-right: 3px !important; + } } .rf-group-name { display: block @@ -446,15 +454,17 @@ display: flex; align-items: center; justify-content: center; - padding: 0 8px; height: 32px; background: #f0f1f5; border-radius: 2px; + cursor: pointer; z-index: 1; - .hook-icon { - font-size: 16px; + .hook-icon, + .render-skip-icon { + height: 32px; + line-height: 32px; + font-size: 12px; color: #979ba5; - cursor: pointer; &.disabled { color: #c4c6cc; cursor: not-allowed; @@ -464,8 +474,13 @@ } } .hook-icon { + line-height: 33px; + padding: 0 8px; font-size: 16px; } + .render-skip-icon { + padding: 0 8px 0 3px; + } .icon-angle-up-fill { font-size: 12px; color: #c4c6cc; diff --git a/frontend/desktop/src/components/common/RenderForm/FormItem.vue b/frontend/desktop/src/components/common/RenderForm/FormItem.vue index dae623311b..6d53b47681 100644 --- a/frontend/desktop/src/components/common/RenderForm/FormItem.vue +++ b/frontend/desktop/src/components/common/RenderForm/FormItem.vue @@ -477,12 +477,15 @@ } &.rf-has-hook { & > .rf-tag-form { - margin-right: 45px; + margin-right: 40px; } } &.show-render { > .rf-tag-form { - margin-right: 64px; + margin-right: 58px; + } + .hook-icon { + padding-right: 3px !important; } } &.rf-col-layout { @@ -548,16 +551,17 @@ display: flex; align-items: center; justify-content: space-between; - padding: 0 8px; height: 32px; background: #f0f1f5; border-radius: 2px; z-index: 1; + cursor: pointer; .hook-icon, .render-skip-icon { - font-size: 14px; + height: 32px; + line-height: 32px; + font-size: 12px; color: #979ba5; - cursor: pointer; &.disabled { color: #c4c6cc; cursor: not-allowed; @@ -567,10 +571,12 @@ } } .hook-icon { + line-height: 31px; + padding: 0 8px; font-size: 16px; } .render-skip-icon { - margin-left: 7px; + padding: 0 8px 0 3px; } .icon-angle-up-fill { font-size: 12px; diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue index 520428a8f5..e438f40b05 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue @@ -213,12 +213,14 @@ } }) }) - } else if (this.decorationsMap[lineNumber]) { - this.decorationsMap[lineNumber].forEach(decorations => { - monacoInstance.deltaDecorations( - [...decorations], - [] - ) + } else { + Object.keys(this.decorationsMap).forEach(key => { + this.decorationsMap[key].forEach(decorations => { + monacoInstance.deltaDecorations( + [...decorations], + [] + ) + }) }) this.decorationsMap = {} } diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue index f3679cd257..3b772babee 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue @@ -48,11 +48,11 @@
  • - {{ item }} + :key="item.key" + :class="{ 'is-hover': hoverKey === item.key }" + @click.stop="onSelectVal(item.key)"> + {{ item.key }} + {{ item.name }}
  • @@ -122,14 +122,14 @@ }), constantArr: { get () { - let Keylist = [] + let KeyList = [] if (this.constants) { - Keylist = [...Object.keys(this.constants)] + KeyList = [...Object.values(this.constants)] } if (this.internalVariable) { - Keylist = [...Keylist, ...Object.keys(this.internalVariable)] + KeyList = [...KeyList, ...Object.values(this.internalVariable)] } - return Keylist + return KeyList }, set (val) { this.varList = val @@ -330,7 +330,7 @@ matchResult = [matchText] } if (matchResult && matchResult[0]) { - this.varList = this.constantArr.filter(item => item.indexOf(matchText) > -1) + this.varList = this.constantArr.filter(item => item.key.indexOf(matchText) > -1) // 计算变量下拉列表的left this.isListOpen = false if (this.varList.length) { @@ -352,11 +352,10 @@ this.$el.appendChild(newDom) const focusValueWidth = newDom.offsetWidth || 0 this.$el.removeChild(newDom) - let right = inputWidth - 238 - previousDomLeft - previousDomWidth - focusValueWidth - right = right > 0 ? right : 0 - this.varListPositionRight = right this.$nextTick(() => { - const { height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + const { width: varListWidth, height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + let right = inputWidth - varListWidth - previousDomLeft - previousDomWidth - focusValueWidth + right = right > 0 ? right : 0 const top = window.innerHeight < inputTop + 30 + varListHeight + 50 ? -95 : 30 this.varListPosition = `right: ${right}px; top: ${top}px` }) @@ -382,9 +381,14 @@ // 获取行内纯文本 const divInputDom = this.$el.querySelector('.div-input') let inputValue = divInputDom.textContent + inputValue.replace(' ', ' ') if (divInputDom.childNodes.length) { inputValue = Array.from(divInputDom.childNodes).map(item => { - return item.type === 'button' ? item.value : item.textContent + return item.type === 'button' + ? item.value + : item.textContent.trim() === '' + ? ' ' + : item.textContent.replace(/ /g, ' ') }).join('') } this.input.value = inputValue @@ -410,7 +414,7 @@ let isExistVar = false if ($0) { isExistVar = this.constantArr.some(item => { - const varText = item.slice(2, -1) + const varText = item.key.slice(2, -1) if ($0.indexOf(varText) > -1) { const regexp = new RegExp(`^(.*\\W|\\W)?${varText}(\\W|\\W.*)?$`) return regexp.test($0) @@ -451,12 +455,12 @@ if (len) { event.preventDefault() event.stopPropagation() - let curIndex = this.varList.findIndex(item => item === this.hoverKey) + let curIndex = this.varList.findIndex(item => item.key === this.hoverKey) curIndex = event.code === 'ArrowDown' ? curIndex + 1 : curIndex - 1 curIndex = curIndex > len - 1 ? 0 : (curIndex < 0 ? len - 1 : curIndex) const option = this.varList[curIndex] if (option) { - this.hoverKey = option + this.hoverKey = option.key const selectDom = this.$el.querySelector('.rf-select-content') const hoverItemDom = selectDom.querySelector('.is-hover') if (hoverItemDom) { @@ -487,12 +491,17 @@ position: absolute; top: 30px; right: 0; - width: 238px; + max-width: 600px; background: #ffffff; + border: 1px solid #dcdee5; border-radius: 2px; - box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 3px 9px 0 rgba(0,0,0,.1); overflow-y: hidden; z-index: 100; + .name { + color: #c4c6cc; + margin-left: 16px; + } } .rf-select-content { max-height: 100px; @@ -501,12 +510,21 @@ @include scrollbar; } .rf-select-item { + display: flex; + align-items: center; padding: 0 10px; line-height: 32px; font-size: 12px; cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; + > span { + flex-shrink: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .name { + max-width: 250px; + } &.is-hover, &:hover { background: #f5f7fa; diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue index 4d16f302c8..c3f3832971 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue @@ -38,11 +38,11 @@
  • - {{ item }} + :key="item.key" + :class="{ 'is-hover': hoverKey === item.key }" + @click.stop="onSelectVal(item.key)"> + {{ item.key }} + {{ item.name }}
  • @@ -107,10 +107,10 @@ get () { let KeyList = [] if (this.constants) { - KeyList = [...Object.keys(this.constants)] + KeyList = [...Object.values(this.constants)] } if (this.internalVariable) { - KeyList = [...KeyList, ...Object.keys(this.internalVariable)] + KeyList = [...KeyList, ...Object.values(this.internalVariable)] } return KeyList }, @@ -277,7 +277,7 @@ } // 判断是否为变量格式 if (matchText === '$' || /^\${[a-zA-Z_]*[\w|.]*/.test(matchText)) { - this.varList = this.constantArr.filter(item => item.indexOf(matchText) > -1) + this.varList = this.constantArr.filter(item => item.key.indexOf(matchText) > -1) // 计算变量下拉列表的坐标 this.isListOpen = false if (this.varList.length) { @@ -307,13 +307,13 @@ const focusValueWidth = newDom.offsetWidth || 0 const focusValueHeight = newDom.offsetHeight || 0 this.$el.removeChild(newDom) - let popLeft = previousDomLeft + previousDomWidth + focusValueWidth - if (popLeft > inputWidth - 238) { - popLeft = inputWidth - 238 - } - let popTop = textNodeTop - inputTop + focusValueHeight + 2 // 2px是为了使光标和联想列表隔开 this.$nextTick(() => { - const { height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + const { height: varListHeight, width: varListWidth } = document.querySelector('.rf-select-list').getBoundingClientRect() + let popLeft = previousDomLeft + previousDomWidth + focusValueWidth + if (popLeft > inputWidth - varListWidth) { + popLeft = inputWidth - varListWidth + } + let popTop = textNodeTop - inputTop + focusValueHeight + 2 // 2px是为了使光标和联想列表隔开 if (window.innerHeight < textNodeTop + focusValueHeight + varListHeight + 50) { popTop = textNodeTop - inputTop - varListHeight - 2 } @@ -345,7 +345,11 @@ let domValue = dom.textContent || '\n' if (dom.childNodes.length) { domValue = Array.from(dom.childNodes).map(item => { - return item.type === 'button' ? item.value : item.textContent + return item.type === 'button' + ? item.value + : item.textContent.trim() === '' + ? ' ' + : item.textContent.replace(/ /g, ' ') }).join('') } return domValue @@ -376,7 +380,7 @@ let isExistVar = false if ($0) { isExistVar = this.constantArr.some(item => { - const varText = item.slice(2, -1) + const varText = item.key.slice(2, -1) if ($0.indexOf(varText) > -1) { const regexp = new RegExp(`^(.*\\W|\\W)?${varText}(\\W|\\W.*)?$`) return regexp.test($0) @@ -436,12 +440,12 @@ if (len) { event.preventDefault() event.stopPropagation() - let curIndex = this.varList.findIndex(item => item === this.hoverKey) + let curIndex = this.varList.findIndex(item => item.key === this.hoverKey) curIndex = event.code === 'ArrowDown' ? curIndex + 1 : curIndex - 1 curIndex = curIndex > len - 1 ? 0 : (curIndex < 0 ? len - 1 : curIndex) const option = this.varList[curIndex] if (option) { - this.hoverKey = option + this.hoverKey = option.key const selectDom = this.$el.querySelector('.rf-select-content') const hoverItemDom = selectDom.querySelector('.is-hover') if (hoverItemDom) { @@ -471,12 +475,17 @@ position: absolute; top: 40px; right: 0; - width: 238px; + max-width: 600px; background: #ffffff; + border: 1px solid #dcdee5; border-radius: 2px; - box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 3px 9px 0 rgba(0,0,0,.1); overflow-y: hidden; z-index: 100; + .name { + color: #c4c6cc; + margin-left: 16px; + } } .rf-select-content { max-height: 100px; @@ -485,12 +494,21 @@ @include scrollbar; } .rf-select-item { + display: flex; + align-items: center; padding: 0 10px; line-height: 32px; font-size: 12px; cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; + > span { + flex-shrink: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .name { + max-width: 250px; + } &.is-hover, &:hover { background: #f5f7fa; diff --git a/frontend/desktop/src/config/i18n/cn.js b/frontend/desktop/src/config/i18n/cn.js index fff8ebb805..b69269f734 100644 --- a/frontend/desktop/src/config/i18n/cn.js +++ b/frontend/desktop/src/config/i18n/cn.js @@ -1788,7 +1788,10 @@ const cn = { '清除所有IP': '清除所有IP', '清除异常IP': '清除异常IP', '节点输入型变量仅支持从节点"取消使用变量"来删除': '节点输入型变量仅支持从节点"取消使用变量"来删除', - '节点输出型变量仅支持从节点"取消接收输出"来删除': '节点输出型变量仅支持从节点"取消接收输出"来删除 ' + '节点输出型变量仅支持从节点"取消接收输出"来删除': '节点输出型变量仅支持从节点"取消接收输出"来删除', + '刷新': '刷新', + 'exFailedText': '节点执行失败,请前往{0}查看错误原因', + 'exFailedText_调用日志': '调用日志' } export default cn diff --git a/frontend/desktop/src/config/i18n/en.js b/frontend/desktop/src/config/i18n/en.js index ecff355d91..ad57c28e8d 100644 --- a/frontend/desktop/src/config/i18n/en.js +++ b/frontend/desktop/src/config/i18n/en.js @@ -1822,7 +1822,10 @@ const en = { '清除所有IP': 'Clear all IPs', '清除异常IP': 'Clear abnormal IP', '节点输入型变量仅支持从节点"取消使用变量"来删除': 'Node input variables can only be deleted by the node "Cancel Using variable"', - '节点输出型变量仅支持从节点"取消接收输出"来删除': 'Node output variables can only be deleted by the node "Cancel Receiving Output"' + '节点输出型变量仅支持从节点"取消接收输出"来删除': 'Node output variables can only be deleted by the node "Cancel Receiving Output"', + '刷新': 'Refresh', + 'exFailedText': 'Node execution failed. Please go to the {0} to check the error reason.', + 'exFailedText_调用日志': 'call log' } export default en diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue index d654c1de1a..14df3b33f6 100644 --- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue +++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue @@ -130,7 +130,8 @@ :execute-info="executeRecord" :node-detail-config="nodeDetailConfig" :not-performed-sub-node="notPerformedSubNode" - :is-sub-process-node="isSubProcessNode"> + :is-sub-process-node="isSubProcessNode" + @onTabChange="onTabChange">
    diff --git a/frontend/desktop/src/scss/iconfont.scss b/frontend/desktop/src/scss/iconfont.scss index bad7e07801..eb48bed614 100644 --- a/frontend/desktop/src/scss/iconfont.scss +++ b/frontend/desktop/src/scss/iconfont.scss @@ -590,9 +590,9 @@ .common-icon-full-screen:before { content: "\e202"; } -.common-icon-variable-hook:before { - content: "\e205"; -} .common-icon-converge-node:before { content: "\e204"; } +.common-icon-variable-hook:before { + content: "\e207"; +}