全網最詳bpmn.js教材-編輯阵苇、刪除節(jié)點篇

前言

Q: bpmn.js是什么? ???

bpmn.js是一個BPMN2.0渲染工具包和web建模器, 使得畫流程圖的功能在前端來完成.

Q: 我為什么要寫該系列的教材? ???

因為公司業(yè)務的需要因而要在項目中使用到bpmn.js,但是由于bpmn.js的開發(fā)者是國外友人, 因此國內對這方面的教材很少, 也沒有詳細的文檔. 所以很多使用方式很多坑都得自己去找.在將其琢磨完之后, 決定寫一系列關于它的教材來幫助更多bpmn.js的使用者或者是期于找到一種好的繪制流程圖的開發(fā)者. 同時也是自己對其的一種鞏固.

由于是系列的文章, 所以更新的可能會比較頻繁, 您要是無意間刷到了且不是您所需要的還請諒解??.

不求贊??不求心??. 只希望能對你有一點小小的幫助.

編輯、刪除節(jié)點篇

雖然前面已經說了很多關于如何創(chuàng)建, 渲染元素的知識, 但是在實際使用上肯定不僅僅只局限于創(chuàng)建Task妆毕、 Event這些節(jié)點上.

你可能還需要創(chuàng)建: 線(bpmn:SequenceFlow)慎玖、網關(ExclusiveGateway)、活動(Activities) 等等其他類型的節(jié)點.

甚至你想要在contextPad中定義一個刪除笛粘、編輯節(jié)點的功能.

那么這一章節(jié)我們主要就是來講解這些.

通過閱讀你可以學習到:

contextPad上的刪除功能

讓我們接著上個章節(jié)的案例進行講解哈, 項目還是之前的項目LinDaiDai/bpmn-vue-custom

想要實現的功能是: 在contextPad中加上一個刪除功能(這里加上一個小垃圾桶):

bpmnCustom20.png

并且點擊它的時候可以刪除當前的節(jié)點...

讓我們打開CustomContextPad.js文件或者CustomContextPadProvider.js文件, 然后在getContextPadEntries方法中加上以下代碼:

// CustomContextPad.js
getContextPadEntries(element) {
    const { modeling } = this // modeling需要利用CustomContextPad.$inject注冊進來
    function removeElement(e) { // 點擊的時候實現刪除功能
        modeling.removeElements([element])
    }
    function deleteElement() { // 創(chuàng)建垃圾桶
        return {
            group: 'edit',
            className: 'icon-custom icon-custom-delete',
            title: translate('刪除'),
            action: {
                click: removeElement
            }
        }
    }
    return {
        'append.lindaidai-task': {...},
        'delete': deleteElement() // 返回值加上刪除的功能
    }
}

可以看到要點就是:

  • modeling引進來, 因為要使用到它的removeElements方法;
  • 定義繪制垃圾桶的功能
  • 編寫className來實現修改默認樣式的功能

OK??, 接下來別忘了在我們的app.css中加上垃圾桶的樣式:

/* app.css*/
.icon-custom-delete {
    background-image: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png');
}

.djs-context-pad .icon-custom-delete.entry:hover {
    background: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png') center no-repeat!important;
    background-size: cover!important;
}

(自定義modeler中的CustomContextPadProvider.js也是這么寫的)

這樣刪除功能就實現了.

contextPad上的編輯功能

其實這里說的編輯功能, 是指在contextPad上定一個編輯的圖標, 然后點擊的時候, 可以出現一個彈窗, 或者右邊出現一個自定義的properties-panel, 然后這里面可以顯示出節(jié)點的一些信息.

這么做的原因是:

  • 你期望的可能不是點擊節(jié)點的時候右邊出現properties-panel, 而是將properties-panel作為一個抽屜隱藏在右側, 點擊contextPad中的某個圖標才從右側出來.
  • 點擊contextPad中的某個圖標獲取到當前節(jié)點的節(jié)點信息然后做其他自定義的操作.

通過點擊小圖標獲取節(jié)點信息

bpmnCustom21.png

如上圖, 先實現這個功能: 點擊編輯圖標, 將節(jié)點信息打印出來.

