Commit 3024c4cae697bda16ccb074e0cbee65a07704b7b
1 parent
01e2632e
feat: implement params setting button component
Showing
4 changed files
with
90 additions
and
15 deletions
... | ... | @@ -240,6 +240,11 @@ |
240 | 240 | SWITCH: 'switch', |
241 | 241 | |
242 | 242 | /** |
243 | + * @description 参数设置按钮 | |
244 | + */ | |
245 | + PARAMS_SETTING_BUTTON: 'paramsSettingButton', | |
246 | + | |
247 | + /** | |
243 | 248 | * @description 默认类型 |
244 | 249 | */ |
245 | 250 | DEFAULT: 'default', |
... | ... | @@ -315,7 +320,10 @@ |
315 | 320 | */ |
316 | 321 | SWITCH_STATE_SETTING: 'stateSetting', |
317 | 322 | |
318 | - | |
323 | + /** | |
324 | + * @description 只有单机事件 | |
325 | + */ | |
326 | + ONLY_SINGLE_EVENT: 'onlySingleEvent' | |
319 | 327 | } |
320 | 328 | |
321 | 329 | /** |
... | ... | @@ -672,8 +680,8 @@ |
672 | 680 | //更多图形,显示出来的的标题跟id,同时包括图片 |
673 | 681 | |
674 | 682 | // TODO thingsKit 设置数据绑定展示面板 |
675 | - const { LINE_CHART_EXPAND, BAR_CHART_EXPAND, DYNAMIC_EFFECT, DATA_SOURCE, VAR_IMAGE, INTERACTION, VIDEO: VIDEO_PANEL, SWITCH_STATE_SETTING } = this.enumPermissionPanel | |
676 | - const { LINE, LINE_CHART, REAL_TIME, TITLE, VARIABLE, DEFAULT, BAR_CHART, VIDEO, SWITCH } = this.enumComponentType | |
683 | + const { LINE_CHART_EXPAND, BAR_CHART_EXPAND, DYNAMIC_EFFECT, DATA_SOURCE, VAR_IMAGE, INTERACTION, VIDEO: VIDEO_PANEL, SWITCH_STATE_SETTING, ONLY_SINGLE_EVENT } = this.enumPermissionPanel | |
684 | + const { LINE, LINE_CHART, REAL_TIME, TITLE, VARIABLE, DEFAULT, BAR_CHART, VIDEO, SWITCH, PARAMS_SETTING_BUTTON } = this.enumComponentType | |
677 | 685 | this.setComponentPermission(LINE, [DYNAMIC_EFFECT]) |
678 | 686 | this.setComponentPermission(DEFAULT, [DYNAMIC_EFFECT]) |
679 | 687 | this.setComponentPermission(REAL_TIME, [DYNAMIC_EFFECT]) |
... | ... | @@ -684,6 +692,7 @@ |
684 | 692 | this.setComponentPermission(LINE_CHART, [DATA_SOURCE, LINE_CHART_EXPAND]) |
685 | 693 | this.setComponentPermission(VIDEO, [VIDEO_PANEL]) |
686 | 694 | this.setComponentPermission(SWITCH, [DATA_SOURCE, SWITCH_STATE_SETTING]) |
695 | + this.setComponentPermission(PARAMS_SETTING_BUTTON, [DATA_SOURCE, ONLY_SINGLE_EVENT]) | |
687 | 696 | |
688 | 697 | var thingskitEntries = [ |
689 | 698 | { title: mxResources.get('general'), id: 'general', image: IMAGE_PATH + '/sidebar-general.png' }, | ... | ... |
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | // Control Component 控制元件 |
5 | 5 | Sidebar.prototype.addControlComponentsPalette = function () { |
6 | 6 | const { COMPONENT_TYPE } = this.enumCellBasicAttribute |
7 | - const { SWITCH } = this.enumComponentType | |
7 | + const { SWITCH, PARAMS_SETTING_BUTTON } = this.enumComponentType | |
8 | 8 | const gn = 'mxgraph.control'; |
9 | 9 | const dt = 'control'; |
10 | 10 | const label = '控制元件' |
... | ... | @@ -15,18 +15,29 @@ |
15 | 15 | const defaultStyle = ';imageAspect=0;' |
16 | 16 | this.setCurrentSearchEntryLibrary(dt); |
17 | 17 | |
18 | - // 自定义属性 | |
19 | - const cellAttribute = { | |
20 | - [COMPONENT_TYPE]: SWITCH | |
21 | - } | |
18 | + | |
22 | 19 | |
23 | 20 | const fns = [ |
24 | 21 | this.addEntry(this.getTagsForStencil(gn, 'Switch', dt).join(' '), mxUtils.bind(this, function () { |
25 | 22 | const cell = new mxCell('', new mxGeometry(0, 0, 48, 48), `image;image=images/thingskit/switch-on.svg;${defaultStyle}`); |
23 | + // 自定义属性 | |
24 | + const cellAttribute = { | |
25 | + [COMPONENT_TYPE]: SWITCH | |
26 | + } | |
26 | 27 | cell.setVertex(true) |
27 | 28 | this.setCellAttributes(cell, cellAttribute) |
28 | 29 | return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '开关'); |
29 | 30 | })), |
31 | + this.addEntry(this.getTagsForStencil(gn, 'Params Setting', dt).join(' '), mxUtils.bind(this, function () { | |
32 | + const cell = new mxCell('<button class="param-setting-button">参数设置</button>', new mxGeometry(0, 0, 100, 60), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;'); | |
33 | + // 自定义属性 | |
34 | + const cellAttribute = { | |
35 | + [COMPONENT_TYPE]: PARAMS_SETTING_BUTTON | |
36 | + } | |
37 | + cell.setVertex(true) | |
38 | + this.setCellAttributes(cell, cellAttribute) | |
39 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '参数设置'); | |
40 | + })), | |
30 | 41 | ] |
31 | 42 | |
32 | 43 | ... | ... |
... | ... | @@ -5133,6 +5133,7 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
5133 | 5133 | [permissionKey.VAR_IMAGE]: createVarImagePanel, |
5134 | 5134 | [permissionKey.VIDEO]: createVideoBindPanel, |
5135 | 5135 | [permissionKey.SWITCH_STATE_SETTING]: createSwitchStateSettingPanel, |
5136 | + [permissionKey.ONLY_SINGLE_EVENT]: createParamsSettingButtonPanel | |
5136 | 5137 | } |
5137 | 5138 | |
5138 | 5139 | |
... | ... | @@ -5388,10 +5389,17 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
5388 | 5389 | type: enumDynamicEffectType.SWITCH, |
5389 | 5390 | category: enumCategory.ACT, |
5390 | 5391 | }) |
5392 | + createDynamicEffectPanel() | |
5393 | + createParamsSettingButtonPanel() | |
5394 | + } | |
5395 | + | |
5396 | + /** | |
5397 | + * @description 参数设置按钮面板创建 | |
5398 | + */ | |
5399 | + function createParamsSettingButtonPanel() { | |
5391 | 5400 | const singleClick = interactionList.find(item => item.type === enumInteractionType.SINGLE) |
5392 | 5401 | interactionList.length = 0 |
5393 | 5402 | interactionList.push(singleClick) |
5394 | - createDynamicEffectPanel() | |
5395 | 5403 | createInteractionPanel() |
5396 | 5404 | } |
5397 | 5405 | |
... | ... | @@ -5856,7 +5864,8 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
5856 | 5864 | [componentType.BAR_CHART]: getSubmitValue, |
5857 | 5865 | [componentType.DEFAULT]: getSubmitValue, |
5858 | 5866 | [componentType.VIDEO]: getVideoSubmitValue, |
5859 | - [componentType.SWITCH]: getSwitchSubmitValue | |
5867 | + [componentType.SWITCH]: getSwitchSubmitValue, | |
5868 | + [componentType.PARAMS_SETTING_BUTTON]: getSwitchSubmitValue | |
5860 | 5869 | } |
5861 | 5870 | |
5862 | 5871 | const cell = vertices[0] |
... | ... | @@ -6847,7 +6856,7 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
6847 | 6856 | const basicAttr = sidebarInstance.enumCellBasicAttribute |
6848 | 6857 | const componentType = sidebarInstance.enumComponentType |
6849 | 6858 | const currentNodeType = nodeInfo.getAttribute(basicAttr.COMPONENT_TYPE) |
6850 | - const isControlComponent = [componentType.SWITCH].includes(currentNodeType) | |
6859 | + const isControlComponent = [componentType.SWITCH, componentType.PARAMS_SETTING_BUTTON].includes(currentNodeType) | |
6851 | 6860 | |
6852 | 6861 | const enumEventType = { |
6853 | 6862 | DOWN: "按下", |
... | ... | @@ -13289,6 +13298,12 @@ class HandleDataSource { |
13289 | 13298 | this.handleSwitchComponent(message) |
13290 | 13299 | return |
13291 | 13300 | } |
13301 | + | |
13302 | + if (type === this.componentType.PARAMS_SETTING_BUTTON) { | |
13303 | + this.handleParamSettingButton(message) | |
13304 | + return | |
13305 | + } | |
13306 | + | |
13292 | 13307 | if (!data) return |
13293 | 13308 | const [[timespan, value]] = data[attr] |
13294 | 13309 | node.setValue(value) |
... | ... | @@ -13323,6 +13338,14 @@ class HandleDataSource { |
13323 | 13338 | } |
13324 | 13339 | } |
13325 | 13340 | |
13341 | + handleParamSettingButton(message) { | |
13342 | + const { subscriptionId, data = {} } = message | |
13343 | + const node = this.getNodeByCmdId(subscriptionId) | |
13344 | + const { attr } = this.getBindData(subscriptionId) | |
13345 | + const [[timespan, receiveValue] = []] = data[attr] || [] | |
13346 | + node.setAttribute('label', `<button class="param-setting-button">${receiveValue}</button>`) | |
13347 | + } | |
13348 | + | |
13326 | 13349 | /** |
13327 | 13350 | * @description 更新实时数据 |
13328 | 13351 | * @param {} message |
... | ... | @@ -13964,7 +13987,7 @@ class HandleDataInteraction { |
13964 | 13987 | return false |
13965 | 13988 | } |
13966 | 13989 | const submitThrottle = this.throttle(submit) |
13967 | - async function submit() { | |
13990 | + async function submit(callback) { | |
13968 | 13991 | const value = $(`#${enumActionEl.CONTAINER}`).parent().find(`textarea[name="${enumConst.VALUE}"]`).val() || '' |
13969 | 13992 | if (!isJson(value)) { |
13970 | 13993 | UseLayUi.topErrorMsg('下发值不正确') |
... | ... | @@ -13989,6 +14012,7 @@ class HandleDataInteraction { |
13989 | 14012 | const [err, res] = await to(ConfigurationNodeApi.sendInstruction(way, deviceId, instructionData)) |
13990 | 14013 | if (!err) { |
13991 | 14014 | UseLayUi.topSuccessMsg('操作成功') |
14015 | + callback() | |
13992 | 14016 | } |
13993 | 14017 | } else { |
13994 | 14018 | UseLayUi.topErrorMsg('设备不在线!') |
... | ... | @@ -14003,7 +14027,9 @@ class HandleDataInteraction { |
14003 | 14027 | area: '600px', |
14004 | 14028 | btn: ["应用", "取消"], |
14005 | 14029 | yes(index) { |
14006 | - submitThrottle() | |
14030 | + submitThrottle(() => { | |
14031 | + layer.close(index) | |
14032 | + }) | |
14007 | 14033 | }, |
14008 | 14034 | but2(index, layero) { |
14009 | 14035 | ... | ... |
... | ... | @@ -447,7 +447,6 @@ |
447 | 447 | } |
448 | 448 | |
449 | 449 | #defaultImageEl { |
450 | - | |
451 | 450 | } |
452 | 451 | |
453 | 452 | /* ===== 数据动效 ========= */ |
... | ... | @@ -494,7 +493,7 @@ |
494 | 493 | .video-panel-org__override .layui-form-item { |
495 | 494 | display: flex; |
496 | 495 | } |
497 | -.video-panel-org__override .layui-form-item label{ | |
496 | +.video-panel-org__override .layui-form-item label { | |
498 | 497 | width: 60px; |
499 | 498 | box-sizing: border-box; |
500 | 499 | } |
... | ... | @@ -502,3 +501,33 @@ |
502 | 501 | flex: auto; |
503 | 502 | margin-left: 0; |
504 | 503 | } |
504 | + | |
505 | +/* 参数设置按钮 */ | |
506 | +.param-setting-button { | |
507 | + color: #fff; | |
508 | + border-color: #1890ff; | |
509 | + background: #1890ff; | |
510 | + text-shadow: 0 -1px 0 rgb(0 0 0 / 12%); | |
511 | + box-shadow: 0 2px #0000000b; | |
512 | + | |
513 | + line-height: 1.5715; | |
514 | + position: relative; | |
515 | + display: inline-block; | |
516 | + font-weight: 400; | |
517 | + white-space: nowrap; | |
518 | + text-align: center; | |
519 | + background-image: none; | |
520 | + border: 1px solid transparent; | |
521 | + box-shadow: 0 2px #00000004; | |
522 | + cursor: pointer; | |
523 | + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); | |
524 | + -webkit-user-select: none; | |
525 | + -moz-user-select: none; | |
526 | + -ms-user-select: none; | |
527 | + user-select: none; | |
528 | + touch-action: manipulation; | |
529 | + height: 32px; | |
530 | + padding: 4px 15px; | |
531 | + font-size: 14px; | |
532 | + border-radius: 2px; | |
533 | +} | ... | ... |