Commit 30353c896536cc3e2cdf7b9dc768e5d071beec4a

Authored by xp.Huang
2 parents 9beebc38 ece0f715

Merge branch 'ww' into 'main'

feat: implement real time && trigger event

See merge request huang/thingskit-drawio!11
1 -(function()  
2 -{  
3 - // Adds Atlassian shapes  
4 - Sidebar.prototype.addBasicComponentsPalette = function()  
5 - {  
6 - var sb = this;  
7 - var gn = 'mxgraph.component';  
8 - var dt = 'component ';  
9 - var lineTags = 'line lines connector connectors connection connections arrow arrows '  
10 - this.setCurrentSearchEntryLibrary('general', 'component');  
11 - var currentDate = getCurrentDate();  
12 - var fns = [  
13 - this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;fontSize=24;fontStyle=1;verticalAlign=middle;align=center;', 100, 40, 'Title', 'Title', null, null, 'text heading title'),  
14 - this.createEdgeTemplateEntry('shape=filledEdge;rounded=1;fixDash=1;endArrow=none;strokeWidth=10;fillColor=#BAFDFF;edgeStyle=orthogonalEdgeStyle;flowAnimation=1;strokeColor=#6666FF;endFill=1;metaEdit=0;backgroundOutline=0;', 60, 40, '', '线条'),  
15 - this.addEntry('timestamp date time text label', mxUtils.bind(this, function()  
16 - {  
17 - var cell = new mxCell('%date{yyyy-mm-dd ddd HH:MM:ss}%', new mxGeometry(0, 0, 160, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');  
18 - cell.vertex = true;  
19 - this.graph.setAttributeForCell(cell, 'placeholders', '1');  
20 - this.graph.setAttributeForCell(cell, 'date', "成都云腾五洲科技有限公司");  
21 - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Timestamps');  
22 - })),  
23 - this.addEntry('动态时间', mxUtils.bind(this, function()  
24 - {  
25 - var cell = new mxCell('<div>%currentDate%</div><div style="font-size:30px">%date{HH:MM:ss}%</div>', new mxGeometry(0, 0, 180, 60), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');  
26 - cell.vertex = true;  
27 - this.graph.setAttributeForCell(cell, 'placeholders', '1');  
28 - this.graph.setAttributeForCell(cell, 'currentDate', currentDate);  
29 - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Variable');  
30 - })),  
31 - ]; 1 +(function () {
  2 + // Adds Atlassian shapes
  3 + Sidebar.prototype.addBasicComponentsPalette = function () {
  4 + var sb = this;
  5 + var gn = 'mxgraph.component';
  6 + var dt = 'component ';
  7 + var lineTags = 'line lines connector connectors connection connections arrow arrows '
  8 + this.setCurrentSearchEntryLibrary('general', 'component');
  9 + var currentDate = getCurrentDate();
  10 + var fns = [
  11 + this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;fontSize=24;fontStyle=1;verticalAlign=middle;align=center;', 100, 40, 'Title', 'Title', null, null, 'text heading title'),
  12 + this.createEdgeTemplateEntry('shape=filledEdge;rounded=1;fixDash=1;endArrow=none;strokeWidth=10;fillColor=#BAFDFF;edgeStyle=orthogonalEdgeStyle;flowAnimation=1;strokeColor=#6666FF;endFill=1;metaEdit=0;backgroundOutline=0;', 60, 40, '', '线条'),
  13 + this.addEntry('timestamp date time text label', mxUtils.bind(this, function () {
  14 + var cell = new mxCell('%date{yyyy-mm-dd ddd HH:MM:ss}%', new mxGeometry(0, 0, 160, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');
  15 + cell.vertex = true;
  16 + this.graph.setAttributeForCell(cell, 'placeholders', '1');
  17 + this.graph.setAttributeForCell(cell, 'date', "成都云腾五洲科技有限公司");
  18 + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Timestamps');
  19 + })),
  20 + this.addEntry('动态时间', mxUtils.bind(this, function () {
  21 + var cell = new mxCell('<div>%currentDate%</div><div style="font-size:30px">%date{HH:MM:ss}%</div>', new mxGeometry(0, 0, 180, 60), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');
  22 + cell.vertex = true;
  23 + this.graph.setAttributeForCell(cell, 'placeholders', '1');
  24 + this.graph.setAttributeForCell(cell, 'currentDate', currentDate);
  25 + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Variable');
  26 + })),
  27 + this.addEntry('real time', mxUtils.bind(this, function () {
  28 + const template = `<div class="thingKit-component__real-time"><div class="real-time__date">%currentDate%</div> <div style="font-size:30px" class="real-time__now">%date{HH:MM:ss}%</div></div>`
  29 + const cell = new mxCell(template, new mxGeometry(0, 0, 180, 60), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;');
  30 + cell.vertex = true;
  31 + this.graph.setAttributeForCell(cell, 'placeholders', '1');
  32 + this.graph.setAttributeForCell(cell, 'currentDate', currentDate);
  33 + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'realTime');
  34 + })),
  35 + ];
32 36
33 - this.addPaletteFunctions('component', '基础元件', false, fns);  
34 - this.setCurrentSearchEntryLibrary();  
35 - }; 37 + this.addPaletteFunctions('component', '基础元件', false, fns);
  38 + this.setCurrentSearchEntryLibrary();
  39 + };
36 40
37 - //封装日期函数  
38 - function getCurrentDate() {  
39 - var date = new Date(); //创建日期对象  
40 - var year = date.getFullYear();  
41 - var month = date.getMonth() + 1;  
42 - var dates = date.getDate();  
43 - arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', ]  
44 - var day = date.getDay();  
45 - return year + '年' + month + '月' + dates + '日 ' + arr[day];  
46 - } 41 + //封装日期函数
  42 + function getCurrentDate() {
  43 + var date = new Date(); //创建日期对象
  44 + var year = date.getFullYear();
  45 + var month = date.getMonth() + 1;
  46 + var dates = date.getDate();
  47 + arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',]
  48 + var day = date.getDay();
  49 + return year + '年' + month + '月' + dates + '日 ' + arr[day];
  50 + }
47 })(); 51 })();
@@ -4879,7 +4879,8 @@ DataFormatPanel.prototype.addDataFont = function (container) { @@ -4879,7 +4879,8 @@ DataFormatPanel.prototype.addDataFont = function (container) {
4879 const ss = ui.getSelectionState(); 4879 const ss = ui.getSelectionState();
4880 const vertices = ss.vertices || [] 4880 const vertices = ss.vertices || []
4881 4881
4882 - console.log(vertices) 4882 + console.log(this.editorUi)
  4883 + console.log(ss.vertices)
4883 /** 4884 /**
4884 * @description 不是单一节点则不进入数据绑定 4885 * @description 不是单一节点则不进入数据绑定
4885 */ 4886 */
@@ -5404,9 +5405,13 @@ DataFormatPanel.prototype.addDataFont = function (container) { @@ -5404,9 +5405,13 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5404 type: item.type, 5405 type: item.type,
5405 enabled: true 5406 enabled: true
5406 }) 5407 })
  5408 + } else {
  5409 + value[item.category].push({
  5410 + type: item.type,
  5411 + enabled: false
  5412 + })
5407 } 5413 }
5408 } 5414 }
5409 -  
5410 const [err, res] = await to(ConfigurationNodeApi.updateNodeInfo(value)) 5415 const [err, res] = await to(ConfigurationNodeApi.updateNodeInfo(value))
5411 if (err) return 5416 if (err) return
5412 UseLayUi.successMsg() 5417 UseLayUi.successMsg()
@@ -6232,7 +6237,8 @@ DataFormatPanel.prototype.addDataFont = function (container) { @@ -6232,7 +6237,8 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6232 */ 6237 */
6233 function echoOrgTree(id) { 6238 function echoOrgTree(id) {
6234 const node = UseLayUi.findTreeObjectByField(treeList, id) 6239 const node = UseLayUi.findTreeObjectByField(treeList, id)
6235 - $(`#${ enumActionEl.ORG_EL }`).find(`input[name="${ enumConst.ORG_ID }"]`).parent().find('span').html(node.name) 6240 + console.log(node)
  6241 + $(`#${ enumActionEl.ORG_EL }`).find(`input[name="${ enumConst.ORG_ID }"]`).parent().find('span').html(node?.name)
6236 } 6242 }
6237 6243
6238 async function submit(callback) { 6244 async function submit(callback) {
@@ -10899,11 +10905,16 @@ class DispatchCenter { @@ -10899,11 +10905,16 @@ class DispatchCenter {
10899 10905
10900 /** 10906 /**
10901 * @description 节点映射 10907 * @description 节点映射
10902 - * @type {Map<string, object>} 10908 + * @type {Map<string, Map<string, object>>}
10903 */ 10909 */
10904 nodeMapping 10910 nodeMapping
10905 10911
10906 /** 10912 /**
  10913 + * @description
  10914 + */
  10915 + editorUi
  10916 +
  10917 + /**
10907 * @description 当前页信息 10918 * @description 当前页信息
10908 */ 10919 */
10909 currentPage 10920 currentPage
@@ -10940,8 +10951,36 @@ class DispatchCenter { @@ -10940,8 +10951,36 @@ class DispatchCenter {
10940 */ 10951 */
10941 static rawContentId 10952 static rawContentId
10942 10953
  10954 + /**
  10955 + * @description 判断事件监听器时候已经绑定过
  10956 + */
  10957 + static eventListenerIsExist = false
  10958 +
  10959 + static enumEventType = {
  10960 + DOWN: 'DOWN',
  10961 + UP: 'UP',
  10962 + SINGLE: 'SINGLE',
  10963 + DOUBLE: 'DOUBLE',
  10964 + }
  10965 +
  10966 + static enumDynamicEffectType = {
  10967 + DISPLAY: 'DISPLAY',
  10968 + FLASH: 'FLASH',
  10969 + ROTATE: 'ROTATE',
  10970 + }
  10971 +
  10972 + static enumPageType = {
  10973 + PAGE: 'PAGE',
  10974 + LINK: 'LINK'
  10975 +
  10976 + }
  10977 +
  10978 +
10943 constructor(editorUi, currentPage) { 10979 constructor(editorUi, currentPage) {
10944 this.nodeMapping = new Map() 10980 this.nodeMapping = new Map()
  10981 + this.editorUi = editorUi
  10982 +
  10983 + // mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', this.pointerUpHandler);
10945 this.init(editorUi, currentPage) 10984 this.init(editorUi, currentPage)
10946 } 10985 }
10947 10986
@@ -10953,7 +10992,7 @@ class DispatchCenter { @@ -10953,7 +10992,7 @@ class DispatchCenter {
10953 init(editorUi, currentPage) { 10992 init(editorUi, currentPage) {
10954 this.createEventBus() 10993 this.createEventBus()
10955 this.saveContentInfo(editorUi, currentPage) 10994 this.saveContentInfo(editorUi, currentPage)
10956 - // this.createGraphEventListener() 10995 + this.createGraphEventListener()
10957 this.connectSocket() 10996 this.connectSocket()
10958 this.getContentDataNode() 10997 this.getContentDataNode()
10959 } 10998 }
@@ -10996,30 +11035,33 @@ class DispatchCenter { @@ -10996,30 +11035,33 @@ class DispatchCenter {
10996 * @description 创建图层事件监听器 11035 * @description 创建图层事件监听器
10997 */ 11036 */
10998 createGraphEventListener() { 11037 createGraphEventListener() {
10999 - console.log(mxEvent)  
11000 - // this.graph.addListener(mxEvent.MOUSE_DOWN, (sender, event) => {  
11001 - // console.log('down')  
11002 - // console.log(event)  
11003 - // console.log(sender)  
11004 - // })  
11005 - // this.graph.addListener(mxEvent.MOUSE_UP, (sender, event) => {  
11006 - // console.log('up')  
11007 - // console.log(event)  
11008 - // console.log(sender)  
11009 - // })  
11010 - console.log(this.contentAllCell)  
11011 - const node = this.contentAllCell.find(item => item.id === "xu8fz6ypefe3Lfq39emV-10")  
11012 - console.log(node)  
11013 - // node.addListener(mxEvent.CLICK, (sender, event) => {  
11014 - // console.log('click')  
11015 - // console.log(event)  
11016 - // console.log(sender)  
11017 - // })  
11018 - // this.graph.addListener(mxEvent.DOUBLE_CLICK, (sender, event) => {  
11019 - // console.log('double click')  
11020 - // console.log(event)  
11021 - // console.log(sender)  
11022 - // }) 11038 + if (DispatchCenter.eventListenerIsExist) return
  11039 +
  11040 + const graphDblClick = this.graph.dblClick;
  11041 + this.graph.dblClick = (...args) => {
  11042 + this.handleDoubleClickEvent(...args)
  11043 + graphDblClick.apply(this.graph, args)
  11044 + }
  11045 +
  11046 +
  11047 + const graphClick = this.graph.click;
  11048 + this.graph.click = (...args) => {
  11049 + this.handleClickEvent(...args)
  11050 + graphClick.apply(this.graph, args)
  11051 + }
  11052 +
  11053 + const graphFireMouseEvent = this.graph.fireMouseEvent;
  11054 + this.graph.fireMouseEvent = (eventName, event, sender) => {
  11055 + if (eventName === mxEvent.MOUSE_DOWN) {
  11056 + this.handleMouseDownEvent(eventName, event, sender)
  11057 + }
  11058 + if (eventName === mxEvent.MOUSE_UP) {
  11059 + this.handleMouseUpEvent(eventName, event, sender)
  11060 + }
  11061 + graphFireMouseEvent.apply(this.graph, [eventName, event, sender]);
  11062 + };
  11063 +
  11064 + DispatchCenter.eventListenerIsExist = true
11023 } 11065 }
11024 11066
11025 /** 11067 /**
@@ -11029,6 +11071,7 @@ class DispatchCenter { @@ -11029,6 +11071,7 @@ class DispatchCenter {
11029 */ 11071 */
11030 saveContentInfo(editorUi, currentPage) { 11072 saveContentInfo(editorUi, currentPage) {
11031 const editor = editorUi.editor 11073 const editor = editorUi.editor
  11074 + console.log(editorUi)
11032 this.graph = editor.graph 11075 this.graph = editor.graph
11033 this.currentPage = currentPage 11076 this.currentPage = currentPage
11034 this.contentAllCell = this.graph.getDefaultParent().children 11077 this.contentAllCell = this.graph.getDefaultParent().children
@@ -11041,11 +11084,14 @@ class DispatchCenter { @@ -11041,11 +11084,14 @@ class DispatchCenter {
11041 const { node: { id } = {} } = this.currentPage 11084 const { node: { id } = {} } = this.currentPage
11042 if (!id) return 11085 if (!id) return
11043 const [err, res] = await to(ConfigurationNodeApi.getConfigurationInfo('CONTENT', id)) 11086 const [err, res] = await to(ConfigurationNodeApi.getConfigurationInfo('CONTENT', id))
11044 - const { dataSources } = res 11087 + const { dataSources, event, act } = res
11045 const sendMsg = { 11088 const sendMsg = {
11046 tsSubCmds: this.generatorDataSourceMapping(dataSources) 11089 tsSubCmds: this.generatorDataSourceMapping(dataSources)
11047 } 11090 }
  11091 + this.generatorEventMapping(event)
  11092 + this.generatorActionEffectMapping(act)
11048 this.sendMessageToGetRealTimeData(sendMsg) 11093 this.sendMessageToGetRealTimeData(sendMsg)
  11094 + console.log(this.nodeMapping)
11049 } 11095 }
11050 11096
11051 /** 11097 /**
@@ -11073,17 +11119,45 @@ class DispatchCenter { @@ -11073,17 +11119,45 @@ class DispatchCenter {
11073 } 11119 }
11074 11120
11075 this.subscribeDataSources(datum, eventName, attr) 11121 this.subscribeDataSources(datum, eventName, attr)
11076 - this.nodeMapping.set(deviceId, sendMsgTemplate)  
11077 return sendMsgTemplate 11122 return sendMsgTemplate
11078 }) 11123 })
11079 } 11124 }
11080 11125
11081 /** 11126 /**
  11127 + * @description 事件映射
  11128 + * @param event
  11129 + */
  11130 + generatorEventMapping(event = []) {
  11131 + for (const item of event) {
  11132 + const { content, id: nodeId, enabled, type } = item
  11133 + if (!enabled) continue
  11134 + if (!this.nodeMapping.has(nodeId)) this.nodeMapping.set(nodeId, new Map())
  11135 + const temp = this.nodeMapping.get(nodeId)
  11136 + temp.set(type, content)
  11137 + }
  11138 + }
  11139 +
  11140 + /**
  11141 + * @description 动效映射
  11142 + * @param act
  11143 + */
  11144 + generatorActionEffectMapping(act = []) {
  11145 + for (const item of act) {
  11146 + const { condition, id: nodeId, enabled, type } = item
  11147 + if (!enabled) continue
  11148 + if (!this.nodeMapping.has(nodeId)) this.nodeMapping.set(nodeId, new Map())
  11149 + const temp = this.nodeMapping.get(nodeId)
  11150 + temp.set(type, condition)
  11151 + }
  11152 + }
  11153 +
  11154 + /**
11082 * @description 分发事件 11155 * @description 分发事件
11083 */ 11156 */
11084 publishEvent(eventName, data) { 11157 publishEvent(eventName, data) {
11085 Object.keys(data).forEach(() => { 11158 Object.keys(data).forEach(() => {
11086 this.eventBus.emit(eventName, data) 11159 this.eventBus.emit(eventName, data)
  11160 +
11087 }) 11161 })
11088 } 11162 }
11089 11163
@@ -11118,6 +11192,81 @@ class DispatchCenter { @@ -11118,6 +11192,81 @@ class DispatchCenter {
11118 } 11192 }
11119 } 11193 }
11120 11194
  11195 + /**
  11196 + * @description 处理按下事件
  11197 + * @param eventName
  11198 + * @param event
  11199 + * @param sender
  11200 + */
  11201 + handleMouseDownEvent(eventName, event, sender) {
  11202 + const { state: { cell: { id } = {} } = {} } = event
  11203 + const temp = this.nodeMapping.get(id)
  11204 + if (temp && temp.has(DispatchCenter.enumEventType.DOWN)) {
  11205 + const content = temp.get(DispatchCenter.enumEventType.DOWN)
  11206 + console.log('mouse down event', content)
  11207 + }
  11208 + }
  11209 +
  11210 + /**
  11211 + * @description 处理抬起事件
  11212 + * @param eventName
  11213 + * @param event
  11214 + * @param sender
  11215 + */
  11216 + handleMouseUpEvent(eventName, event, sender) {
  11217 + const { state: { cell: { id } = {} } = {} } = event
  11218 + const temp = this.nodeMapping.get(id)
  11219 + if (temp && temp.has(DispatchCenter.enumEventType.UP)) {
  11220 + const content = temp.get(DispatchCenter.enumEventType.UP)
  11221 + console.log('mouse up event', content)
  11222 + }
  11223 + }
  11224 +
  11225 + /**
  11226 + * @description 鼠标双击事件
  11227 + * @param event
  11228 + */
  11229 + handleClickEvent(event) {
  11230 + const { state: { cell: { id } = {} } = {} } = event
  11231 + const temp = this.nodeMapping.get(id)
  11232 + if (temp && temp.has(DispatchCenter.enumEventType.SINGLE)) {
  11233 + const content = temp.get(DispatchCenter.enumEventType.SINGLE)
  11234 + const { type, value } = content
  11235 + if (type === DispatchCenter.enumPageType.PAGE) {
  11236 + this.jumpPage(value)
  11237 + } else if (type === DispatchCenter.enumPageType.LINK) {
  11238 + window.open(value)
  11239 + }
  11240 + }
  11241 + }
  11242 +
  11243 + /**
  11244 + * @description 鼠标单击事件
  11245 + * @param event
  11246 + * @param cell
  11247 + */
  11248 + handleDoubleClickEvent(event, cell = {}) {
  11249 + const { id } = cell
  11250 + const temp = this.nodeMapping.get(id)
  11251 + if (temp && temp.has(DispatchCenter.enumEventType.DOUBLE)) {
  11252 + const content = temp.get(DispatchCenter.enumEventType.DOUBLE)
  11253 + const { type, value } = content
  11254 + if (type === DispatchCenter.enumPageType.PAGE) {
  11255 + this.jumpPage(value)
  11256 + } else if (type === DispatchCenter.enumPageType.LINK) {
  11257 + window.open(value)
  11258 + }
  11259 + }
  11260 + }
  11261 +
  11262 + /**
  11263 + * @description 跳转页面
  11264 + */
  11265 + jumpPage(page) {
  11266 + // const page = 'ikp4NlRjQpI8WxeSibFj'
  11267 + this.editorUi.handleCustomLink(`data:page/id,${ page }`)
  11268 + }
  11269 +
11121 11270
11122 /** 11271 /**
11123 * @description 返回 DispatchCenter 实例 当contentID变化时重新创建实例 11272 * @description 返回 DispatchCenter 实例 当contentID变化时重新创建实例
@@ -11138,3 +11287,22 @@ class DispatchCenter { @@ -11138,3 +11287,22 @@ class DispatchCenter {
11138 11287
11139 } 11288 }
11140 11289
  11290 +function globalInit() {
  11291 + init()
  11292 +
  11293 + function init() {
  11294 + initRealTime()
  11295 + }
  11296 +
  11297 + function initRealTime() {
  11298 + setInterval(() => {
  11299 + const allTimeNode = document.querySelectorAll('.thingKit-component__real-time .real-time__now')
  11300 + for (const time of allTimeNode) {
  11301 + const date = new Date()
  11302 + time.innerHTML = `${ date.getHours() }:${ date.getMinutes() < 10 ? '0' : '' }${ date.getMinutes() }:${ date.getSeconds() < 10 ? '0' : '' }${ date.getSeconds() }`
  11303 + }
  11304 + }, 1000)
  11305 + }
  11306 +}
  11307 +
  11308 +globalInit()