其實也很簡單, 經過了lindaidi-taskdelete之后, 我相信你也掌握了一些規(guī)律了.

反正要創(chuàng)建什么圖標就往getContextPadEntries的返回值加就可以了:

// CustomContextPad.js
getContextPadEntries(element) {
    function clickElement(e) {
        console.log(element)
    }
    function editElement() { // 創(chuàng)建編輯圖標
        return {
            group: 'edit',
            className: 'icon-custom icon-custom-edit',
            title: translate('編輯'),
            action: {
                click: clickElement
            }
        }
    }
    return {
        'append.lindaidai-task': {...},
        'edit': editElement(), // 返回值加上編輯功能
        'delete': deleteElement() // 返回值加上刪除的功能
    }
}

然后記得在app.css中加上.icon-custom-edit的樣式, 這里就不貼代碼了.

將節(jié)點的信息傳遞出去

其實我們會發(fā)現, 通過點擊小圖標獲取到節(jié)點信息很容易就實現了, 但是如何將在CustomContextPad.js中的信息傳遞出去呢, 也就是我們在頁面上該怎么拿到這個信息呢?

比如我想實現: 點擊上面??所說的編輯小圖標, 然后出現這么一個彈窗, 顯示出節(jié)點的相關信息:

bpmnCustom22.png

(由于沒有引入任何的UI組件, 所以隨手寫了一些樣式)

哈哈??, 方法其實也有很多種:

  • 前端本地存儲localStorage
  • vuevuex
  • reactredux

以上技術都可以實現...

由于項目是用vue開發(fā)的, 所以這里我就演示以下利用vuex來進行交互??.

首先在我們的項目里安裝上vuex:

$ npm i vuex --save-D

然后在src目錄下創(chuàng)建好一個store文件夾用來存放它, 并記得在main.js用進行引用:

// main.js
import store from './store'
...
new Vue({
    ...
    store,
    render: h => h(App),
}).$mount('#app')

讓我們在store中創(chuàng)建一個叫做bpmn模塊, 專門用來定義bpmn相關的存儲. 然后在其中定義:

  1. nodeInfo<Object>: 用于存儲當前點擊的節(jié)點的信息
  2. nodeVisible<Boolean>: 用于判斷彈窗顯示隱藏的變量
// store/modules/bpmn.js
const bpmn = {
    state: {
        nodeVisible: false,
        nodeInfo: {}
    },
    mutations: {
        TOGGLENODEVISIBLE: (state, visible) => {
            state.nodeVisible = visible
        },
        SETNODEINFO: (state, info) => {
            state.nodeInfo = info
        }
    },
    actions: {}
}

export default bpmn

定義好這些之后, 我們就可以在CustomContextPadProvider.js里的clickElement做文章了:

// CustomContextPadProvider.js
import store from '../../../store' // 引入store

function clickElement(e) {
    console.log(element)
    store.commit('SETNODEINFO', element) // 存儲節(jié)點信息
    store.commit('TOGGLENODEVISIBLE', true)
}

由于CustomContextPadProvider.jsCustomContextPad.js的做法都是一樣的, 這里我就以CustomContextPadProvider.js為案例進行講解.

通過以上的步驟, 已經可以將這兩個值存儲到store中了, 接下來只是看看頁面上該如何調用它們.

讓我們打開custom-modeler.vue文件, 給里面加個小彈窗:

<template>
    <div class="modal" v-if="bpmnNodeVisible" @click="close">
      <div class="modal-content">
        <div class="modal-ctx">
          <div class="modal-item">
            節(jié)點id: {{ bpmnNodeInfo.id }}
          </div>
          <div class="modal-item">
            節(jié)點type: {{ bpmnNodeInfo.type }}
          </div>
        </div>
      </div>
    </div>
</template>

彈窗樣式隨便寫了點, 在項目代碼里可以看到, 這里就不貼了.

然后編輯相關的js代碼:

<script>
import { mapState, mapMutations } from 'vuex'

export default {
    ... // 這個省略號是省略代碼
    methods: { // 方法
        ...mapMutations(['TOGGLENODEVISIBLE']), // 這個省略號是解構
        close () {
            this.TOGGLENODEVISIBLE(false)
        }
    },
    computed: { // 計算屬性
        ...mapState({ // 解構
            bpmnNodeInfo: state => state.bpmn.nodeInfo,
            bpmnNodeVisible: state => state.bpmn.nodeVisible
        })
    }
}
</script>

完成了上面的步驟之后, 我們就實現了點擊contextPad中的編輯圖標, 出現顯示節(jié)點相關信息的小彈窗, 點擊陰影出關閉小彈窗的功能了, 當然了你也可以在關閉的時候, 清空掉store中的節(jié)點信息nodeInfo, 這里就不做這些操作了.

最后讓我們來梳理一下, 前面的關鍵步驟:

  • 引用vuex來實現跨組件傳遞數據;
  • 在點擊編輯小圖標的時候將節(jié)點信息存儲到store中;
  • 頁面要使用的時候, 利用vue中計算屬性能夠監(jiān)聽state的改變的原理來更新你的UI(也就是出現彈窗)

(我開始是想用最簡單的localStorage來實現的, 后來發(fā)現computed不能夠監(jiān)聽到它的改變, 導致localStorage中的nodeVisible雖然已經變化了, 但是bpmnNodeVisible還是沒有. 因此后來轉用了vuex)

后語

其實這一章節(jié)主要是給大家傳遞一種思路, 如何將contextPad與你的頁面結合起來, 講解中只是說了一種最簡單的出現小彈窗的情況, 可能在實際開發(fā)中你會有更多復雜的需求, 復雜的交互.

不過也很高興能給你提供一個這樣的解決方案, 也可以說給你一點靈感吧??...

因為自己在研究bpmn.js的時候, 也是沒有任何人指導, 全靠自己查看官方案例還有絞盡腦汁的想, 所以我才明白這玩意的麻煩... 哈哈哈??, 扯多了, 這一章節(jié)就到這里吧.

上面??案例用的都是同一個項目??

項目案例Git地址: LinDaiDai/bpmn-vue-custom 喜歡的小伙伴請給個Star??呀, 謝謝??

系列全部目錄請查看此處: 《全網最詳bpmn.js教材》

系列相關推薦:

《全網最詳bpmn.js教材-基礎篇》

《全網最詳bpmn.js教材-http請求篇》

《全網最詳bpmn.js教材-事件篇》

《全網最詳bpmn.js教材-renderer篇》

《全網最詳bpmn.js教材-contextPad篇》

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湿硝,隨后出現的幾起案子薪前,更是在濱河造成了極大的恐慌,老刑警劉巖关斜,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件示括,死亡現場離奇詭異,居然都是意外死亡痢畜,警方通過查閱死者的電腦和手機垛膝,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丁稀,“玉大人吼拥,你說我怎么就攤上這事∠呱溃” “怎么了凿可?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長授账。 經常有香客問我枯跑,道長,這世上最難降的妖魔是什么白热? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任敛助,我火速辦了婚禮,結果婚禮上屋确,老公的妹妹穿的比我還像新娘纳击。我一直安慰自己,他們只是感情好乍恐,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布评疗。 她就那樣靜靜地躺著,像睡著了一般茵烈。 火紅的嫁衣襯著肌膚如雪百匆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天呜投,我揣著相機與錄音加匈,去河邊找鬼存璃。 笑死,一個胖子當著我的面吹牛雕拼,可吹牛的內容都是我干的纵东。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啥寇,長吁一口氣:“原來是場噩夢啊……” “哼偎球!你這毒婦竟也來了?” 一聲冷哼從身側響起辑甜,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衰絮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷醋,有當地人在樹林里發(fā)現了一具尸體猫牡,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年邓线,在試婚紗的時候發(fā)現自己被綠了淌友。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡骇陈,死狀恐怖震庭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情缩歪,我是刑警寧澤归薛,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站匪蝙,受9級特大地震影響主籍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜逛球,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一千元、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颤绕,春花似錦幸海、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氯葬,卻和暖如春挡篓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工官研, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秽澳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓戏羽,卻偏偏與公主長得像担神,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子始花,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容