New file |
| | |
| | | @font-face { |
| | | font-family: 'bpmn-js-pp'; |
| | | src: url("data:;base64,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"); |
| | | src: url("data:;base64,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") format('embedded-opentype'), url("data:application/font-woff;base64,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") format('woff'), url("data:application/x-font-ttf;base64,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IDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKxAAAqsQAFQrEACCqxAAVCsQAIKrEABUK5AAAACSqxAAVCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARAA=") format('truetype'), url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtZXRhZGF0YT5Db3B5cmlnaHQgKEMpIDIwMTYgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbTwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0iYnBtbi1pby1wcCIgaG9yaXotYWR2LXg9IjEwMDAiID4KPGZvbnQtZmFjZSBmb250LWZhbWlseT0iYnBtbi1pby1wcCIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1zdHJldGNoPSJub3JtYWwiIHVuaXRzLXBlci1lbT0iMTAwMCIgYXNjZW50PSI4NTAiIGRlc2NlbnQ9Ii0xNTAiIC8+CjxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSIxMDAwIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0iY2xlYXIiIHVuaWNvZGU9IiYjeGU4MDI7IiBkPSJNNDUyIDE5NHExOC0xOCAxOC00M3QtMTgtNDNxLTE4LTE2LTQzLTE2dC00MyAxNmwtMTMyIDE1Mi0xMzItMTUycS0xOC0xNi00My0xNnQtNDMgMTZxLTE2IDE4LTE2IDQzdDE2IDQzbDEzOCAxNTYtMTM4IDE1OHEtMTYgMTgtMTYgNDN0MTYgNDNxMTggMTYgNDMgMTZ0NDMtMTZsMTMyLTE1MiAxMzIgMTUycTE4IDE2IDQzIDE2dDQzLTE2cTE4LTE4IDE4LTQzdC0xOC00M2wtMTM4LTE1OHoiIGhvcml6LWFkdi14PSI0NzAiIC8+CjxnbHlwaCBnbHlwaC1uYW1lPSJhZGQiIHVuaWNvZGU9IiYjeGU4MDM7IiBkPSJNNTUwIDQwMHEzMCAwIDMwLTUwdC0zMC01MGwtMjEwIDAgMC0yMTBxMC0zMC01MC0zMHQtNTAgMzBsMCAyMTAtMjEwIDBxLTMwIDAtMzAgNTB0MzAgNTBsMjEwIDAgMCAyMTBxMCAzMCA1MCAzMHQ1MC0zMGwwLTIxMCAyMTAgMHoiIGhvcml6LWFkdi14PSI1ODAiIC8+CjxnbHlwaCBnbHlwaC1uYW1lPSJzZWFyY2giIHVuaWNvZGU9IiYjeGU4MDU7IiBkPSJNNzcyIDc4cTMwLTM0IDYtNjJsLTQ2LTQ2cS0zNi0zMi02OCAwbC0xOTAgMTkwcS03NC00Mi0xNTYtNDItMTI4IDAtMjIzIDk1dC05NSAyMjMgOTAgMjE5IDIxOCA5MSAyMjQtOTUgOTYtMjIzcTAtODgtNDYtMTYyeiBtLTY3OCAzNThxMC04OCA2OC0xNTZ0MTU2LTY4IDE1MSA2MyA2MyAxNTNxMCA4OC02OCAxNTV0LTE1NiA2Ny0xNTEtNjMtNjMtMTUxeiIgaG9yaXotYWR2LXg9Ijc4OSIgLz4KPGdseXBoIGdseXBoLW5hbWU9ImF0dGVudGlvbiIgdW5pY29kZT0iJiN4ZTgwNjsiIGQ9Ik05NTctMjRxMTAtMTYgMC0zNC0xMC0xNi0zMC0xNmwtODkyIDBxLTE4IDAtMjggMTYtMTMgMTgtMiAzNGw0NDYgNzgycTggMTggMzAgMTh0MzAtMTh6IG0tNDIwIDUwbDAgMTAwLTExMCAwIDAtMTAwIDExMCAweiBtMCAxNzRsMCAzMDAtMTEwIDAgMC0zMDAgMTEwIDB6IiBob3Jpei1hZHYteD0iOTYyIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0iY2xlYXItY2lyY2xlZCIgdW5pY29kZT0iJiN4ZTkwMjsiIGQ9Ik00MjAgNzcwcTE3NCAwIDI5Ny0xMjN0MTIzLTI5Ny0xMjMtMjk3LTI5Ny0xMjMtMjk3IDEyMy0xMjMgMjk3IDEyMyAyOTcgMjk3IDEyM3ogbTg2LTQyMGwxNTQgMTU0LTg2IDg2LTE1NC0xNTItMTUyIDE1Mi04OC04NiAxNTQtMTU0LTE1NC0xNTIgODgtODYgMTUyIDE1MiAxNTQtMTUyIDg2IDg2eiIgaG9yaXotYWR2LXg9Ijg0MCIgLz4KPGdseXBoIGdseXBoLW5hbWU9ImFkZC1jaXJjbGVkIiB1bmljb2RlPSImI3hlOTAzOyIgZD0iTTQyMCA3NzBxMTc0IDAgMjk3LTEyM3QxMjMtMjk3LTEyMy0yOTctMjk3LTEyMy0yOTcgMTIzLTEyMyAyOTcgMTIzIDI5NyAyOTcgMTIzeiBtNTItNDcwbDIwMCAwIDAgMTAyLTIwMCAwIDAgMjAyLTEwMiAwIDAtMjAyLTIwMiAwIDAtMTAyIDIwMiAwIDAtMjAyIDEwMiAwIDAgMjAyeiIgaG9yaXotYWR2LXg9Ijg0MCIgLz4KPC9mb250Pgo8L2RlZnM+Cjwvc3ZnPg==") format('svg'); |
| | | font-weight: normal; |
| | | font-style: normal; |
| | | } |
| | | /* line 16, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel { |
| | | background-color: #f8f8f8; |
| | | position: relative; |
| | | } |
| | | /* line 20, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel:empty { |
| | | display: none; |
| | | } |
| | | /* line 24, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel label, |
| | | .bpp-properties-panel input { |
| | | vertical-align: middle; |
| | | } |
| | | /* line 29, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel input, |
| | | .bpp-properties-panel button, |
| | | .bpp-properties-panel textarea, |
| | | .bpp-properties-panel [contenteditable] { |
| | | padding: 3px 6px; |
| | | border: 1px solid #ccc; |
| | | } |
| | | /* line 36, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel input:focus, |
| | | .bpp-properties-panel button:focus, |
| | | .bpp-properties-panel textarea:focus, |
| | | .bpp-properties-panel [contenteditable]:focus { |
| | | outline: none; |
| | | border-color: #52B415; |
| | | box-shadow: 0 0 1px 2px rgba(82, 180, 21, 0.2); |
| | | } |
| | | /* line 40, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel input.invalid, |
| | | .bpp-properties-panel button.invalid, |
| | | .bpp-properties-panel textarea.invalid, |
| | | .bpp-properties-panel [contenteditable].invalid { |
| | | border-color: #cc3333; |
| | | background: #f0c2c2; |
| | | } |
| | | /* line 42, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel input.invalid:focus, |
| | | .bpp-properties-panel button.invalid:focus, |
| | | .bpp-properties-panel textarea.invalid:focus, |
| | | .bpp-properties-panel [contenteditable].invalid:focus { |
| | | box-shadow: 0 0 1px 2px rgba(204, 51, 51, 0.2); |
| | | } |
| | | /* line 48, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel [type=text], |
| | | .bpp-properties-panel [contenteditable], |
| | | .bpp-properties-panel textarea, |
| | | .bpp-properties-panel select { |
| | | width: 100%; |
| | | } |
| | | /* line 55, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel [contenteditable], |
| | | .bpp-properties-panel textarea { |
| | | resize: vertical; |
| | | } |
| | | /* line 60, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel [contenteditable] { |
| | | outline: 0px solid transparent; |
| | | background-color: white; |
| | | overflow-y: auto; |
| | | white-space: pre-wrap; |
| | | /* css-3 */ |
| | | white-space: -moz-pre-wrap; |
| | | /* Mozilla, since 1999 */ |
| | | white-space: -pre-wrap; |
| | | /* Opera 4-6 */ |
| | | white-space: -o-pre-wrap; |
| | | /* Opera 7 */ |
| | | word-wrap: break-word; |
| | | /* Internet Explorer 5.5+ */ |
| | | } |
| | | /* line 72, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel [contenteditable]:before { |
| | | content: "\feff"; |
| | | } |
| | | /* line 77, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel [disabled] { |
| | | color: #808080; |
| | | } |
| | | /* line 81, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel label { |
| | | font-weight: bolder; |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | color: #666; |
| | | margin-bottom: 3px; |
| | | } |
| | | /* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel label[for] { |
| | | cursor: pointer; |
| | | } |
| | | /* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel label.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 87, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel .entry-label { |
| | | font-weight: bolder; |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | color: #666; |
| | | font-size: 120%; |
| | | margin-top: 5px; |
| | | margin-bottom: 10px; |
| | | transition: margin 0.218s linear; |
| | | font-style: italic; |
| | | } |
| | | /* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel .entry-label[for] { |
| | | cursor: pointer; |
| | | } |
| | | /* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel .entry-label.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 95, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel .entry-label.divider { |
| | | border-top: 1px dotted #ccc; |
| | | padding-top: 8px; |
| | | margin-top: 16px; |
| | | width: 100%; |
| | | } |
| | | /* line 103, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-panel button { |
| | | position: absolute; |
| | | top: 0; |
| | | height: 23px; |
| | | width: 24px; |
| | | overflow: hidden; |
| | | cursor: pointer; |
| | | background-color: #f8f8f8; |
| | | border: 1px solid #ccc; |
| | | } |
| | | /* line 44, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel button > span { |
| | | display: none; |
| | | } |
| | | /* line 48, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel button:before { |
| | | font-family: "bpmn-js-pp"; |
| | | font-style: normal; |
| | | font-weight: normal; |
| | | speak: none; |
| | | display: inline-block; |
| | | text-decoration: inherit; |
| | | text-align: center; |
| | | font-variant: normal; |
| | | text-transform: none; |
| | | line-height: 1em; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | position: relative; |
| | | } |
| | | /* line 53, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel button.add:before { |
| | | content: '\E803'; |
| | | } |
| | | /* line 57, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel button.clear:before { |
| | | content: '\E802'; |
| | | } |
| | | /* line 61, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-panel button:hover { |
| | | color: #52B415; |
| | | } |
| | | /* line 109, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-error-message, |
| | | .bpp-error-message.bpp-entry-link { |
| | | margin-top: 5px; |
| | | color: #cc3333; |
| | | } |
| | | /* line 115, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-row { |
| | | margin-top: 10px; |
| | | margin-bottom: 10px; |
| | | } |
| | | /* line 118, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-row:first-of-type { |
| | | margin-top: 0; |
| | | } |
| | | /* line 121, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-row:last-of-type { |
| | | margin-bottom: 0; |
| | | } |
| | | /* line 126, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-textfield, |
| | | .bpp-textbox { |
| | | margin-bottom: 3px; |
| | | } |
| | | /* line 131, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group { |
| | | list-style: none; |
| | | padding: 0; |
| | | margin: 0 0 9px 0; |
| | | } |
| | | /* line 136, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group .bpp-radio-wrapper { |
| | | margin: 6px 0; |
| | | } |
| | | /* line 140, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group input, |
| | | .bpp-radios-group label { |
| | | vertical-align: middle; |
| | | } |
| | | /* line 145, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group input { |
| | | margin-top: 0; |
| | | margin-left: 0; |
| | | } |
| | | /* line 153, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group input, |
| | | .bpp-checkbox input { |
| | | margin-left: 0; |
| | | } |
| | | /* line 158, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-radios-group label:after, |
| | | .bpp-checkbox label:after { |
| | | display: none; |
| | | } |
| | | /* line 165, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-textfield input { |
| | | padding-right: 28px; |
| | | } |
| | | /* line 169, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-textfield .clear { |
| | | background: transparent; |
| | | border: none; |
| | | top: 0; |
| | | right: 0; |
| | | } |
| | | /* line 177, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-combo-input { |
| | | margin-top: 7px; |
| | | } |
| | | /* line 182, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-select select { |
| | | height: 23px; |
| | | } |
| | | /* line 185, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-select button.add { |
| | | top: -22px; |
| | | right: 0; |
| | | } |
| | | /* line 195, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-select button.add, |
| | | .bpp-element-list button.add, |
| | | .bpp-select button.clear, |
| | | .bpp-element-list button.clear { |
| | | top: -23px; |
| | | border-bottom: none; |
| | | } |
| | | /* line 202, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-select button.add, |
| | | .bpp-element-list button.add { |
| | | right: 0px; |
| | | } |
| | | /* line 206, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-select button.clear, |
| | | .bpp-element-list button.clear { |
| | | right: 23px; |
| | | } |
| | | /* line 211, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-entry { |
| | | margin-bottom: 9px; |
| | | } |
| | | /* line 214, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-entry .bpp-field-wrapper { |
| | | position: relative; |
| | | } |
| | | /* line 217, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-entry .bpp-field-wrapper input[readonly] + .clear { |
| | | display: none; |
| | | } |
| | | /* line 221, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-entry .bpp-field-wrapper select { |
| | | resize: vertical; |
| | | } |
| | | /* line 227, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 231, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | label.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 236, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-add-row > button { |
| | | position: relative; |
| | | margin-left: 10px; |
| | | } |
| | | /* line 242, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table { |
| | | margin-top: 10px; |
| | | } |
| | | /* line 246, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row { |
| | | margin-bottom: 2px; |
| | | overflow: hidden; |
| | | } |
| | | /* line 250, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > input, |
| | | .bpp-table-row > button { |
| | | float: left; |
| | | } |
| | | /* line 255, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label { |
| | | padding-left: 5px; |
| | | } |
| | | /* line 262, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label.bpp-table-row-columns-1, |
| | | .bpp-table-row > input.bpp-table-row-columns-1 { |
| | | width: 100%; |
| | | } |
| | | /* line 264, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label.bpp-table-row-columns-1.bpp-table-row-removable, |
| | | .bpp-table-row > input.bpp-table-row-columns-1.bpp-table-row-removable { |
| | | width: calc(100% - 24px); |
| | | } |
| | | /* line 269, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label.bpp-table-row-columns-2, |
| | | .bpp-table-row > input.bpp-table-row-columns-2 { |
| | | width: 50%; |
| | | box-sizing: border-box; |
| | | } |
| | | /* line 272, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label.bpp-table-row-columns-2.bpp-table-row-removable, |
| | | .bpp-table-row > input.bpp-table-row-columns-2.bpp-table-row-removable { |
| | | width: calc(50% - 12px); |
| | | } |
| | | /* line 275, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > label.bpp-table-row-columns-2:nth-child(2), |
| | | .bpp-table-row > input.bpp-table-row-columns-2:nth-child(2) { |
| | | border-left: none; |
| | | } |
| | | /* line 281, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-table-row > button { |
| | | border-left: none; |
| | | position: static; |
| | | } |
| | | /* line 287, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-properties-static { |
| | | margin-bottom: 0; |
| | | margin-top: 0; |
| | | border: 1px solid #ccc; |
| | | background-color: white; |
| | | padding: 3px 6px; |
| | | font: 13.3333px Arial; |
| | | width: 100%; |
| | | } |
| | | /* line 297, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-entry-link { |
| | | cursor: pointer; |
| | | color: #52B415; |
| | | } |
| | | /* line 302, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-icon-warning:before { |
| | | font-family: "bpmn-js-pp"; |
| | | font-style: normal; |
| | | font-weight: normal; |
| | | speak: none; |
| | | display: inline-block; |
| | | text-decoration: inherit; |
| | | text-align: center; |
| | | font-variant: normal; |
| | | text-transform: none; |
| | | line-height: 1em; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | content: '\E806'; |
| | | } |
| | | /* line 307, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-field-description { |
| | | margin-top: 5px; |
| | | color: #999; |
| | | } |
| | | /* line 311, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-field-description a { |
| | | color: #3d8610; |
| | | text-decoration: none; |
| | | } |
| | | /* line 315, node_modules\bpmn-js-properties-panel\styles\properties.less */ |
| | | .bpp-field-description a:hover { |
| | | color: #52B415; |
| | | } |
| | | /* line 1, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header { |
| | | padding: 15px; |
| | | padding-bottom: 5px; |
| | | } |
| | | /* line 5, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header > .label { |
| | | font-size: 120%; |
| | | font-weight: bolder; |
| | | } |
| | | /* line 10, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header > .search { |
| | | display: none; |
| | | margin-top: 5px; |
| | | position: relative; |
| | | } |
| | | /* line 15, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header > .search input { |
| | | position: relative; |
| | | border-radius: 15px; |
| | | width: 100%; |
| | | z-index: 1; |
| | | } |
| | | /* line 22, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header > .search button { |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | | right: 0; |
| | | border: none; |
| | | background-color: transparent; |
| | | z-index: 2; |
| | | } |
| | | /* line 30, node_modules\bpmn-js-properties-panel\styles\header.less */ |
| | | .bpp-properties-header > .search button:before { |
| | | content: '\E805'; |
| | | } |
| | | /* line 1, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group { |
| | | padding: 6px 15px 6px 15px; |
| | | position: relative; |
| | | overflow: hidden; |
| | | transition: max-height 0.218s ease-in-out, padding-top 0.218s ease-in-out, padding-bottom 0.218s ease-in-out; |
| | | } |
| | | /* line 9, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group:empty { |
| | | display: none; |
| | | } |
| | | /* line 13, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group > .group-toggle { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | width: 4px; |
| | | cursor: pointer; |
| | | transition: background-color 0.218s linear; |
| | | } |
| | | /* line 21, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group > .group-toggle:hover { |
| | | background-color: #8fc071; |
| | | } |
| | | /* line 26, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group > .group-label { |
| | | font-weight: bolder; |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | color: #666; |
| | | font-size: 120%; |
| | | margin-top: 5px; |
| | | margin-bottom: 10px; |
| | | transition: margin 0.218s linear; |
| | | font-style: italic; |
| | | } |
| | | /* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-group > .group-label[for] { |
| | | cursor: pointer; |
| | | } |
| | | /* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */ |
| | | .bpp-properties-group > .group-label.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 35, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group:hover > .group-toggle { |
| | | background-color: #ccc; |
| | | } |
| | | /* line 37, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group:hover > .group-toggle:hover { |
| | | background-color: #8fc071; |
| | | } |
| | | /* line 42, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group.group-closed { |
| | | max-height: 20px; |
| | | border-top: none; |
| | | cursor: pointer; |
| | | background-color: rgba(143, 192, 113, 0.2); |
| | | padding-top: 0; |
| | | padding-bottom: 0; |
| | | } |
| | | /* line 50, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group.group-closed > div { |
| | | visibility: hidden; |
| | | } |
| | | /* line 54, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group.group-closed > .group-label { |
| | | margin-top: 2px; |
| | | margin-bottom: 2px; |
| | | } |
| | | /* line 59, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group.group-closed:hover > .group-label { |
| | | color: #52B415; |
| | | } |
| | | /* line 64, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group + .bpp-properties-group { |
| | | border-top: 1px dotted #ccc; |
| | | } |
| | | /* line 68, node_modules\bpmn-js-properties-panel\styles\groups.less */ |
| | | .bpp-properties-group:last-child { |
| | | padding-bottom: 9px; |
| | | } |
| | | /* line 2, node_modules\bpmn-js-properties-panel\styles\listeners.less */ |
| | | .cam-add-listener > button { |
| | | position: relative; |
| | | margin-left: 10px; |
| | | } |
| | | /* line 8, node_modules\bpmn-js-properties-panel\styles\listeners.less */ |
| | | [data-list-entry-container] > .bpp-listener-area { |
| | | border: 1px solid #ccc; |
| | | margin: 10px 1px; |
| | | padding: 10px; |
| | | } |
| | | /* line 14, node_modules\bpmn-js-properties-panel\styles\listeners.less */ |
| | | .bpp-listener-area { |
| | | position: relative; |
| | | } |
| | | /* line 16, node_modules\bpmn-js-properties-panel\styles\listeners.less */ |
| | | .bpp-listener-area > button { |
| | | position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | border: none; |
| | | background: none; |
| | | } |
| | | /* line 25, node_modules\bpmn-js-properties-panel\styles\listeners.less */ |
| | | .bpp-listener-area + .bpp-listener-area { |
| | | margin-top: 20px; |
| | | } |
| | | /* line 1, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar { |
| | | border-bottom: 1px solid #ccc; |
| | | padding: 0 15px; |
| | | } |
| | | /* line 5, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar .scroll-tabs-button { |
| | | cursor: pointer; |
| | | font-size: 16px; |
| | | padding: 3px 4px 3px 4px; |
| | | color: #666; |
| | | } |
| | | /* line 11, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar .scroll-tabs-button:hover { |
| | | font-weight: bold; |
| | | } |
| | | /* line 15, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar .scroll-tabs-button.scroll-tabs-left { |
| | | float: left; |
| | | margin-left: -15px; |
| | | } |
| | | /* line 20, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar .scroll-tabs-button.scroll-tabs-right { |
| | | float: right; |
| | | margin-right: -15px; |
| | | } |
| | | /* line 27, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab-bar:not(.scroll-tabs-overflow) .scroll-tabs-button { |
| | | display: none; |
| | | } |
| | | /* line 33, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links { |
| | | margin: 5px 0 -1px 0; |
| | | padding: 0; |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | } |
| | | /* line 39, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li { |
| | | display: inline-block; |
| | | margin: 0; |
| | | } |
| | | /* line 43, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 47, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li > a { |
| | | display: inline-block; |
| | | font-size: 12px; |
| | | padding: 4px 7px; |
| | | border: 1px solid #ccc; |
| | | border-radius: 3px 3px 0 0; |
| | | border-bottom: transparent; |
| | | background-color: #f8f8f8; |
| | | color: #666; |
| | | text-decoration: none; |
| | | } |
| | | /* line 62, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li > a:hover { |
| | | color: #4d4d4d; |
| | | } |
| | | /* line 68, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li + li { |
| | | margin-left: 4px; |
| | | } |
| | | /* line 74, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | ul.bpp-properties-tabs-links > li.bpp-active a { |
| | | padding-bottom: 5px; |
| | | border-top: 2px solid #52B415; |
| | | border-bottom: none; |
| | | } |
| | | /* line 83, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab, |
| | | .bpp-properties-tab.bpp-hidden { |
| | | display: none; |
| | | } |
| | | /* line 88, node_modules\bpmn-js-properties-panel\styles\tabs.less */ |
| | | .bpp-properties-tab.bpp-active { |
| | | display: block; |
| | | } |
| | | /* line 3, styles/app.less */ |
| | | * { |
| | | box-sizing: border-box; |
| | | } |
| | | /* line 7, styles/app.less */ |
| | | body, |
| | | html { |
| | | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; |
| | | font-size: 12px; |
| | | height: 100%; |
| | | max-height: 100%; |
| | | padding: 0; |
| | | margin: 0; |
| | | } |
| | | /* line 20, styles/app.less */ |
| | | a:link { |
| | | text-decoration: none; |
| | | } |
| | | /* line 24, styles/app.less */ |
| | | .content { |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | /* line 29, styles/app.less */ |
| | | .content > .message { |
| | | width: 100%; |
| | | height: 100%; |
| | | text-align: center; |
| | | display: table; |
| | | font-size: 16px; |
| | | color: #111; |
| | | } |
| | | /* line 38, styles/app.less */ |
| | | .content > .message .note { |
| | | vertical-align: middle; |
| | | text-align: center; |
| | | display: table-cell; |
| | | } |
| | | /* line 45, styles/app.less */ |
| | | .content > .message.error .details { |
| | | max-width: 500px; |
| | | font-size: 12px; |
| | | margin: 20px auto; |
| | | text-align: left; |
| | | color: #BD2828; |
| | | } |
| | | /* line 53, styles/app.less */ |
| | | .content > .message.error pre { |
| | | border: solid 1px #BD2828; |
| | | background: #fefafa; |
| | | padding: 10px; |
| | | color: #BD2828; |
| | | } |
| | | /* line 61, styles/app.less */ |
| | | .content:not(.with-error) .error, |
| | | .content.with-error .intro, |
| | | .content.with-diagram .intro { |
| | | display: none; |
| | | } |
| | | /* line 67, styles/app.less */ |
| | | .content .canvas { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | } |
| | | /* line 75, styles/app.less */ |
| | | .content .canvas, |
| | | .content .properties-panel-parent { |
| | | display: none; |
| | | } |
| | | /* line 81, styles/app.less */ |
| | | .content.with-diagram .canvas, |
| | | .content.with-diagram .properties-panel-parent { |
| | | display: block; |
| | | } |
| | | /* line 89, styles/app.less */ |
| | | .buttons { |
| | | position: fixed; |
| | | bottom: 20px; |
| | | left: 20px; |
| | | padding: 0; |
| | | margin: 0; |
| | | list-style: none; |
| | | } |
| | | /* line 98, styles/app.less */ |
| | | .buttons > li { |
| | | display: inline-block; |
| | | margin-right: 10px; |
| | | } |
| | | /* line 102, styles/app.less */ |
| | | .buttons > li > a { |
| | | background: #DDD; |
| | | border: solid 1px #666; |
| | | display: inline-block; |
| | | padding: 5px; |
| | | } |
| | | /* line 110, styles/app.less */ |
| | | .buttons a { |
| | | opacity: 0.3; |
| | | } |
| | | /* line 114, styles/app.less */ |
| | | .buttons a.active { |
| | | opacity: 1; |
| | | } |
| | | /* line 119, styles/app.less */ |
| | | .properties-panel-parent { |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | | right: 0; |
| | | width: 260px; |
| | | z-index: 10; |
| | | border-left: 1px solid #ccc; |
| | | overflow: auto; |
| | | } |
| | | /* line 128, styles/app.less */ |
| | | .properties-panel-parent:empty { |
| | | display: none; |
| | | } |
| | | /* line 131, styles/app.less */ |
| | | .properties-panel-parent > .djs-properties-panel { |
| | | padding-bottom: 70px; |
| | | min-height: 100%; |
| | | } |
New file |
| | |
| | | /** |
| | | * outline styles |
| | | */ |
| | | |
| | | .djs-outline { |
| | | fill: none; |
| | | visibility: hidden; |
| | | } |
| | | |
| | | .djs-element.hover .djs-outline, |
| | | .djs-element.selected .djs-outline { |
| | | visibility: visible; |
| | | shape-rendering: crispEdges; |
| | | stroke-dasharray: 3,3; |
| | | } |
| | | |
| | | .djs-element.selected .djs-outline { |
| | | stroke: #8888FF; |
| | | stroke-width: 1px; |
| | | } |
| | | |
| | | .djs-element.hover .djs-outline { |
| | | stroke: #FF8888; |
| | | stroke-width: 1px; |
| | | } |
| | | |
| | | .djs-shape.connect-ok .djs-visual > :nth-child(1) { |
| | | fill: #DCFECC /* light-green */ !important; |
| | | } |
| | | |
| | | .djs-shape.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-shape.drop-not-ok .djs-visual > :nth-child(1) { |
| | | fill: #f9dee5 /* light-red */ !important; |
| | | } |
| | | |
| | | .djs-shape.new-parent .djs-visual > :nth-child(1) { |
| | | fill: #F7F9FF !important; |
| | | } |
| | | |
| | | svg.drop-not-ok { |
| | | background: #f9dee5 /* light-red */ !important; |
| | | } |
| | | |
| | | svg.new-parent { |
| | | background: #F7F9FF /* light-blue */ !important; |
| | | } |
| | | |
| | | .djs-connection.connect-ok .djs-visual > :nth-child(1), |
| | | .djs-connection.drop-ok .djs-visual > :nth-child(1) { |
| | | stroke: #90DD5F /* light-green */ !important; |
| | | } |
| | | |
| | | .djs-connection.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-connection.drop-not-ok .djs-visual > :nth-child(1) { |
| | | stroke: #E56283 /* light-red */ !important; |
| | | } |
| | | |
| | | .drop-not-ok, |
| | | .connect-not-ok { |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .djs-element.attach-ok .djs-visual > :nth-child(1) { |
| | | stroke-width: 5px !important; |
| | | stroke: rgba(255, 116, 0, 0.7) !important; |
| | | } |
| | | |
| | | .djs-frame.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-frame.drop-not-ok .djs-visual > :nth-child(1) { |
| | | stroke-width: 3px !important; |
| | | stroke: #E56283 /* light-red */ !important; |
| | | fill: none !important; |
| | | } |
| | | |
| | | /** |
| | | * Selection box style |
| | | * |
| | | */ |
| | | .djs-lasso-overlay { |
| | | fill: rgb(255, 116, 0); |
| | | fill-opacity: 0.1; |
| | | |
| | | stroke-dasharray: 5 1 3 1; |
| | | stroke: rgb(255, 116, 0); |
| | | |
| | | shape-rendering: crispEdges; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | /** |
| | | * Resize styles |
| | | */ |
| | | .djs-resize-overlay { |
| | | fill: none; |
| | | |
| | | stroke-dasharray: 5 1 3 1; |
| | | stroke: rgb(255, 116, 0); |
| | | |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-resizer-hit { |
| | | fill: none; |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-resizer-visual { |
| | | fill: white; |
| | | stroke-width: 1px; |
| | | stroke: black; |
| | | shape-rendering: crispEdges; |
| | | stroke-opacity: 0.2; |
| | | } |
| | | |
| | | .djs-cursor-resize-nwse, |
| | | .djs-resizer-nw, |
| | | .djs-resizer-se { |
| | | cursor: nwse-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-nesw, |
| | | .djs-resizer-ne, |
| | | .djs-resizer-sw { |
| | | cursor: nesw-resize; |
| | | } |
| | | |
| | | .djs-shape.djs-resizing > .djs-outline { |
| | | visibility: hidden !important; |
| | | } |
| | | |
| | | .djs-shape.djs-resizing > .djs-resizer { |
| | | visibility: hidden; |
| | | } |
| | | |
| | | .djs-dragger > .djs-resizer { |
| | | visibility: hidden; |
| | | } |
| | | |
| | | /** |
| | | * drag styles |
| | | */ |
| | | .djs-dragger * { |
| | | fill: none !important; |
| | | stroke: rgb(255, 116, 0) !important; |
| | | } |
| | | |
| | | .djs-dragger tspan, |
| | | .djs-dragger text { |
| | | fill: rgb(255, 116, 0) !important; |
| | | stroke: none !important; |
| | | } |
| | | |
| | | marker.djs-dragger circle, |
| | | marker.djs-dragger path, |
| | | marker.djs-dragger polygon, |
| | | marker.djs-dragger polyline, |
| | | marker.djs-dragger rect { |
| | | fill: rgb(255, 116, 0) !important; |
| | | stroke: none !important; |
| | | } |
| | | |
| | | marker.djs-dragger text, |
| | | marker.djs-dragger tspan { |
| | | fill: none !important; |
| | | stroke: rgb(255, 116, 0) !important; |
| | | } |
| | | |
| | | .djs-dragging { |
| | | opacity: 0.3; |
| | | } |
| | | |
| | | .djs-dragging, |
| | | .djs-dragging > * { |
| | | pointer-events: none !important; |
| | | } |
| | | |
| | | .djs-dragging .djs-context-pad, |
| | | .djs-dragging .djs-outline { |
| | | display: none !important; |
| | | } |
| | | |
| | | /** |
| | | * no pointer events for visual |
| | | */ |
| | | .djs-visual, |
| | | .djs-outline { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-element.attach-ok .djs-hit { |
| | | stroke-width: 60px !important; |
| | | } |
| | | |
| | | /** |
| | | * all pointer events for hit shape |
| | | */ |
| | | .djs-element > .djs-hit-all { |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-element > .djs-hit-stroke, |
| | | .djs-element > .djs-hit-click-stroke { |
| | | pointer-events: stroke; |
| | | } |
| | | |
| | | /** |
| | | * all pointer events for hit shape |
| | | */ |
| | | .djs-drag-active .djs-element > .djs-hit-click-stroke { |
| | | pointer-events: all; |
| | | } |
| | | |
| | | /** |
| | | * shape / connection basic styles |
| | | */ |
| | | .djs-connection .djs-visual { |
| | | stroke-width: 2px; |
| | | fill: none; |
| | | } |
| | | |
| | | .djs-cursor-grab { |
| | | cursor: -webkit-grab; |
| | | cursor: -moz-grab; |
| | | cursor: grab; |
| | | } |
| | | |
| | | .djs-cursor-grabbing { |
| | | cursor: -webkit-grabbing; |
| | | cursor: -moz-grabbing; |
| | | cursor: grabbing; |
| | | } |
| | | |
| | | .djs-cursor-crosshair { |
| | | cursor: crosshair; |
| | | } |
| | | |
| | | .djs-cursor-move { |
| | | cursor: move; |
| | | } |
| | | |
| | | .djs-cursor-resize-ns { |
| | | cursor: ns-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-ew { |
| | | cursor: ew-resize; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * snapping |
| | | */ |
| | | .djs-snap-line { |
| | | stroke: rgb(255, 195, 66); |
| | | stroke: rgba(255, 195, 66, 0.50); |
| | | stroke-linecap: round; |
| | | stroke-width: 2px; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | /** |
| | | * snapping |
| | | */ |
| | | .djs-crosshair { |
| | | stroke: #555; |
| | | stroke-linecap: round; |
| | | stroke-width: 1px; |
| | | pointer-events: none; |
| | | shape-rendering: crispEdges; |
| | | stroke-dasharray: 5, 5; |
| | | } |
| | | |
| | | /** |
| | | * palette |
| | | */ |
| | | |
| | | .djs-palette { |
| | | position: absolute; |
| | | left: 20px; |
| | | top: 20px; |
| | | |
| | | box-sizing: border-box; |
| | | width: 48px; |
| | | } |
| | | |
| | | .djs-palette .separator { |
| | | margin: 0 5px; |
| | | padding-top: 5px; |
| | | |
| | | border: none; |
| | | border-bottom: solid 1px #DDD; |
| | | |
| | | clear: both; |
| | | } |
| | | |
| | | .djs-palette .entry:before { |
| | | vertical-align: text-bottom; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-toggle { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .djs-palette .entry, |
| | | .djs-palette .djs-palette-toggle { |
| | | color: #333; |
| | | font-size: 30px; |
| | | |
| | | text-align: center; |
| | | } |
| | | |
| | | .djs-palette .entry { |
| | | float: left; |
| | | } |
| | | |
| | | .djs-palette .entry img { |
| | | max-width: 100%; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-entries:after { |
| | | content: ''; |
| | | display: table; |
| | | clear: both; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-toggle:hover { |
| | | background: #666; |
| | | } |
| | | |
| | | .djs-palette .entry:hover { |
| | | color: rgb(255, 116, 0); |
| | | } |
| | | |
| | | .djs-palette .highlighted-entry { |
| | | color: rgb(255, 116, 0) !important; |
| | | } |
| | | |
| | | .djs-palette .entry, |
| | | .djs-palette .djs-palette-toggle { |
| | | width: 46px; |
| | | height: 46px; |
| | | line-height: 46px; |
| | | cursor: default; |
| | | } |
| | | |
| | | /** |
| | | * Palette open / two-column layout is controlled via |
| | | * classes on the palette. Events to hook into palette |
| | | * changed life-cycle are available in addition. |
| | | */ |
| | | .djs-palette.two-column.open { |
| | | width: 94px; |
| | | } |
| | | |
| | | .djs-palette:not(.open) .djs-palette-entries { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-palette:not(.open) { |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .djs-palette.open .djs-palette-toggle { |
| | | display: none; |
| | | } |
| | | |
| | | /** |
| | | * context-pad |
| | | */ |
| | | .djs-overlay-context-pad { |
| | | width: 72px; |
| | | } |
| | | |
| | | .djs-context-pad { |
| | | position: absolute; |
| | | display: none; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-context-pad .entry { |
| | | width: 22px; |
| | | height: 22px; |
| | | text-align: center; |
| | | display: inline-block; |
| | | font-size: 22px; |
| | | margin: 0 2px 2px 0; |
| | | |
| | | border-radius: 3px; |
| | | |
| | | cursor: default; |
| | | |
| | | background-color: #FEFEFE; |
| | | box-shadow: 0 0 2px 1px #FEFEFE; |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-context-pad .entry:before { |
| | | vertical-align: top; |
| | | } |
| | | |
| | | .djs-context-pad .entry:hover { |
| | | background: rgb(255, 252, 176); |
| | | } |
| | | |
| | | .djs-context-pad.open { |
| | | display: block; |
| | | } |
| | | |
| | | /** |
| | | * popup styles |
| | | */ |
| | | .djs-popup .entry { |
| | | line-height: 20px; |
| | | white-space: nowrap; |
| | | cursor: default; |
| | | } |
| | | |
| | | /* larger font for prefixed icons */ |
| | | .djs-popup .entry:before { |
| | | vertical-align: middle; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .djs-popup .entry > span { |
| | | vertical-align: middle; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .djs-popup .entry:hover, |
| | | .djs-popup .entry.active:hover { |
| | | background: rgb(255, 252, 176); |
| | | } |
| | | |
| | | .djs-popup .entry.disabled { |
| | | background: inherit; |
| | | } |
| | | |
| | | .djs-popup .djs-popup-header .entry { |
| | | display: inline-block; |
| | | padding: 2px 3px 2px 3px; |
| | | |
| | | border: solid 1px transparent; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | .djs-popup .djs-popup-header .entry.active { |
| | | color: rgb(255, 116, 0); |
| | | border: solid 1px rgb(255, 116, 0); |
| | | background-color: #F6F6F6; |
| | | } |
| | | |
| | | .djs-popup-body .entry { |
| | | padding: 4px 10px 4px 5px; |
| | | } |
| | | |
| | | .djs-popup-body .entry > span { |
| | | margin-left: 5px; |
| | | } |
| | | |
| | | .djs-popup-body { |
| | | background-color: #FEFEFE; |
| | | } |
| | | |
| | | .djs-popup-header { |
| | | border-bottom: 1px solid #DDD; |
| | | } |
| | | |
| | | .djs-popup-header .entry { |
| | | margin: 1px; |
| | | margin-left: 3px; |
| | | } |
| | | |
| | | .djs-popup-header .entry:last-child { |
| | | margin-right: 3px; |
| | | } |
| | | |
| | | /** |
| | | * popup / palette styles |
| | | */ |
| | | .djs-popup, .djs-palette { |
| | | background: #FAFAFA; |
| | | border: solid 1px #CCC; |
| | | border-radius: 2px; |
| | | } |
| | | |
| | | /** |
| | | * touch |
| | | */ |
| | | |
| | | .djs-shape, |
| | | .djs-connection { |
| | | touch-action: none; |
| | | } |
| | | |
| | | .djs-segment-dragger, |
| | | .djs-bendpoint { |
| | | display: none; |
| | | } |
| | | |
| | | /** |
| | | * bendpoints |
| | | */ |
| | | .djs-segment-dragger .djs-visual { |
| | | fill: rgba(255, 255, 121, 0.2); |
| | | stroke-width: 1px; |
| | | stroke-opacity: 1; |
| | | stroke: rgba(255, 255, 121, 0.3); |
| | | } |
| | | |
| | | .djs-bendpoint .djs-visual { |
| | | fill: rgba(255, 255, 121, 0.8); |
| | | stroke-width: 1px; |
| | | stroke-opacity: 0.5; |
| | | stroke: black; |
| | | } |
| | | |
| | | .djs-segment-dragger:hover, |
| | | .djs-bendpoints.hover .djs-segment-dragger, |
| | | .djs-bendpoints.selected .djs-segment-dragger, |
| | | .djs-bendpoint:hover, |
| | | .djs-bendpoints.hover .djs-bendpoint, |
| | | .djs-bendpoints.selected .djs-bendpoint { |
| | | display: block; |
| | | } |
| | | |
| | | .djs-drag-active .djs-bendpoints * { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-bendpoints:not(.hover) .floating { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-segment-dragger:hover .djs-visual, |
| | | .djs-segment-dragger.djs-dragging .djs-visual, |
| | | .djs-bendpoint:hover .djs-visual, |
| | | .djs-bendpoint.floating .djs-visual { |
| | | fill: yellow; |
| | | stroke-opacity: 0.5; |
| | | stroke: black; |
| | | } |
| | | |
| | | .djs-bendpoint.floating .djs-hit { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-segment-dragger .djs-hit, |
| | | .djs-bendpoint .djs-hit { |
| | | pointer-events: all; |
| | | fill: none; |
| | | } |
| | | |
| | | .djs-segment-dragger.horizontal .djs-hit { |
| | | cursor: ns-resize; |
| | | } |
| | | |
| | | .djs-segment-dragger.vertical .djs-hit { |
| | | cursor: ew-resize; |
| | | } |
| | | |
| | | .djs-segment-dragger.djs-dragging .djs-hit { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-updating, |
| | | .djs-updating > * { |
| | | pointer-events: none !important; |
| | | } |
| | | |
| | | .djs-updating .djs-context-pad, |
| | | .djs-updating .djs-outline, |
| | | .djs-updating .djs-bendpoint, |
| | | .connect-ok .djs-bendpoint, |
| | | .connect-not-ok .djs-bendpoint, |
| | | .drop-ok .djs-bendpoint, |
| | | .drop-not-ok .djs-bendpoint { |
| | | display: none !important; |
| | | } |
| | | |
| | | .djs-segment-dragger.djs-dragging, |
| | | .djs-bendpoint.djs-dragging { |
| | | display: block; |
| | | opacity: 1.0; |
| | | } |
| | | |
| | | .djs-segment-dragger.djs-dragging .djs-visual, |
| | | .djs-bendpoint.djs-dragging .djs-visual { |
| | | fill: yellow; |
| | | stroke-opacity: 0.5; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * tooltips |
| | | */ |
| | | .djs-tooltip-error { |
| | | font-size: 11px; |
| | | line-height: 18px; |
| | | text-align: left; |
| | | |
| | | padding: 5px; |
| | | |
| | | opacity: 0.7; |
| | | } |
| | | |
| | | .djs-tooltip-error > * { |
| | | width: 160px; |
| | | |
| | | background: rgb(252, 236, 240); |
| | | color: rgb(158, 76, 76); |
| | | padding: 3px 7px; |
| | | border-radius: 5px; |
| | | border-left: solid 5px rgb(174, 73, 73); |
| | | } |
| | | |
| | | .djs-tooltip-error:hover { |
| | | opacity: 1; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * search pad |
| | | */ |
| | | .djs-search-container { |
| | | position: absolute; |
| | | top: 20px; |
| | | left: 0; |
| | | right: 0; |
| | | margin-left: auto; |
| | | margin-right: auto; |
| | | |
| | | width: 25%; |
| | | min-width: 300px; |
| | | max-width: 400px; |
| | | z-index: 10; |
| | | |
| | | font-size: 1.05em; |
| | | opacity: 0.9; |
| | | background: #FAFAFA; |
| | | border: solid 1px #CCC; |
| | | border-radius: 2px; |
| | | } |
| | | |
| | | .djs-search-container:not(.open) { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-search-input input { |
| | | font-size: 1.05em; |
| | | width: 100%; |
| | | padding: 6px 10px; |
| | | border: 1px solid #ccc; |
| | | } |
| | | |
| | | .djs-search-input input:focus { |
| | | outline: none; |
| | | border-color: #52B415; |
| | | } |
| | | |
| | | .djs-search-results { |
| | | position: relative; |
| | | overflow-y: auto; |
| | | max-height: 200px; |
| | | } |
| | | |
| | | .djs-search-results:hover { |
| | | /*background: #fffdd7;*/ |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .djs-search-result { |
| | | width: 100%; |
| | | padding: 6px 10px; |
| | | background: white; |
| | | border-bottom: solid 1px #AAA; |
| | | border-radius: 1px; |
| | | } |
| | | |
| | | .djs-search-highlight { |
| | | color: black; |
| | | } |
| | | |
| | | .djs-search-result-primary { |
| | | margin: 0 0 10px; |
| | | } |
| | | |
| | | .djs-search-result-secondary { |
| | | font-family: monospace; |
| | | margin: 0; |
| | | } |
| | | |
| | | .djs-search-result:hover { |
| | | background: #fdffd6; |
| | | } |
| | | |
| | | .djs-search-result-selected { |
| | | background: #fffcb0; |
| | | } |
| | | |
| | | .djs-search-result-selected:hover { |
| | | background: #f7f388; |
| | | } |
| | | |
| | | .djs-search-overlay { |
| | | background: yellow; |
| | | opacity: 0.3; |
| | | } |
| | | |
| | | /** |
| | | * hidden styles |
| | | */ |
| | | .djs-element-hidden, |
| | | .djs-element-hidden .djs-hit, |
| | | .djs-element-hidden .djs-outline, |
| | | .djs-label-hidden .djs-label { |
| | | display: none !important; |
| | | } |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html > |
| | | |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <title>在线绘制流程</title> |
| | | <link rel="icon" href="favicon.ico"> |
| | | <link rel="stylesheet" href="css/diagram-js.css" /> |
| | | <link rel="stylesheet" href="vendor/bpmn-font/css/bpmn-embedded.css" /> |
| | | <link rel="stylesheet" href="css/app.css" /> |
| | | |
| | | <style> |
| | | .item{ |
| | | display: none; |
| | | cursor: pointer; |
| | | } |
| | | .bjs-powered-by { |
| | | display: none; |
| | | } |
| | | .buttons > li { |
| | | /* display: inline-block; */ |
| | | margin-right: 10px; |
| | | height: 26px; |
| | | line-height: 26px; |
| | | float: left; |
| | | } |
| | | .buttons > li > a.btn { |
| | | background: #00BCD4; |
| | | border: none; |
| | | outline: none; |
| | | padding: 0px 10px; |
| | | color: #fff; |
| | | display: inline-block; |
| | | opacity: 1; |
| | | height: 26px; |
| | | font-size: 14px; |
| | | line-height: 26px; |
| | | } |
| | | .label { |
| | | background: #00BCD4; |
| | | border: none; |
| | | outline: none; |
| | | padding: 0px 10px; |
| | | color: #fff; |
| | | display: inline-block; |
| | | cursor: pointer; |
| | | opacity: 1; |
| | | height: 26px; |
| | | font-size: 14px; |
| | | line-height: 26px; |
| | | } |
| | | .sy-mask{width:100%; |
| | | height:100%; |
| | | position:fixed; |
| | | background:rgba(0,0,0,0.8); |
| | | left:0;top:0;z-index:1000; |
| | | display: none; |
| | | } |
| | | .sy-alert{ |
| | | position:fixed;display:none;background:#fff;border-radius:5px;overflow:hidden;width:300px;max-width:90%;max-height:80%;left:0;right:0;margin:0 auto;z-index:9999}.sy-alert.animated{-webkit-animation-duration:.3s;animation-duration:.3s}.sy-alert .sy-title{height:45px;color:#333;line-height:45px;font-size:15px;border-bottom:1px solid #eee;padding:0 12px}.sy-alert .sy-content{padding:20px;text-align:center;font-size:14px;line-height:24px;color:#666;overflow-y:auto}.sy-alert .sy-btn{height:50%;border-top:1px solid #eee;overflow:hidden}.sy-alert .sy-btn button{float:left;border:0;color:#333;cursor:pointer;background:#fff;width:50%;line-height:45px;font-size:15px;text-align:center}.sy-alert .sy-btn button:nth-child(1){color:#888;border-right:1px solid #eee}.sy-alert.sy-alert-alert .sy-btn button{float:none;width:100%}.sy-alert.sy-alert-tips{text-align:center;width:150px;background:rgba(0,0,0,0.7)}.sy-alert.sy-alert-tips .sy-content{padding:8px;color:#fff;font-size:14px}.sy-alert.sy-alert-model .sy-content{text-align:left}.sy-alert.sy-alert-model .sy-content .form .input-item{margin-bottom:12px;position:relative}.sy-alert.sy-alert-model .sy-content .form .input-item input{display:block;position:relative;width:100%;border:1px solid #eee;padding:10px}.sy-alert.sy-alert-model .sy-content .form .input-item .getcode{border:0;top:0;right:0;position:absolute;background:0;line-height:37px;color:#f60;width:100px;text-align:center} |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <div class="content with-diagram" id="js-drop-zone"> |
| | | <div class="message error"> |
| | | <div class="note"> |
| | | <p>无法显示bpms2.0</p> |
| | | <div class="details"> |
| | | <span>错误详细信息</span> |
| | | <pre></pre> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="canvas" id="js-canvas"></div> |
| | | <div class="properties-panel-parent" id="js-properties-panel"></div> |
| | | </div> |
| | | <ul class="buttons"> |
| | | <li class="item upload"> |
| | | <form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件"> |
| | | <input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none"> |
| | | <label class="label" for="uploadFile" >导入</label> |
| | | </form> |
| | | </li> |
| | | <li class="item download"> |
| | | <a class="btn" href id="downloadBpmn">导出</a> |
| | | </li> |
| | | <li class="item submit"> |
| | | <a class="btn" id="js-download-diagram"> |
| | | 部署 |
| | | </a> |
| | | </li> |
| | | </ul> |
| | | <div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" > |
| | | <div class="sy-title">部署流程</div> |
| | | <div class="sy-content"> |
| | | 确认是否部署该流程 |
| | | <!-- <div class="form">--> |
| | | <!-- <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>--> |
| | | <!-- </div>--> |
| | | </div> |
| | | <div class="sy-btn"> |
| | | <button id="sure">确定</button> |
| | | <button class="cancel" >取消</button> |
| | | </div> |
| | | </div> |
| | | <div class="sy-mask cancel"></div> |
| | | <script src="index.js"></script> |
| | | </body> |
| | | </html> |
New file |
| | |
| | | |
| | | .bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */ |
| | | .bpmn-icon-trash:before { content: '\e801'; } /* '' */ |
| | | .bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */ |
| | | .bpmn-icon-default-flow:before { content: '\e803'; } /* '' */ |
| | | .bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */ |
| | | .bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */ |
| | | .bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */ |
| | | .bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ |
| | | .bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */ |
| | | .bpmn-icon-connection:before { content: '\e810'; } /* '' */ |
| | | .bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ |
| | | .bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ |
| | | .bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */ |
| | | .bpmn-icon-user-task:before { content: '\e817'; } /* '' */ |
| | | .bpmn-icon-business-rule:before { content: '\e818'; } /* '' */ |
| | | .bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */ |
| | | .bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ |
| | | .bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ |
| | | .bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */ |
| | | .bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ |
| | | .bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */ |
| | | .bpmn-icon-task:before { content: '\e821'; } /* '' */ |
| | | .bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ |
| | | .bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */ |
| | | .bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */ |
| | | .bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */ |
| | | .bpmn-icon-manual:before { content: '\e828'; } /* '' */ |
| | | .bpmn-icon-receive:before { content: '\e829'; } /* '' */ |
| | | .bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */ |
| | | .bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */ |
| | | .bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ |
| | | .bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */ |
| | | .bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */ |
| | | .bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */ |
| | | .bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */ |
| | | .bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */ |
| | | .bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */ |
| | | .bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */ |
| | | .bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */ |
| | | .bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */ |
| | | .bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */ |
| | | .bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */ |
| | | .bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */ |
| | | .bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ |
| | | .bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */ |
| | | .bpmn-icon-script:before { content: '\e83f'; } /* '' */ |
| | | .bpmn-icon-manual-task:before { content: '\e840'; } /* '' */ |
| | | .bpmn-icon-send:before { content: '\e841'; } /* '' */ |
| | | .bpmn-icon-service:before { content: '\e842'; } /* '' */ |
| | | .bpmn-icon-receive-task:before { content: '\e843'; } /* '' */ |
| | | .bpmn-icon-user:before { content: '\e844'; } /* '' */ |
| | | .bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ |
| | | .bpmn-icon-data-object:before { content: '\e84b'; } /* '' */ |
| | | .bpmn-icon-script-task:before { content: '\e84c'; } /* '' */ |
| | | .bpmn-icon-send-task:before { content: '\e84d'; } /* '' */ |
| | | .bpmn-icon-data-store:before { content: '\e84e'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ |
| | | .bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ |
| | | .bpmn-icon-service-task:before { content: '\e856'; } /* '' */ |
| | | .bpmn-icon-task-none:before { content: '\e857'; } /* '' */ |
| | | .bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ |
| | | .bpmn-icon-participant:before { content: '\e85c'; } /* '' */ |
| | | .bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */ |
| | | .bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */ |
| | | .bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */ |
| | | .bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */ |
| | | .bpmn-icon-lane:before { content: '\e861'; } /* '' */ |
| | | .bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */ |
| | | .bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */ |
| | | .bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */ |
| | | .bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */ |
| | | .bpmn-icon-data-input:before { content: '\e866'; } /* '' */ |
| | | .bpmn-icon-data-output:before { content: '\e867'; } /* '' */ |
| | | .bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */ |
| | | .bpmn-icon-group:before { content: '\e869'; } /* '' */ |
| | | .bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */ |
New file |
| | |
| | | @font-face { |
| | | font-family: 'bpmn'; |
| | | src: url('../font/bpmn.eot?68866489'); |
| | | src: url('../font/bpmn.eot?68866489#iefix') format('embedded-opentype'), |
| | | url('../font/bpmn.svg?68866489#bpmn') format('svg'); |
| | | font-weight: normal; |
| | | font-style: normal; |
| | | } |
| | | @font-face { |
| | | font-family: 'bpmn'; |
| | | src: url('data:application/octet-stream;base64,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') format('woff'), |
| | | url('data:application/octet-stream;base64,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AAAAGgAA6BoAAOgaAAAAGwAA6BsAAOgbAAAAHAAA6BwAAOgcAAAAHQAA6B0AAOgdAAAAHgAA6B4AAOgeAAAAHwAA6B8AAOgfAAAAIAAA6CAAAOggAAAAIQAA6CEAAOghAAAAIgAA6CIAAOgiAAAAIwAA6CMAAOgjAAAAJAAA6CQAAOgkAAAAJQAA6CUAAOglAAAAJgAA6CYAAOgmAAAAJwAA6CcAAOgnAAAAKAAA6CgAAOgoAAAAKQAA6CkAAOgpAAAAKgAA6CoAAOgqAAAAKwAA6CsAAOgrAAAALAAA6CwAAOgsAAAALQAA6C0AAOgtAAAALgAA6C4AAOguAAAALwAA6C8AAOgvAAAAMAAA6DAAAOgwAAAAMQAA6DEAAOgxAAAAMgAA6DIAAOgyAAAAMwAA6DMAAOgzAAAANAAA6DQAAOg0AAAANQAA6DUAAOg1AAAANgAA6DYAAOg2AAAANwAA6DcAAOg3AAAAOAAA6DgAAOg4AAAAOQAA6DkAAOg5AAAAOgAA6DoAAOg6AAAAOwAA6DsAAOg7AAAAPAAA6DwAAOg8AAAAPQAA6D0AAOg9AAAAPgAA6D4AAOg+AAAAPwAA6D8AAOg/AAAAQAAA6EAAAOhAAAAAQQAA6EEAAOhBAAAAQgAA6EIAAOhCAAAAQwAA6EMAAOhDAAAARAAA6EQAAOhEAAAARQAA6EUAAOhFAAAARgAA6EYAAOhGAAAARwAA6EcAAOhHAAAASAAA6EgAAOhIAAAASQAA6EkAAOhJAAAASgAA6EoAAOhKAAAASwAA6EsAAOhLAAAATAAA6EwAAOhMAAAATQAA6E0AAOhNAAAATgAA6E4AAOhOAAAATwAA6E8AAOhPAAAAUAAA6FAAAOhQAAAAUQAA6FEAAOhRAAAAUgAA6FIAAOhSAAAAUwAA6FMAAOhTAAAAVAAA6FQAAOhUAAAAVQAA6FUAAOhVAAAAVgAA6FYAAOhWAAAAVwAA6FcAAOhXAAAAWAAA6FgAAOhYAAAAWQAA6FkAAOhZAAAAWgAA6FoAAOhaAAAAWwAA6FsAAOhbAAAAXAAA6FwAAOhcAAAAXQAA6F0AAOhdAAAAXgAA6F4AAOheAAAAXwAA6F8AAOhfAAAAYAAA6GAAAOhgAAAAYQAA6GEAAOhhAAAAYgAA6GIAAOhiAAAAYwAA6GMAAOhjAAAAZAAA6GQAAOhk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AgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQI/KcFCAgEAgEBAQIGAgICAQQBBgIKAwQBAwYEBQkEBAQDBAIBEgECAQIBAgICBwIBAQEBAgcDBQLwBAUEBAMEAgIHAgMFAgQBAgMMCgMEAgQBAQQDBAQJCAUHAw8CAQYFCAEBAQYBAgECAQICAgkBAgIDBAj9rQQIBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggBnAUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAH6/sgBODFaPrq6fQHyAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEE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BgcDBAMEAwQHCAQEBwIBAgIDBAgEAq8ECAYCAQEBAQECCAIBAgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQIBPymBAQIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUElAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQ0CGgQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgEAjQBSzs5gFkeFRVtQD5xGhUnASI9JTduHRUHGjhNUSElLDISIzYBDxEDAwEGGSJECO0BAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwEBAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEPAEBAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDAqsBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQBdwECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKECAgMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwcDTQECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBAs4BAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUF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FRczFzMfARUfATMXFR8EMxczHwYzPwU1LxYhIw8XFR8GMz8IMz8ENTczNzM3NT8BNT8BMz8ENS8EAa59fYx9fXVefX1efX0vCwYLBQwFBQYmBgoIBAIDAQECBgQJBCsFCQUFBQUKBR4FCgUFBQUKBBgJBQQDBAQBAQQDBAcmBQYFCwYLBvQFBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECv3xBQQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgBBBINCgUHBgICAwgIBAEIBCYECAMEBAQHBAgDGgMIBwcDCQUEBAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2tBAgGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAiF9jH19jH0XfV59fl0BlQEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAAIAAD/mgO4AyIAFAApAC4AMgA2ADoAPgBCAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYHMhcWFxYUBwYHBiInJicmNDc2NzYHFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AfR6amY8Pj48Zmr0amY8Pj48Zmp6bl5bNTc3NVte3F5bNTc3NVteKQEu/ur+/hrKysrKysrKAyI+PGZq9GpmPD4+PGZq9GpmPD4xNzVbXtxeWzU3NzVbXtxeWzU31Qz+kAF8GP60AScZGUoYGFUYGE0YGAAAAAoAAP+iA7gDIAAPACAAMgBtANYBXwG8AgMCTQK5AAABJgYHBh4CNz4BNzYmJyYHNh4BFxYGBw4BLgI2Nz4BFwYPAQ4BFhcWPgE7ATUjNjcmAysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAfRAbxcZGFZ+Oj1RAQREOSsyJkgzCQ8tMSFQSzgaCRYYUGMJFB0JCQQIBAkNBFlZEiYOOwcNBg0NBycNDgQDAwQBAgMDCQQFBgwGFwYLBgYGBikGBgYGBgUfBAUMAwMCAgYDCicGBwYNB+kFBAQDAwECAgIGAgIDBgUEAwgBDgIIAgYCBAECAgECAwIDBQQDBAMKBQYDCQQJBAQDBAIEBgEEAwIDAgMCAQIIAQUDBAIEAgIFAgcCAgECCQECAgMHAwIDAgECAwIGAgoF/fMFBwECAwIDAgMCAwIDBAECAgMCBAEEBAECAgICAgIBAgICBAICBAEBAQIDAgIKAQICAgEEAQIBAgECAQICAQQEAw4ECAQDAQECAwECAgIBAgECAQIBAgIDAgECCAIBAgICAQQCBAEGAgoCBgMKAwYDBQMCAQQGCAUCsgQFAwYCAQEBAQEBAQECAQMFAwUDBAMCBgMBAgMGBAkJBAQDAgEBAwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCNAFLOzmAWR4VFW1APnEaFScBIj0lN24dFQcaOE1RISUsMhIjNgEPEQMDAQYZIkQIAUgBAgYBAgQCAwQICQUEBAMEAQICAgQCAQEBAQEFAQYEAwkFCAgCBAYBAQFPAQEDAwQEBAUJBAYBAgEGAwQCCA4DCAMGAwQBAgIDBAMEAwcHAwgDEgoIAgQCAgMDCAoHBwEMCAQEBAQEBAQLAQcDBgIGAgMFAwcDAgMJAwICBwICAgIBAQECAgQCBQwBBAICAgICAQICAgICAQQCAQICAwQBBAEEAQIDAgMCAQIDAgECBgIBAgYDAwIFAgECDwMCAQIBAgMGAwMDAwMDAwMBBAkFCAMDAwEEAwMEBgUDAgUBAgMCAwIDAgMDAgUCAwIMAgMCAwIDBAMEAwYDCgMGAgoBBgIF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BAMBAwgEAwEDAQMBCAQEBAEECAEECv3xBQQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgBBBINCgUHBgICAwgIBAEIBCYECAMEBAQHBAgDGgMIBwcDCQUEBAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2tBAgGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLwEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAADAAAAAAO5Ao4AAwAHAAsAABMRIREHESERIzMRIy8DijH9YoxeXgKO/Y8CcTD96wIV/esAIAAA/+4DrALPAAQACQAOABMAGAAhAC0ANgBBAE4AVQBaAF8AZABpAG4AcwB4AH0AiACOAJcAoQCmAKsAsAC1ALoAvwDEAMkAzgAAATIzNSMXMjM1IxcyMzUjFzIzNSMXMjM1IxcyMzYXNyYrASEiBxc2MjYnJjY1JgUWFzY3NjcmJwUGBxYXFhc2NycmBQ4BFxYGFjIzMjc0JwUGFTMmNycFMjM1IwUyMzUjBTIzNSMFMjM1IwUyMzUjBTIzNSMFMjM1IwUyMzUjBQYHFhcWFzY3JyYFFhc3JicFBgcWHwE2NycFFhc3NjcmJwcGFzIzNSMXMjM1IxcyMzUjFzIzNSMXMjM1IxcyMzUjBzQ1IRETMjMRITcUFTM1AQUZGDFiGRgxYRkYMWIZGDFiGRgxYQQHGAsGCxUU/e0NDAkDDgYDAQIBAmISDQUKEQUUGP0zGBMFCxAHEA4KCgLxCwMEAgECCg0SBwr8owcxAQYuAzUZGDH8wxkYMQM9GRgx/MMZGDEDPRkYMfzDGRgxAz0ZGDH8wxkYMQM7BQkGCxEIDwUQFvy/BhEoCwQC3BERBQgDGxce/TAbGQUFAhMQBw5jGRgxYRkYMWIZGDFiGBgwXhkYMWUZGDE1/q4fior+7CXLAp0xMTExMTExMTExAQIwAgMwAQQIBBUEBz0JEAQJDAcXDQMPFgQJDQQSBxASVgEKCwIPBgEeGggYHRMVD5UxNTGOMTYxjjE1MY8xNTFZFg8DBwsDGRsDBQ0cGRsSE0EMBQwZCQcTJyoSBxIUCQYMCRUpMTExMTExMTExMTEirKv+qQE4/uunFxgvAAALAAD/zgO5AvIABQAJAA0AEQAVABkAHwAjACcAKwAvAAAXNTMVMxUzNTMVMzUzFTM1MxUzNTMVMzUzFTM1MzUzFSU1MxUhNTMVJREhEScRIREuMRAxYTFiMWExYjFhMA0x/HUxAykx/HYDijH81jJZKDExMTExMTExMTExMShZilxcXFyLAg/98TABs/5NAAAEAAD/nAPDAyAAAwAHAA4AFQAAAREzETMRMxEBBxc1MzUjJRUHFTMVNwFuJsMm/lCkpF1dAlNeXqMDIPx8A4T8fAOE/uGjo29pbmwBam+jAAYAAP+eA5QDHgAGAAkADQARABUAGQAAAQUXARcBFyUFFycHFzcPARc3DwEXNw8BFzcDlP5mQP4aGQHmPgED/mWXlT8ZP5c+GT6ePxk/lyYZJgMebV/+uSYBSFwFbeBYKyUqLyomKzUrJSswGiUaAAACAAAAAAO5AmYAAwAHAAATESERAREhES8DivylAyoCZv3wAhD+HQGz/k0AAAkAAP+nA7IDHgADAAcACwARABUAGQAfACUAKQAAARUzNQUVMzUzFTM1FxUzFTM1BRUzNQUVMzUHFSMVMzUFFTM1IzUXFTM1AS9n/qHaoduCeyj9fWcB9Cgod5/9np934FIDHtra9mdnZ2ceKHWdaNran01NvnQonAGdKHV1KCgACwAA/84DuQLyAAUACQANABEAFQAZAB8AIwAnACsALwAAExUzNTM1MxUzNTMVMzUzFTM1MxUzNTMVMzUzFTMVMzUFFTM1IRUzNQURIREHESERLjEQMWExYjFhMWIxYTANMfx1MQMpMfx2A4ox/NYC8lkpMDAwMDAwMDAwMDAwKVmJXFxcXIv98AIQMP5NAbMADAAA//oDuQLCAAQAGAAcACAAJAAoACwAMAA0ADgAPABAAAATFREhEQUhFSMVMxUjFTMVITUzNSM1MzUjMxUzNTMVMzUzFTM1MxUzNTMVMzUFFTM1MxUzNTMVMzUzFTM1MxUzNS8DivylAyoMDAwM/NYRERERQmIxYTFiMWExYv1UYjFhMWIxYTFiAsLY/hACyCysMbYxqakxtjExMTExMTExMTEx5zExMTExMTExMTEAAAAABwAA//oDuQLCAAQAEAAUABgAHAAgACQAABMZASERBSERIxUzESERMzUjMxUzNTMVMzUzFTM1MxUzNTMVMzUvA4r8pQMqDAz81hERQmIxYTFiMWExYgLC/rT+hALILP7gMP7jAR0wMDAwMDAwMDAwMAAAAAAFAAD/0gMjAuoABQALAA4AFgAdAAABIiMRIREnFTMRIREFFyMnHQEjFTMVNycXBzUjNTMCctbXAl7luP38AXl9feNqao15XFxqagLq/OgCYom6/fwCvgyBbBhFUFyEVlZWQigABAAA/9IDIwLqAAUACwAOABUAAAEiIxEhEScVMxEhEQUXIycVIxUzFTcCctbXAl7luP38AXl9feNqao0C6vzo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AAAAAAAAAAAAbAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQAMc2NyZXctd3JlbmNoBXRyYXNoEGNvbmRpdGlvbmFsLWZsb3cMZGVmYXVsdC1mbG93EGdhdGV3YXktcGFyYWxsZWwfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNhbmNlbDFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tZXNzYWdlGHN0YXJ0LWV2ZW50LWNvbXBlbnNhdGlvbi5zdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlC2xvb3AtbWFya2VyEnBhcmFsbGVsLW1pLW1hcmtlciNzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXNpZ25hbC9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy10aW1lcippbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtcGFyYWxsZWwtbXVsdGlwbGUlaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbXBlbnNhdGlvbgtnYXRld2F5LXhvcgpjb25uZWN0aW9uEGVuZC1ldmVudC1jYW5jZWwiaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbmRpdGlvbjtpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZRVzdGFydC1ldmVudC1jb25kaXRpb24ic3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy10aW1lchRzZXF1ZW50aWFsLW1pLW1hcmtlcgl1c2VyLXRhc2sNYnVzaW5lc3MtcnVsZRJzdWItcHJvY2Vzcy1tYXJrZXIdc3RhcnQtZXZlbnQtcGFyYWxsZWwtbXVsdGlwbGURc3RhcnQtZXZlbnQtZXJyb3IfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXNpZ25hbB5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXJyb3IWZW5kLWV2ZW50LWNvbXBlbnNhdGlvbhRzdWJwcm9jZXNzLWNvbGxhcHNlZBNzdWJwcm9jZXNzLWV4cGFuZGVkBHRhc2sPZW5kLWV2ZW50LWVycm9yI2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lc2NhbGF0aW9uHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC10aW1lchZzdGFydC1ldmVudC1lc2NhbGF0aW9uEnN0YXJ0LWV2ZW50LXNpZ25hbBJidXNpbmVzcy1ydWxlLXRhc2sGbWFudWFsB3JlY2VpdmUNY2FsbC1hY3Rpdml0eRFzdGFydC1ldmVudC10aW1lchNzdGFydC1ldmVudC1tZXNzYWdlF2ludGVybWVkaWF0ZS1ldmVudC1ub25lHWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1saW5rFGVuZC1ldmVudC1lc2NhbGF0aW9uD3RleHQtYW5ub3RhdGlvbgdicG1uLWlvD2dhdGV3YXktY29tcGxleBJnYXRld2F5LWV2ZW50YmFzZWQMZ2F0ZXdheS1ub25lCmdhdGV3YXktb3ITZW5kLWV2ZW50LXRlcm1pbmF0ZRBlbmQtZXZlbnQtc2lnbmFsDmVuZC1ldmVudC1ub25lEmVuZC1ldmVudC1tdWx0aXBsZRFlbmQtZXZlbnQtbWVzc2FnZQ5lbmQtZXZlbnQtbGluayBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbWVzc2FnZSVpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctY29tcGVuc2F0aW9uFHN0YXJ0LWV2ZW50LW11bHRpcGxlBnNjcmlwdAttYW51YWwtdGFzawRzZW5kB3NlcnZpY2UMcmVjZWl2ZS10YXNrBHVzZXIQc3RhcnQtZXZlbnQtbm9uZSNpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctZXNjYWxhdGlvbiFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbXVsdGlwbGU0aW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctZXNjYWxhdGlvbh1pbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbGluayZzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLWNvbmRpdGlvbgtkYXRhLW9iamVjdAtzY3JpcHQtdGFzawlzZW5kLXRhc2sKZGF0YS1zdG9yZSdzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24gaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LW1lc3NhZ2UyaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUwaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctc2lnbmFsIWludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tdWx0aXBsZSRzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLW1lc3NhZ2UNYWQtaG9jLW1hcmtlcgxzZXJ2aWNlLXRhc2sJdGFzay1ub25lE2NvbXBlbnNhdGlvbi1tYXJrZXIlc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tdWx0aXBsZR9pbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctc2lnbmFsM2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWNvbmRpdGlvbgtwYXJ0aWNpcGFudBlldmVudC1zdWJwcm9jZXNzLWV4cGFuZGVkEWxhbmUtaW5zZXJ0LWJlbG93CnNwYWNlLXRvb2wQY29ubmVjdGlvbi1tdWx0aQRsYW5lCmxhc3NvLXRvb2wRbGFuZS1pbnNlcnQtYWJvdmURbGFuZS1kaXZpZGUtdGhyZWUPbGFuZS1kaXZpZGUtdHdvCmRhdGEtaW5wdXQLZGF0YS1vdXRwdXQJaGFuZC10b29sBWdyb3VwC3RyYW5zYWN0aW9uAAA=') format('truetype'); |
| | | } |
| | | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ |
| | | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ |
| | | /* |
| | | @media screen and (-webkit-min-device-pixel-ratio:0) { |
| | | @font-face { |
| | | font-family: 'bpmn'; |
| | | src: url('../font/bpmn.svg?68866489#bpmn') format('svg'); |
| | | } |
| | | } |
| | | */ |
| | | |
| | | [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before { |
| | | font-family: "bpmn"; |
| | | font-style: normal; |
| | | font-weight: normal; |
| | | speak: never; |
| | | |
| | | display: inline-block; |
| | | text-decoration: inherit; |
| | | width: 1em; |
| | | /* margin-right: .2em; */ |
| | | text-align: center; |
| | | /* opacity: .8; */ |
| | | |
| | | /* For safety - reset parent styles, that can break glyph codes*/ |
| | | font-variant: normal; |
| | | text-transform: none; |
| | | |
| | | /* fix buttons height, for twitter bootstrap */ |
| | | line-height: 1em; |
| | | |
| | | /* Animation center compensation - margins should be symmetric */ |
| | | /* remove if not needed */ |
| | | /* margin-left: .2em; */ |
| | | |
| | | /* you can be more comfortable with increased icons size */ |
| | | /* font-size: 120%; */ |
| | | |
| | | /* Uncomment for 3D effect */ |
| | | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ |
| | | } |
| | | .bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */ |
| | | .bpmn-icon-trash:before { content: '\e801'; } /* '' */ |
| | | .bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */ |
| | | .bpmn-icon-default-flow:before { content: '\e803'; } /* '' */ |
| | | .bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */ |
| | | .bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */ |
| | | .bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */ |
| | | .bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ |
| | | .bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */ |
| | | .bpmn-icon-connection:before { content: '\e810'; } /* '' */ |
| | | .bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ |
| | | .bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ |
| | | .bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */ |
| | | .bpmn-icon-user-task:before { content: '\e817'; } /* '' */ |
| | | .bpmn-icon-business-rule:before { content: '\e818'; } /* '' */ |
| | | .bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */ |
| | | .bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ |
| | | .bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ |
| | | .bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */ |
| | | .bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ |
| | | .bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */ |
| | | .bpmn-icon-task:before { content: '\e821'; } /* '' */ |
| | | .bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ |
| | | .bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */ |
| | | .bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */ |
| | | .bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */ |
| | | .bpmn-icon-manual:before { content: '\e828'; } /* '' */ |
| | | .bpmn-icon-receive:before { content: '\e829'; } /* '' */ |
| | | .bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */ |
| | | .bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */ |
| | | .bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ |
| | | .bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */ |
| | | .bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */ |
| | | .bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */ |
| | | .bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */ |
| | | .bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */ |
| | | .bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */ |
| | | .bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */ |
| | | .bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */ |
| | | .bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */ |
| | | .bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */ |
| | | .bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */ |
| | | .bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */ |
| | | .bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ |
| | | .bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */ |
| | | .bpmn-icon-script:before { content: '\e83f'; } /* '' */ |
| | | .bpmn-icon-manual-task:before { content: '\e840'; } /* '' */ |
| | | .bpmn-icon-send:before { content: '\e841'; } /* '' */ |
| | | .bpmn-icon-service:before { content: '\e842'; } /* '' */ |
| | | .bpmn-icon-receive-task:before { content: '\e843'; } /* '' */ |
| | | .bpmn-icon-user:before { content: '\e844'; } /* '' */ |
| | | .bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ |
| | | .bpmn-icon-data-object:before { content: '\e84b'; } /* '' */ |
| | | .bpmn-icon-script-task:before { content: '\e84c'; } /* '' */ |
| | | .bpmn-icon-send-task:before { content: '\e84d'; } /* '' */ |
| | | .bpmn-icon-data-store:before { content: '\e84e'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ |
| | | .bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ |
| | | .bpmn-icon-service-task:before { content: '\e856'; } /* '' */ |
| | | .bpmn-icon-task-none:before { content: '\e857'; } /* '' */ |
| | | .bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ |
| | | .bpmn-icon-participant:before { content: '\e85c'; } /* '' */ |
| | | .bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */ |
| | | .bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */ |
| | | .bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */ |
| | | .bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */ |
| | | .bpmn-icon-lane:before { content: '\e861'; } /* '' */ |
| | | .bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */ |
| | | .bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */ |
| | | .bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */ |
| | | .bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */ |
| | | .bpmn-icon-data-input:before { content: '\e866'; } /* '' */ |
| | | .bpmn-icon-data-output:before { content: '\e867'; } /* '' */ |
| | | .bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */ |
| | | .bpmn-icon-group:before { content: '\e869'; } /* '' */ |
| | | .bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */ |
New file |
| | |
| | | @font-face { |
| | | font-family: 'bpmn'; |
| | | src: url('../font/bpmn.eot?26374340'); |
| | | src: url('../font/bpmn.eot?26374340#iefix') format('embedded-opentype'), |
| | | url('../font/bpmn.woff2?26374340') format('woff2'), |
| | | url('../font/bpmn.woff?26374340') format('woff'), |
| | | url('../font/bpmn.ttf?26374340') format('truetype'), |
| | | url('../font/bpmn.svg?26374340#bpmn') format('svg'); |
| | | font-weight: normal; |
| | | font-style: normal; |
| | | } |
| | | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ |
| | | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ |
| | | /* |
| | | @media screen and (-webkit-min-device-pixel-ratio:0) { |
| | | @font-face { |
| | | font-family: 'bpmn'; |
| | | src: url('../font/bpmn.svg?26374340#bpmn') format('svg'); |
| | | } |
| | | } |
| | | */ |
| | | |
| | | [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before { |
| | | font-family: "bpmn"; |
| | | font-style: normal; |
| | | font-weight: normal; |
| | | speak: never; |
| | | |
| | | display: inline-block; |
| | | text-decoration: inherit; |
| | | width: 1em; |
| | | /* margin-right: .2em; */ |
| | | text-align: center; |
| | | /* opacity: .8; */ |
| | | |
| | | /* For safety - reset parent styles, that can break glyph codes*/ |
| | | font-variant: normal; |
| | | text-transform: none; |
| | | |
| | | /* fix buttons height, for twitter bootstrap */ |
| | | line-height: 1em; |
| | | |
| | | /* Animation center compensation - margins should be symmetric */ |
| | | /* remove if not needed */ |
| | | /* margin-left: .2em; */ |
| | | |
| | | /* you can be more comfortable with increased icons size */ |
| | | /* font-size: 120%; */ |
| | | |
| | | /* Font smoothing. That was taken from TWBS */ |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | |
| | | /* Uncomment for 3D effect */ |
| | | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ |
| | | } |
| | | |
| | | .bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */ |
| | | .bpmn-icon-trash:before { content: '\e801'; } /* '' */ |
| | | .bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */ |
| | | .bpmn-icon-default-flow:before { content: '\e803'; } /* '' */ |
| | | .bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */ |
| | | .bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */ |
| | | .bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */ |
| | | .bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ |
| | | .bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */ |
| | | .bpmn-icon-connection:before { content: '\e810'; } /* '' */ |
| | | .bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ |
| | | .bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ |
| | | .bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */ |
| | | .bpmn-icon-user-task:before { content: '\e817'; } /* '' */ |
| | | .bpmn-icon-business-rule:before { content: '\e818'; } /* '' */ |
| | | .bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */ |
| | | .bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ |
| | | .bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ |
| | | .bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */ |
| | | .bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ |
| | | .bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */ |
| | | .bpmn-icon-task:before { content: '\e821'; } /* '' */ |
| | | .bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ |
| | | .bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */ |
| | | .bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */ |
| | | .bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */ |
| | | .bpmn-icon-manual:before { content: '\e828'; } /* '' */ |
| | | .bpmn-icon-receive:before { content: '\e829'; } /* '' */ |
| | | .bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */ |
| | | .bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */ |
| | | .bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ |
| | | .bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */ |
| | | .bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */ |
| | | .bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */ |
| | | .bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */ |
| | | .bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */ |
| | | .bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */ |
| | | .bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */ |
| | | .bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */ |
| | | .bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */ |
| | | .bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */ |
| | | .bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */ |
| | | .bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */ |
| | | .bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ |
| | | .bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */ |
| | | .bpmn-icon-script:before { content: '\e83f'; } /* '' */ |
| | | .bpmn-icon-manual-task:before { content: '\e840'; } /* '' */ |
| | | .bpmn-icon-send:before { content: '\e841'; } /* '' */ |
| | | .bpmn-icon-service:before { content: '\e842'; } /* '' */ |
| | | .bpmn-icon-receive-task:before { content: '\e843'; } /* '' */ |
| | | .bpmn-icon-user:before { content: '\e844'; } /* '' */ |
| | | .bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ |
| | | .bpmn-icon-data-object:before { content: '\e84b'; } /* '' */ |
| | | .bpmn-icon-script-task:before { content: '\e84c'; } /* '' */ |
| | | .bpmn-icon-send-task:before { content: '\e84d'; } /* '' */ |
| | | .bpmn-icon-data-store:before { content: '\e84e'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ |
| | | .bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ |
| | | .bpmn-icon-service-task:before { content: '\e856'; } /* '' */ |
| | | .bpmn-icon-task-none:before { content: '\e857'; } /* '' */ |
| | | .bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */ |
| | | .bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ |
| | | .bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ |
| | | .bpmn-icon-participant:before { content: '\e85c'; } /* '' */ |
| | | .bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */ |
| | | .bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */ |
| | | .bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */ |
| | | .bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */ |
| | | .bpmn-icon-lane:before { content: '\e861'; } /* '' */ |
| | | .bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */ |
| | | .bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */ |
| | | .bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */ |
| | | .bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */ |
| | | .bpmn-icon-data-input:before { content: '\e866'; } /* '' */ |
| | | .bpmn-icon-data-output:before { content: '\e867'; } /* '' */ |
| | | .bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */ |
| | | .bpmn-icon-group:before { content: '\e869'; } /* '' */ |
| | | .bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */ |
New file |
| | |
| | | <?xml version="1.0" standalone="no"?> |
| | | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> |
| | | <svg xmlns="http://www.w3.org/2000/svg"> |
| | | <metadata>camunda Services GmbH</metadata> |
| | | <defs> |
| | | <font id="bpmn" horiz-adv-x="1000" > |
| | | <font-face font-family="bpmn" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" /> |
| | | <missing-glyph horiz-adv-x="1000" /> |
| | | <glyph glyph-name="screw-wrench" unicode="" d="M756 704c-55 0-108-22-147-61-39-39-61-92-61-147 0-55 22-108 61-147 39-39 92-61 147-61 91 0 171 59 198 146l-149-40-116 77 62 124 79 21 78 21c-39 42-94 67-152 67z m-247-278l-461-316c-14-42 32-111 80-114l451 310c-36 31-61 73-70 120z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="trash" unicode="" d="M429 743c-58-4-70 11-71-52l0-9-172-56c-20-5-20-29 0-30l624 0c19 0 19 25 0 30l-168 55 0 10c0 62-7 48-71 52l-71 0z m-215-204c-14 0-25-12-24-26l50-555c1-12 11-22 24-22l457 0c13 0 23 9 25 22l64 554c2 15-9 27-24 27l-143 0-143 0z m27-49l259 0 259 0-59-505-414 0z m120-73c-1 0-2 0-3 0-16-1-28-15-25-31l44-320c2-15 16-26 31-24 15 2 25 17 22 32l-44 319c-2 13-12 23-25 24z m280 0c-13 0-25-10-27-24l-44-319c-3-15 7-30 22-32 16-2 29 9 31 24l44 320c3 16-9 30-26 31z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="conditional-flow" unicode="" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-140-142-77-81-199-205l-209-34-41-247 247 40 3 15 31 194c123 125 60 64 201 206 30-29 60-60 90-90 77 153 218 424 218 424z m-552-552l-27-160-160-27 26 161 161 26z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="default-flow" unicode="" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-91-93-183-186-275-279l-166 0 0-43 124 0c-42-42-84-84-126-126 11-11 22-21 33-31 52 52 104 105 156 157l175 0 0 43-133 0c82 83 163 166 245 248 30-29 60-60 90-90 77 153 218 424 218 424z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-parallel" unicode="" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-11-161c0 0-4-1-4-1 0 0-4-3-4-3 0 0-3-4-3-4 0 0-1-4-1-4l0-194-194 0 0 0c0 0-4-1-4-1 0 0-4-3-4-3l0 0c0 0-3-4-3-4 0 0-1-4-1-4l0-21c0 0 1-5 1-5 0 0 3-4 3-4 0 0 4-3 4-3 0 0 4-1 4-1l194 0 0-194 0 0c0 0 1-4 1-4 0 0 3-4 3-4 0 0 4-3 4-3 0 0 4-1 4-1l22 0c0 0 4 1 4 1 0 0 4 3 4 3 0 0 3 4 3 4 0 0 1 4 1 4l0 194 194 0c0 0 4 1 4 1 0 0 4 3 4 3 0 0 3 4 3 4 0 0 1 4 1 4l0 22c0 0-1 4-1 4 0 0-3 4-3 4 0 0-4 3-4 3 0 0-4 1-4 1l-194 0 0 194c0 0-1 4-1 4 0 0-3 4-3 4 0 0-4 3-4 3 0 0-4 1-4 1l-22 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-cancel" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-112-111c-29-30-58-59-87-88 37-38 75-75 112-113-37-36-74-73-110-110 28-29 57-58 86-86 37 37 73 73 110 110 38-37 75-75 113-112 29 29 58 58 88 87-38 38-76 75-113 113 37 37 74 73 110 110-28 29-57 58-86 86-37-36-73-73-110-110-38 37-75 75-113 113z m0-35c38-38 75-75 113-113 37 37 73 74 110 111 17-17 35-35 52-52-37-37-74-73-111-110 38-38 75-75 113-113-18-18-35-35-53-53-38 38-75 75-113 113-36-37-73-74-110-111-17 17-35 35-52 52 37 37 74 74 111 110-38 38-75 76-113 113 18 18 35 35 53 53z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-message" unicode="" d="M295 506l0-312 410 0 0 312-410 0z m91-49l228 0c-38-30-76-60-114-90-38 30-76 60-114 90z m270-28l0-186-312 0 0 186c52-42 104-83 156-125 52 42 104 83 156 125z m-156 373l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-compensation" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m-16-255c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z m-24-47c0-67 0-134 0-201-48 33-95 67-143 100 48 34 95 67 143 101z m202 0c0-67 0-134 0-202-48 34-95 68-143 101 48 34 95 67 143 101z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-parallel-multiple" unicode="" d="M430 545l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0z m51 278l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="loop-marker" unicode="" d="M529 645c-126 1-247-86-283-207-28-87-12-187 42-260-44 8-89 17-134 26-4-20-8-40-12-59 81-16 162-32 242-47 16 80 32 160 47 240-19 4-39 8-59 11-9-48-19-97-28-145-69 82-68 214 2 295 69 86 200 111 295 57 92-47 143-159 118-259-22-104-124-184-230-182-28 2-42-38-19-53 20-13 45-4 67-3 124 19 229 125 245 250 19 119-46 244-152 300-43 23-92 36-141 36z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="parallel-mi-marker" unicode="" d="M250 650l0-600 100 0 0 600-100 0z m200 0l0-600 100 0 0 600-100 0z m200 0l0-600 100 0 0 600-100 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-signal" unicode="" d="M500 562c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z m4 289c-45-7-119 8-139-39 18-48 78-2 116-10 40 3 80-6 119-8 49 46-38 58-72 56-8 1-16 1-24 1z m250-79c-62-19 12-63 34-87 30-33 55-70 76-109 42-29 52 35 23 57-33 54-74 105-127 138l-6 1 0 0z m-521-11c-51-21-82-73-113-115-22-23-63-104 0-91 32 41 53 93 92 130 19 20 77 57 21 76z m695-313c-47-13-14-76-28-111-7-43-22-86-43-125-6-47 57-33 57 6 31 66 44 141 36 213-3 10-13 16-22 17z m-853-19c-48-11-18-76-18-110 11-46 23-94 51-133 67-9 16 67 8 99-12 40-19 82-19 124-2 11-12 19-22 20z m694-334c-50-24-94-64-149-78-33 0-87-36-38-60 75 13 146 49 204 98 14 14 2 40-17 40z m-542-1c-56-22 12-68 41-83 45-25 95-46 147-53 50 23-6 59-38 59-50 15-97 39-136 73l-6 3-8 1 0 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-timer" unicode="" d="M500 564c-85 2-167-54-198-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21z m0-39c78 2 152-55 170-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80z m55-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4 30 0 59 0 89 0 0 8 0 17 0 25-30 0-60 0-89 0 18 34 37 68 56 102-7 4-14 8-22 12z m-55 233l-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-159-39l-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m392-60l-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-170l-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m658-119l-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-161l-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m425-76l-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 1 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-162 718l-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m250-83l-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m692-315l-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m153-334l-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m542-2l-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-parallel-multiple" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-61-93c0-52 0-104 0-156-53 0-106 0-159 0 0-41 0-83 0-124 53 0 106 0 159 0 0-52 0-104 0-156 41 0 81 0 122 0 0 52 0 104 0 156 53 0 106 0 159 0 0 41 0 83 0 124-53 0-106 0-159 0 0 52 0 104 0 156-41 0-81 0-122 0z m25-24c24 0 48 0 73 0 0-52 0-104 0-157 53 0 106 0 159 0 0-24 0-49 0-74-53 0-106 0-159 0 0-53 0-105 0-157-25 0-49 0-73 0 0 52 0 104 0 157-54 0-107 0-160 0 0 25 0 50 0 74 53 0 106 0 160 0 0 53 0 105 0 157z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-compensation" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-16-163c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z m-24-47c0-67 0-134 0-201-48 33-95 67-143 100 48 34 95 67 143 101z m202 0c0-67 0-134 0-202-48 34-95 68-143 101 48 34 95 67 143 101z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-xor" unicode="" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-146-217c0 0-4-1-4-1 0 0-4-3-4-3l-15-15c0 0-3-4-3-4 0 0-1-4-1-4 0 0 1-5 1-5 0 0 3-4 3-4l137-137-137-137 0 0c0 0-3-4-3-4 0 0-1-5-1-5 0 0 1-4 1-4 0 0 3-4 3-4l15-15c0 0 4-3 4-3 0 0 4-1 4-1 0 0 5 1 5 1 0 0 4 3 4 3l137 137 137-137c0 0 4-3 4-3 0 0 5-1 5-1 0 0 4 1 4 1 0 0 4 3 4 3l15 15c0 0 3 4 3 4 0 0 1 4 1 4 0 0-1 5-1 5 0 0-3 4-3 4l-137 137 137 137c0 0 3 4 3 4 0 0 1 5 1 5 0 0-1 4-1 4 0 0-3 4-3 4l-15 15c0 0-4 3-4 3 0 0-4 1-4 1 0 0-5-1-5-1 0 0-4-3-4-3l-137-137-137 137 0 1c0 0-4 2-4 2 0 0-5 1-5 1l0 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="connection" unicode="" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-147-149-295-299-443-448 11-11 22-21 33-31 148 149 295 299 443 448 30-29 60-60 90-90 77 153 218 424 218 424z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-cancel" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-112-110c-29-30-58-59-87-88 37-38 75-75 112-113-37-36-74-73-110-110 28-29 57-58 86-86 37 37 73 73 110 110 38-37 75-75 113-112 29 29 58 58 88 87-38 38-76 75-113 113 37 37 74 73 110 110-28 29-57 58-86 86-37-36-73-73-110-110-38 37-75 75-113 113z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-condition" unicode="" d="M499 802c-1 0-2 0-3 0-202 1-391-150-436-346-42-173 28-368 174-471 145-107 354-116 506-18 149 93 235 276 207 450-26 176-164 330-338 371-36 9-73 14-110 14z m-5-49c3 0 7 0 10 0 187 2 362-146 392-331 32-167-54-348-205-427-154-85-363-54-483 77-124 127-147 338-53 488 71 116 203 192 339 193z m8-44c-3 0-7 0-10 0-172 0-330-143-349-314-22-161 79-328 233-382 145-55 322-3 413 124 98 129 92 326-17 447-67 77-167 125-270 125z m-2-48c2 0 4 0 6 0 153 0 292-129 304-281 16-145-84-293-225-330-137-40-296 27-361 154-69 129-33 305 86 392 54 42 122 65 190 65z m-151-121l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-parallel-multiple" unicode="" d="M430 545l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0z m47 280l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-condition" unicode="" d="M500 802c-249 0-452-203-452-452 0-249 203-452 452-452 249 0 452 203 452 452 0 249-203 452-452 452z m0-49c223 0 403-180 403-403 0-223-180-403-403-403-223 0-403 180-403 403 0 223 180 403 403 403z m-151-213l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-timer" unicode="" d="M500 564c-85 2-167-54-198-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21z m0-39c78 2 152-55 170-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80z m55-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4 30 0 59 0 89 0 0 8 0 17 0 25-30 0-60 0-89 0 18 34 37 68 56 102-7 4-14 8-22 12z m-51 324l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="sequential-mi-marker" unicode="" d="M200 600l0-100 600 0 0 100-600 0z m0-200l0-100 600 0 0 100-600 0z m0-200l0-100 600 0 0 100-600 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="user-task" unicode="" d="M328 611c-51 0-87-39-88-84l0 0 0 0c0-13 4-27 10-40 4-10 9-18 15-25-37-13-80-33-102-75l-1-2 0-133 332 0 0 133-1 2c-22 41-64 62-101 75 18 18 23 41 23 65l0 0 0 0c0 45-36 84-87 84z m-35-47c3 0 5-1 8-1 23-1 30-5 36-9 6-4 10-8 26-8l0 0 0 0c12 0 18 3 22 5 1 1 3 2 4 3 4-8 6-17 6-27 0-27-4-45-29-61l2-18c6-1 11-3 16-5 1-3 2-7 2-12 1-4 1-9 1-13 0-3-2-5-2-5-12-13-34-20-57-20-23 0-45 7-57 20 0 0-2 2-2 5 0 4 0 9 1 13 0 5 1 9 2 12 5 2 10 4 15 5l2 20c-1 1-3 2-4 3-5 4-12 13-17 24-4 10-7 23-7 32 0 12 3 23 8 33 2 0 3 0 4 1 4 1 10 3 20 3z m-43-130c0 0 0 0 0 0-1-6-2-12-1-18 1-6 2-12 8-17 17-18 44-26 71-26 27 0 54 8 71 26 6 5 7 11 8 17 1 6 0 12-1 18 0 0 0 0 0 0 27-12 54-29 68-54l0-108-48 0 0 76-20 0 0-76-156 0 0 76-21 0 0-76-47 0 0 108c14 25 41 43 68 54z m-35 311c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="business-rule" unicode="" d="M89 659l0-617 822 0 0 617-822 0z m35-209l159 0 0-173-159 0 0 173z m194 0l558 0 0-173-558 0 0 173z m-194-208l159 0 0-165-159 0 0 165z m194 0l558 0 0-165-558 0 0 165z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="sub-process-marker" unicode="" d="M150 700l0-25 0-675 700 0 0 700z m44-44l612 0 0-612-612 0z m261-106l0-155-155 0 0-90 155 0 0-155 90 0 0 155 155 0 0 90-155 0 0 155z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-parallel-multiple" unicode="" d="M496 802c-176 0-345-113-412-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47-1 0-3 0-4 0z m12-49c173-1 335-126 380-293 47-159-17-344-155-439-143-105-354-97-489 18-136 108-185 309-115 468 60 147 212 248 371 246 3 0 6 0 8 0z m-78-208l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125-140 0z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0 0 125z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-error" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m173-210c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z m-219-110c41-52 81-103 122-154 10 22 20 45 30 67-10-39-19-78-29-116-41 48-83 97-124 145-17-26-34-52-50-77 17 45 34 90 51 135z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-signal" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-99c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-error" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m173-118c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z m-219-110c41-52 81-103 122-154 10 22 20 45 30 67-10-39-19-78-29-116-41 48-83 97-124 145-17-26-34-51-50-77 17 45 34 90 51 135z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-compensation" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-16-162c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="subprocess-collapsed" unicode="" d="M216 716c-86 0-155-69-155-154l0-424c0-85 69-154 155-154l569 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-569 0z m0-48l569 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-116 0 0 308-338 0 0-15 0-293-115 0c-60 0-106 47-106 106l0 424c0 59 46 106 106 106z m146-359l276 0 0-276-276 0 0 276z m115-39l0-23 0-54-54 0-23 0 0-46 23 0 54 0 0-54 0-23 46 0 0 23 0 54 54 0 23 0 0 46-23 0-54 0 0 54 0 23-46 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="subprocess-expanded" unicode="" d="M215 716c-85 0-154-69-154-154l0-424c0-85 69-154 154-154l570 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-570 0z m0-48l570 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-116 0 0 292 0 16-15 0-308 0-15 0 0-16 0-292-116 0c-59 0-105 47-105 106l0 424c0 59 46 106 105 106z m147-359l276 0 0-277-276 0 0 277z m37-110l0-47 203 0 0 47-203 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="task" unicode="" d="M215 716c-85 0-154-69-154-154l0-424c0-85 69-154 154-154l570 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-570 0z m0-48l570 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-570 0c-59 0-105 47-105 106l0 424c0 59 46 106 105 106z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-error" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m173-117c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-escalation" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-111c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-timer" unicode="" d="M499 802c-1 0-2 0-3 0-202 1-391-150-436-346-42-173 28-368 174-471 145-107 354-116 506-18 149 93 235 276 207 450-26 176-164 330-338 371-36 9-73 14-110 14z m-5-49c3 0 7 0 10 0 187 2 362-146 392-331 32-167-54-348-205-427-154-85-363-54-483 77-124 127-147 338-53 488 71 116 203 192 339 193z m8-44c-3 0-7 0-10 0-172 0-330-143-349-314-22-161 79-328 233-382 145-55 322-3 413 124 98 129 92 326-17 447-67 77-167 125-270 125z m-2-48c2 0 4 0 6 0 153 0 292-129 304-281 16-145-84-293-225-330-137-40-296 27-361 154-69 129-33 305 86 392 54 42 122 65 190 65z m-4-97c-84 0-164-55-194-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21-1 0-3 0-4 0z m8-39c76 0 148-57 166-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80 1 0 2 0 4 0z m51-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4l89 0 0 25-89 0c18 34 37 68 56 102-7 4-14 8-22 12z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-escalation" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-203c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-signal" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-191c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="business-rule-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-36-72l0-380 506 0 0 380-506 0z m21-131l463 0 0-104-343 0 0 103-22 0 0-103-98 0 0 104z m0-125l98 0 0-102-98 0 0 102z m120 0l343 0 0-102-343 0 0 102z m-118 232l0-108 461 0 0 108z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="manual" unicode="" d="M460 659c-11 0-22-5-31-10l0 0 0 0c-47-31-209-143-245-168l0 0 0 0c-32-22-54-55-66-95l0 0 0 0c-13-41-11-86-11-124l0 0 0 0c0-28 1-53 8-83 0 0 0 0 0 0 11-44 31-75 61-95 29-19 65-26 105-26 147-1 293-1 439 0l0 0 0 0c16 0 31 6 41 18 10 12 14 28 14 45 0 11-2 22-5 32l16 0c16 0 30 4 40 14 11 9 16 22 19 35l0 0c4 19 2 38-6 53 17 2 31 8 41 19 10 13 13 29 13 47 0 18-4 35-14 49-10 13-27 23-46 23l0 0 0 0c-7 0-13 0-21 0 4 9 6 19 6 31l0 0 0 0c0 17-5 35-15 48-10 14-27 23-46 23-112 0-223-1-317-1 5 5 9 10 15 15 16 17 31 32 39 42 20 25 23 59 6 83-8 13-21 22-34 24-2 0-4 1-5 1l0 0c-1 0-1 0-1 0z m0-35c0 0 1 0 1-1 3 0 6-1 10-8l0 0 0 0c6-9 6-29-4-42l0 0 0 0c-4-5-21-23-37-39-16-16-32-31-39-40-8-9-5-16-3-21 2-5 4-10 14-12 3-1 4-1 5-1 0 0 1 0 3 0 2 0 5 0 9 0 113-1 225 0 338 0l0 0 0 0c9 0 13-3 18-9 4-6 8-16 8-28 0-12-3-19-7-24-3-4-8-6-19-6l-242 0 0-35 242 0 0 0c34 0 51 0 76 0 9 0 13-3 18-9 4-6 7-16 7-28l0 0c0-13-2-21-5-24-3-4-8-7-20-7-4 0-34 0-47 0 0 0 0 0-1 0-90 0-180 0-270 0l0 0 0-35 0 0c0 0 191 0 271 0 10 0 15-4 20-12 5-8 7-20 5-34l0 0 0 0c-2-9-5-14-8-17-3-2-7-4-17-4-90 0-181 0-271 0l0 0 0-35 0 0 205 0 0 0c7 0 10-2 14-7 3-4 6-13 6-25l0 0 0 0c0-11-3-19-6-23-3-4-6-5-14-5-146-1-292-1-438 0l0 0 0 0c-37 0-66 6-87 20-21 14-37 37-46 74l0 1 0 0c-6 26-7 47-7 74l0 0c0 39-1 80 9 114 11 34 28 59 53 76l0 0c36 25 199 138 244 167l0 0c5 3 8 4 11 4 0 1 1 1 1 1z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="receive" unicode="" d="M95 618l0-535 811 0 0 535-811 0z m83-35l644 0-322-212-322 212z m-48-10l370-244 371 244 0-455-741 0 0 455z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="call-activity" unicode="" d="M231 745c-116 0-211-93-211-208l0-374c0-115 95-208 211-208l538 0c116 0 211 93 211 208l0 374c0 115-95 208-211 208l-538 0z m0-110l538 0c58 0 101-43 101-98l0-374c0-55-43-98-101-98l-538 0c-58 0-101 43-101 98l0 374c0 55 43 98 101 98z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-timer" unicode="" d="M500 802c-249 0-452-203-452-452 0-249 203-452 452-452 249 0 452 203 452 452 0 249-203 452-452 452z m0-49c223 0 403-180 403-403 0-223-180-403-403-403-223 0-403 180-403 403 0 223 180 403 403 403z m-4-189c-84 0-164-55-194-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21-1 0-3 0-4 0z m8-39c76 0 148-57 166-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80 1 0 2 0 4 0z m51-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4l89 0 0 25-89 0c18 34 37 68 56 102-7 4-14 8-22 12z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-message" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m-205-247c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-none" unicode="" d="M496 802c-219 2-422-178-445-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 165-214 291-388 303-15 1-29 2-43 2z m8-49c201 3 386-169 398-370 16-178-100-360-271-415-164-56-362 4-460 148-103 144-99 357 19 491 76 92 194 149 314 146z m-12-44c-185 0-352-166-352-352-4-168 124-331 291-360 153-30 322 49 390 191 71 141 39 329-84 431-67 59-156 92-245 90z m14-48c165 1 312-150 305-315 0-150-121-290-272-305-143-19-295 73-336 213-43 134 14 296 139 364 50 29 107 44 164 43z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-link" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m50-116c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z m28-73c34-40 68-81 102-121-34-40-68-81-102-121 0 18 0 36 0 54-75 0-149 0-223 0 0 44 0 89 0 133 74 0 148 0 223 0 0 18 0 37 0 55z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-escalation" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-110c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="text-annotation" unicode="" d="M677 795l0-25 0-411 0-412 0-24 24 0 224 0 25 0 0 49-25 0-199 0 0 387 0 386 199 0 25 0 0 50-25 0-224 0-24 0z m-81-386l-75-60 60-75 75 60-60 75z m-151-119l-75-60 60-75 75 59-60 76z m-150-120l-76-59 60-76 75 60-59 75z m-151-119l-76-60 60-75 76 59-60 76z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="bpmn-io" unicode="" d="M674 41h-348v-191h348z m-348 809v-714h176c114 0 171 57 171 166v58c0 76-23 133-81 157 48 24 67 71 67 143v28c0 105-48 162-162 162z m114-100h57c43 0 57-24 57-76v-38c0-57-23-76-66-76h-48z m-5-300h53c47 0 71-19 71-86v-62c0-52-19-71-57-71h-67z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-complex" unicode="" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-9-192l0 0c0 0-4-1-4-1 0 0-4-2-4-2 0 0-2-3-2-3 0 0-1-4-1-4l0-140-99 99 0 0c0 0-3 2-3 2 0 0-4 1-4 1 0 0-4-1-4-1 0 0-4-2-4-2l-13-13c0 0-2-4-2-4 0 0-1-4-1-4 0 0 1-4 1-4 0 0 2-3 2-3l99-99-140 0 0 0c0 0-4-1-4-1 0 0-3-2-3-2l0 0c0 0-2-4-2-4 0 0-1-4-1-4l0-18c0 0 1-4 1-4 0 0 2-4 2-4 0 0 3-2 3-2 0 0 4-1 4-1l140 0-99-99 0 0c0 0-2-3-2-3 0 0-1-4-1-4 0 0 1-4 1-4 0 0 2-4 2-4l13-13c0 0 4-2 4-2 0 0 4-1 4-1 0 0 4 1 4 1 0 0 3 2 3 2l99 99 0-140 0 0c0 0 1-4 1-4 0 0 2-3 2-3 0 0 4-2 4-2 0 0 4-1 4-1l18 0c0 0 4 1 4 1 0 0 4 2 4 2 0 0 2 3 2 3 0 0 1 4 1 4l0 140 99-99c0 0 3-2 3-2 0 0 4-1 4-1 0 0 4 1 4 1 0 0 4 2 4 2l13 13c0 0 2 4 2 4 0 0 1 4 1 4 0 0-1 4-1 4 0 0-2 4-2 4l-99 98 140 0c0 0 4 1 4 1 0 0 3 2 3 2 0 0 3 4 3 4 0 0 0 4 0 4l0 18c0 0 0 4 0 4 0 0-3 4-3 4 0 0-3 2-3 2 0 0-4 1-4 1l-140 0 99 99c0 0 2 3 2 3 0 0 1 4 1 4 0 0-1 4-1 4 0 0-2 4-2 4l-13 13c0 0-4 2-4 2 0 0-4 1-4 1 0 0-4-1-4-1 0 0-3-2-3-2l-99-99 0 140c0 0-1 4-1 4 0 0-2 3-2 3 0 0-4 3-4 3 0 0-4 0-4 0l-18 0z m-117-48c0 0 0 0 0 0l0 0c0 0 0 0 0 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-eventbased" unicode="" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m0-166l-7-5-208-151 82-253 266 0 82 253-215 156z m0-30l187-135-72-220-230 0-72 220 187 135z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-none" unicode="" d="M59 376c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-14 14-38 14-52 0l-415-415z m51-26l390 390 390-390-390-390-390 390z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="gateway-or" unicode="" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m0-180c-116 0-210-94-210-210 0-116 94-210 210-210 116 0 210 94 210 210 0 116-94 210-210 210z m0-23c103 0 187-84 187-187 0-103-84-187-187-187-103 0-187 84-187 187 0 103 84 187 187 187z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-terminate" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-81c-149 6-268-156-219-297 38-143 229-210 349-121 126 79 133 281 13 369-40 32-92 50-143 49z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-signal" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-98c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-none" unicode="" d="M496 802c-203 1-394-153-437-351-41-174 33-368 181-470 143-103 348-111 497-15 150 91 238 275 210 449-26 181-170 339-350 376-33 7-67 11-101 11z m10-142c150 1 287-123 302-271 19-142-72-291-210-334-134-45-296 13-366 138-77 129-45 313 78 403 56 43 126 66 196 64z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-multiple" unicode="" d="M491 802c-219-1-420-183-440-401-22-185 82-379 252-458 159-77 362-53 493 66 134 116 192 313 133 481-55 171-220 303-401 311-13 0-25 1-37 1z m9-142c161 5 308-137 310-298 7-148-104-292-250-317-142-28-300 54-350 192-53 136 1 308 132 380 47 28 102 43 158 43z m0-86c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-message" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-167-154c57-46 114-92 171-138 56 46 113 92 170 138-114 0-227 0-341 0z m-38-32c0-93 0-187 0-280 137 0 273 0 410 0 0 91 0 183 0 274-67-54-134-109-201-163-70 56-139 113-209 169z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="end-event-link" unicode="" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m50-115c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-message" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-205-155c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-compensation" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-16-163c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-multiple" unicode="" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-179c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z m0-30c62-45 124-90 187-135-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="script" unicode="" d="M380 661l-4-2-2-1c-58-35-98-67-125-98-26-31-39-62-40-92 0-60 44-105 83-145 39-40 74-78 78-109 1-16-3-32-20-54-17-22-49-48-99-78l-74-43 458 0 5 3 1 0c53 31 89 60 112 89 23 29 32 59 29 88-6 56-52 97-90 137-39 39-70 76-70 112 0 17 7 37 29 62 21 25 57 55 113 88l0 0 73 43-457 0z m13-46l282 0c-25-19-45-37-60-55-26-31-39-62-39-92-1-60 43-105 82-145 39-40 74-78 78-109 1-16-2-32-20-54-16-21-47-46-94-74l-283 0c20 15 36 30 47 45 23 29 33 59 30 88-6 56-52 97-91 137-38 39-70 76-69 112 0 17 7 37 28 62 21 25 56 53 109 85z m-66-80l0-21 220 0 0 21-220 0z m-9-115l0-22 229 0 0 22-229 0z m104-116l0-21 221 0 0 21-221 0z m31-115l0-22 229 0 0 22-229 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="manual-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m133-40c-7 0-13-2-18-6l0 0 0 0c-30-19-131-89-153-104l0 0 0 0c-20-14-34-35-42-60l0 0 0 0c-8-25-7-53-7-77l0 0 0 0c0-18 1-33 5-52 0 0 0 0 0 0 7-27 19-49 37-63 18-15 41-22 67-22 91-1 183-1 274 0l0 0 0 0c10 0 19 3 25 11 6 7 9 17 9 27 0 7-1 13-3 19l10 0c10 0 19 3 25 9 7 7 10 15 12 23 0 0 0 0 0 0 2 12 1 24-4 34 11 1 21 8 26 16 6 9 8 20 8 31 0 11-3 22-9 31-6 9-16 15-29 15l0 0 0 0c-4 0-9 0-14 0 3 7 5 15 5 24l0 0 0 0c0 11-3 21-10 29-6 8-17 13-28 13-68 0-127 0-192 0-3 0-4 0-6 0 3 3 6 6 9 9 10 10 20 20 25 26 12 16 14 37 4 52-6 8-13 14-22 15-1 0-2 0-3 0 0 0-1 0-1 0z m1-22c0 0 0 0 0 0 2 0 4 0 7-5l0 0 0 0c4-6 3-18-3-26l0 0 0 0c-2-3-13-14-23-24-10-10-20-20-25-25-4-6-2-11-1-13 1-3 2-7 9-8 2-1 2-1 2-1 1 0 1 0 2 0 73-1 150 0 217 0l0 0 0 0c6 0 9-1 11-5 3-3 5-8 5-16 0-7-2-14-5-17-2-4-5-6-11-6-51 0-102 0-153 1l0-22c67-1 133-1 200-1 5 0 8-2 11-6 3-4 5-11 5-18l0 0c0-8-2-15-4-19-3-4-5-6-12-6-69 0-136 0-200 0l0-22c57 0 114 0 171 0 6 0 9-3 12-8 4-5 5-13 3-22l0 0 0 0c-1-5-3-9-5-11-2-2-4-3-10-3l-171 0c0-8 0-15 0-22 43 0 86 0 130 0l0 0 0 0c5 0 7-1 9-4 2-2 3-7 3-15l0 0 0 0c0-7-2-11-3-13-2-2-4-3-9-4-91 0-183 0-274 0l0 0 0 0c-22 1-39 6-53 18-13 11-24 28-29 51l0 0 0 0c-4 17-5 30-5 47l0 0c0 24 0 50 6 71 7 21 18 37 33 48l0 0c23 15 124 86 152 104l0 0c3 1 5 2 7 2 0 0 0 0 1 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="send" unicode="" d="M99 608l401-227 401 227-802 0z m1-84l0-448 802 0 0 448-402-224-400 224z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="service" unicode="" d="M413 631c0-19 0-37 0-56-16-4-30-10-44-18l-40 39-74-74 40-40c-8-13-14-28-18-43l-56 0 0-106 56 0c6-20 17-39 28-55l0 91-49-1 0 36 49 0 3 14c4 20 12 40 23 57l8 12-34 35 25 25 34-34 12 8c18 11 38 19 58 24l14 3 0 48 36 0 0-48 14 0 80 0c-9 10-46 24-59 28l0 55c-39 0-70 0-106 0z m100-101l0-55c-16-5-31-11-44-19l-40 40-74-75 39-40c-7-13-13-28-17-43l-57 0 0-106 57 1c5-16 11-30 18-44l-40-40 75-74 41 40c13-8 28-14 44-18l0-57c36 0 74 0 105 0l0 58c16 4 31 10 44 18l41-40 74 75-41 40c8 14 14 28 18 44l56 0 0 105-56 0c-5 16-11 30-19 43l39 39-75 74-39-39c-14 8-28 14-44 18l1 55-106 0z m35-35l36 0-1-48 15-3c20-4 40-12 58-23l11-8 34 34 25-25-33-34 8-12c12-18 20-37 24-57l3-14 49 0 0-35-49-1-3-14c-4-20-12-40-23-57l-8-12 36-35-26-26-35 36-12-8c-18-12-38-20-58-24l-14-3 0-51c-9 0-20 0-35 0l0 50-15 3c-20 4-40 12-58 24l-11 8-36-36-26 25 36 35-8 12c-12 18-20 38-24 58l-3 14-50-1 0 36 50 0 3 14c4 21 12 40 23 58l8 12-35 34 25 25 35-34 12 8c18 12 37 19 58 24l14 3 0 48z m18-128c-43 0-79-36-79-79 0-44 36-79 79-79 43 0 79 35 79 79 0 43-36 79-79 79z m0-35c25 0 44-20 44-44 0-25-19-44-44-44-24 0-44 19-44 44 0 24 20 44 44 44z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="receive-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-38-83l0-347 526 0 0 347-526 0z m54-23l418 0-209-137-209 137z m-31-6l240-158 241 158 0-295-481 0 0 295z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="user" unicode="" d="M496 668c-89 0-152-69-152-146l0 0 0 0c0-24 6-48 16-71 7-16 16-31 27-43-65-22-140-58-178-130l-2-4 0-231 578 0 0 231-2 4c-37 71-111 107-175 129 31 32 40 73 40 115l0 0 0 0c0 77-63 146-152 146z m-61-83c5 0 9 0 14-1 39-2 53-9 63-16 10-6 17-13 44-14l0 0 0 0c21 1 32 5 39 9 3 2 5 4 8 5 7-14 10-30 10-46 0-47-8-80-51-106l4-32c9-3 19-6 28-9 1-5 3-13 4-20 1-8 1-16 1-23-1-6-3-9-3-10-22-21-61-34-100-34-39 0-78 13-100 34 0 1-2 4-3 10 0 7 0 15 1 23 1 7 3 15 4 20 9 3 19 6 27 9l3 34c-2 2-4 4-7 6-9 7-21 23-29 41-8 19-13 40-13 57 0 20 5 39 15 56 2 1 4 1 6 2 7 3 18 5 35 5z m-75-225c0 0 0 0 0-1-2-9-2-20-1-30 1-11 4-22 13-31 31-31 78-45 124-45 46 0 93 14 124 45 10 9 12 20 13 31 2 10 1 21-1 30 0 1 0 1 0 1 48-21 93-50 118-95l0-187-83 0 0 132-35 0 0-132-272 0 0 132-35 0 0-132-83 0 0 187c25 45 70 74 118 95z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-none" unicode="" d="M496 802c-176 0-345-113-412-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47-1 0-3 0-4 0z m12-49c173-1 335-126 380-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246 3 0 6 0 8 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-escalation" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-111c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-multiple" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-87c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z m0-30c62-45 124-90 187-135-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-escalation" unicode="" d="M500 550c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z m-1 335c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-link" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m50-116c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-condition" unicode="" d="M349 540l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z m105 557l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="data-object" unicode="" d="M626 746c-143 0-286 0-429 0 0-264 0-528 0-792 202 0 404 0 606 0 0 203 0 407 0 610-59 61-118 121-177 182z m-52-45c0-62 0-124 0-186 61 0 123 0 184 0 0-172 0-344 0-516-172 0-344 0-516 0 0 234 0 468 0 702 110 0 221 0 332 0z m45-12c42-43 83-86 125-129-42 0-83 0-125 0 0 43 0 86 0 129z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="script-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m90-92l-3-2-1 0c-32-19-55-37-70-55-14-17-22-34-22-51 0-34 24-59 46-82 22-22 42-43 44-61 1-9-1-18-11-30-10-12-27-27-56-43l-41-25 257 0 3 2 0 0c29 18 50 34 62 50 13 16 19 33 17 49-3 31-29 54-51 77-21 22-39 43-39 62 0 10 4 21 16 35 12 15 33 31 64 50l0 0 41 24-256 0z m7-26l158 0c-14-11-25-21-33-31-15-17-23-34-23-51 0-34 25-59 47-82 22-22 41-43 43-61 1-9-1-18-11-30-9-12-26-26-53-42l-158 0c11 9 20 17 26 26 13 16 18 33 17 49-4 31-29 54-51 77-22 22-39 43-39 62 0 10 4 21 16 35 12 14 31 30 61 48z m-37-45l0-12 123 0 0 12-123 0z m-5-64l0-12 128 0 0 12-128 0z m58-65l0-12 124 0 0 12-124 0z m18-65l0-12 128 0 0 12-128 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="send-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-42-95l250-141 250 141-500 0z m1-52l0-279 500 0 0 279-251-140-249 140z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="data-store" unicode="" d="M500 681c-79 0-158-7-219-20-31-7-58-16-79-27-20-10-36-24-41-43 0-1-1-3-1-4l0-2 0-2c0-158 0-307 0-469l0-2c5-21 22-35 42-46 21-11 48-20 79-26 61-14 140-20 219-20 79 0 158 6 219 20 31 6 58 15 79 26 21 11 37 25 42 46l0 2c0 154 0 323 0 470 0 1 0 1 0 2l0 1 0 0c0 1 0 3-1 4-5 19-21 33-41 43-21 11-48 20-79 27-61 13-140 20-219 20z m0-35c77 0 154-7 212-20 29-6 53-14 69-22 13-7 20-14 23-19-3-5-10-12-23-19-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-13 7-20 14-23 19 3 5 10 12 23 19 16 8 40 16 69 22 58 13 135 20 212 20z m-305-107c2-1 5-3 7-4 21-11 48-19 79-26 61-13 140-20 219-20 79 0 158 7 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-41c-2-5-8-13-24-21-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-15 8-22 16-24 21z m0-89c2-1 5-3 7-4 21-11 48-19 79-26 61-13 140-20 219-20 79 0 158 7 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-41c-2-5-8-13-24-21-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-15 8-22 16-24 21z m0-89c2-1 5-3 7-4 21-11 48-19 79-26 61-14 140-20 219-20 79 0 158 6 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-243c-2-5-8-13-24-21-16-9-40-17-69-23-58-13-135-19-212-19-77 0-154 6-212 19-29 6-53 14-69 23-15 8-22 16-24 21z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-escalation" unicode="" d="M500 550c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z m3 333c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-message" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-167-155c57-46 114-92 171-138 56 46 113 92 170 138-114 0-227 0-341 0z m-38-32c0-93 0-187 0-280 137 0 273 0 410 0 0 91 0 183 0 274-67-54-134-109-201-163-70 56-139 113-209 169z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-multiple" unicode="" d="M715 418c-71 52-143 104-215 156-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253z m-28-9c-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135 62-45 124-90 187-135z m-187 393c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-signal" unicode="" d="M500 562c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z m0 291c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-multiple" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-87c-72-52-144-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-message" unicode="" d="M295 506c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z m-152 371c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="ad-hoc-marker" unicode="" d="M150 330c29 69 67 141 133 180 49 29 110 11 155-17 69-43 123-106 191-150 41-24 92-4 122 29 36 42 78 82 99 135 0-55 0-110 0-165-31-61-70-124-133-154-52-22-112-8-156 24-66 44-114 112-185 147-35 18-79 14-108-13-52-46-82-112-118-171 0 52 0 103 0 155z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="service-task" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m36-50c0-12 0-24 0-35-9-3-18-7-27-12l-25 25-46-47 24-24c-4-9-8-18-11-28l-35 0 0-66 36 0c3-13 10-24 17-35l0 57-31 0 0 22 31 0 2 9c2 13 7 25 14 36l5 8-21 21 15 16 22-22 8 5c11 8 23 13 36 16l8 1 0 31 23 0 0-30 9 0 50 0c-6 6-29 15-37 17l0 35c-25 0-44 0-67 0z m63-64l0-34c-10-3-19-7-28-12l-24 25-47-47 25-25c-5-8-9-17-11-27l-36 0 0-66 36 0c3-10 7-19 12-27l-26-25 47-47 26 26c8-5 17-9 27-12l0-36c23 0 47 0 66 0l0 37c10 2 19 6 28 11l25-25 47 47-26 25c5 9 9 18 12 27l34 1 0 66-35-1c-3 10-7 19-11 28l24 24-47 46-24-24c-9 5-18 8-28 11l0 34-66 0 0 0z m22-21l22 0 0-31 9-1c13-3 25-8 36-15l8-5 21 21 16-15-21-22 5-7c7-11 12-23 15-36l2-9 30 1 0-23-30 0-2-9c-2-12-7-25-15-36l-5-7 23-22-16-16-22 22-8-5c-11-7-23-12-36-15l-9-2 0-32c-6 0-12 0-22 0l0 32-9 2c-13 2-25 7-36 15l-8 4-22-22-16 16 23 22-6 8c-7 11-12 23-15 35l-2 9-31 0 0 22 31 0 2 9c3 13 8 25 15 36l5 8-22 21 16 16 22-22 7 5c11 8 23 13 36 15l9 2 0 31z m11-81c-27 0-49-22-49-49 0-27 22-50 49-50 28 0 50 23 50 50 0 27-22 49-50 49z m0-22c16 0 28-12 28-27 0-16-12-28-28-28-15 0-27 12-27 28 0 15 12 27 27 27z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="task-none" unicode="" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="compensation-marker" unicode="" d="M502 590c-20-3-34-19-51-29-94-63-187-125-280-188-18-14-12-43 8-52 103-69 206-138 309-207 21-13 49 8 45 31 0 53 0 106 0 159 94-64 188-127 283-190 21-13 48 8 44 31 0 139 0 279 0 418-1 24-34 36-51 19-92-62-184-124-276-186-1 57 0 113-1 170-3 14-16 25-30 24z m-29-86c0-103 0-205 0-308-77 52-153 103-229 154 76 51 152 102 229 154z m327 0c0-103 0-205 0-308-76 52-152 103-229 154 77 51 153 102 229 154z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="start-event-non-interrupting-multiple" unicode="" d="M715 418c-71 52-143 104-215 156-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253z m-28-9c-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135 62-45 124-90 187-135z m-183 391c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-throw-signal" unicode="" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-99c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="intermediate-event-catch-non-interrupting-condition" unicode="" d="M349 540l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z m101 559l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="participant" unicode="" d="M47 654l0-625 906 0 0 625z m857-48l0-533-670 0 0 533 670 0z m-810 0l94 0 0-533-94 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="event-subprocess-expanded" unicode="" d="M261 669c16 0 33 0 49 0 0 16 0 32 0 49-16 0-33 0-49 0 0-17 0-33 0-49z m98 0c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m97 0c17 0 33 0 49 0 0 16 0 32 0 49-16 0-32 0-49 0 0-17 0-33 0-49z m98 0c16 0 33 0 49 0 0 16 0 32 0 49-16 0-33 0-49 0 0-17 0-33 0-49z m98 0c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m97 0c15 0 31 1 46-1 2 16 4 32 6 48-17 3-34 1-52 2 0-17 0-33 0-49z m-531 49c-8 0-17-1-25-3 3-16 6-32 9-48 10 3 26-3 20 13-2 11 5 34-4 38z m614-63c12-6 23-15 31-25 12 11 28 21 37 32-13 15-27 27-44 36-8-14-16-29-24-43z m-693 40c-16-10-31-23-43-37 13-9 27-24 39-30 9 10 18 19 30 25-9 14-16 29-26 42z m759-94c-15-1-15-9-10-22 4-6-3-23 7-23 14 1 31-1 44 1 0 19-3 38-10 56-10-4-20-8-31-12z m-830 4c-5-17-7-35-7-53 16 0 32 0 49 0-1 13 1 27 5 40-15 5-31 10-46 15l-1-2 0 0z m822-147c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m-829-4c16 0 32 0 49 0 0 16 0 33 0 49-17 0-33 0-49 0 0-16 0-33 0-49z m829-93c17 0 33 0 49 0 0 16 0 32 0 49-16 0-32 0-49 0 0-17 0-33 0-49z m-829-5c16 0 32 0 49 0 0 17 0 33 0 49-17 0-33 0-49 0 0-16 0-32 0-49z m829-93c17 0 33 0 49 0 0 16 0 33 0 49-16 0-32 0-49 0 0-16 0-33 0-49z m-829-4c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m829-94c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m-829-4c16 0 32 0 49 0 0 16 0 33 0 49-17 0-33 0-49 0 0-16 0-33 0-49z m827-40c-3-13-7-25-14-37 14-7 28-19 42-24 10 16 17 34 20 52-16 3-33 7-48 9z m-823-14c4-19 12-37 23-53 13 9 27 18 40 27-7 12-12 24-15 37-16-4-32-7-48-11z m780-54c-10-7-21-13-34-17 6-15 11-31 16-46 18 5 35 14 50 26-10 13-20 26-30 39l-2-2 0 0z m-718-40c16-11 33-20 52-25 4 16 9 32 12 47-12 4-24 10-35 18-10-14-19-27-29-40z m107-31c16 0 32 0 49 0 0 17 0 33 0 49-17 0-33 0-49 0 0-16 0-32 0-49z m97 0c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m98 0c16 0 33 0 49 0 0 17 0 33 0 49-16 0-33 0-49 0 0-16 0-32 0-49z m98 0c16 0 32 0 48 0 0 17 0 33 0 49-16 0-32 0-48 0 0-16 0-32 0-49z m94 0c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m101 0c16 0 33 0 49 0 0 17 0 33 0 49-16 0-33 0-49 0 0-16 0-32 0-49z m-53 15c0 114 0 229 0 343-113 0-225 0-338 0 0-114 0-229 0-343 113 0 225 0 338 0z m-307 312c92 0 184 0 276 0 0-92 0-184 0-277-92 0-184 0-276 0 0 93 0 185 0 277z m37-110c0-16 0-31 0-47 67 0 135 0 203 0 0 16 0 31 0 47-68 0-136 0-203 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lane-insert-below" unicode="" d="M46-50l0 89 49 0 0-40 16 0 0-49-65 0z m114 0l0 49 97 0 0-49-97 0z m146 0l0 49 98 0 0-49-98 0z m147 0l0 49 97 0 0-49-97 0z m146 0l0 49 98 0 0-49-98 0z m147 0l0 49 97 0 0-49-97 0z m145 0l0 49 13 0 0 40 49 0 0-64 0-25-25 0-37 0z m-845 138l0 92 49 0 0-92-49 0z m858 0l0 92 49 0 0-92-49 0z m-857 139l0 527 906 0 0-527-906 0z m857 48l0 435-810 0 0-435 810 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="space-tool" unicode="" d="M366 800l0-900 38 0 0 900-38 0z m233 0l0-900 38 0 0 900-38 0z m-394-287l-164-163 164-163 0 111 93 0 0 105-93 0 0 110z m595 0l0-108-94-1 0-106 94 0 0-111 163 163-163 163z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="connection-multi" unicode="" d="M916 798l-410-109 64-95-486-327 25-38 486 328 62-92 259 333 0 0z m0-328l-411-109 151-224 260 333 0 0z m-409-245l-63-43 25-37 63 42-25 38z m-126-85l-62-42 25-38 62 43-25 37z m-133-90l-63-43 25-37 63 43-25 37z m-126-85l-38-26 25-37 38 26-25 37z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lane" unicode="" d="M47 614l0-528 906 0 0 528z m47-483l0 435 810 0 0 0 0-435z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lasso-tool" unicode="" d="M303 798l0-218 103 0 0 218-103 0z m-248-246l0-103 218 0 0 103-218 0z m379 0l0-103 219 0 0 103-219 0z m349-30l0-40 123 0 0-117 40 0 0 157-163 0z m-480-104l0-218 103 0 0 218-103 0z m603-159l0-77 40 0 0 77-40 0z m0-190l0-116-119 0 0-40 159 0 0 156-40 0z m-570-1l0-157 159 0 0 40-119 0 0 117-40 0z m264-117l0-40 82 0 0 40-82 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lane-insert-above" unicode="" d="M46 754l0-89 49 0 0 41 16 0 0 48-65 0z m114 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m145 0l0-48 13 0 0-41 49 0 0 65 0 24-25 0-37 0z m-845-137l0-92 49 0 0 92-49 0z m858 0l0-92 49 0 0 92-49 0z m-857-139l0-528 906 0 0 528-906 0z m857-48l0-435-810 0 0 435 810 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lane-divide-three" unicode="" d="M47 706l0-216 0-49 0-182 0-49 0-216 906 0 0 216 0 24 0 25 0 182 0 25 0 24 0 216-906 0z m47-44l810 0 0-172-12 0 0-49 12 0 0-182-12 0 0-49 12 0 0-169-810 0 0 169 17 0 0 49-17 0 0 182 17 0 0 49-17 0 0 172z m66-172l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m-586-231l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="lane-divide-two" unicode="" d="M47 706l0-332 0-48 0-332 906 0 0 332 0 24 0 24 0 332-906 0z m47-44l810 0 0-288-12 0 0-48 12 0 0-285-810 0 0 285 17 0 0 48-17 0 0 288z m66-288l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="data-input" unicode="" d="M626 746c-143 0-286 0-429 0l0-792 606 0 0 610c-59 61-118 121-177 182z m-52-45l0-186 184 0 0-516-516 0 0 702c110 0 221 0 332 0z m45-12l125-129-125 0 0 129z m-227-21l0-24 0-69-106 0 0-80 106 0 0-92 141 132-141 133z m20-47l92-86-92-86 0 66-106 0 0 40 106 0 0 66z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="data-output" unicode="" d="M626 746c-143 0-286 0-429 0l0-792 606 0 0 610c-59 61-118 121-177 182z m-52-45l0-186 184 0 0-516-516 0 0 702c110 0 221 0 332 0z m45-12l125-129-125 0z m-227-21l0-93-106 0 0-80 106 0 0-92 141 132z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="hand-tool" unicode="" d="M498 750c-19 0-36-11-45-26-8-15-12-33-14-53-5-40-1-88-1-131 0-22 0-45 0-67-6 14-11 28-15 39l0 0 0 0c-16 40-30 81-50 111-10 15-21 27-36 34-16 8-34 7-52 0l0-1 0 0c-18-8-28-24-32-41-3-17 0-35 4-54 9-39 26-84 38-128 10-35 19-70 27-100-12 11-24 23-38 35-23 20-49 38-75 48-27 10-57 11-80-9l0 0 0 0c-18-17-27-37-24-57 2-20 13-38 27-56 29-36 74-75 118-128 49-58 102-152 140-201l5-7 332 0 3 12c7 21 14 62 26 114 11 51 27 112 47 165 28 71 56 138 68 191 6 26 9 49 4 70-5 20-22 37-45 41-20 4-39-5-52-19-14-13-24-31-33-52-8-15-14-33-21-50 0 29 0 36 0 75-1 43 2 92-1 131-2 19-5 37-12 51-7 14-22 26-40 25-17 1-32-7-41-19-10-13-16-28-20-44-9-34-13-74-19-107-3-16-6-32-9-47-2 16-4 33-6 51-4 40-6 88-15 128-4 19-9 37-19 51-9 15-25 26-43 25l1 0c0 0-1 0-2 0z m0-33c0 0 1 0 1 0l1 0 0 0c6 0 9-2 14-10 5-8 10-23 14-40 8-36 11-83 15-125 9-90 22-156 22-156l33 1c0 0 13 75 26 149 6 35 11 75 18 104 4 14 9 26 14 32 5 6 7 7 14 7l1 0 1 0c6 0 5 0 9-7 4-7 7-21 8-39 3-35 1-83 1-128 0-84 1-160 1-160l32-7c19 41 35 91 52 128 9 19 18 34 27 43 8 8 14 10 22 9l0 0 0 0c13-2 16-6 19-17 2-10 1-30-5-54-11-47-39-114-66-186-22-56-37-118-49-170-10-42-17-79-22-99l-289 0c-35 47-86 136-136 196-46 55-92 95-117 127-13 16-20 29-21 38-1 10 1 17 14 29 11 10 25 10 45 3 20-8 44-24 65-43 44-37 80-82 80-82l29 15c0 0-21 87-43 167-13 47-30 92-38 126-4 17-5 32-3 41 1 9 4 13 12 17 11 5 17 4 23 1 7-3 15-11 23-23 16-24 31-64 46-104l0 0c16-42 47-117 47-117l32 6c0 0 3 83 2 151-1 44-4 92 0 128 2 17 6 31 10 39 5 8 8 10 16 10z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="group" unicode="" d="M258 735c-56 0-113-42-128-100-10-40-4-83-6-124v-70h50c0 56-2 112 1 168 6 46 47 80 90 77h216v49c-74 0-149 1-223 0z m315-49h47v49h-47z m139 0c30 2 64-1 87-25 25-24 29-61 27-94v-152h50c-1 64 1 129-1 193-4 66-63 123-126 126-12 2-25 1-37 1 0-16 0-32 0-49z m-588-392h50v49h-50z m702-26h50v49h-50z m-702-163c0-53 34-105 80-127 42-20 89-11 133-13 11 3 31-6 35 4v45c-43 1-87-2-129 2-41 9-71 49-69 93v87h-50v-91z m702 2c1-47-37-91-82-92-47-2-94-1-141-1v-49c51 1 102-2 153 1 61 7 116 64 119 129 2 25 0 50 1 75h-50l0-63z m-362-142h46v49h-46z" horiz-adv-x="1000" /> |
| | | |
| | | <glyph glyph-name="transaction" unicode="" d="M210 716c-83 0-149-66-149-149l0-434c0-82 66-149 149-149l581 0c82 0 149 67 149 149l0 434c0 83-67 149-149 149l-581 0z m0-34l581 0c63 0 114-51 114-115l0-434c0-64-51-115-114-115l-581 0c-64 0-115 51-115 115l0 434c0 64 51 115 115 115z m29-49c-51 0-93-41-93-92l0-382c0-51 42-92 93-92l523 0c51 0 92 41 92 92l0 382c0 51-41 92-92 92l-523 0z m0-34l523 0c32 0 58-26 58-58l0-382c0-32-26-58-58-58l-523 0c-33 0-59 26-59 58l0 382c0 32 26 58 59 58z" horiz-adv-x="1000" /> |
| | | </font> |
| | | </defs> |
| | | </svg> |
New file |
| | |
| | | /** |
| | | * color definitions |
| | | */ |
| | | .djs-container { |
| | | --blue-base-65: #4d90ff; |
| | | --blue-base-65-opacity-30: rgba(77, 144, 255, 0.3); |
| | | --blue-darken-48: #005df7; |
| | | --blue-darken-55: #1a70ff; |
| | | --blue-lighten-82: #a2c5ff; |
| | | |
| | | --orange-base-60: #ffa533; |
| | | --orange-base-60-opacity-30: rgba(255, 165, 51, 0.3); |
| | | --orange-base-60-opacity-50: rgba(255, 165, 51, 0.5); |
| | | --orange-lighten-85: #ffddb3; |
| | | |
| | | --red-base-62: #ff3d3d; |
| | | --red-base-62-opacity-10: rgba(255, 61, 61, 0.1); |
| | | |
| | | --silver-darken-94: #efefef; |
| | | |
| | | --color-000000: #000000; |
| | | --color-000000-opacity-05: rgba(0, 0, 0, 0.05); |
| | | --color-000000-opacity-10: rgba(0, 0, 0, 0.1); |
| | | --color-333333: #333333; |
| | | --color-666666: #666666; |
| | | --color-aaaaaa: #aaaaaa; |
| | | --color-cccccc: #cccccc; |
| | | --color-cdcdcd: #cdcdcd; |
| | | --color-dddddd: #dddddd; |
| | | --color-f6f6f6: #f6f6f6; |
| | | --color-fafafa: #fafafa; |
| | | --color-fefefe: #fefefe; |
| | | --color-ffffff: #ffffff; |
| | | |
| | | --bendpoint-fill-color: var(--blue-base-65-opacity-30); |
| | | --bendpoint-stroke-color: var(--blue-base-65); |
| | | |
| | | --context-pad-entry-background-color: var(--color-fefefe); |
| | | --context-pad-entry-hover-background-color: var(--silver-darken-94); |
| | | |
| | | --element-dragger-color: var(--blue-base-65); |
| | | --element-hover-outline-fill-color: var(--blue-darken-48); |
| | | --element-selected-outline-stroke-color: var(--blue-base-65); |
| | | |
| | | --lasso-fill-color: var(--color-000000-opacity-05); |
| | | --lasso-stroke-color: var(--color-000000); |
| | | |
| | | --palette-entry-color: var(--color-333333); |
| | | --palette-entry-hover-color: var(--blue-darken-48); |
| | | --palette-entry-selected-color: var(--blue-base-65); |
| | | --palette-separator-color: var(--color-aaaaaa); |
| | | --palette-toggle-hover-background-color: var(--color-666666); |
| | | --palette-background-color: var(--color-fafafa); |
| | | --palette-border-color: var(--color-cccccc); |
| | | |
| | | --popup-body-background-color: var(--color-fefefe); |
| | | --popup-header-entry-selected-color: var(--blue-base-65); |
| | | --popup-header-entry-selected-background-color: var(--color-000000-opacity-10); |
| | | --popup-header-separator-color: var(--color-dddddd); |
| | | --popup-background-color: var(--color-fafafa); |
| | | --popup-border-color: var(--color-cccccc); |
| | | |
| | | --resizer-fill-color: var(--blue-base-65-opacity-30); |
| | | --resizer-stroke-color: var(--blue-base-65); |
| | | |
| | | --search-container-background-color: var(--color-fafafa); |
| | | --search-container-border-color: var(--blue-darken-55); |
| | | --search-container-box-shadow-color: var(--blue-lighten-82); |
| | | --search-container-box-shadow-inset-color: var(--color-cdcdcd); |
| | | --search-input-border-color: var(--color-cccccc); |
| | | --search-result-border-color: var(--color-aaaaaa); |
| | | --search-result-highlight-color: var(--color-000000); |
| | | --search-result-selected-color: var(--blue-base-65-opacity-30); |
| | | |
| | | --shape-attach-allowed-stroke-color: var(--blue-base-65); |
| | | --shape-connect-allowed-fill-color: var(--color-000000-opacity-05); |
| | | --shape-drop-allowed-fill-color: var(--color-000000-opacity-05); |
| | | --shape-drop-not-allowed-fill-color: var(--red-base-62-opacity-10); |
| | | --shape-resize-preview-stroke-color: var(--blue-base-65); |
| | | |
| | | --snap-line-stroke-color: var(--blue-base-65-opacity-30); |
| | | |
| | | --space-tool-crosshair-stroke-color: var(--color-000000); |
| | | |
| | | --tooltip-error-background-color: var(--red-base-62-opacity-10); |
| | | --tooltip-error-border-color: var(--red-base-62); |
| | | --tooltip-error-color: var(--red-base-62); |
| | | } |
| | | |
| | | /** |
| | | * outline styles |
| | | */ |
| | | |
| | | .djs-outline { |
| | | fill: none; |
| | | visibility: hidden; |
| | | } |
| | | |
| | | .djs-element.hover .djs-outline, |
| | | .djs-element.selected .djs-outline { |
| | | visibility: visible; |
| | | shape-rendering: geometricPrecision; |
| | | stroke-dasharray: 3,3; |
| | | } |
| | | |
| | | .djs-element.selected .djs-outline { |
| | | stroke: var(--element-selected-outline-stroke-color); |
| | | stroke-width: 1px; |
| | | } |
| | | |
| | | .djs-element.hover .djs-outline { |
| | | stroke: var(--element-hover-outline-fill-color); |
| | | stroke-width: 1px; |
| | | } |
| | | |
| | | .djs-shape.connect-ok .djs-visual > :nth-child(1) { |
| | | fill: var(--shape-connect-allowed-fill-color) !important; |
| | | } |
| | | |
| | | .djs-shape.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-shape.drop-not-ok .djs-visual > :nth-child(1) { |
| | | fill: var(--shape-drop-not-allowed-fill-color) !important; |
| | | } |
| | | |
| | | .djs-shape.new-parent .djs-visual > :nth-child(1) { |
| | | fill: var(--shape-drop-allowed-fill-color) !important; |
| | | } |
| | | |
| | | svg.drop-not-ok { |
| | | background: var(--shape-drop-not-allowed-fill-color) !important; |
| | | } |
| | | |
| | | svg.new-parent { |
| | | background: var(--shape-drop-allowed-fill-color) !important; |
| | | } |
| | | |
| | | .djs-connection.connect-ok .djs-visual > :nth-child(1), |
| | | .djs-connection.drop-ok .djs-visual > :nth-child(1) { |
| | | stroke: var(--shape-drop-allowed-fill-color) !important; |
| | | } |
| | | |
| | | .djs-connection.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-connection.drop-not-ok .djs-visual > :nth-child(1) { |
| | | stroke: var(--shape-drop-not-allowed-fill-color) !important; |
| | | } |
| | | |
| | | .drop-not-ok, |
| | | .connect-not-ok { |
| | | stroke: var(--shape-attach-allowed-stroke-color) !important; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .djs-element.attach-ok .djs-visual > :nth-child(1) { |
| | | stroke-width: 5px !important; |
| | | } |
| | | |
| | | .djs-frame.connect-not-ok .djs-visual > :nth-child(1), |
| | | .djs-frame.drop-not-ok .djs-visual > :nth-child(1) { |
| | | stroke-width: 3px !important; |
| | | stroke: var(--shape-drop-not-allowed-fill-color) !important; |
| | | fill: none !important; |
| | | } |
| | | |
| | | /** |
| | | * Selection box style |
| | | * |
| | | */ |
| | | .djs-lasso-overlay { |
| | | fill: var(--lasso-fill-color); |
| | | |
| | | stroke-dasharray: 5 1 3 1; |
| | | stroke: var(--lasso-stroke-color); |
| | | |
| | | shape-rendering: geometricPrecision; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | /** |
| | | * Resize styles |
| | | */ |
| | | .djs-resize-overlay { |
| | | fill: none; |
| | | |
| | | stroke-dasharray: 5 1 3 1; |
| | | stroke: var(--shape-resize-preview-stroke-color); |
| | | |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-resizer-hit { |
| | | fill: none; |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-resizer-visual { |
| | | fill: var(--resizer-fill-color);; |
| | | stroke-width: 1px; |
| | | stroke-opacity: 0.5; |
| | | stroke: var(--resizer-stroke-color); |
| | | shape-rendering: geometricprecision; |
| | | } |
| | | |
| | | .djs-resizer:hover .djs-resizer-visual { |
| | | stroke: var(--resizer-stroke-color); |
| | | stroke-opacity: 1; |
| | | } |
| | | |
| | | .djs-cursor-resize-ns, |
| | | .djs-resizer-n, |
| | | .djs-resizer-s { |
| | | cursor: ns-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-ew, |
| | | .djs-resizer-e, |
| | | .djs-resizer-w { |
| | | cursor: ew-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-nwse, |
| | | .djs-resizer-nw, |
| | | .djs-resizer-se { |
| | | cursor: nwse-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-nesw, |
| | | .djs-resizer-ne, |
| | | .djs-resizer-sw { |
| | | cursor: nesw-resize; |
| | | } |
| | | |
| | | .djs-shape.djs-resizing > .djs-outline { |
| | | visibility: hidden !important; |
| | | } |
| | | |
| | | .djs-shape.djs-resizing > .djs-resizer { |
| | | visibility: hidden; |
| | | } |
| | | |
| | | .djs-dragger > .djs-resizer { |
| | | visibility: hidden; |
| | | } |
| | | |
| | | /** |
| | | * drag styles |
| | | */ |
| | | .djs-dragger * { |
| | | fill: none !important; |
| | | stroke: var(--element-dragger-color) !important; |
| | | } |
| | | |
| | | .djs-dragger tspan, |
| | | .djs-dragger text { |
| | | fill: var(--element-dragger-color) !important; |
| | | stroke: none !important; |
| | | } |
| | | |
| | | marker.djs-dragger circle, |
| | | marker.djs-dragger path, |
| | | marker.djs-dragger polygon, |
| | | marker.djs-dragger polyline, |
| | | marker.djs-dragger rect { |
| | | fill: var(--element-dragger-color) !important; |
| | | stroke: none !important; |
| | | } |
| | | |
| | | marker.djs-dragger text, |
| | | marker.djs-dragger tspan { |
| | | fill: none !important; |
| | | stroke: var(--element-dragger-color) !important; |
| | | } |
| | | |
| | | .djs-dragging { |
| | | opacity: 0.3; |
| | | } |
| | | |
| | | .djs-dragging, |
| | | .djs-dragging > * { |
| | | pointer-events: none !important; |
| | | } |
| | | |
| | | .djs-dragging .djs-context-pad, |
| | | .djs-dragging .djs-outline { |
| | | display: none !important; |
| | | } |
| | | |
| | | /** |
| | | * no pointer events for visual |
| | | */ |
| | | .djs-visual, |
| | | .djs-outline { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-element.attach-ok .djs-hit { |
| | | stroke-width: 60px !important; |
| | | } |
| | | |
| | | /** |
| | | * all pointer events for hit shape |
| | | */ |
| | | .djs-element > .djs-hit-all { |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-element > .djs-hit-stroke, |
| | | .djs-element > .djs-hit-click-stroke { |
| | | pointer-events: stroke; |
| | | } |
| | | |
| | | /** |
| | | * all pointer events for hit shape |
| | | */ |
| | | .djs-drag-active .djs-element > .djs-hit-click-stroke { |
| | | pointer-events: all; |
| | | } |
| | | |
| | | /** |
| | | * shape / connection basic styles |
| | | */ |
| | | .djs-connection .djs-visual { |
| | | stroke-width: 2px; |
| | | fill: none; |
| | | } |
| | | |
| | | .djs-cursor-grab { |
| | | cursor: -webkit-grab; |
| | | cursor: -moz-grab; |
| | | cursor: grab; |
| | | } |
| | | |
| | | .djs-cursor-grabbing { |
| | | cursor: -webkit-grabbing; |
| | | cursor: -moz-grabbing; |
| | | cursor: grabbing; |
| | | } |
| | | |
| | | .djs-cursor-crosshair { |
| | | cursor: crosshair; |
| | | } |
| | | |
| | | .djs-cursor-move { |
| | | cursor: move; |
| | | } |
| | | |
| | | .djs-cursor-resize-ns { |
| | | cursor: ns-resize; |
| | | } |
| | | |
| | | .djs-cursor-resize-ew { |
| | | cursor: ew-resize; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * snapping |
| | | */ |
| | | .djs-snap-line { |
| | | stroke: var(--snap-line-stroke-color); |
| | | stroke-linecap: round; |
| | | stroke-width: 2px; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | /** |
| | | * snapping |
| | | */ |
| | | .djs-crosshair { |
| | | stroke: var(--space-tool-crosshair-stroke-color); |
| | | stroke-linecap: round; |
| | | stroke-width: 1px; |
| | | pointer-events: none; |
| | | shape-rendering: crispEdges; |
| | | stroke-dasharray: 5, 5; |
| | | } |
| | | |
| | | /** |
| | | * palette |
| | | */ |
| | | |
| | | .djs-palette { |
| | | position: absolute; |
| | | left: 20px; |
| | | top: 20px; |
| | | |
| | | box-sizing: border-box; |
| | | width: 48px; |
| | | } |
| | | |
| | | .djs-palette .separator { |
| | | margin: 0 5px; |
| | | padding-top: 5px; |
| | | |
| | | border: none; |
| | | border-bottom: solid 1px var(--palette-separator-color); |
| | | |
| | | clear: both; |
| | | } |
| | | |
| | | .djs-palette .entry:before { |
| | | vertical-align: text-bottom; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-toggle { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .djs-palette .entry, |
| | | .djs-palette .djs-palette-toggle { |
| | | color: var(--palette-entry-color); |
| | | font-size: 30px; |
| | | |
| | | text-align: center; |
| | | } |
| | | |
| | | .djs-palette .entry { |
| | | float: left; |
| | | } |
| | | |
| | | .djs-palette .entry img { |
| | | max-width: 100%; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-entries:after { |
| | | content: ''; |
| | | display: table; |
| | | clear: both; |
| | | } |
| | | |
| | | .djs-palette .djs-palette-toggle:hover { |
| | | background: var(--palette-toggle-hover-background-color); |
| | | } |
| | | |
| | | .djs-palette .entry:hover { |
| | | color: var(--palette-entry-hover-color); |
| | | } |
| | | |
| | | .djs-palette .highlighted-entry { |
| | | color: var(--palette-entry-selected-color) !important; |
| | | } |
| | | |
| | | .djs-palette .entry, |
| | | .djs-palette .djs-palette-toggle { |
| | | width: 46px; |
| | | height: 46px; |
| | | line-height: 46px; |
| | | cursor: default; |
| | | } |
| | | |
| | | /** |
| | | * Palette open / two-column layout is controlled via |
| | | * classes on the palette. Events to hook into palette |
| | | * changed life-cycle are available in addition. |
| | | */ |
| | | .djs-palette.two-column.open { |
| | | width: 94px; |
| | | } |
| | | |
| | | .djs-palette:not(.open) .djs-palette-entries { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-palette:not(.open) { |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .djs-palette.open .djs-palette-toggle { |
| | | display: none; |
| | | } |
| | | |
| | | /** |
| | | * context-pad |
| | | */ |
| | | .djs-overlay-context-pad { |
| | | width: 72px; |
| | | } |
| | | |
| | | .djs-context-pad { |
| | | position: absolute; |
| | | display: none; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-context-pad .entry { |
| | | width: 22px; |
| | | height: 22px; |
| | | text-align: center; |
| | | display: inline-block; |
| | | font-size: 22px; |
| | | margin: 0 2px 2px 0; |
| | | |
| | | border-radius: 3px; |
| | | |
| | | cursor: default; |
| | | |
| | | background-color: var(--context-pad-entry-background-color); |
| | | box-shadow: 0 0 2px 1px var(--context-pad-entry-background-color); |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-context-pad .entry:before { |
| | | vertical-align: top; |
| | | } |
| | | |
| | | .djs-context-pad .entry:hover { |
| | | background: var(--context-pad-entry-hover-background-color); |
| | | } |
| | | |
| | | .djs-context-pad.open { |
| | | display: block; |
| | | } |
| | | |
| | | /** |
| | | * popup styles |
| | | */ |
| | | .djs-popup .entry { |
| | | line-height: 20px; |
| | | white-space: nowrap; |
| | | cursor: default; |
| | | } |
| | | |
| | | /* larger font for prefixed icons */ |
| | | .djs-popup .entry:before { |
| | | vertical-align: middle; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .djs-popup .entry > span { |
| | | vertical-align: middle; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .djs-popup .entry:hover, |
| | | .djs-popup .entry.active:hover { |
| | | background: var(--popup-header-entry-selected-background-color); |
| | | } |
| | | |
| | | .djs-popup .entry.disabled { |
| | | background: inherit; |
| | | } |
| | | |
| | | .djs-popup .djs-popup-header .entry { |
| | | display: inline-block; |
| | | padding: 2px 3px 2px 3px; |
| | | |
| | | border: solid 1px transparent; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | .djs-popup .djs-popup-header .entry.active { |
| | | color: var(--popup-header-entry-selected-color); |
| | | border: solid 1px var(--popup-header-entry-selected-color); |
| | | background-color: var(--popup-header-entry-selected-background-color); |
| | | } |
| | | |
| | | .djs-popup-body .entry { |
| | | padding: 4px 10px 4px 5px; |
| | | } |
| | | |
| | | .djs-popup-body .entry > span { |
| | | margin-left: 5px; |
| | | } |
| | | |
| | | .djs-popup-body { |
| | | background-color: var(--popup-body-background-color); |
| | | } |
| | | |
| | | .djs-popup-header { |
| | | border-bottom: 1px solid var(--popup-header-separator-color); |
| | | } |
| | | |
| | | .djs-popup-header .entry { |
| | | margin: 1px; |
| | | margin-left: 3px; |
| | | } |
| | | |
| | | .djs-popup-header .entry:last-child { |
| | | margin-right: 3px; |
| | | } |
| | | |
| | | /** |
| | | * popup / palette styles |
| | | */ |
| | | .djs-palette { |
| | | background: var(--palette-background-color); |
| | | border: solid 1px var(--palette-border-color); |
| | | border-radius: 2px; |
| | | } |
| | | |
| | | .djs-popup { |
| | | background: var(--popup-background-color); |
| | | border: solid 1px var(--popup-border-color); |
| | | border-radius: 2px; |
| | | } |
| | | |
| | | /** |
| | | * touch |
| | | */ |
| | | |
| | | .djs-shape, |
| | | .djs-connection { |
| | | touch-action: none; |
| | | } |
| | | |
| | | .djs-segment-dragger, |
| | | .djs-bendpoint { |
| | | display: none; |
| | | } |
| | | |
| | | /** |
| | | * bendpoints |
| | | */ |
| | | .djs-segment-dragger .djs-visual { |
| | | display: none; |
| | | |
| | | fill: var(--bendpoint-fill-color); |
| | | stroke: var(--bendpoint-stroke-color); |
| | | stroke-width: 1px; |
| | | stroke-opacity: 1; |
| | | } |
| | | |
| | | .djs-segment-dragger:hover .djs-visual { |
| | | display: block; |
| | | } |
| | | |
| | | .djs-bendpoint .djs-visual { |
| | | fill: var(--bendpoint-fill-color); |
| | | stroke: var(--bendpoint-stroke-color); |
| | | stroke-width: 1px; |
| | | stroke-opacity: 0.5; |
| | | } |
| | | |
| | | .djs-segment-dragger:hover, |
| | | .djs-bendpoints.hover .djs-segment-dragger, |
| | | .djs-bendpoints.selected .djs-segment-dragger, |
| | | .djs-bendpoint:hover, |
| | | .djs-bendpoints.hover .djs-bendpoint, |
| | | .djs-bendpoints.selected .djs-bendpoint { |
| | | display: block; |
| | | } |
| | | |
| | | .djs-drag-active .djs-bendpoints * { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-bendpoints:not(.hover) .floating { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-segment-dragger:hover .djs-visual, |
| | | .djs-segment-dragger.djs-dragging .djs-visual, |
| | | .djs-bendpoint:hover .djs-visual, |
| | | .djs-bendpoint.floating .djs-visual { |
| | | fill: var(--bendpoint-fill-color); |
| | | stroke: var(--bendpoint-stroke-color); |
| | | stroke-opacity: 1; |
| | | } |
| | | |
| | | .djs-bendpoint.floating .djs-hit { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-segment-dragger .djs-hit, |
| | | .djs-bendpoint .djs-hit { |
| | | fill: none; |
| | | pointer-events: all; |
| | | } |
| | | |
| | | .djs-segment-dragger.horizontal .djs-hit { |
| | | cursor: ns-resize; |
| | | } |
| | | |
| | | .djs-segment-dragger.vertical .djs-hit { |
| | | cursor: ew-resize; |
| | | } |
| | | |
| | | .djs-segment-dragger.djs-dragging .djs-hit { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .djs-updating, |
| | | .djs-updating > * { |
| | | pointer-events: none !important; |
| | | } |
| | | |
| | | .djs-updating .djs-context-pad, |
| | | .djs-updating .djs-outline, |
| | | .djs-updating .djs-bendpoint, |
| | | .connect-ok .djs-bendpoint, |
| | | .connect-not-ok .djs-bendpoint, |
| | | .drop-ok .djs-bendpoint, |
| | | .drop-not-ok .djs-bendpoint { |
| | | display: none !important; |
| | | } |
| | | |
| | | .djs-segment-dragger.djs-dragging, |
| | | .djs-bendpoint.djs-dragging { |
| | | display: block; |
| | | opacity: 1.0; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * tooltips |
| | | */ |
| | | .djs-tooltip-error { |
| | | width: 160px; |
| | | padding: 6px; |
| | | |
| | | background: var(--tooltip-error-background-color); |
| | | border: solid 1px var(--tooltip-error-border-color); |
| | | border-radius: 2px; |
| | | color: var(--tooltip-error-color); |
| | | font-size: 12px; |
| | | line-height: 16px; |
| | | |
| | | opacity: 0.75; |
| | | } |
| | | |
| | | .djs-tooltip-error:hover { |
| | | opacity: 1; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * search pad |
| | | */ |
| | | .djs-search-container { |
| | | position: absolute; |
| | | top: 20px; |
| | | left: 0; |
| | | right: 0; |
| | | margin-left: auto; |
| | | margin-right: auto; |
| | | |
| | | width: 25%; |
| | | min-width: 300px; |
| | | max-width: 400px; |
| | | z-index: 10; |
| | | |
| | | font-size: 1.05em; |
| | | opacity: 0.9; |
| | | background: var(--search-container-background-color); |
| | | border: solid 1px var(--search-container-border-color); |
| | | border-radius: 2px; |
| | | box-shadow: 0 0 0 2px var(--search-container-box-shadow-color), 0 0 0 1px var(--search-container-box-shadow-inset-color) inset; |
| | | } |
| | | |
| | | .djs-search-container:not(.open) { |
| | | display: none; |
| | | } |
| | | |
| | | .djs-search-input input { |
| | | font-size: 1.05em; |
| | | width: 100%; |
| | | padding: 6px 10px; |
| | | border: 1px solid var(--search-input-border-color); |
| | | } |
| | | |
| | | .djs-search-input input:focus { |
| | | outline: none; |
| | | border-color: var(--search-input-border-color); |
| | | } |
| | | |
| | | .djs-search-results { |
| | | position: relative; |
| | | overflow-y: auto; |
| | | max-height: 200px; |
| | | } |
| | | |
| | | .djs-search-results:hover { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .djs-search-result { |
| | | width: 100%; |
| | | padding: 6px 10px; |
| | | background: white; |
| | | border-bottom: solid 1px var(--search-result-border-color); |
| | | border-radius: 1px; |
| | | } |
| | | |
| | | .djs-search-highlight { |
| | | color: var(--search-result-highlight-color); |
| | | } |
| | | |
| | | .djs-search-result-primary { |
| | | margin: 0 0 10px; |
| | | } |
| | | |
| | | .djs-search-result-secondary { |
| | | font-family: monospace; |
| | | margin: 0; |
| | | } |
| | | |
| | | .djs-search-result:hover { |
| | | background: var(--search-result-selected-color); |
| | | } |
| | | |
| | | .djs-search-result-selected { |
| | | background: var(--search-result-selected-color); |
| | | } |
| | | |
| | | .djs-search-result-selected:hover { |
| | | background: var(--search-result-selected-color); |
| | | } |
| | | |
| | | .djs-search-overlay { |
| | | background: var(--search-result-selected-color); |
| | | } |
| | | |
| | | /** |
| | | * hidden styles |
| | | */ |
| | | .djs-element-hidden, |
| | | .djs-element-hidden .djs-hit, |
| | | .djs-element-hidden .djs-outline, |
| | | .djs-label-hidden .djs-label { |
| | | display: none !important; |
| | | } |
New file |
| | |
| | | node_modules/ |
| | | tmp/ |
| | | dist/ |
New file |
| | |
| | | package-lock=false |
New file |
| | |
| | | var path = require('path'); |
| | | |
| | | module.exports = function(grunt) { |
| | | |
| | | require('load-grunt-tasks')(grunt); |
| | | |
| | | /** |
| | | * Resolve external project resource as file path |
| | | */ |
| | | function resolvePath(project, file) { |
| | | return path.join(path.dirname(require.resolve(project)), file); |
| | | } |
| | | |
| | | |
| | | grunt.initConfig({ |
| | | browserify: { |
| | | options: { |
| | | browserifyOptions: { |
| | | debug: true |
| | | }, |
| | | transform: [ |
| | | [ 'stringify', { |
| | | extensions: [ '.bpmn' ] |
| | | } ] |
| | | ], |
| | | plugin: [ |
| | | 'esmify' |
| | | ] |
| | | }, |
| | | watch: { |
| | | options: { |
| | | watch: true |
| | | }, |
| | | files: { |
| | | 'dist/index.js': [ 'app/**/*.js' ] |
| | | } |
| | | }, |
| | | app: { |
| | | files: { |
| | | 'dist/index.js': [ 'app/**/*.js' ] |
| | | } |
| | | } |
| | | }, |
| | | |
| | | copy: { |
| | | diagram_js: { |
| | | files: [ |
| | | { |
| | | src: resolvePath('diagram-js', 'assets/diagram-js.css'), |
| | | dest: 'dist/css/diagram-js.css' |
| | | } |
| | | ] |
| | | }, |
| | | bpmn_js: { |
| | | files: [ |
| | | { |
| | | expand: true, |
| | | cwd: resolvePath('bpmn-js', 'dist/assets'), |
| | | src: ['**/*.*', '!**/*.js'], |
| | | dest: 'dist/vendor' |
| | | } |
| | | ] |
| | | }, |
| | | app: { |
| | | files: [ |
| | | { |
| | | expand: true, |
| | | cwd: 'app/', |
| | | src: ['**/*.*', '!**/*.js'], |
| | | dest: 'dist' |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | |
| | | less: { |
| | | options: { |
| | | dumpLineNumbers: 'comments', |
| | | paths: [ |
| | | 'node_modules' |
| | | ] |
| | | }, |
| | | |
| | | styles: { |
| | | files: { |
| | | 'dist/css/app.css': 'styles/app.less' |
| | | } |
| | | } |
| | | }, |
| | | |
| | | watch: { |
| | | options: { |
| | | livereload: true |
| | | }, |
| | | |
| | | samples: { |
| | | files: [ 'app/**/*.*' ], |
| | | tasks: [ 'copy:app' ] |
| | | }, |
| | | |
| | | less: { |
| | | files: [ |
| | | 'styles/**/*.less', |
| | | 'node_modules/bpmn-js-properties-panel/styles/**/*.less' |
| | | ], |
| | | tasks: [ |
| | | 'less' |
| | | ] |
| | | }, |
| | | }, |
| | | |
| | | connect: { |
| | | livereload: { |
| | | options: { |
| | | port: 9013, |
| | | livereload: true, |
| | | hostname: 'localhost', |
| | | open: true, |
| | | base: [ |
| | | 'dist' |
| | | ] |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | |
| | | // tasks |
| | | |
| | | grunt.registerTask('build', [ 'copy', 'less', 'browserify:app' ]); |
| | | |
| | | grunt.registerTask('auto-build', [ |
| | | 'copy', |
| | | 'less', |
| | | 'browserify:watch', |
| | | 'connect:livereload', |
| | | 'watch' |
| | | ]); |
| | | |
| | | grunt.registerTask('default', [ 'build' ]); |
| | | }; |
New file |
| | |
| | | # bpmn-js Modeler + Properties Panel Example |
| | | |
| | | This example uses [bpmn-js](https://github.com/bpmn-io/bpmn-js) and [bpmn-js-properties-panel](https://github.com/bpmn-io/bpmn-js-properties-panel). It implements a BPMN 2.0 modeler that allows you to edit execution related properties via a properties panel. |
| | | |
| | | |
| | | ## About |
| | | |
| | | This example is a node-style web application that builds a user interface around the bpmn-js BPMN 2.0 modeler. |
| | | |
| | |  |
| | | |
| | | |
| | | ## Usage |
| | | |
| | | Add the [properties panel](https://github.com/bpmn-io/bpmn-js-properties-panel) to your project: |
| | | |
| | | ``` |
| | | npm install --save bpmn-js-properties-panel |
| | | ``` |
| | | |
| | | Additionally, if you'd like to use [Camunda BPM](https://camunda.org) execution related properties, include the [camunda-bpmn-moddle](https://github.com/camunda/camunda-bpmn-moddle) dependency which tells the modeler about `camunda:XXX` extension properties: |
| | | |
| | | ``` |
| | | npm install --save camunda-bpmn-moddle |
| | | ``` |
| | | |
| | | Now extend the [bpmn-js](https://github.com/bpmn-io/bpmn-js) modeler with two properties panel related modules, the panel itself and a provider module that controls which properties are visible for each element. Additionally you must pass an element via `propertiesPanel.parent` into which the properties panel will be rendered (cf. [`app/index.js`](https://github.com/bpmn-io/bpmn-js-examples/blob/master/properties-panel/app/index.js#L16) for details). |
| | | |
| | | ```javascript |
| | | var propertiesPanelModule = require('bpmn-js-properties-panel'), |
| | | // providing camunda executable properties, too |
| | | propertiesProviderModule = require('bpmn-js-properties-panel/lib/provider/camunda'), |
| | | camundaModdleDescriptor = require('camunda-bpmn-moddle/resources/camunda'); |
| | | |
| | | var bpmnModeler = new BpmnModeler({ |
| | | container: '#js-canvas', |
| | | propertiesPanel: { |
| | | parent: '#js-properties-panel' |
| | | }, |
| | | additionalModules: [ |
| | | propertiesPanelModule, |
| | | propertiesProviderModule |
| | | ], |
| | | // needed if you'd like to maintain camunda:XXX properties in the properties panel |
| | | moddleExtensions: { |
| | | camunda: camundaModdleDescriptor |
| | | } |
| | | }); |
| | | ``` |
| | | |
| | | |
| | | ## Building the Example |
| | | |
| | | You need a [NodeJS](http://nodejs.org) development stack with [npm](https://npmjs.org) and installed to build the project. |
| | | |
| | | To install all project dependencies execute |
| | | |
| | | ``` |
| | | npm install |
| | | ``` |
| | | |
| | | Build the example using [browserify](http://browserify.org) via |
| | | |
| | | ``` |
| | | npm run all |
| | | ``` |
| | | |
| | | You may also spawn a development setup by executing |
| | | |
| | | ``` |
| | | npm run dev |
| | | ``` |
| | | |
| | | Both tasks generate the distribution ready client-side modeler application into the `dist` folder. |
| | | |
| | | Serve the application locally or via a web server (nginx, apache, embedded). |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html > |
| | | |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <title>在线绘制流程</title> |
| | | <link rel="icon" href="favicon.ico"> |
| | | <link rel="stylesheet" href="css/diagram-js.css" /> |
| | | <link rel="stylesheet" href="vendor/bpmn-font/css/bpmn-embedded.css" /> |
| | | <link rel="stylesheet" href="css/app.css" /> |
| | | |
| | | <style> |
| | | .item{ |
| | | display: none; |
| | | cursor: pointer; |
| | | } |
| | | .bjs-powered-by { |
| | | display: none; |
| | | } |
| | | .buttons > li { |
| | | /* display: inline-block; */ |
| | | margin-right: 10px; |
| | | height: 26px; |
| | | line-height: 26px; |
| | | float: left; |
| | | } |
| | | .buttons > li > a.btn { |
| | | background: #00BCD4; |
| | | border: none; |
| | | outline: none; |
| | | padding: 0px 10px; |
| | | color: #fff; |
| | | display: inline-block; |
| | | opacity: 1; |
| | | height: 26px; |
| | | font-size: 14px; |
| | | line-height: 26px; |
| | | } |
| | | .label { |
| | | background: #00BCD4; |
| | | border: none; |
| | | outline: none; |
| | | padding: 0px 10px; |
| | | color: #fff; |
| | | display: inline-block; |
| | | cursor: pointer; |
| | | opacity: 1; |
| | | height: 26px; |
| | | font-size: 14px; |
| | | line-height: 26px; |
| | | } |
| | | .sy-mask{width:100%; |
| | | height:100%; |
| | | position:fixed; |
| | | background:rgba(0,0,0,0.8); |
| | | left:0;top:0;z-index:1000; |
| | | display: none; |
| | | } |
| | | .sy-alert{ |
| | | position:fixed;display:none;background:#fff;border-radius:5px;overflow:hidden;width:300px;max-width:90%;max-height:80%;left:0;right:0;margin:0 auto;z-index:9999}.sy-alert.animated{-webkit-animation-duration:.3s;animation-duration:.3s}.sy-alert .sy-title{height:45px;color:#333;line-height:45px;font-size:15px;border-bottom:1px solid #eee;padding:0 12px}.sy-alert .sy-content{padding:20px;text-align:center;font-size:14px;line-height:24px;color:#666;overflow-y:auto}.sy-alert .sy-btn{height:50%;border-top:1px solid #eee;overflow:hidden}.sy-alert .sy-btn button{float:left;border:0;color:#333;cursor:pointer;background:#fff;width:50%;line-height:45px;font-size:15px;text-align:center}.sy-alert .sy-btn button:nth-child(1){color:#888;border-right:1px solid #eee}.sy-alert.sy-alert-alert .sy-btn button{float:none;width:100%}.sy-alert.sy-alert-tips{text-align:center;width:150px;background:rgba(0,0,0,0.7)}.sy-alert.sy-alert-tips .sy-content{padding:8px;color:#fff;font-size:14px}.sy-alert.sy-alert-model .sy-content{text-align:left}.sy-alert.sy-alert-model .sy-content .form .input-item{margin-bottom:12px;position:relative}.sy-alert.sy-alert-model .sy-content .form .input-item input{display:block;position:relative;width:100%;border:1px solid #eee;padding:10px}.sy-alert.sy-alert-model .sy-content .form .input-item .getcode{border:0;top:0;right:0;position:absolute;background:0;line-height:37px;color:#f60;width:100px;text-align:center} |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <div class="content with-diagram" id="js-drop-zone"> |
| | | <div class="message error"> |
| | | <div class="note"> |
| | | <p>无法显示bpms2.0</p> |
| | | <div class="details"> |
| | | <span>错误详细信息</span> |
| | | <pre></pre> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="canvas" id="js-canvas"></div> |
| | | <div class="properties-panel-parent" id="js-properties-panel"></div> |
| | | </div> |
| | | <ul class="buttons"> |
| | | <li class="item upload"> |
| | | <form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件"> |
| | | <input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none"> |
| | | <label class="label" for="uploadFile" >导入</label> |
| | | </form> |
| | | </li> |
| | | <li class="item download"> |
| | | <a class="btn" href id="downloadBpmn">导出</a> |
| | | </li> |
| | | <li class="item submit"> |
| | | <a class="btn" id="js-download-diagram"> |
| | | 部署 |
| | | </a> |
| | | </li> |
| | | </ul> |
| | | <div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" > |
| | | <div class="sy-title">部署流程</div> |
| | | <div class="sy-content"> |
| | | 确认是否部署该流程 |
| | | <!-- <div class="form">--> |
| | | <!-- <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>--> |
| | | <!-- </div>--> |
| | | </div> |
| | | <div class="sy-btn"> |
| | | <button id="sure">确定</button> |
| | | <button class="cancel" >取消</button> |
| | | </div> |
| | | </div> |
| | | <div class="sy-mask cancel"></div> |
| | | <script src="index.js"></script> |
| | | </body> |
| | | </html> |
New file |
| | |
| | | |
| | | import $ from 'jquery'; |
| | | import BpmnModeler from 'bpmn-js/lib/Modeler'; |
| | | //import propertiesPanelModule from '../resources/properties-panel'; |
| | | import propertiesPanelModule from 'bpmn-js-properties-panel'; |
| | | import propertiesProviderModule from '../resources/properties-panel/provider/activiti'; |
| | | import activitiModdleDescriptor from '../resources/activiti.json'; |
| | | import customTranslate from '../resources/customTranslate/customTranslate'; |
| | | import customControlsModule from '../resources/customControls'; |
| | | import tools from '../resources/tools' |
| | | import diagramXML from '../resources/newDiagram.bpmn'; |
| | | const proHost = window.location.protocol + "//" + window.location.host; |
| | | const href = window.location.href.split("bpmnjs")[0]; |
| | | const key = href.split(window.location.host)[1]; |
| | | const publicurl = proHost + key; |
| | | |
| | | // 添加翻译组件 |
| | | var customTranslateModule = { |
| | | translate: ['value', customTranslate] |
| | | }; |
| | | var container = $('#js-drop-zone'); |
| | | var canvas = $('#js-canvas'); |
| | | var bpmnModeler = new BpmnModeler({ |
| | | container: canvas, |
| | | propertiesPanel: { |
| | | parent: '#js-properties-panel' |
| | | }, |
| | | additionalModules: [ |
| | | propertiesPanelModule, |
| | | propertiesProviderModule, |
| | | customControlsModule, |
| | | customTranslateModule |
| | | ], |
| | | moddleExtensions: { |
| | | activiti:activitiModdleDescriptor |
| | | } |
| | | }); |
| | | container.removeClass('with-diagram'); |
| | | // 判断浏览器支持程度 |
| | | if (!window.FileList || !window.FileReader) { |
| | | window.alert('请使用谷歌、火狐、IE10+浏览器'); |
| | | } else { |
| | | tools.registerFileDrop(container, tools.createDiagram(diagramXML, bpmnModeler, container)); |
| | | } |
| | | |
| | | |
| | | $(function () { |
| | | // 创建bpmn |
| | | var param = tools.getUrlParam(window.location.href) |
| | | $('.item').show() |
| | | if (param.type === 'addBpmn') { |
| | | tools.createDiagram(diagramXML, bpmnModeler, container); |
| | | } else if (param.type === 'lookBpmn') { //编辑bpmn |
| | | $('.item').hide() |
| | | $('.download').show() |
| | | const Id = param.deploymentFileUUID || '6d4af2dc-bab0-11ea-b584-3cf011eaafca' |
| | | const Name=param.deploymentName || 'String.bpmn' |
| | | const instanceId=param.instanceId |
| | | var param={ |
| | | "deploymentId":Id, |
| | | "resourceName":decodeURI(Name) |
| | | } |
| | | if(instanceId){ |
| | | var param1={ |
| | | instanceId |
| | | } |
| | | $.ajax({ |
| | | url: localStorage.getItem("VUE_APP_BASE_API")+'/activitiHistory/gethighLine', |
| | | // url: 'http://localhost:8080/activitiHistory/gethighLine', |
| | | type: 'GET', |
| | | data: param1, |
| | | dataType:'json', |
| | | success: function (result) { |
| | | console.log(result) |
| | | var ColorJson=tools.getByColor(result.data) |
| | | $.ajax({ |
| | | url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/getDefinitionXML', |
| | | // url: 'http://localhost:8080/processDefinition/getDefinitionXML', |
| | | type: 'GET', |
| | | data: param, |
| | | dataType:'text', |
| | | success: function (result) { |
| | | var newXmlData = result |
| | | tools.createDiagram(newXmlData, bpmnModeler, container); |
| | | setTimeout(function () { |
| | | for (var i in ColorJson) { |
| | | tools.setColor(ColorJson[i],bpmnModeler) |
| | | } |
| | | }, 200) |
| | | }, |
| | | error: function (err) { |
| | | console.log(err) |
| | | } |
| | | }); |
| | | }, |
| | | error: function (err) { |
| | | console.log(err) |
| | | } |
| | | }); |
| | | }else{ |
| | | //加载后台方法获取xml |
| | | $.ajax({ |
| | | url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/getDefinitionXML', |
| | | // url: 'http://localhost:8080/processDefinition/getDefinitionXML', |
| | | type: 'GET', |
| | | data: param, |
| | | dataType:'text', |
| | | success: function (result) { |
| | | var newXmlData = result |
| | | tools.createDiagram(newXmlData, bpmnModeler, container); |
| | | }, |
| | | error: function (err) { |
| | | console.log(err) |
| | | } |
| | | }); |
| | | } |
| | | } else if(param.type === "historyBpmn") { // bpmn历史 |
| | | $('.item').hide() |
| | | $('.download').show() |
| | | } |
| | | // 点击新增 |
| | | $('#js-download-diagram').on("click", function () { |
| | | tools.syopen('alert') |
| | | }) |
| | | |
| | | // 点击取消 |
| | | $('.cancel').on("click",function () { |
| | | tools.syhide('alert') |
| | | }) |
| | | // 点击确定 |
| | | $('#sure').on('click',function(){ |
| | | // const text=$("#deploymentName").val() |
| | | tools.saveBpmn(bpmnModeler) |
| | | }) |
| | | |
| | | |
| | | |
| | | // 点击下载 |
| | | $("#downloadBpmn").on("click", function () { |
| | | tools.downLoad(bpmnModeler) |
| | | }) |
| | | // 点击上传 |
| | | $("#uploadFile").on("change", function () { |
| | | tools.upload(bpmnModeler,container) |
| | | }) |
| | | }); |
New file |
| | |
| | | { |
| | | "name": "bpmn-js-example-properties-panel", |
| | | "version": "0.0.0", |
| | | "description": "A bpmn-js modeler + properties panel example", |
| | | "main": "app/index.js", |
| | | "scripts": { |
| | | "all": "grunt", |
| | | "dev": "grunt auto-build" |
| | | }, |
| | | "repository": { |
| | | "type": "git", |
| | | "url": "https://github.com/bpmn-io/bpmn-js-examples" |
| | | }, |
| | | "keywords": [ |
| | | "bpmnjs-example" |
| | | ], |
| | | "author": { |
| | | "name": "Nico Rehwaldt", |
| | | "url": "https://github.com/nikku" |
| | | }, |
| | | "contributors": [ |
| | | { |
| | | "name": "bpmn.io contributors", |
| | | "url": "https://github.com/bpmn-io" |
| | | } |
| | | ], |
| | | "license": "MIT", |
| | | "devDependencies": { |
| | | "esmify": "^2.1.1", |
| | | "grunt": "^1.0.4", |
| | | "grunt-browserify": "^5.3.0", |
| | | "grunt-contrib-connect": "^2.0.0", |
| | | "grunt-contrib-copy": "^1.0.0", |
| | | "grunt-contrib-less": "^2.0.0", |
| | | "grunt-contrib-watch": "^1.1.0", |
| | | "load-grunt-tasks": "^5.0.0", |
| | | "stringify": "^5.2.0" |
| | | }, |
| | | "dependencies": { |
| | | "bpmn-js": "^7.0.0", |
| | | "bpmn-js-properties-panel": "^0.32.0", |
| | | "camunda-bpmn-moddle": "^4.0.1", |
| | | "diagram-js": "^5.0.0", |
| | | "jquery": "^3.4.1", |
| | | "min-dash": "^3.5.0", |
| | | "x2js": "^3.4.0" |
| | | } |
| | | } |
New file |
| | |
| | | { |
| | | "name": "Activiti", |
| | | "uri": "http://activiti.org/bpmn", |
| | | "prefix": "activiti", |
| | | "xml": { |
| | | "tagAlias": "lowerCase" |
| | | }, |
| | | "associations": [], |
| | | "types": [ |
| | | { |
| | | "name": "Definitions", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Definitions" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "diagramRelationId", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "InOutBinding", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "isAbstract": true, |
| | | "properties": [ |
| | | { |
| | | "name": "source", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "sourceExpression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "target", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "businessKey", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "local", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": false |
| | | }, |
| | | { |
| | | "name": "variables", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "In", |
| | | "superClass": [ |
| | | "InOutBinding" |
| | | ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:CallActivity" |
| | | ] |
| | | } |
| | | }, |
| | | { |
| | | "name": "Out", |
| | | "superClass": [ |
| | | "InOutBinding" |
| | | ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:CallActivity" |
| | | ] |
| | | } |
| | | }, |
| | | { |
| | | "name": "AsyncCapable", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Activity", |
| | | "bpmn:Gateway", |
| | | "bpmn:Event" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "async", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": false |
| | | }, |
| | | { |
| | | "name": "asyncBefore", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": false |
| | | }, |
| | | { |
| | | "name": "asyncAfter", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": false |
| | | }, |
| | | { |
| | | "name": "exclusive", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "JobPriorized", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Process", |
| | | "activiti:AsyncCapable" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "jobPriority", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "SignalEventDefinition", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:SignalEventDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "async", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": false |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ErrorEventDefinition", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:ErrorEventDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "errorCodeVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "errorMessageVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Error", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Error" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "activiti:errorMessage", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "PotentialStarter", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "resourceAssignmentExpression", |
| | | "type": "bpmn:ResourceAssignmentExpression" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FormSupported", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:StartEvent", |
| | | "bpmn:UserTask" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "formHandlerClass", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "formKey", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "TemplateSupported", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Process", |
| | | "bpmn:FlowElement" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "modelerTemplate", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Initiator", |
| | | "isAbstract": true, |
| | | "extends": [ "bpmn:StartEvent" ], |
| | | "properties": [ |
| | | { |
| | | "name": "initiator", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ScriptTask", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:ScriptTask" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "resultVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "resource", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Process", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:Process" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "candidateStarterConfiguration", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "candidateStarterUsers", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "versionTag", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "historyTimeToLive", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "isStartableInTasklist", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": true |
| | | }, |
| | | { |
| | | "name": "process-is-executable", |
| | | "isAttr": true, |
| | | "type": "Boolean", |
| | | "default": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "EscalationEventDefinition", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:EscalationEventDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "escalationCodeVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FormalExpression", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:FormalExpression" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "resource", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Assignable", |
| | | "extends": [ "bpmn:UserTask" ], |
| | | "properties": [ |
| | | { |
| | | "name": "assignee", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "candidateUsers", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "candidateGroups", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "dueDate", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "followUpDate", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "priority", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "CallActivity", |
| | | "extends": [ "bpmn:CallActivity" ], |
| | | "properties": [ |
| | | { |
| | | "name": "calledElementBinding", |
| | | "isAttr": true, |
| | | "type": "String", |
| | | "default": "latest" |
| | | }, |
| | | { |
| | | "name": "calledElementVersion", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "calledElementVersionTag", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "calledElementTenantId", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "caseRef", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "caseBinding", |
| | | "isAttr": true, |
| | | "type": "String", |
| | | "default": "latest" |
| | | }, |
| | | { |
| | | "name": "caseVersion", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "caseTenantId", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "variableMappingClass", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "variableMappingDelegateExpression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ServiceTaskLike", |
| | | "extends": [ |
| | | "bpmn:ServiceTask", |
| | | "bpmn:BusinessRuleTask", |
| | | "bpmn:SendTask", |
| | | "bpmn:MessageEventDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "expression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "class", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "delegateExpression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "resultVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "DmnCapable", |
| | | "extends": [ |
| | | "bpmn:BusinessRuleTask" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "decisionRef", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "decisionRefBinding", |
| | | "isAttr": true, |
| | | "type": "String", |
| | | "default": "latest" |
| | | }, |
| | | { |
| | | "name": "decisionRefVersion", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "mapDecisionResult", |
| | | "isAttr": true, |
| | | "type": "String", |
| | | "default": "resultList" |
| | | }, |
| | | { |
| | | "name": "decisionRefTenantId", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ExternalCapable", |
| | | "extends": [ |
| | | "activiti:ServiceTaskLike" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "type", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "topic", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "TaskPriorized", |
| | | "extends": [ |
| | | "bpmn:Process", |
| | | "activiti:ExternalCapable" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "taskPriority", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Properties", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "meta": { |
| | | "allowedIn": [ "*" ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "values", |
| | | "type": "Property", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Property", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "id", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "name", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "value", |
| | | "type": "String", |
| | | "isAttr": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Connector", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "activiti:ServiceTaskLike" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "inputOutput", |
| | | "type": "InputOutput" |
| | | }, |
| | | { |
| | | "name": "connectorId", |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "InputOutput", |
| | | "superClass": [ |
| | | "Element" |
| | | ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:FlowNode", |
| | | "activiti:Connector" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "inputOutput", |
| | | "type": "InputOutput" |
| | | }, |
| | | { |
| | | "name": "connectorId", |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "inputParameters", |
| | | "isMany": true, |
| | | "type": "InputParameter" |
| | | }, |
| | | { |
| | | "name": "outputParameters", |
| | | "isMany": true, |
| | | "type": "OutputParameter" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "InputOutputParameter", |
| | | "properties": [ |
| | | { |
| | | "name": "name", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "value", |
| | | "isBody": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "definition", |
| | | "type": "InputOutputParameterDefinition" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "InputOutputParameterDefinition", |
| | | "isAbstract": true |
| | | }, |
| | | { |
| | | "name": "List", |
| | | "superClass": [ "InputOutputParameterDefinition" ], |
| | | "properties": [ |
| | | { |
| | | "name": "items", |
| | | "isMany": true, |
| | | "type": "InputOutputParameterDefinition" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Map", |
| | | "superClass": [ "InputOutputParameterDefinition" ], |
| | | "properties": [ |
| | | { |
| | | "name": "entries", |
| | | "isMany": true, |
| | | "type": "Entry" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Entry", |
| | | "properties": [ |
| | | { |
| | | "name": "key", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "value", |
| | | "isBody": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "definition", |
| | | "type": "InputOutputParameterDefinition" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Value", |
| | | "superClass": [ |
| | | "InputOutputParameterDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "id", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "name", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "value", |
| | | "isBody": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Script", |
| | | "superClass": [ "InputOutputParameterDefinition" ], |
| | | "properties": [ |
| | | { |
| | | "name": "scriptFormat", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "resource", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "value", |
| | | "isBody": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Field", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "activiti:ServiceTaskLike", |
| | | "activiti:ExecutionListener", |
| | | "activiti:TaskListener" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "name", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "expression", |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "stringValue", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "string", |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "InputParameter", |
| | | "superClass": [ "InputOutputParameter" ] |
| | | }, |
| | | { |
| | | "name": "OutputParameter", |
| | | "superClass": [ "InputOutputParameter" ] |
| | | }, |
| | | { |
| | | "name": "Collectable", |
| | | "isAbstract": true, |
| | | "extends": [ "bpmn:MultiInstanceLoopCharacteristics" ], |
| | | "superClass": [ "activiti:AsyncCapable" ], |
| | | "properties": [ |
| | | { |
| | | "name": "collection", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "elementVariable", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FailedJobRetryTimeCycle", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "activiti:AsyncCapable", |
| | | "bpmn:MultiInstanceLoopCharacteristics" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "body", |
| | | "isBody": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ExecutionListener", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:Task", |
| | | "bpmn:ServiceTask", |
| | | "bpmn:UserTask", |
| | | "bpmn:BusinessRuleTask", |
| | | "bpmn:ScriptTask", |
| | | "bpmn:ReceiveTask", |
| | | "bpmn:ManualTask", |
| | | "bpmn:ExclusiveGateway", |
| | | "bpmn:SequenceFlow", |
| | | "bpmn:ParallelGateway", |
| | | "bpmn:InclusiveGateway", |
| | | "bpmn:EventBasedGateway", |
| | | "bpmn:StartEvent", |
| | | "bpmn:IntermediateCatchEvent", |
| | | "bpmn:IntermediateThrowEvent", |
| | | "bpmn:EndEvent", |
| | | "bpmn:BoundaryEvent", |
| | | "bpmn:CallActivity", |
| | | "bpmn:SubProcess", |
| | | "bpmn:Process" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "expression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "class", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "delegateExpression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "event", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "script", |
| | | "type": "Script" |
| | | }, |
| | | { |
| | | "name": "fields", |
| | | "type": "Field", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "TaskListener", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:UserTask" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "expression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "class", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "delegateExpression", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "event", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "script", |
| | | "type": "Script" |
| | | }, |
| | | { |
| | | "name": "fields", |
| | | "type": "Field", |
| | | "isMany": true |
| | | }, |
| | | { |
| | | "name": "id", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "eventDefinitions", |
| | | "type": "bpmn:TimerEventDefinition", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FormProperty", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:StartEvent", |
| | | "bpmn:UserTask" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "id", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "name", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "type", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "required", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "readable", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "writable", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "variable", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "expression", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "datePattern", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "default", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "values", |
| | | "type": "Value", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FormData", |
| | | "superClass": [ "Element" ], |
| | | "meta": { |
| | | "allowedIn": [ |
| | | "bpmn:StartEvent", |
| | | "bpmn:UserTask" |
| | | ] |
| | | }, |
| | | "properties": [ |
| | | { |
| | | "name": "fields", |
| | | "type": "FormField", |
| | | "isMany": true |
| | | }, |
| | | { |
| | | "name": "businessKey", |
| | | "type": "String", |
| | | "isAttr": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "FormField", |
| | | "superClass": [ "Element" ], |
| | | "properties": [ |
| | | { |
| | | "name": "id", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "label", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "type", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "datePattern", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "defaultValue", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "properties", |
| | | "type": "Properties" |
| | | }, |
| | | { |
| | | "name": "validation", |
| | | "type": "Validation" |
| | | }, |
| | | { |
| | | "name": "values", |
| | | "type": "Value", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Validation", |
| | | "superClass": [ "Element" ], |
| | | "properties": [ |
| | | { |
| | | "name": "constraints", |
| | | "type": "Constraint", |
| | | "isMany": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "Constraint", |
| | | "superClass": [ "Element" ], |
| | | "properties": [ |
| | | { |
| | | "name": "name", |
| | | "type": "String", |
| | | "isAttr": true |
| | | }, |
| | | { |
| | | "name": "config", |
| | | "type": "String", |
| | | "isAttr": true |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "name": "ConditionalEventDefinition", |
| | | "isAbstract": true, |
| | | "extends": [ |
| | | "bpmn:ConditionalEventDefinition" |
| | | ], |
| | | "properties": [ |
| | | { |
| | | "name": "variableName", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | }, |
| | | { |
| | | "name": "variableEvent", |
| | | "isAttr": true, |
| | | "type": "String" |
| | | } |
| | | ] |
| | | } |
| | | ], |
| | | "emumerations": [ ] |
| | | } |
New file |
| | |
| | | export default class CustomContextPad { |
| | | constructor(config, contextPad, create, elementFactory, injector, translate) { |
| | | this.create = create; |
| | | this.elementFactory = elementFactory; |
| | | this.translate = translate; |
| | | //自动摆放位置 |
| | | if (config.autoPlace !== false) { |
| | | this.autoPlace = injector.get('autoPlace', false); |
| | | } |
| | | //注册工具 |
| | | contextPad.registerProvider(this); |
| | | } |
| | | getContextPadEntries(element) { |
| | | const { |
| | | autoPlace, |
| | | create, |
| | | elementFactory, |
| | | translate |
| | | } = this; |
| | | |
| | | function appendUserTask(event, element) { |
| | | if (autoPlace) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:UserTask' }); |
| | | autoPlace.append(element, shape); |
| | | } else { |
| | | appendUserTaskStart(event, element); |
| | | } |
| | | } |
| | | |
| | | function appendUserTaskStart(event) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:UserTask' }); |
| | | create.start(event, shape, element); |
| | | } |
| | | function appendCallActivityStart(event) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' }); |
| | | create.start(event, shape, element); |
| | | } |
| | | |
| | | function appendCallActivity(event, element) { |
| | | if (autoPlace) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' }); |
| | | autoPlace.append(element, shape); |
| | | } else { |
| | | appendCallActivityStart(event, element); |
| | | } |
| | | } |
| | | return { |
| | | 'append.user-task': { |
| | | group: 'model', |
| | | className: 'bpmn-icon-user-task', |
| | | title: translate('Append ServiceTask'), |
| | | action: { |
| | | click: appendUserTask, |
| | | dragstart: appendUserTaskStart |
| | | } |
| | | }, |
| | | 'append.call-activity':{ |
| | | group: 'model', |
| | | className: 'bpmn-icon-call-activity', |
| | | title: translate('Append CallActivity'), |
| | | action: { |
| | | click: appendCallActivity, |
| | | dragstart: appendCallActivityStart |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | } |
| | | CustomContextPad.$inject = [ |
| | | 'config', |
| | | 'contextPad', |
| | | 'create', |
| | | 'elementFactory', |
| | | 'injector', |
| | | 'translate' |
| | | ]; |
New file |
| | |
| | | export default class CustomPalette { |
| | | constructor(create, elementFactory, palette, translate) { |
| | | this.create = create; |
| | | this.elementFactory = elementFactory; |
| | | this.translate = translate; |
| | | palette.registerProvider(this); |
| | | } |
| | | |
| | | getPaletteEntries(element) { |
| | | const { |
| | | create, |
| | | elementFactory, |
| | | translate |
| | | } = this; |
| | | |
| | | function createServiceTask(event) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:UserTask' }); |
| | | create.start(event, shape); |
| | | } |
| | | function createCallActivity(event) { |
| | | const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' }); |
| | | create.start(event, shape); |
| | | } |
| | | |
| | | |
| | | return { |
| | | 'create.user-task': { |
| | | group: 'activity', |
| | | className: 'bpmn-icon-user-task', |
| | | title: translate('Create UserTask'), |
| | | action: { |
| | | dragstart: createServiceTask, |
| | | click: createServiceTask |
| | | } |
| | | }, |
| | | 'create.call-activity': { |
| | | group: 'activity', |
| | | className: 'bpmn-icon-call-activity', |
| | | title: translate('Create CallActivity'), |
| | | action: { |
| | | dragstart: createCallActivity, |
| | | click: createCallActivity |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | CustomPalette.$inject = [ |
| | | 'create', |
| | | 'elementFactory', |
| | | 'palette', |
| | | 'translate' |
| | | ]; |
New file |
| | |
| | | import CustomContextPad from './CustomContextPad'; |
| | | import CustomPalette from './CustomPalette'; |
| | | |
| | | export default { |
| | | __init__: [ 'customContextPad', 'customPalette' ], |
| | | customContextPad: [ 'type', CustomContextPad ], |
| | | customPalette: [ 'type', CustomPalette ] |
| | | }; |
New file |
| | |
| | | import translations from './translationsGerman'; |
| | | export default function customTranslate(template, replacements) { |
| | | replacements = replacements || {}; |
| | | template = translations[template] || template; |
| | | return template.replace(/{([^}]+)}/g, function(_, key) { |
| | | var str = replacements[key]; |
| | | if(translations[replacements[key]] != null && translations [replacements[key]] != 'undefined'){ |
| | | str = translations[replacements[key]]; |
| | | } |
| | | return str || '{' + key + '}'; |
| | | }); |
| | | } |
New file |
| | |
| | | export default { |
| | | // Labels |
| | | 'Activate the global connect tool' : '激活全局连接工具', |
| | | 'Append {type}': '追加 {type}', |
| | | 'Append EndEvent': '追加 结束事件 ', |
| | | 'Append Task':'追加 任务', |
| | | 'Append Gateway':'追加 网关', |
| | | 'Append Intermediate/Boundary Event':'追加 中间/边界 事件', |
| | | 'Add Lane above': '在上面添加道', |
| | | 'Divide into two Lanes': '分割成两个道', |
| | | 'Divide into three Lanes': '分割成三个道', |
| | | 'Add Lane below': '在下面添加道', |
| | | 'Append compensation activity': '追加补偿活动', |
| | | 'Change type': '修改类型', |
| | | 'Connect using Association': '使用关联连接', |
| | | 'Connect using Sequence/MessageFlow or Association': '使用顺序/消息流或者关联连接', |
| | | 'Connect using DataInputAssociation': '使用数据输入关联连接', |
| | | 'Remove': '移除', |
| | | 'Activate the hand tool': '激活抓手工具', |
| | | 'Activate the lasso tool': '激活套索工具', |
| | | 'Activate the create/remove space tool': '激活创建/删除空间工具', |
| | | 'Create expanded SubProcess': '创建扩展子过程', |
| | | 'Create IntermediateThrowEvent/BoundaryEvent' : '创建中间抛出事件/边界事件', |
| | | 'Create Pool/Participant': '创建池/参与者', |
| | | 'Parallel Multi Instance': '并行多重事件', |
| | | 'Sequential Multi Instance': '时序多重事件', |
| | | 'DataObjectReference':'数据对象参考', |
| | | 'DataStoreReference':'数据存储参考', |
| | | 'Loop': '循环', |
| | | 'Ad-hoc': '即席', |
| | | 'Create {type}': '创建 {type}', |
| | | 'Create Task':'创建任务', |
| | | 'Create StartEvent':'创建开始事件', |
| | | 'Create EndEvent':'创建结束事件', |
| | | 'Create Group':'创建组', |
| | | 'Task': '任务', |
| | | 'Send Task': '发送任务', |
| | | 'Receive Task': '接收任务', |
| | | 'User Task': '用户任务', |
| | | 'Manual Task': '手工任务', |
| | | 'Business Rule Task': '业务规则任务', |
| | | 'Service Task': '服务任务', |
| | | 'Script Task': '脚本任务', |
| | | 'Call Activity': '调用活动', |
| | | 'Sub Process (collapsed)': '子流程(折叠的)', |
| | | 'Sub Process (expanded)': '子流程(展开的)', |
| | | 'Start Event': '开始事件', |
| | | 'StartEvent': '开始事件', |
| | | 'Intermediate Throw Event': '中间事件', |
| | | 'End Event': '结束事件', |
| | | 'EndEvent': '结束事件', |
| | | 'Create Gateway': '创建网关', |
| | | 'GateWay':'网关', |
| | | 'Create Intermediate/Boundary Event': '创建中间/边界事件', |
| | | 'Message Start Event': '消息开始事件', |
| | | 'Timer Start Event': '定时开始事件', |
| | | 'Conditional Start Event': '条件开始事件', |
| | | 'Signal Start Event': '信号开始事件', |
| | | 'Error Start Event': '错误开始事件', |
| | | 'Escalation Start Event': '升级开始事件', |
| | | 'Compensation Start Event': '补偿开始事件', |
| | | 'Message Start Event (non-interrupting)': '消息开始事件(非中断)', |
| | | 'Timer Start Event (non-interrupting)': '定时开始事件(非中断)', |
| | | 'Conditional Start Event (non-interrupting)': '条件开始事件(非中断)', |
| | | 'Signal Start Event (non-interrupting)': '信号开始事件(非中断)', |
| | | 'Escalation Start Event (non-interrupting)': '升级开始事件(非中断)', |
| | | 'Message Intermediate Catch Event': '消息中间捕获事件', |
| | | 'Message Intermediate Throw Event': '消息中间抛出事件', |
| | | 'Timer Intermediate Catch Event': '定时中间捕获事件', |
| | | 'Escalation Intermediate Throw Event': '升级中间抛出事件', |
| | | 'Conditional Intermediate Catch Event': '条件中间捕获事件', |
| | | 'Link Intermediate Catch Event': '链接中间捕获事件', |
| | | 'Link Intermediate Throw Event': '链接中间抛出事件', |
| | | 'Compensation Intermediate Throw Event': '补偿中间抛出事件', |
| | | 'Signal Intermediate Catch Event': '信号中间捕获事件', |
| | | 'Signal Intermediate Throw Event': '信号中间抛出事件', |
| | | 'Message End Event': '消息结束事件', |
| | | 'Escalation End Event': '定时结束事件', |
| | | 'Error End Event': '错误结束事件', |
| | | 'Cancel End Event': '取消结束事件', |
| | | 'Compensation End Event': '补偿结束事件', |
| | | 'Signal End Event': '信号结束事件', |
| | | 'Terminate End Event': '终止结束事件', |
| | | 'Message Boundary Event': '消息边界事件', |
| | | 'Message Boundary Event (non-interrupting)': '消息边界事件(非中断)', |
| | | 'Timer Boundary Event': '定时边界事件', |
| | | 'Timer Boundary Event (non-interrupting)': '定时边界事件(非中断)', |
| | | 'Escalation Boundary Event': '升级边界事件', |
| | | 'Escalation Boundary Event (non-interrupting)': '升级边界事件(非中断)', |
| | | 'Conditional Boundary Event': '条件边界事件', |
| | | 'Conditional Boundary Event (non-interrupting)': '条件边界事件(非中断)', |
| | | 'Error Boundary Event': '错误边界事件', |
| | | 'Cancel Boundary Event': '取消边界事件', |
| | | 'Signal Boundary Event': '信号边界事件', |
| | | 'Signal Boundary Event (non-interrupting)': '信号边界事件(非中断)', |
| | | 'Compensation Boundary Event': '补偿边界事件', |
| | | 'Exclusive Gateway': '互斥网关', |
| | | 'Parallel Gateway': '并行网关', |
| | | 'Inclusive Gateway': '相容网关', |
| | | 'Complex Gateway': '复杂网关', |
| | | 'Event based Gateway': '事件网关', |
| | | 'Transaction': '转运', |
| | | 'Sub Process': '子流程', |
| | | 'Event Sub Process': '事件子流程', |
| | | 'Collapsed Pool': '折叠池', |
| | | 'Expanded Pool': '展开池', |
| | | // Errors |
| | | 'no parent for {element} in {parent}': '在{parent}里,{element}没有父类', |
| | | 'no shape type specified': '没有指定的形状类型', |
| | | 'flow elements must be children of pools/participants': '流元素必须是池/参与者的子类', |
| | | 'out of bounds release': 'out of bounds release', |
| | | 'more than {count} child lanes': '子道大于{count} ', |
| | | 'element required': '元素不能为空', |
| | | 'diagram not part of bpmn:Definitions': '流程图不符合bpmn规范', |
| | | 'no diagram to display': '没有可展示的流程图', |
| | | 'no process or collaboration to display': '没有可展示的流程/协作', |
| | | 'element {element} referenced by {referenced}#{property} not yet drawn': '由{referenced}#{property}引用的{element}元素仍未绘制', |
| | | 'already rendered {element}': '{element} 已被渲染', |
| | | 'failed to import {element}': '导入{element}失败', |
| | | //属性面板的参数 |
| | | 'Id':'编号', |
| | | 'Name':'名称', |
| | | 'General':'常规', |
| | | 'Details':'详情', |
| | | 'Message Name':'消息名称', |
| | | 'Message':'消息', |
| | | 'Initiator':'创建者', |
| | | 'Asynchronous Continuations':'持续异步', |
| | | 'Asynchronous Before':'异步前', |
| | | 'Asynchronous After':'异步后', |
| | | 'Job Configuration':'工作配置', |
| | | 'Exclusive':'排除', |
| | | 'Job Priority':'工作优先级', |
| | | 'Retry Time Cycle':'重试时间周期', |
| | | 'Documentation':'文档', |
| | | 'Element Documentation':'元素文档', |
| | | 'History Configuration':'历史配置', |
| | | 'History Time To Live':'历史的生存时间', |
| | | 'Forms':'表单', |
| | | 'Form Key':'表单key', |
| | | 'Form Fields':'表单字段', |
| | | 'Business Key':'业务key', |
| | | 'Form Field':'表单字段', |
| | | 'ID':'编号', |
| | | 'Type':'类型', |
| | | 'Label':'名称', |
| | | 'Default Value':'默认值', |
| | | 'Validation':'校验', |
| | | 'Add Constraint':'添加约束', |
| | | 'Config':'配置', |
| | | 'Properties':'属性', |
| | | 'Add Property':'添加属性', |
| | | 'Value':'值', |
| | | 'Add':'添加', |
| | | 'Values':'值', |
| | | 'Add Value':'添加值', |
| | | 'Listeners':'监听器', |
| | | 'Execution Listener':'执行监听', |
| | | 'Event Type':'事件类型', |
| | | 'Listener Type':'监听器类型', |
| | | 'Java Class':'Java类', |
| | | 'Expression':'表达式', |
| | | 'Must provide a value':'必须提供一个值', |
| | | 'Delegate Expression':'代理表达式', |
| | | 'Script':'脚本', |
| | | 'Script Format':'脚本格式', |
| | | 'Script Type':'脚本类型', |
| | | 'Inline Script':'内联脚本', |
| | | 'External Script':'外部脚本', |
| | | 'Resource':'资源', |
| | | 'Field Injection':'字段注入', |
| | | 'Extensions':'扩展', |
| | | 'Input/Output':'输入/输出', |
| | | 'Input Parameters':'输入参数', |
| | | 'Output Parameters':'输出参数', |
| | | 'Parameters':'参数', |
| | | 'Output Parameter':'输出参数', |
| | | 'Timer Definition Type':'定时器定义类型', |
| | | 'Timer Definition':'定时器定义', |
| | | 'Date':'日期', |
| | | 'Duration':'持续', |
| | | 'Cycle':'循环', |
| | | 'Signal':'信号', |
| | | 'Signal Name':'信号名称', |
| | | 'Escalation':'升级', |
| | | 'Error':'错误', |
| | | 'Link Name':'链接名称', |
| | | 'Condition':'条件名称', |
| | | 'Variable Name':'变量名称', |
| | | 'Variable Event':'变量事件', |
| | | 'Specify more than one variable change event as a comma separated list.':'多个变量事件以逗号隔开', |
| | | 'Wait for Completion':'等待完成', |
| | | 'Activity Ref':'活动参考', |
| | | 'Version Tag':'版本标签', |
| | | 'Executable':'可执行文件', |
| | | 'External Task Configuration':'扩展任务配置', |
| | | 'Task Priority':'任务优先级', |
| | | 'External':'外部', |
| | | 'Connector':'连接器', |
| | | 'Must configure Connector':'必须配置连接器', |
| | | 'Connector Id':'连接器编号', |
| | | 'Implementation':'实现方式', |
| | | 'Field Injections':'字段注入', |
| | | 'Fields':'字段', |
| | | 'Result Variable':'结果变量', |
| | | 'Topic':'主题', |
| | | 'Configure Connector':'配置连接器', |
| | | 'Input Parameter':'输入参数', |
| | | 'Assignee':'代理人', |
| | | 'Candidate Users':'候选用户', |
| | | 'Candidate Groups':'候选组', |
| | | 'Due Date':'到期时间', |
| | | 'Follow Up Date':'跟踪日期', |
| | | 'Priority':'优先级', |
| | | 'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00', |
| | | 'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00', |
| | | 'Variables':'变量', |
| | | 'Candidate Starter Configuration':'候选开始配置', |
| | | 'Task Listener':'任务监听器', |
| | | 'Candidate Starter Groups':'候选开始组', |
| | | 'Candidate Starter Users':'候选开始用户', |
| | | 'Tasklist Configuration':'任务列表配置', |
| | | 'Startable':'启动', |
| | | 'Specify more than one group as a comma separated list.':'指定多个组,用逗号分隔', |
| | | 'Specify more than one user as a comma separated list.':'指定多个用户,用逗号分隔', |
| | | 'This maps to the process definition key.':'这会映射为流程定义的键', |
| | | 'CallActivity Type':'调用活动类型', |
| | | 'Condition Type':'条件类型', |
| | | 'Create UserTask':'创建用户任务', |
| | | 'Create CallActivity':'创建调用活动', |
| | | 'Called Element':'调用元素', |
| | | 'Create DataObjectReference':'创建数据对象引用', |
| | | 'Create DataStoreReference':'创建数据存储引用', |
| | | 'Multi Instance':'多实例', |
| | | 'Loop Cardinality':'实例数量', |
| | | 'Collection':'任务参与人列表', |
| | | 'Element Variable':'元素变量', |
| | | 'Completion Condition':'完成条件' |
| | | }; |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="sample-diagram" targetNamespace="http://activiti.org/bpmn"> |
| | | <bpmn2:process id="Process_1" isExecutable="true"> |
| | | <bpmn2:startEvent id="StartEvent_1"/> |
| | | </bpmn2:process> |
| | | <bpmndi:BPMNDiagram id="BPMNDiagram_1"> |
| | | <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1"> |
| | | <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"> |
| | | <dc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"/> |
| | | </bpmndi:BPMNShape> |
| | | </bpmndi:BPMNPlane> |
| | | </bpmndi:BPMNDiagram> |
| | | </bpmn2:definitions> |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var DEFAULT_PRIORITY = 1000; |
| | | |
| | | |
| | | /** |
| | | * A component that decides upon the visibility / editable |
| | | * state of properties in the properties panel. |
| | | * |
| | | * Implementors must subclass this component and override |
| | | * {@link PropertiesActivator#isEntryVisible} and |
| | | * {@link PropertiesActivator#isPropertyEditable} to provide |
| | | * custom behavior. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | * |
| | | * @param {EventBus} eventBus |
| | | * @param {Number} [priority] at which priority to hook into the activation |
| | | */ |
| | | function PropertiesActivator(eventBus, priority) { |
| | | var self = this; |
| | | |
| | | priority = priority || DEFAULT_PRIORITY; |
| | | |
| | | eventBus.on('propertiesPanel.isEntryVisible', priority, function(e) { |
| | | return self.isEntryVisible(e.entry, e.element); |
| | | }); |
| | | |
| | | eventBus.on('propertiesPanel.isPropertyEditable', priority, function(e) { |
| | | return self.isPropertyEditable(e.entry, e.propertyName, e.element); |
| | | }); |
| | | } |
| | | |
| | | PropertiesActivator.$inject = [ 'eventBus' ]; |
| | | |
| | | module.exports = PropertiesActivator; |
| | | |
| | | |
| | | /** |
| | | * Should the given entry be visible for the specified element. |
| | | * |
| | | * @method PropertiesActivator#isEntryVisible |
| | | * |
| | | * @param {EntryDescriptor} entry |
| | | * @param {ModdleElement} element |
| | | * |
| | | * @returns {Boolean} |
| | | */ |
| | | PropertiesActivator.prototype.isEntryVisible = function(entry, element) { |
| | | return true; |
| | | }; |
| | | |
| | | /** |
| | | * Should the given property be editable for the specified element |
| | | * |
| | | * @method PropertiesActivator#isPropertyEditable |
| | | * |
| | | * @param {EntryDescriptor} entry |
| | | * @param {String} propertyName |
| | | * @param {ModdleElement} element |
| | | * |
| | | * @returns {Boolean} |
| | | */ |
| | | PropertiesActivator.prototype.isPropertyEditable = function(entry, propertyName, element) { |
| | | return true; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('./Utils').escapeHTML; |
| | | |
| | | var domify = require('min-dom').domify, |
| | | domQuery = require('min-dom').query, |
| | | domQueryAll = require('min-dom').queryAll, |
| | | domRemove = require('min-dom').remove, |
| | | domClasses = require('min-dom').classes, |
| | | domClosest = require('min-dom').closest, |
| | | domAttr = require('min-dom').attr, |
| | | domDelegate = require('min-dom').delegate, |
| | | domMatches = require('min-dom').matches; |
| | | |
| | | var forEach = require('lodash/forEach'), |
| | | filter = require('lodash/filter'), |
| | | get = require('lodash/get'), |
| | | keys = require('lodash/keys'), |
| | | isEmpty = require('lodash/isEmpty'), |
| | | isArray = require('lodash/isArray'), |
| | | xor = require('lodash/xor'), |
| | | debounce = require('lodash/debounce'); |
| | | |
| | | var updateSelection = require('selection-update'); |
| | | |
| | | var scrollTabs = require('scroll-tabs').default; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var HIDE_CLASS = 'bpp-hidden'; |
| | | var DEBOUNCE_DELAY = 300; |
| | | |
| | | |
| | | function isToggle(node) { |
| | | return node.type === 'checkbox' || node.type === 'radio'; |
| | | } |
| | | |
| | | function isSelect(node) { |
| | | return node.type === 'select-one'; |
| | | } |
| | | |
| | | function isContentEditable(node) { |
| | | return domAttr(node, 'contenteditable'); |
| | | } |
| | | |
| | | function getPropertyPlaceholders(node) { |
| | | var selector = 'input[name], textarea[name], [data-value], [contenteditable]'; |
| | | var placeholders = domQueryAll(selector, node); |
| | | if ((!placeholders || !placeholders.length) && domMatches(node, selector)) { |
| | | placeholders = [ node ]; |
| | | } |
| | | return placeholders; |
| | | } |
| | | |
| | | /** |
| | | * Return all active form controls. |
| | | * This excludes the invisible controls unless all is true |
| | | * |
| | | * @param {Element} node |
| | | * @param {Boolean} [all=false] |
| | | */ |
| | | function getFormControls(node, all) { |
| | | var controls = domQueryAll('input[name], textarea[name], select[name], [contenteditable]', node); |
| | | |
| | | if (!controls || !controls.length) { |
| | | controls = domMatches(node, 'option') ? [ node ] : controls; |
| | | } |
| | | |
| | | if (!all) { |
| | | controls = filter(controls, function(node) { |
| | | return !domClosest(node, '.' + HIDE_CLASS); |
| | | }); |
| | | } |
| | | |
| | | return controls; |
| | | } |
| | | |
| | | function getFormControlValuesInScope(entryNode) { |
| | | var values = {}; |
| | | |
| | | var controlNodes = getFormControls(entryNode); |
| | | |
| | | forEach(controlNodes, function(controlNode) { |
| | | var value = controlNode.value; |
| | | |
| | | var name = domAttr(controlNode, 'name') || domAttr(controlNode, 'data-name'); |
| | | |
| | | // take toggle state into account for radio / checkboxes |
| | | if (isToggle(controlNode)) { |
| | | if (controlNode.checked) { |
| | | if (!domAttr(controlNode, 'value')) { |
| | | value = true; |
| | | } else { |
| | | value = controlNode.value; |
| | | } |
| | | } else { |
| | | value = null; |
| | | } |
| | | } else |
| | | if (isContentEditable(controlNode)) { |
| | | value = controlNode.innerText; |
| | | } |
| | | |
| | | if (value !== null) { |
| | | // return the actual value |
| | | // handle serialization in entry provider |
| | | // (ie. if empty string should be serialized or not) |
| | | values[name] = value; |
| | | } |
| | | }); |
| | | |
| | | return values; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * Extract input values from entry node |
| | | * |
| | | * @param {DOMElement} entryNode |
| | | * @returns {Object} |
| | | */ |
| | | function getFormControlValues(entryNode) { |
| | | |
| | | var values; |
| | | |
| | | var listContainer = domQuery('[data-list-entry-container]', entryNode); |
| | | if (listContainer) { |
| | | values = []; |
| | | var listNodes = listContainer.children || []; |
| | | forEach(listNodes, function(listNode) { |
| | | values.push(getFormControlValuesInScope(listNode)); |
| | | }); |
| | | } else { |
| | | values = getFormControlValuesInScope(entryNode); |
| | | } |
| | | |
| | | return values; |
| | | } |
| | | |
| | | /** |
| | | * Return true if the given form extracted value equals |
| | | * to an old cached version. |
| | | * |
| | | * @param {Object} value |
| | | * @param {Object} oldValue |
| | | * @return {Boolean} |
| | | */ |
| | | function valueEqual(value, oldValue) { |
| | | |
| | | if (value && !oldValue) { |
| | | return false; |
| | | } |
| | | |
| | | var allKeys = keys(value).concat(keys(oldValue)); |
| | | |
| | | return allKeys.every(function(key) { |
| | | return value[key] === oldValue[key]; |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Return true if the given form extracted value(s) |
| | | * equal an old cached version. |
| | | * |
| | | * @param {Array<Object>|Object} values |
| | | * @param {Array<Object>|Object} oldValues |
| | | * @return {Boolean} |
| | | */ |
| | | function valuesEqual(values, oldValues) { |
| | | |
| | | if (isArray(values)) { |
| | | |
| | | if (values.length !== oldValues.length) { |
| | | return false; |
| | | } |
| | | |
| | | return values.every(function(v, idx) { |
| | | return valueEqual(v, oldValues[idx]); |
| | | }); |
| | | } |
| | | |
| | | return valueEqual(values, oldValues); |
| | | } |
| | | |
| | | /** |
| | | * Return a mapping of { id: entry } for all entries in the given groups in the given tabs. |
| | | * |
| | | * @param {Object} tabs |
| | | * @return {Object} |
| | | */ |
| | | function extractEntries(tabs) { |
| | | return keyBy(flattenDeep(map(flattenDeep(map(tabs, 'groups')), 'entries')), 'id'); |
| | | } |
| | | |
| | | /** |
| | | * Return a mapping of { id: group } for all groups in the given tabs. |
| | | * |
| | | * @param {Object} tabs |
| | | * @return {Object} |
| | | */ |
| | | function extractGroups(tabs) { |
| | | return keyBy(flattenDeep(map(tabs, 'groups')), 'id'); |
| | | } |
| | | |
| | | /** |
| | | * A properties panel implementation. |
| | | * |
| | | * To use it provide a `propertiesProvider` component that knows |
| | | * about which properties to display. |
| | | * |
| | | * Properties edit state / visibility can be intercepted |
| | | * via a custom {@link PropertiesActivator}. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | * |
| | | * @param {Object} config |
| | | * @param {EventBus} eventBus |
| | | * @param {Modeling} modeling |
| | | * @param {PropertiesProvider} propertiesProvider |
| | | * @param {Canvas} canvas |
| | | * @param {CommandStack} commandStack |
| | | */ |
| | | function PropertiesPanel(config, eventBus, modeling, propertiesProvider, commandStack, canvas) { |
| | | |
| | | this._eventBus = eventBus; |
| | | this._modeling = modeling; |
| | | this._commandStack = commandStack; |
| | | this._canvas = canvas; |
| | | this._propertiesProvider = propertiesProvider; |
| | | |
| | | this._init(config); |
| | | } |
| | | |
| | | PropertiesPanel.$inject = [ |
| | | 'config.propertiesPanel', |
| | | 'eventBus', |
| | | 'modeling', |
| | | 'propertiesProvider', |
| | | 'commandStack', |
| | | 'canvas' |
| | | ]; |
| | | |
| | | module.exports = PropertiesPanel; |
| | | |
| | | |
| | | PropertiesPanel.prototype._init = function(config) { |
| | | |
| | | var canvas = this._canvas, |
| | | eventBus = this._eventBus; |
| | | |
| | | var self = this; |
| | | |
| | | /** |
| | | * Select the root element once it is added to the canvas |
| | | */ |
| | | eventBus.on('root.added', function(e) { |
| | | var element = e.element; |
| | | |
| | | if (isImplicitRoot(element)) { |
| | | return; |
| | | } |
| | | |
| | | self.update(element); |
| | | }); |
| | | |
| | | eventBus.on('selection.changed', function(e) { |
| | | var newElement = e.newSelection[0]; |
| | | |
| | | var rootElement = canvas.getRootElement(); |
| | | |
| | | if (isImplicitRoot(rootElement)) { |
| | | return; |
| | | } |
| | | |
| | | self.update(newElement); |
| | | }); |
| | | |
| | | // add / update tab-bar scrolling |
| | | eventBus.on([ |
| | | 'propertiesPanel.changed', |
| | | 'propertiesPanel.resized' |
| | | ], function(event) { |
| | | |
| | | var tabBarNode = domQuery('.bpp-properties-tab-bar', self._container); |
| | | |
| | | if (!tabBarNode) { |
| | | return; |
| | | } |
| | | |
| | | var scroller = scrollTabs.get(tabBarNode); |
| | | |
| | | if (!scroller) { |
| | | |
| | | // we did not initialize yet, do that |
| | | // now and make sure we select the active |
| | | // tab on scroll update |
| | | scroller = scrollTabs(tabBarNode, { |
| | | selectors: { |
| | | tabsContainer: '.bpp-properties-tabs-links', |
| | | tab: '.bpp-properties-tabs-links li', |
| | | ignore: '.bpp-hidden', |
| | | active: '.bpp-active' |
| | | } |
| | | }); |
| | | |
| | | |
| | | scroller.on('scroll', function(newActiveNode, oldActiveNode, direction) { |
| | | |
| | | var linkNode = domQuery('[data-tab-target]', newActiveNode); |
| | | |
| | | var tabId = domAttr(linkNode, 'data-tab-target'); |
| | | |
| | | self.activateTab(tabId); |
| | | }); |
| | | } |
| | | |
| | | // react on tab changes and or tabContainer resize |
| | | // and make sure the active tab is shown completely |
| | | scroller.update(); |
| | | }); |
| | | |
| | | eventBus.on('elements.changed', function(e) { |
| | | |
| | | var current = self._current; |
| | | var element = current && current.element; |
| | | |
| | | if (element) { |
| | | if (e.elements.indexOf(element) !== -1) { |
| | | self.update(element); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | eventBus.on('elementTemplates.changed', function() { |
| | | var current = self._current; |
| | | var element = current && current.element; |
| | | |
| | | if (element) { |
| | | self.update(element); |
| | | } |
| | | }); |
| | | |
| | | eventBus.on('diagram.destroy', function() { |
| | | self.detach(); |
| | | }); |
| | | |
| | | this._container = domify('<div class="bpp-properties-panel"></div>'); |
| | | |
| | | this._bindListeners(this._container); |
| | | |
| | | if (config && config.parent) { |
| | | this.attachTo(config.parent); |
| | | } |
| | | }; |
| | | |
| | | |
| | | PropertiesPanel.prototype.attachTo = function(parentNode) { |
| | | |
| | | if (!parentNode) { |
| | | throw new Error('parentNode required'); |
| | | } |
| | | |
| | | // ensure we detach from the |
| | | // previous, old parent |
| | | this.detach(); |
| | | |
| | | // unwrap jQuery if provided |
| | | if (parentNode.get && parentNode.constructor.prototype.jquery) { |
| | | parentNode = parentNode.get(0); |
| | | } |
| | | |
| | | if (typeof parentNode === 'string') { |
| | | parentNode = domQuery(parentNode); |
| | | } |
| | | |
| | | var container = this._container; |
| | | |
| | | parentNode.appendChild(container); |
| | | |
| | | this._emit('attach'); |
| | | }; |
| | | |
| | | PropertiesPanel.prototype.detach = function() { |
| | | |
| | | var container = this._container, |
| | | parentNode = container.parentNode; |
| | | |
| | | if (!parentNode) { |
| | | return; |
| | | } |
| | | |
| | | this._emit('detach'); |
| | | |
| | | parentNode.removeChild(container); |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Select the given tab within the properties panel. |
| | | * |
| | | * @param {Object|String} tab |
| | | */ |
| | | PropertiesPanel.prototype.activateTab = function(tab) { |
| | | |
| | | var tabId = typeof tab === 'string' ? tab : tab.id; |
| | | |
| | | var current = this._current; |
| | | |
| | | var panelNode = current.panel; |
| | | |
| | | var allTabNodes = domQueryAll('.bpp-properties-tab', panelNode), |
| | | allTabLinkNodes = domQueryAll('.bpp-properties-tab-link', panelNode); |
| | | |
| | | forEach(allTabNodes, function(tabNode) { |
| | | |
| | | var currentTabId = domAttr(tabNode, 'data-tab'); |
| | | |
| | | domClasses(tabNode).toggle('bpp-active', tabId === currentTabId); |
| | | }); |
| | | |
| | | forEach(allTabLinkNodes, function(tabLinkNode) { |
| | | |
| | | var tabLink = domQuery('[data-tab-target]', tabLinkNode), |
| | | currentTabId = domAttr(tabLink, 'data-tab-target'); |
| | | |
| | | domClasses(tabLinkNode).toggle('bpp-active', tabId === currentTabId); |
| | | }); |
| | | }; |
| | | |
| | | /** |
| | | * Update the DOM representation of the properties panel |
| | | */ |
| | | PropertiesPanel.prototype.update = function(element) { |
| | | var current = this._current; |
| | | |
| | | // no actual selection change |
| | | var needsCreate = true; |
| | | |
| | | if (typeof element === 'undefined') { |
| | | |
| | | // use RootElement of BPMN diagram to generate properties panel if no element is selected |
| | | element = this._canvas.getRootElement(); |
| | | } |
| | | |
| | | var newTabs = this._propertiesProvider.getTabs(element); |
| | | |
| | | if (current && current.element === element) { |
| | | // see if we can reuse the existing panel |
| | | |
| | | needsCreate = this._entriesChanged(current, newTabs); |
| | | } |
| | | |
| | | if (needsCreate) { |
| | | |
| | | if (current) { |
| | | |
| | | // get active tab from the existing panel before remove it |
| | | var activeTabNode = domQuery('.bpp-properties-tab.bpp-active', current.panel); |
| | | |
| | | var activeTabId; |
| | | if (activeTabNode) { |
| | | activeTabId = domAttr(activeTabNode, 'data-tab'); |
| | | } |
| | | |
| | | // remove old panel |
| | | domRemove(current.panel); |
| | | } |
| | | |
| | | this._current = this._create(element, newTabs); |
| | | |
| | | // activate the saved active tab from the remove panel or the first tab |
| | | (activeTabId) ? this.activateTab(activeTabId) : this.activateTab(this._current.tabs[0]); |
| | | |
| | | } |
| | | |
| | | if (this._current) { |
| | | // make sure correct tab contents are visible |
| | | this._updateActivation(this._current); |
| | | |
| | | } |
| | | |
| | | this._emit('changed'); |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Returns true if one of two groups has different entries than the other. |
| | | * |
| | | * @param {Object} current |
| | | * @param {Object} newTabs |
| | | * @return {Boolean} |
| | | */ |
| | | PropertiesPanel.prototype._entriesChanged = function(current, newTabs) { |
| | | |
| | | var oldEntryIds = keys(current.entries), |
| | | newEntryIds = keys(extractEntries(newTabs)); |
| | | |
| | | return !isEmpty(xor(oldEntryIds, newEntryIds)); |
| | | }; |
| | | |
| | | PropertiesPanel.prototype._emit = function(event) { |
| | | this._eventBus.fire('propertiesPanel.' + event, { panel: this, current: this._current }); |
| | | }; |
| | | |
| | | PropertiesPanel.prototype._bindListeners = function(container) { |
| | | |
| | | var self = this; |
| | | |
| | | // handles a change for a given event |
| | | var handleChange = function handleChange(event) { |
| | | |
| | | // see if we handle a change inside a [data-entry] element. |
| | | // if not, drop out |
| | | var inputNode = event.delegateTarget, |
| | | entryNode = domClosest(inputNode, '[data-entry]'), |
| | | entryId, entry; |
| | | |
| | | // change from outside a [data-entry] element, simply ignore |
| | | if (!entryNode) { |
| | | return; |
| | | } |
| | | |
| | | entryId = domAttr(entryNode, 'data-entry'); |
| | | entry = self.getEntry(entryId); |
| | | |
| | | var values = getFormControlValues(entryNode); |
| | | |
| | | if (event.type === 'change') { |
| | | |
| | | // - if the "data-on-change" attribute is present and a value is changed, |
| | | // then the associated action is performed. |
| | | // - if the associated action returns "true" then an update to the business |
| | | // object is done |
| | | // - if it does not return "true", then only the DOM content is updated |
| | | var onChangeAction = domAttr(inputNode, 'data-on-change'); |
| | | |
| | | if (onChangeAction) { |
| | | var isEntryDirty = self.executeAction(entry, entryNode, onChangeAction, event); |
| | | |
| | | if (!isEntryDirty) { |
| | | return self.update(self._current.element); |
| | | } |
| | | } |
| | | } |
| | | self.applyChanges(entry, values, entryNode); |
| | | self.updateState(entry, entryNode); |
| | | }; |
| | | |
| | | // debounce update only elements that are target of key events, |
| | | // i.e. INPUT and TEXTAREA. SELECTs will trigger an immediate update anyway. |
| | | domDelegate.bind(container, 'input, textarea, [contenteditable]', 'input', debounce(handleChange, DEBOUNCE_DELAY)); |
| | | domDelegate.bind(container, 'input, textarea, select, [contenteditable]', 'change', handleChange); |
| | | |
| | | // handle key events |
| | | domDelegate.bind(container, 'select', 'keydown', function(e) { |
| | | |
| | | // DEL |
| | | if (e.keyCode === 46) { |
| | | e.stopPropagation(); |
| | | e.preventDefault(); |
| | | } |
| | | }); |
| | | |
| | | domDelegate.bind(container, '[data-action]', 'click', function onClick(event) { |
| | | |
| | | // triggers on all inputs |
| | | var inputNode = event.delegateTarget, |
| | | entryNode = domClosest(inputNode, '[data-entry]'); |
| | | |
| | | var actionId = domAttr(inputNode, 'data-action'), |
| | | entryId = domAttr(entryNode, 'data-entry'); |
| | | |
| | | var entry = self.getEntry(entryId); |
| | | |
| | | var isEntryDirty = self.executeAction(entry, entryNode, actionId, event); |
| | | |
| | | if (isEntryDirty) { |
| | | var values = getFormControlValues(entryNode); |
| | | |
| | | self.applyChanges(entry, values, entryNode); |
| | | } |
| | | |
| | | self.updateState(entry, entryNode); |
| | | }); |
| | | |
| | | function handleInput(event, element) { |
| | | // triggers on all inputs |
| | | var inputNode = event.delegateTarget; |
| | | |
| | | var entryNode = domClosest(inputNode, '[data-entry]'); |
| | | |
| | | // only work on data entries |
| | | if (!entryNode) { |
| | | return; |
| | | } |
| | | |
| | | var eventHandlerId = domAttr(inputNode, 'data-blur'), |
| | | entryId = domAttr(entryNode, 'data-entry'); |
| | | |
| | | var entry = self.getEntry(entryId); |
| | | |
| | | var isEntryDirty = self.executeAction(entry, entryNode, eventHandlerId, event); |
| | | |
| | | if (isEntryDirty) { |
| | | var values = getFormControlValues(entryNode); |
| | | |
| | | self.applyChanges(entry, values, entryNode); |
| | | } |
| | | |
| | | self.updateState(entry, entryNode); |
| | | } |
| | | |
| | | domDelegate.bind(container, '[data-blur]', 'blur', handleInput, true); |
| | | |
| | | // make tab links interactive |
| | | domDelegate.bind(container, '.bpp-properties-tabs-links [data-tab-target]', 'click', function(event) { |
| | | event.preventDefault(); |
| | | |
| | | var delegateTarget = event.delegateTarget; |
| | | |
| | | var tabId = domAttr(delegateTarget, 'data-tab-target'); |
| | | |
| | | // activate tab on link click |
| | | self.activateTab(tabId); |
| | | }); |
| | | |
| | | }; |
| | | |
| | | PropertiesPanel.prototype.updateState = function(entry, entryNode) { |
| | | this.updateShow(entry, entryNode); |
| | | this.updateDisable(entry, entryNode); |
| | | }; |
| | | |
| | | /** |
| | | * Update the visibility of the entry node in the DOM |
| | | */ |
| | | PropertiesPanel.prototype.updateShow = function(entry, node) { |
| | | |
| | | var current = this._current; |
| | | |
| | | if (!current) { |
| | | return; |
| | | } |
| | | |
| | | var showNodes = domQueryAll('[data-show]', node) || []; |
| | | |
| | | forEach(showNodes, function(showNode) { |
| | | |
| | | var expr = domAttr(showNode, 'data-show'); |
| | | var fn = get(entry, expr); |
| | | if (fn) { |
| | | var scope = domClosest(showNode, '[data-scope]') || node; |
| | | var shouldShow = fn(current.element, node, showNode, scope) || false; |
| | | if (shouldShow) { |
| | | domClasses(showNode).remove(HIDE_CLASS); |
| | | } else { |
| | | domClasses(showNode).add(HIDE_CLASS); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | /** |
| | | * Evaluates a given function. If it returns true, then the |
| | | * node is marked as "disabled". |
| | | */ |
| | | PropertiesPanel.prototype.updateDisable = function(entry, node) { |
| | | var current = this._current; |
| | | |
| | | if (!current) { |
| | | return; |
| | | } |
| | | |
| | | var nodes = domQueryAll('[data-disable]', node) || []; |
| | | |
| | | forEach(nodes, function(currentNode) { |
| | | var expr = domAttr(currentNode, 'data-disable'); |
| | | var fn = get(entry, expr); |
| | | if (fn) { |
| | | var scope = domClosest(currentNode, '[data-scope]') || node; |
| | | var shouldDisable = fn(current.element, node, currentNode, scope) || false; |
| | | domAttr(currentNode, 'disabled', shouldDisable ? '' : null); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | PropertiesPanel.prototype.executeAction = function(entry, entryNode, actionId, event) { |
| | | var current = this._current; |
| | | |
| | | if (!current) { |
| | | return; |
| | | } |
| | | |
| | | var fn = get(entry, actionId); |
| | | if (fn) { |
| | | var scopeNode = domClosest(event.target, '[data-scope]') || entryNode; |
| | | return fn.apply(entry, [ current.element, entryNode, event, scopeNode ]); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * Apply changes to the business object by executing a command |
| | | */ |
| | | PropertiesPanel.prototype.applyChanges = function(entry, values, containerElement) { |
| | | |
| | | var element = this._current.element; |
| | | |
| | | // ensure we only update the model if we got dirty changes |
| | | if (valuesEqual(values, entry.oldValues)) { |
| | | return; |
| | | } |
| | | |
| | | var command = entry.set(element, values, containerElement); |
| | | |
| | | var commandToExecute; |
| | | |
| | | if (isArray(command)) { |
| | | if (command.length) { |
| | | commandToExecute = { |
| | | cmd: 'properties-panel.multi-command-executor', |
| | | context: flattenDeep(command) |
| | | }; |
| | | } |
| | | } else { |
| | | commandToExecute = command; |
| | | } |
| | | |
| | | if (commandToExecute) { |
| | | this._commandStack.execute(commandToExecute.cmd, commandToExecute.context || { element : element }); |
| | | } else { |
| | | this.update(element); |
| | | } |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * apply validation errors in the DOM and show or remove an error message near the entry node. |
| | | */ |
| | | PropertiesPanel.prototype.applyValidationErrors = function(validationErrors, entryNode) { |
| | | |
| | | var valid = true; |
| | | |
| | | var controlNodes = getFormControls(entryNode, true); |
| | | |
| | | forEach(controlNodes, function(controlNode) { |
| | | |
| | | var name = domAttr(controlNode, 'name') || domAttr(controlNode, 'data-name'); |
| | | |
| | | var error = validationErrors && validationErrors[name]; |
| | | |
| | | var errorMessageNode = domQuery('.bpp-error-message', controlNode.parentNode); |
| | | |
| | | if (error) { |
| | | valid = false; |
| | | |
| | | if (!errorMessageNode) { |
| | | errorMessageNode = domify('<div></div>'); |
| | | |
| | | domClasses(errorMessageNode).add('bpp-error-message'); |
| | | |
| | | // insert errorMessageNode after controlNode |
| | | controlNode.parentNode.insertBefore(errorMessageNode, controlNode.nextSibling); |
| | | } |
| | | |
| | | errorMessageNode.textContent = error; |
| | | |
| | | domClasses(controlNode).add('invalid'); |
| | | } else { |
| | | domClasses(controlNode).remove('invalid'); |
| | | |
| | | if (errorMessageNode) { |
| | | controlNode.parentNode.removeChild(errorMessageNode); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | return valid; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Check if the entry contains valid input |
| | | */ |
| | | PropertiesPanel.prototype.validate = function(entry, values, entryNode) { |
| | | var self = this; |
| | | |
| | | var current = this._current; |
| | | |
| | | var valid = true; |
| | | |
| | | entryNode = entryNode || domQuery('[data-entry="' + entry.id + '"]', current.panel); |
| | | |
| | | if (values instanceof Array) { |
| | | var listContainer = domQuery('[data-list-entry-container]', entryNode), |
| | | listEntryNodes = listContainer.children || []; |
| | | |
| | | // create new elements |
| | | for (var i = 0; i < values.length; i++) { |
| | | var listValue = values[i]; |
| | | |
| | | if (entry.validateListItem) { |
| | | |
| | | var validationErrors = entry.validateListItem(current.element, listValue, entryNode, i), |
| | | listEntryNode = listEntryNodes[i]; |
| | | |
| | | valid = self.applyValidationErrors(validationErrors, listEntryNode) && valid; |
| | | } |
| | | } |
| | | } else { |
| | | if (entry.validate) { |
| | | this.validationErrors = entry.validate(current.element, values, entryNode); |
| | | |
| | | valid = self.applyValidationErrors(this.validationErrors, entryNode) && valid; |
| | | } |
| | | } |
| | | |
| | | return valid; |
| | | }; |
| | | |
| | | PropertiesPanel.prototype.getEntry = function(id) { |
| | | return this._current && this._current.entries[id]; |
| | | }; |
| | | |
| | | var flattenDeep = require('lodash/flattenDeep'), |
| | | keyBy = require('lodash/keyBy'), |
| | | map = require('lodash/map'); |
| | | |
| | | PropertiesPanel.prototype._create = function(element, tabs) { |
| | | |
| | | if (!element) { |
| | | return null; |
| | | } |
| | | |
| | | var containerNode = this._container; |
| | | |
| | | var panelNode = this._createPanel(element, tabs); |
| | | |
| | | containerNode.appendChild(panelNode); |
| | | |
| | | var entries = extractEntries(tabs); |
| | | var groups = extractGroups(tabs); |
| | | |
| | | return { |
| | | tabs: tabs, |
| | | groups: groups, |
| | | entries: entries, |
| | | element: element, |
| | | panel: panelNode |
| | | }; |
| | | }; |
| | | |
| | | /** |
| | | * Update variable parts of the entry node on element changes. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {EntryDescriptor} entry |
| | | * @param {Object} values |
| | | * @param {HTMLElement} entryNode |
| | | * @param {Number} idx |
| | | */ |
| | | PropertiesPanel.prototype._bindTemplate = function(element, entry, values, entryNode, idx) { |
| | | |
| | | var eventBus = this._eventBus; |
| | | |
| | | function isPropertyEditable(entry, propertyName) { |
| | | return eventBus.fire('propertiesPanel.isPropertyEditable', { |
| | | entry: entry, |
| | | propertyName: propertyName, |
| | | element: element |
| | | }); |
| | | } |
| | | |
| | | var inputNodes = getPropertyPlaceholders(entryNode); |
| | | |
| | | forEach(inputNodes, function(node) { |
| | | |
| | | var name, |
| | | newValue, |
| | | editable; |
| | | |
| | | // we deal with an input element |
| | | if ('value' in node || isContentEditable(node) === 'true') { |
| | | name = domAttr(node, 'name') || domAttr(node, 'data-name'); |
| | | newValue = values[name]; |
| | | |
| | | editable = isPropertyEditable(entry, name); |
| | | if (editable && entry.editable) { |
| | | editable = entry.editable(element, entryNode, node, name, newValue, idx); |
| | | } |
| | | |
| | | domAttr(node, 'readonly', editable ? null : ''); |
| | | domAttr(node, 'disabled', editable ? null : ''); |
| | | |
| | | // take full control over setting the value |
| | | // and possibly updating the input in entry#setControlValue |
| | | if (entry.setControlValue) { |
| | | entry.setControlValue(element, entryNode, node, name, newValue, idx); |
| | | } else if (isToggle(node)) { |
| | | setToggleValue(node, newValue); |
| | | } else if (isSelect(node)) { |
| | | setSelectValue(node, newValue); |
| | | } else { |
| | | setInputValue(node, newValue); |
| | | } |
| | | } |
| | | |
| | | // we deal with some non-editable html element |
| | | else { |
| | | name = domAttr(node, 'data-value'); |
| | | newValue = values[name]; |
| | | if (entry.setControlValue) { |
| | | entry.setControlValue(element, entryNode, node, name, newValue, idx); |
| | | } else { |
| | | setTextValue(node, newValue); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // TODO(nikku): WTF freaking name? Change / clarify. |
| | | PropertiesPanel.prototype._updateActivation = function(current) { |
| | | var self = this; |
| | | |
| | | var eventBus = this._eventBus; |
| | | |
| | | var element = current.element; |
| | | |
| | | function isEntryVisible(entry) { |
| | | return eventBus.fire('propertiesPanel.isEntryVisible', { |
| | | entry: entry, |
| | | element: element |
| | | }); |
| | | } |
| | | |
| | | function isGroupVisible(group, element, groupNode) { |
| | | if (typeof group.enabled === 'function') { |
| | | return group.enabled(element, groupNode); |
| | | } else { |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | function isTabVisible(tab, element) { |
| | | if (typeof tab.enabled === 'function') { |
| | | return tab.enabled(element); |
| | | } else { |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | function toggleVisible(node, visible) { |
| | | domClasses(node).toggle(HIDE_CLASS, !visible); |
| | | } |
| | | |
| | | // check whether the active tab is visible |
| | | // if not: set the first tab as active tab |
| | | function checkActiveTabVisibility(node, visible) { |
| | | var isActive = domClasses(node).has('bpp-active'); |
| | | if (!visible && isActive) { |
| | | self.activateTab(current.tabs[0]); |
| | | } |
| | | } |
| | | |
| | | function updateLabel(element, selector, text) { |
| | | var labelNode = domQuery(selector, element); |
| | | |
| | | if (!labelNode) { |
| | | return; |
| | | } |
| | | |
| | | labelNode.textContent = text; |
| | | } |
| | | |
| | | var panelNode = current.panel; |
| | | |
| | | forEach(current.tabs, function(tab) { |
| | | |
| | | var tabNode = domQuery('[data-tab=' + tab.id + ']', panelNode); |
| | | var tabLinkNode = domQuery('[data-tab-target=' + tab.id + ']', panelNode).parentNode; |
| | | |
| | | var tabVisible = false; |
| | | |
| | | forEach(tab.groups, function(group) { |
| | | |
| | | var groupVisible = false; |
| | | |
| | | var groupNode = domQuery('[data-group=' + group.id + ']', tabNode); |
| | | |
| | | forEach(group.entries, function(entry) { |
| | | |
| | | var entryNode = domQuery('[data-entry="' + entry.id + '"]', groupNode); |
| | | |
| | | var entryVisible = isEntryVisible(entry); |
| | | |
| | | groupVisible = groupVisible || entryVisible; |
| | | |
| | | toggleVisible(entryNode, entryVisible); |
| | | |
| | | var values = 'get' in entry ? entry.get(element, entryNode) : {}; |
| | | |
| | | if (values instanceof Array) { |
| | | var listEntryContainer = domQuery('[data-list-entry-container]', entryNode); |
| | | var existingElements = listEntryContainer.children || []; |
| | | |
| | | for (var i = 0; i < values.length; i++) { |
| | | var listValue = values[i]; |
| | | var listItemNode = existingElements[i]; |
| | | if (!listItemNode) { |
| | | listItemNode = domify(entry.createListEntryTemplate(listValue, i, listEntryContainer)); |
| | | listEntryContainer.appendChild(listItemNode); |
| | | } |
| | | domAttr(listItemNode, 'data-index', i); |
| | | |
| | | self._bindTemplate(element, entry, listValue, listItemNode, i); |
| | | } |
| | | |
| | | var entriesToRemove = existingElements.length - values.length; |
| | | |
| | | for (var j = 0; j < entriesToRemove; j++) { |
| | | // remove orphaned element |
| | | listEntryContainer.removeChild(listEntryContainer.lastChild); |
| | | } |
| | | |
| | | } else { |
| | | self._bindTemplate(element, entry, values, entryNode); |
| | | } |
| | | |
| | | // update conditionally visible elements |
| | | self.updateState(entry, entryNode); |
| | | self.validate(entry, values, entryNode); |
| | | |
| | | // remember initial state for later dirty checking |
| | | entry.oldValues = getFormControlValues(entryNode); |
| | | }); |
| | | |
| | | if (typeof group.label === 'function') { |
| | | updateLabel(groupNode, '.group-label', group.label(element, groupNode)); |
| | | } |
| | | |
| | | groupVisible = groupVisible && isGroupVisible(group, element, groupNode); |
| | | |
| | | tabVisible = tabVisible || groupVisible; |
| | | |
| | | toggleVisible(groupNode, groupVisible); |
| | | }); |
| | | |
| | | tabVisible = tabVisible && isTabVisible(tab, element); |
| | | |
| | | toggleVisible(tabNode, tabVisible); |
| | | toggleVisible(tabLinkNode, tabVisible); |
| | | |
| | | checkActiveTabVisibility(tabNode, tabVisible); |
| | | }); |
| | | |
| | | // inject elements id into header |
| | | updateLabel(panelNode, '[data-label-id]', getBusinessObject(element).id || ''); |
| | | }; |
| | | |
| | | PropertiesPanel.prototype._createPanel = function(element, tabs) { |
| | | var self = this; |
| | | |
| | | var panelNode = domify('<div class="bpp-properties"></div>'), |
| | | headerNode = domify('<div class="bpp-properties-header">' + |
| | | '<div class="label" data-label-id></div>' + |
| | | '<div class="search">' + |
| | | '<input type="search" placeholder="Search for property" />' + |
| | | '<button><span>Search</span></button>' + |
| | | '</div>' + |
| | | '</div>'), |
| | | tabBarNode = domify('<div class="bpp-properties-tab-bar"></div>'), |
| | | tabLinksNode = domify('<ul class="bpp-properties-tabs-links"></ul>'), |
| | | tabContainerNode = domify('<div class="bpp-properties-tabs-container"></div>'); |
| | | |
| | | panelNode.appendChild(headerNode); |
| | | |
| | | forEach(tabs, function(tab, tabIndex) { |
| | | |
| | | if (!tab.id) { |
| | | throw new Error('tab must have an id'); |
| | | } |
| | | |
| | | var tabNode = domify('<div class="bpp-properties-tab" data-tab="' + escapeHTML(tab.id) + '"></div>'), |
| | | tabLinkNode = domify('<li class="bpp-properties-tab-link">' + |
| | | '<a href data-tab-target="' + escapeHTML(tab.id) + '">' + escapeHTML(tab.label) + '</a>' + |
| | | '</li>'); |
| | | |
| | | var groups = tab.groups; |
| | | |
| | | forEach(groups, function(group) { |
| | | |
| | | if (!group.id) { |
| | | throw new Error('group must have an id'); |
| | | } |
| | | |
| | | var groupNode = domify('<div class="bpp-properties-group" data-group="' + escapeHTML(group.id) + '">' + |
| | | '<span class="group-toggle"></span>' + |
| | | '<span class="group-label">' + escapeHTML(group.label) + '</span>' + |
| | | '</div>'); |
| | | |
| | | // TODO(nre): use event delegation to handle that... |
| | | groupNode.querySelector('.group-toggle').addEventListener('click', function(evt) { |
| | | domClasses(groupNode).toggle('group-closed'); |
| | | evt.preventDefault(); |
| | | evt.stopPropagation(); |
| | | }); |
| | | groupNode.addEventListener('click', function(evt) { |
| | | if (!evt.defaultPrevented && domClasses(groupNode).has('group-closed')) { |
| | | domClasses(groupNode).remove('group-closed'); |
| | | } |
| | | }); |
| | | |
| | | forEach(group.entries, function(entry) { |
| | | |
| | | if (!entry.id) { |
| | | throw new Error('entry must have an id'); |
| | | } |
| | | |
| | | var html = entry.html; |
| | | |
| | | if (typeof html === 'string') { |
| | | html = domify(html); |
| | | } |
| | | |
| | | // unwrap jquery |
| | | if (html.get && html.constructor.prototype.jquery) { |
| | | html = html.get(0); |
| | | } |
| | | |
| | | var entryNode = domify('<div class="bpp-properties-entry" data-entry="' + escapeHTML(entry.id) + '"></div>'); |
| | | |
| | | forEach(entry.cssClasses || [], function(cssClass) { |
| | | domClasses(entryNode).add(cssClass); |
| | | }); |
| | | |
| | | entryNode.appendChild(html); |
| | | |
| | | groupNode.appendChild(entryNode); |
| | | |
| | | // update conditionally visible elements |
| | | self.updateState(entry, entryNode); |
| | | }); |
| | | |
| | | tabNode.appendChild(groupNode); |
| | | }); |
| | | |
| | | tabLinksNode.appendChild(tabLinkNode); |
| | | tabContainerNode.appendChild(tabNode); |
| | | }); |
| | | |
| | | tabBarNode.appendChild(tabLinksNode); |
| | | |
| | | panelNode.appendChild(tabBarNode); |
| | | panelNode.appendChild(tabContainerNode); |
| | | |
| | | return panelNode; |
| | | }; |
| | | |
| | | |
| | | |
| | | function setInputValue(node, value) { |
| | | |
| | | var contentEditable = isContentEditable(node); |
| | | |
| | | var oldValue = contentEditable ? node.innerText : node.value; |
| | | |
| | | var selection; |
| | | |
| | | // prevents input fields from having the value 'undefined' |
| | | if (value === undefined) { |
| | | value = ''; |
| | | } |
| | | |
| | | if (oldValue === value) { |
| | | return; |
| | | } |
| | | |
| | | // update selection on undo/redo |
| | | if (document.activeElement === node) { |
| | | selection = updateSelection(getSelection(node), oldValue, value); |
| | | } |
| | | |
| | | if (contentEditable) { |
| | | node.innerText = value; |
| | | } else { |
| | | node.value = value; |
| | | } |
| | | |
| | | if (selection) { |
| | | setSelection(node, selection); |
| | | } |
| | | } |
| | | |
| | | function setSelectValue(node, value) { |
| | | if (value !== undefined) { |
| | | node.value = value; |
| | | } |
| | | } |
| | | |
| | | function setToggleValue(node, value) { |
| | | var nodeValue = node.value; |
| | | |
| | | node.checked = (value === nodeValue) || (!domAttr(node, 'value') && value); |
| | | } |
| | | |
| | | function setTextValue(node, value) { |
| | | node.textContent = value; |
| | | } |
| | | |
| | | function getSelection(node) { |
| | | |
| | | return isContentEditable(node) ? getContentEditableSelection(node) : { |
| | | start: node.selectionStart, |
| | | end: node.selectionEnd |
| | | }; |
| | | } |
| | | |
| | | function getContentEditableSelection(node) { |
| | | |
| | | var selection = window.getSelection(); |
| | | |
| | | var focusNode = selection.focusNode, |
| | | focusOffset = selection.focusOffset, |
| | | anchorOffset = selection.anchorOffset; |
| | | |
| | | if (!focusNode) { |
| | | throw new Error('not selected'); |
| | | } |
| | | |
| | | // verify we have selection on the current element |
| | | if (!node.contains(focusNode)) { |
| | | throw new Error('not selected'); |
| | | } |
| | | |
| | | return { |
| | | start: Math.min(focusOffset, anchorOffset), |
| | | end: Math.max(focusOffset, anchorOffset) |
| | | }; |
| | | } |
| | | |
| | | function setSelection(node, selection) { |
| | | |
| | | if (isContentEditable(node)) { |
| | | setContentEditableSelection(node, selection); |
| | | } else { |
| | | node.selectionStart = selection.start; |
| | | node.selectionEnd = selection.end; |
| | | } |
| | | } |
| | | |
| | | function setContentEditableSelection(node, selection) { |
| | | |
| | | var focusNode, |
| | | domRange, |
| | | domSelection; |
| | | |
| | | focusNode = node.firstChild || node, |
| | | domRange = document.createRange(); |
| | | domRange.setStart(focusNode, selection.start); |
| | | domRange.setEnd(focusNode, selection.end); |
| | | |
| | | domSelection = window.getSelection(); |
| | | domSelection.removeAllRanges(); |
| | | domSelection.addRange(domRange); |
| | | } |
| | | |
| | | function isImplicitRoot(element) { |
| | | return element.id === '__implicitroot'; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domClear = require('min-dom').clear, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | forEach = require('lodash/forEach'), |
| | | domify = require('min-dom').domify, |
| | | Ids = require('ids').default; |
| | | |
| | | var SPACE_REGEX = /\s/; |
| | | |
| | | // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar |
| | | var QNAME_REGEX = /^([a-z][\w-.]*:)?[a-z_][\w-.]*$/i; |
| | | |
| | | // for ID validation as per BPMN Schema (QName - Namespace) |
| | | var ID_REGEX = /^[a-z_][\w-.]*$/i; |
| | | |
| | | var PLACEHOLDER_REGEX = /\$\{([^}]*)\}/g; |
| | | |
| | | var HTML_ESCAPE_MAP = { |
| | | '&': '&', |
| | | '<': '<', |
| | | '>': '>', |
| | | '"': '"', |
| | | '\'': ''' |
| | | }; |
| | | |
| | | function selectedOption(selectBox) { |
| | | if (selectBox.selectedIndex >= 0) { |
| | | return selectBox.options[selectBox.selectedIndex].value; |
| | | } |
| | | } |
| | | |
| | | module.exports.selectedOption = selectedOption; |
| | | |
| | | |
| | | function selectedType(elementSyntax, inputNode) { |
| | | var typeSelect = domQuery(elementSyntax, inputNode); |
| | | return selectedOption(typeSelect); |
| | | } |
| | | |
| | | module.exports.selectedType = selectedType; |
| | | |
| | | |
| | | /** |
| | | * Retrieve the root element the document this |
| | | * business object is contained in. |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function getRoot(businessObject) { |
| | | var parent = businessObject; |
| | | while (parent.$parent) { |
| | | parent = parent.$parent; |
| | | } |
| | | return parent; |
| | | } |
| | | |
| | | module.exports.getRoot = getRoot; |
| | | |
| | | |
| | | /** |
| | | * filters all elements in the list which have a given type. |
| | | * removes a new list |
| | | */ |
| | | function filterElementsByType(objectList, type) { |
| | | var list = objectList || []; |
| | | var result = []; |
| | | forEach(list, function(obj) { |
| | | if (is(obj, type)) { |
| | | result.push(obj); |
| | | } |
| | | }); |
| | | return result; |
| | | } |
| | | |
| | | module.exports.filterElementsByType = filterElementsByType; |
| | | |
| | | |
| | | function findRootElementsByType(businessObject, referencedType) { |
| | | var root = getRoot(businessObject); |
| | | |
| | | return filterElementsByType(root.rootElements, referencedType); |
| | | } |
| | | |
| | | module.exports.findRootElementsByType = findRootElementsByType; |
| | | |
| | | |
| | | function removeAllChildren(domElement) { |
| | | while (domElement.firstChild) { |
| | | domElement.removeChild(domElement.firstChild); |
| | | } |
| | | } |
| | | |
| | | module.exports.removeAllChildren = removeAllChildren; |
| | | |
| | | |
| | | /** |
| | | * adds an empty option to the list |
| | | */ |
| | | function addEmptyParameter(list) { |
| | | return list.push({ 'label': '', 'value': '', 'name': '' }); |
| | | } |
| | | |
| | | module.exports.addEmptyParameter = addEmptyParameter; |
| | | |
| | | |
| | | /** |
| | | * returns a list with all root elements for the given parameter 'referencedType' |
| | | */ |
| | | function refreshOptionsModel(businessObject, referencedType) { |
| | | var model = []; |
| | | var referableObjects = findRootElementsByType(businessObject, referencedType); |
| | | forEach(referableObjects, function(obj) { |
| | | model.push({ |
| | | label: (obj.name || '') + ' (id='+obj.id+')', |
| | | value: obj.id, |
| | | name: obj.name |
| | | }); |
| | | }); |
| | | return model; |
| | | } |
| | | |
| | | module.exports.refreshOptionsModel = refreshOptionsModel; |
| | | |
| | | |
| | | /** |
| | | * fills the drop down with options |
| | | */ |
| | | function updateOptionsDropDown(domSelector, businessObject, referencedType, entryNode) { |
| | | var options = refreshOptionsModel(businessObject, referencedType); |
| | | addEmptyParameter(options); |
| | | var selectBox = domQuery(domSelector, entryNode); |
| | | domClear(selectBox); |
| | | |
| | | forEach(options, function(option) { |
| | | var optionEntry = domify('<option value="' + escapeHTML(option.value) + '">' + escapeHTML(option.label) + '</option>'); |
| | | selectBox.appendChild(optionEntry); |
| | | }); |
| | | return options; |
| | | } |
| | | |
| | | module.exports.updateOptionsDropDown = updateOptionsDropDown; |
| | | |
| | | |
| | | /** |
| | | * checks whether the id value is valid |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * @param {String} idValue |
| | | * @param {Function} translate |
| | | * |
| | | * @return {String} error message |
| | | */ |
| | | function isIdValid(bo, idValue, translate) { |
| | | var assigned = bo.$model.ids.assigned(idValue); |
| | | |
| | | var idExists = assigned && assigned !== bo; |
| | | |
| | | if (!idValue || idExists) { |
| | | return translate('Element must have an unique id.'); |
| | | } |
| | | |
| | | return validateId(idValue, translate); |
| | | } |
| | | |
| | | module.exports.isIdValid = isIdValid; |
| | | |
| | | |
| | | function validateId(idValue, translate) { |
| | | |
| | | idValue = stripPlaceholders(idValue); |
| | | |
| | | if (containsSpace(idValue)) { |
| | | return translate('Id must not contain spaces.'); |
| | | } |
| | | |
| | | if (!ID_REGEX.test(idValue)) { |
| | | |
| | | if (QNAME_REGEX.test(idValue)) { |
| | | return translate('Id must not contain prefix.'); |
| | | } |
| | | |
| | | return translate('Id must be a valid QName.'); |
| | | } |
| | | } |
| | | |
| | | module.exports.validateId = validateId; |
| | | |
| | | |
| | | function containsSpace(value) { |
| | | return SPACE_REGEX.test(value); |
| | | } |
| | | |
| | | module.exports.containsSpace = containsSpace; |
| | | |
| | | |
| | | function stripPlaceholders(idValue) { |
| | | |
| | | // replace expression e.g. ${VERSION_TAG} |
| | | // use only the content between ${} |
| | | // for the REGEX check |
| | | return idValue.replace(PLACEHOLDER_REGEX, '$1'); |
| | | } |
| | | |
| | | /** |
| | | * generate a semantic id with given prefix |
| | | */ |
| | | function nextId(prefix) { |
| | | var ids = new Ids([32,32,1]); |
| | | |
| | | return ids.nextPrefixed(prefix); |
| | | } |
| | | |
| | | module.exports.nextId = nextId; |
| | | |
| | | |
| | | function triggerClickEvent(element) { |
| | | var evt; |
| | | var eventType = 'click'; |
| | | |
| | | if (document.createEvent) { |
| | | try { |
| | | // Chrome, Safari, Firefox |
| | | evt = new MouseEvent((eventType), { view: window, bubbles: true, cancelable: true }); |
| | | } catch (e) { |
| | | // IE 11, PhantomJS (wat!) |
| | | evt = document.createEvent('MouseEvent'); |
| | | |
| | | evt.initEvent((eventType), true, true); |
| | | } |
| | | return element.dispatchEvent(evt); |
| | | } else { |
| | | // Welcome IE |
| | | evt = document.createEventObject(); |
| | | |
| | | return element.fireEvent('on' + eventType, evt); |
| | | } |
| | | } |
| | | |
| | | module.exports.triggerClickEvent = triggerClickEvent; |
| | | |
| | | |
| | | function escapeHTML(str) { |
| | | str = '' + str; |
| | | |
| | | return str && str.replace(/[&<>"']/g, function(match) { |
| | | return HTML_ESCAPE_MAP[match]; |
| | | }); |
| | | } |
| | | |
| | | module.exports.escapeHTML = escapeHTML; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var elementHelper = require('../helper/ElementHelper'); |
| | | |
| | | /** |
| | | * A handler capable of creating a new element under a provided parent |
| | | * and updating / creating a reference to it in one atomic action. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function CreateAndReferenceElementHandler(elementRegistry, bpmnFactory) { |
| | | this._elementRegistry = elementRegistry; |
| | | this._bpmnFactory = bpmnFactory; |
| | | } |
| | | |
| | | CreateAndReferenceElementHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ]; |
| | | |
| | | module.exports = CreateAndReferenceElementHandler; |
| | | |
| | | |
| | | // api //////////////////// |
| | | |
| | | /** |
| | | * Creates a new element under a provided parent and updates / creates a reference to it in |
| | | * one atomic action. |
| | | * |
| | | * @method CreateAndReferenceElementHandler#execute |
| | | * |
| | | * @param {Object} context |
| | | * @param {djs.model.Base} context.element which is the context for the reference |
| | | * @param {moddle.referencingObject} context.referencingObject the object which creates the reference |
| | | * @param {String} context.referenceProperty the property of the referencingObject which makes the reference |
| | | * @param {moddle.newObject} context.newObject the new object to add |
| | | * @param {moddle.newObjectContainer} context.newObjectContainer the container for the new object |
| | | * |
| | | * @returns {Array<djs.mode.Base>} the updated element |
| | | */ |
| | | CreateAndReferenceElementHandler.prototype.execute = function(context) { |
| | | |
| | | var referencingObject = ensureNotNull(context.referencingObject, 'referencingObject'), |
| | | referenceProperty = ensureNotNull(context.referenceProperty, 'referenceProperty'), |
| | | newObject = ensureNotNull(context.newObject, 'newObject'), |
| | | newObjectContainer = ensureNotNull(context.newObjectContainer, 'newObjectContainer'), |
| | | newObjectParent = ensureNotNull(context.newObjectParent, 'newObjectParent'), |
| | | changed = [ context.element ]; // this will not change any diagram-js elements |
| | | |
| | | // create new object |
| | | var referencedObject = elementHelper |
| | | .createElement(newObject.type, newObject.properties, newObjectParent, this._bpmnFactory); |
| | | context.referencedObject = referencedObject; |
| | | |
| | | // add to containing list |
| | | newObjectContainer.push(referencedObject); |
| | | |
| | | // adjust reference attribute |
| | | context.previousReference = referencingObject[referenceProperty]; |
| | | referencingObject[referenceProperty] = referencedObject; |
| | | |
| | | context.changed = changed; |
| | | |
| | | // indicate changed on objects affected by the update |
| | | return changed; |
| | | }; |
| | | |
| | | /** |
| | | * Reverts the update |
| | | * |
| | | * @method CreateAndReferenceElementHandler#revert |
| | | * |
| | | * @param {Object} context |
| | | * |
| | | * @returns {djs.mode.Base} the updated element |
| | | */ |
| | | CreateAndReferenceElementHandler.prototype.revert = function(context) { |
| | | |
| | | var referencingObject = context.referencingObject, |
| | | referenceProperty = context.referenceProperty, |
| | | previousReference = context.previousReference, |
| | | referencedObject = context.referencedObject, |
| | | newObjectContainer = context.newObjectContainer; |
| | | |
| | | // reset reference |
| | | referencingObject.set(referenceProperty, previousReference); |
| | | |
| | | // remove new element |
| | | newObjectContainer.splice(newObjectContainer.indexOf(referencedObject), 1); |
| | | |
| | | return context.changed; |
| | | }; |
| | | |
| | | |
| | | |
| | | // helpers ////////////// |
| | | |
| | | function ensureNotNull(prop, name) { |
| | | if (!prop) { |
| | | throw new Error(name + ' required'); |
| | | } |
| | | return prop; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var elementHelper = require('../helper/ElementHelper'); |
| | | |
| | | /** |
| | | * A handler that implements a BPMN 2.0 property update |
| | | * for business objects which are not represented in the |
| | | * diagram. |
| | | * |
| | | * This is useful in the context of the properties panel in |
| | | * order to update child elements of elements visible in |
| | | * the diagram. |
| | | * |
| | | * Example: perform an update of a specific event definition |
| | | * of an intermediate event. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function CreateBusinessObjectListHandler(elementRegistry, bpmnFactory) { |
| | | this._elementRegistry = elementRegistry; |
| | | this._bpmnFactory = bpmnFactory; |
| | | } |
| | | |
| | | CreateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ]; |
| | | |
| | | module.exports = CreateBusinessObjectListHandler; |
| | | |
| | | function ensureNotNull(prop, name) { |
| | | if (!prop) { |
| | | throw new Error(name + ' required'); |
| | | } |
| | | return prop; |
| | | |
| | | } |
| | | function ensureList(prop, name) { |
| | | if (!prop || Object.prototype.toString.call(prop) !== '[object Array]') { |
| | | throw new Error(name + ' needs to be a list'); |
| | | } |
| | | return prop; |
| | | } |
| | | |
| | | // api ///////////////////////////////////////////// |
| | | |
| | | /** |
| | | * Creates a new element under a provided parent and updates / creates a reference to it in |
| | | * one atomic action. |
| | | * |
| | | * @method CreateBusinessObjectListHandler#execute |
| | | * |
| | | * @param {Object} context |
| | | * @param {djs.model.Base} context.element which is the context for the reference |
| | | * @param {moddle.referencingObject} context.referencingObject the object which creates the reference |
| | | * @param {String} context.referenceProperty the property of the referencingObject which makes the reference |
| | | * @param {moddle.newObject} context.newObject the new object to add |
| | | * @param {moddle.newObjectContainer} context.newObjectContainer the container for the new object |
| | | * |
| | | * @return {Array<djs.mode.Base>} the updated element |
| | | */ |
| | | CreateBusinessObjectListHandler.prototype.execute = function(context) { |
| | | |
| | | var currentObject = ensureNotNull(context.currentObject, 'currentObject'), |
| | | propertyName = ensureNotNull(context.propertyName, 'propertyName'), |
| | | newObjects = ensureList(context.newObjects, 'newObjects'), |
| | | changed = [ context.element ]; // this will not change any diagram-js elements |
| | | |
| | | |
| | | var childObjects = []; |
| | | var self = this; |
| | | |
| | | // create new array of business objects |
| | | forEach(newObjects, function(obj) { |
| | | var element = elementHelper.createElement(obj.type, obj.properties, currentObject, self._bpmnFactory); |
| | | |
| | | childObjects.push(element); |
| | | }); |
| | | context.childObject = childObjects; |
| | | |
| | | // adjust array reference in the parent business object |
| | | context.previousChilds = currentObject[propertyName]; |
| | | currentObject[propertyName] = childObjects; |
| | | |
| | | context.changed = changed; |
| | | |
| | | // indicate changed on objects affected by the update |
| | | return changed; |
| | | }; |
| | | |
| | | /** |
| | | * Reverts the update |
| | | * |
| | | * @method CreateBusinessObjectListHandler#revert |
| | | * |
| | | * @param {Object} context |
| | | * |
| | | * @return {djs.mode.Base} the updated element |
| | | */ |
| | | CreateBusinessObjectListHandler.prototype.revert = function(context) { |
| | | |
| | | var currentObject = context.currentObject, |
| | | propertyName = context.propertyName, |
| | | previousChilds = context.previousChilds; |
| | | |
| | | // remove new element |
| | | currentObject.set(propertyName, previousChilds); |
| | | |
| | | return context.changed; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | /** |
| | | * A handler that combines and executes multiple commands. |
| | | * |
| | | * All updates are bundled on the command stack and executed in one step. |
| | | * This also makes it possible to revert the changes in one step. |
| | | * |
| | | * Example use case: remove the camunda:formKey attribute and in addition |
| | | * add all form fields needed for the camunda:formData property. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function MultiCommandHandler(commandStack) { |
| | | this._commandStack = commandStack; |
| | | } |
| | | |
| | | MultiCommandHandler.$inject = [ 'commandStack' ]; |
| | | |
| | | module.exports = MultiCommandHandler; |
| | | |
| | | MultiCommandHandler.prototype.preExecute = function(context) { |
| | | |
| | | var commandStack = this._commandStack; |
| | | |
| | | forEach(context, function(command) { |
| | | commandStack.execute(command.cmd, command.context); |
| | | }); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var reduce = require('lodash/transform'), |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | keys = require('lodash/keys'), |
| | | forEach = require('lodash/forEach'); |
| | | |
| | | /** |
| | | * A handler that implements a BPMN 2.0 property update |
| | | * for business objects which are not represented in the |
| | | * diagram. |
| | | * |
| | | * This is useful in the context of the properties panel in |
| | | * order to update child elements of elements visible in |
| | | * the diagram. |
| | | * |
| | | * Example: perform an update of a specific event definition |
| | | * of an intermediate event. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function UpdateBusinessObjectHandler(elementRegistry) { |
| | | this._elementRegistry = elementRegistry; |
| | | } |
| | | |
| | | UpdateBusinessObjectHandler.$inject = [ 'elementRegistry' ]; |
| | | |
| | | module.exports = UpdateBusinessObjectHandler; |
| | | |
| | | /** |
| | | * returns the root element |
| | | */ |
| | | function getRoot(businessObject) { |
| | | var parent = businessObject; |
| | | while (parent.$parent) { |
| | | parent = parent.$parent; |
| | | } |
| | | return parent; |
| | | } |
| | | |
| | | function getProperties(businessObject, propertyNames) { |
| | | return reduce(propertyNames, function(result, key) { |
| | | result[key] = businessObject.get(key); |
| | | return result; |
| | | }, {}); |
| | | } |
| | | |
| | | |
| | | function setProperties(businessObject, properties) { |
| | | forEach(properties, function(value, key) { |
| | | businessObject.set(key, value); |
| | | }); |
| | | } |
| | | |
| | | |
| | | // api ///////////////////////////////////////////// |
| | | |
| | | /** |
| | | * Updates a business object with a list of new properties |
| | | * |
| | | * @method UpdateBusinessObjectHandler#execute |
| | | * |
| | | * @param {Object} context |
| | | * @param {djs.model.Base} context.element the element which has a child business object updated |
| | | * @param {moddle.businessObject} context.businessObject the businessObject to update |
| | | * @param {Object} context.properties a list of properties to set on the businessObject |
| | | * |
| | | * @return {Array<djs.mode.Base>} the updated element |
| | | */ |
| | | UpdateBusinessObjectHandler.prototype.execute = function(context) { |
| | | |
| | | var element = context.element, |
| | | businessObject = context.businessObject, |
| | | rootElements = getRoot(businessObject).rootElements, |
| | | referenceType = context.referenceType, |
| | | referenceProperty = context.referenceProperty, |
| | | changed = [ element ]; // this will not change any diagram-js elements |
| | | |
| | | if (!element) { |
| | | throw new Error('element required'); |
| | | } |
| | | |
| | | if (!businessObject) { |
| | | throw new Error('businessObject required'); |
| | | } |
| | | |
| | | var properties = context.properties, |
| | | oldProperties = context.oldProperties || getProperties(businessObject, keys(properties)); |
| | | |
| | | // check if there the update needs an external element for reference |
| | | if (typeof referenceType !== 'undefined' && typeof referenceProperty !== 'undefined') { |
| | | forEach(rootElements, function(rootElement) { |
| | | if (is(rootElement, referenceType)) { |
| | | if (rootElement.id === properties[referenceProperty]) { |
| | | properties[referenceProperty] = rootElement; |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // update properties |
| | | setProperties(businessObject, properties); |
| | | |
| | | // store old values |
| | | context.oldProperties = oldProperties; |
| | | context.changed = changed; |
| | | |
| | | // indicate changed on objects affected by the update |
| | | return changed; |
| | | }; |
| | | |
| | | /** |
| | | * Reverts the update |
| | | * |
| | | * @method UpdateBusinessObjectHandler#revert |
| | | * |
| | | * @param {Object} context |
| | | * |
| | | * @return {djs.mode.Base} the updated element |
| | | */ |
| | | UpdateBusinessObjectHandler.prototype.revert = function(context) { |
| | | |
| | | var oldProperties = context.oldProperties, |
| | | businessObject = context.businessObject; |
| | | |
| | | // update properties |
| | | setProperties(businessObject, oldProperties); |
| | | |
| | | return context.changed; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | /** |
| | | * A handler that implements a BPMN 2.0 property update |
| | | * for business object lists which are not represented in the |
| | | * diagram. |
| | | * |
| | | * This is useful in the context of the properties panel in |
| | | * order to update child elements of elements visible in |
| | | * the diagram. |
| | | * |
| | | * Example: perform an update of a specific event definition |
| | | * of an intermediate event. |
| | | * |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function UpdateBusinessObjectListHandler(elementRegistry, bpmnFactory) { |
| | | this._elementRegistry = elementRegistry; |
| | | this._bpmnFactory = bpmnFactory; |
| | | } |
| | | |
| | | UpdateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ]; |
| | | |
| | | module.exports = UpdateBusinessObjectListHandler; |
| | | |
| | | function ensureNotNull(prop, name) { |
| | | if (!prop) { |
| | | throw new Error(name + 'required'); |
| | | } |
| | | return prop; |
| | | } |
| | | |
| | | // api ///////////////////////////////////////////// |
| | | |
| | | /** |
| | | * Updates a element under a provided parent. |
| | | */ |
| | | UpdateBusinessObjectListHandler.prototype.execute = function(context) { |
| | | |
| | | var currentObject = ensureNotNull(context.currentObject, 'currentObject'), |
| | | propertyName = ensureNotNull(context.propertyName, 'propertyName'), |
| | | updatedObjectList = context.updatedObjectList, |
| | | objectsToRemove = context.objectsToRemove || [], |
| | | objectsToAdd = context.objectsToAdd || [], |
| | | changed = [ context.element], // this will not change any diagram-js elements |
| | | referencePropertyName; |
| | | |
| | | if (context.referencePropertyName) { |
| | | referencePropertyName = context.referencePropertyName; |
| | | } |
| | | |
| | | var objectList = currentObject[propertyName]; |
| | | // adjust array reference in the parent business object |
| | | context.previousList = currentObject[propertyName]; |
| | | |
| | | if (updatedObjectList) { |
| | | currentObject[propertyName] = updatedObjectList; |
| | | } else { |
| | | var listCopy = []; |
| | | // remove all objects which should be removed |
| | | forEach(objectList, function(object) { |
| | | if (objectsToRemove.indexOf(object) == -1) { |
| | | listCopy.push(object); |
| | | } |
| | | }); |
| | | // add all objects which should be added |
| | | listCopy = listCopy.concat(objectsToAdd); |
| | | |
| | | // set property to new list |
| | | if (listCopy.length > 0 || !referencePropertyName) { |
| | | |
| | | // as long as there are elements in the list update the list |
| | | currentObject[propertyName] = listCopy; |
| | | } else if (referencePropertyName) { |
| | | |
| | | // remove the list when it is empty |
| | | var parentObject = currentObject.$parent; |
| | | parentObject.set(referencePropertyName, undefined); |
| | | } |
| | | } |
| | | |
| | | context.changed = changed; |
| | | |
| | | // indicate changed on objects affected by the update |
| | | return changed; |
| | | }; |
| | | |
| | | /** |
| | | * Reverts the update |
| | | * |
| | | * @method CreateBusinessObjectListHandler#revert |
| | | * |
| | | * @param {Object} context |
| | | * |
| | | * @return {djs.mode.Base} the updated element |
| | | */ |
| | | UpdateBusinessObjectListHandler.prototype.revert = function(context) { |
| | | |
| | | var currentObject = context.currentObject, |
| | | propertyName = context.propertyName, |
| | | previousList = context.previousList, |
| | | parentObject = currentObject.$parent; |
| | | |
| | | if (context.referencePropertyName) { |
| | | parentObject.set(context.referencePropertyName, currentObject); |
| | | } |
| | | |
| | | // remove new element |
| | | currentObject.set(propertyName, previousList); |
| | | |
| | | return context.changed; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var HANDLERS = { |
| | | 'properties-panel.update-businessobject': require('./UpdateBusinessObjectHandler'), |
| | | 'properties-panel.create-and-reference': require('./CreateAndReferenceHandler'), |
| | | 'properties-panel.create-businessobject-list': require('./CreateBusinessObjectListHandler'), |
| | | 'properties-panel.update-businessobject-list': require('./UpdateBusinessObjectListHandler'), |
| | | 'properties-panel.multi-command-executor': require('./MultiCommandHandler') |
| | | }; |
| | | |
| | | |
| | | function CommandInitializer(eventBus, commandStack) { |
| | | |
| | | eventBus.on('diagram.init', function() { |
| | | forEach(HANDLERS, function(handler, id) { |
| | | commandStack.registerHandler(id, handler); |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | CommandInitializer.$inject = [ 'eventBus', 'commandStack' ]; |
| | | |
| | | module.exports = { |
| | | __init__: [ CommandInitializer ] |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | cmdHelper = require('../helper/CmdHelper'), |
| | | escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | |
| | | var checkbox = function(options, defaultParameters) { |
| | | var resource = defaultParameters, |
| | | id = resource.id, |
| | | label = options.label || id, |
| | | canBeDisabled = !!options.disabled && typeof options.disabled === 'function', |
| | | canBeHidden = !!options.hidden && typeof options.hidden === 'function', |
| | | description = options.description; |
| | | |
| | | resource.html = |
| | | '<input id="activiti-' + escapeHTML(id) + '" ' + |
| | | 'type="checkbox" ' + |
| | | 'name="' + escapeHTML(options.modelProperty) + '" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled"' : '') + |
| | | (canBeHidden ? 'data-show="isHidden"' : '') + |
| | | ' />' + |
| | | '<label for="activiti-' + escapeHTML(id) + '" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled"' : '') + |
| | | (canBeHidden ? 'data-show="isHidden"' : '') + |
| | | '>' + escapeHTML(label) + '</label>'; |
| | | |
| | | // add description below checkbox entry field |
| | | if (description) { |
| | | resource.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | resource.get = function(element) { |
| | | var bo = getBusinessObject(element), |
| | | res = {}; |
| | | |
| | | res[options.modelProperty] = bo.get(options.modelProperty); |
| | | |
| | | return res; |
| | | }; |
| | | |
| | | resource.set = function(element, values) { |
| | | var res = {}; |
| | | |
| | | res[options.modelProperty] = !!values[options.modelProperty]; |
| | | |
| | | return cmdHelper.updateProperties(element, res); |
| | | }; |
| | | |
| | | if (typeof options.set === 'function') { |
| | | resource.set = options.set; |
| | | } |
| | | |
| | | if (typeof options.get === 'function') { |
| | | resource.get = options.get; |
| | | } |
| | | |
| | | if (canBeDisabled) { |
| | | resource.isDisabled = function() { |
| | | return options.disabled.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | if (canBeHidden) { |
| | | resource.isHidden = function() { |
| | | return !options.hidden.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | resource.cssClasses = ['bpp-checkbox']; |
| | | |
| | | return resource; |
| | | }; |
| | | |
| | | module.exports = checkbox; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'), |
| | | find = require('lodash/find'); |
| | | |
| | | var domQuery = require('min-dom').query; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var selectEntryFactory = require('./SelectEntryFactory'), |
| | | entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | |
| | | /** |
| | | * The combo box is a special implementation of the select entry and adds the option 'custom' to the |
| | | * select box. If 'custom' is selected, an additional text input field is shown which allows to define |
| | | * a custom value. |
| | | * |
| | | * @param {Object} options |
| | | * @param {string} options.id |
| | | * @param {string} options.label |
| | | * @param {Array<Object>} options.selectOptions list of name/value pairs |
| | | * @param {string} options.modelProperty |
| | | * @param {function} options.get |
| | | * @param {function} options.set |
| | | * @param {string} [options.customValue] custom select option value (default: 'custom') |
| | | * @param {string} [options.customName] custom select option name visible in the select box (default: 'custom') |
| | | * |
| | | * @return {Object} |
| | | */ |
| | | var comboBox = function(options) { |
| | | |
| | | var selectOptions = options.selectOptions, |
| | | modelProperty = options.modelProperty, |
| | | customValue = options.customValue || 'custom', |
| | | customName = options.customName || 'custom ' + modelProperty, |
| | | description = options.description; |
| | | |
| | | // check if a value is not a built in value |
| | | var isCustomValue = function(value) { |
| | | if (typeof value[modelProperty] === 'undefined') { |
| | | return false; |
| | | } |
| | | |
| | | var isCustom = !find(selectOptions, function(option) { |
| | | return value[modelProperty] === option.value; |
| | | }); |
| | | |
| | | return isCustom; |
| | | }; |
| | | |
| | | var comboOptions = assign({}, options); |
| | | |
| | | // true if the selected value in the select box is customValue |
| | | comboOptions.showCustomInput = function(element, node) { |
| | | var selectBox = domQuery('[data-entry="'+ options.id +'"] select', node.parentNode); |
| | | |
| | | if (selectBox) { |
| | | return selectBox.value === customValue; |
| | | } |
| | | |
| | | return false; |
| | | }; |
| | | |
| | | comboOptions.get = function(element, node) { |
| | | var value = options.get(element, node); |
| | | |
| | | var modifiedValues = {}; |
| | | |
| | | if (!isCustomValue(value)) { |
| | | modifiedValues[modelProperty] = value[modelProperty] || ''; |
| | | |
| | | return modifiedValues; |
| | | } |
| | | |
| | | modifiedValues[modelProperty] = customValue; |
| | | modifiedValues['custom-'+modelProperty] = value[modelProperty]; |
| | | |
| | | return modifiedValues; |
| | | }; |
| | | |
| | | comboOptions.set = function(element, values, node) { |
| | | var modifiedValues = {}; |
| | | |
| | | // if the custom select option has been selected |
| | | // take the value from the text input field |
| | | if (values[modelProperty] === customValue) { |
| | | modifiedValues[modelProperty] = values['custom-' + modelProperty] || ''; |
| | | } |
| | | else if (options.emptyParameter && values[modelProperty] === '') { |
| | | modifiedValues[modelProperty] = undefined; |
| | | } else { |
| | | modifiedValues[modelProperty] = values[modelProperty]; |
| | | } |
| | | return options.set(element, modifiedValues, node); |
| | | }; |
| | | |
| | | comboOptions.selectOptions.push({ name: customName, value: customValue }); |
| | | |
| | | var comboBoxEntry = assign({}, selectEntryFactory(comboOptions, comboOptions)); |
| | | |
| | | comboBoxEntry.html += '<div class="bpp-field-wrapper bpp-combo-input" ' + |
| | | 'data-show="showCustomInput"' + |
| | | '>' + |
| | | '<input id="activiti-' + escapeHTML(options.id) + '-input" type="text" name="custom-' + |
| | | escapeHTML(modelProperty) + '" ' + |
| | | ' />' + |
| | | '</div>'; |
| | | |
| | | // add description below combo box entry field |
| | | if (description) { |
| | | comboBoxEntry.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | return comboBoxEntry; |
| | | }; |
| | | |
| | | module.exports = comboBox; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | // input entities |
| | | var textInputField = require('./TextInputEntryFactory'), |
| | | checkboxField = require('./CheckboxEntryFactory'), |
| | | selectBoxField = require('./SelectEntryFactory'), |
| | | comboBoxField = require('./ComboEntryFactory'), |
| | | textBoxField = require('./TextBoxEntryFactory'), |
| | | validationAwareTextInputField = require('./ValidationAwareTextInput'), |
| | | tableField = require('./TableEntryFactory'), |
| | | labelEntry = require('./LabelFactory'), |
| | | link = require('./LinkEntryFactory'); |
| | | |
| | | var cmdHelper = require('../helper/CmdHelper'); |
| | | |
| | | // helpers //////////////////////////////////////// |
| | | |
| | | function ensureNotNull(prop) { |
| | | if (!prop) { |
| | | throw new Error(prop + ' must be set.'); |
| | | } |
| | | |
| | | return prop; |
| | | } |
| | | |
| | | /** |
| | | * sets the default parameters which are needed to create an entry |
| | | * |
| | | * @param options |
| | | * @returns {{id: *, description: (*|string), get: (*|Function), set: (*|Function), |
| | | * validate: (*|Function), html: string}} |
| | | */ |
| | | var setDefaultParameters = function(options) { |
| | | |
| | | // default method to fetch the current value of the input field |
| | | var defaultGet = function(element) { |
| | | var bo = getBusinessObject(element), |
| | | res = {}, |
| | | prop = ensureNotNull(options.modelProperty); |
| | | res[prop] = bo.get(prop); |
| | | |
| | | return res; |
| | | }; |
| | | |
| | | // default method to set a new value to the input field |
| | | var defaultSet = function(element, values) { |
| | | var res = {}, |
| | | prop = ensureNotNull(options.modelProperty); |
| | | if (values[prop] !== '') { |
| | | res[prop] = values[prop]; |
| | | } else { |
| | | res[prop] = undefined; |
| | | } |
| | | |
| | | return cmdHelper.updateProperties(element, res); |
| | | }; |
| | | |
| | | // default validation method |
| | | var defaultValidate = function() { |
| | | return {}; |
| | | }; |
| | | |
| | | return { |
| | | id : options.id, |
| | | description : (options.description || ''), |
| | | get : (options.get || defaultGet), |
| | | set : (options.set || defaultSet), |
| | | validate : (options.validate || defaultValidate), |
| | | html: '' |
| | | }; |
| | | }; |
| | | |
| | | function EntryFactory() { |
| | | |
| | | } |
| | | |
| | | /** |
| | | * Generates an text input entry object for a property panel. |
| | | * options are: |
| | | * - id: id of the entry - String |
| | | * |
| | | * - description: description of the property - String |
| | | * |
| | | * - label: label for the input field - String |
| | | * |
| | | * - set: setter method - Function |
| | | * |
| | | * - get: getter method - Function |
| | | * |
| | | * - validate: validation mehtod - Function |
| | | * |
| | | * - modelProperty: name of the model property - String |
| | | * |
| | | * - buttonAction: Object which contains the following properties: - Object |
| | | * ---- name: name of the [data-action] callback - String |
| | | * ---- method: callback function for [data-action] - Function |
| | | * |
| | | * - buttonShow: Object which contains the following properties: - Object |
| | | * ---- name: name of the [data-show] callback - String |
| | | * ---- method: callback function for [data-show] - Function |
| | | * |
| | | * @param options |
| | | * @returns the propertyPanel entry resource object |
| | | */ |
| | | EntryFactory.textField = function(options) { |
| | | return textInputField(options, setDefaultParameters(options)); |
| | | }; |
| | | |
| | | EntryFactory.validationAwareTextField = function(options) { |
| | | return validationAwareTextInputField(options, setDefaultParameters(options)); |
| | | }; |
| | | |
| | | /** |
| | | * Generates a checkbox input entry object for a property panel. |
| | | * options are: |
| | | * - id: id of the entry - String |
| | | * |
| | | * - description: description of the property - String |
| | | * |
| | | * - label: label for the input field - String |
| | | * |
| | | * - set: setter method - Function |
| | | * |
| | | * - get: getter method - Function |
| | | * |
| | | * - validate: validation method - Function |
| | | * |
| | | * - modelProperty: name of the model property - String |
| | | * |
| | | * @param options |
| | | * @returns the propertyPanel entry resource object |
| | | */ |
| | | EntryFactory.checkbox = function(options) { |
| | | return checkboxField(options, setDefaultParameters(options)); |
| | | }; |
| | | |
| | | EntryFactory.textBox = function(options) { |
| | | return textBoxField(options, setDefaultParameters(options)); |
| | | }; |
| | | |
| | | EntryFactory.selectBox = function(options) { |
| | | return selectBoxField(options, setDefaultParameters(options)); |
| | | }; |
| | | |
| | | EntryFactory.comboBox = function(options) { |
| | | return comboBoxField(options); |
| | | }; |
| | | |
| | | EntryFactory.table = function(options) { |
| | | return tableField(options); |
| | | }; |
| | | |
| | | EntryFactory.label = function(options) { |
| | | return labelEntry(options); |
| | | }; |
| | | |
| | | EntryFactory.link = function(options) { |
| | | return link(options); |
| | | }; |
| | | |
| | | module.exports = EntryFactory; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | /** |
| | | * Create a linkified and HTML escaped entry field description. |
| | | * |
| | | * As a special feature, this description may contain both markdown |
| | | * and plain <a href> links. |
| | | * |
| | | * @param {String} description |
| | | */ |
| | | module.exports = function entryFieldDescription(description) { |
| | | |
| | | // we tokenize the description to extract text, HTML and markdown links |
| | | // text and links are handled seperately |
| | | |
| | | var escaped = []; |
| | | |
| | | // match markdown [{TEXT}]({URL}) and HTML links <a href="{URL}">{TEXT}</a> |
| | | var pattern = /(?:\[([^\]]+)\]\((https?:\/\/[^"<>\]]+)\))|(?:<a href="(https?:\/\/[^"<>]+)">([^<]*)<\/a>)/gi; |
| | | |
| | | var index = 0; |
| | | var match; |
| | | var link, text; |
| | | |
| | | while ((match = pattern.exec(description))) { |
| | | |
| | | // escape + insert text before match |
| | | if (match.index > index) { |
| | | escaped.push(escapeHTML(description.substring(index, match.index))); |
| | | } |
| | | |
| | | link = match[2] || match[3]; |
| | | text = match[1] || match[4]; |
| | | |
| | | // insert safe link |
| | | escaped.push('<a href="' + link + '" target="_blank">' + escapeHTML(text) + '</a>'); |
| | | |
| | | index = match.index + match[0].length; |
| | | } |
| | | |
| | | // escape and insert text after last match |
| | | if (index < description.length) { |
| | | escaped.push(escapeHTML(description.substring(index))); |
| | | } |
| | | |
| | | return '<div class="bpp-field-description">' + escaped.join('') + '</div>'; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | /** |
| | | * The label factory provides a label entry. For the label text |
| | | * it expects either a string provided by the options.labelText |
| | | * parameter or it could be generated programmatically using a |
| | | * function passed as the options.get parameter. |
| | | * |
| | | * @param {Object} options |
| | | * @param {string} options.id |
| | | * @param {string} [options.labelText] |
| | | * @param {Function} [options.get] |
| | | * @param {Function} [options.showLabel] |
| | | * @param {Boolean} [options.divider] adds a divider at the top of the label if true; default: false |
| | | */ |
| | | var label = function(options) { |
| | | return { |
| | | id: options.id, |
| | | html: '<label data-value="label" ' + |
| | | 'data-show="showLabel" ' + |
| | | 'class="entry-label' + (options.divider ? ' divider' : '') + '">' + |
| | | '</label>', |
| | | get: function(element, node) { |
| | | if (typeof options.get === 'function') { |
| | | return options.get(element, node); |
| | | } |
| | | return { label: options.labelText }; |
| | | }, |
| | | showLabel: function(element, node) { |
| | | if (typeof options.showLabel === 'function') { |
| | | return options.showLabel(element, node); |
| | | } |
| | | return true; |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | module.exports = label; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | var bind = require('lodash/bind'); |
| | | |
| | | /** |
| | | * An entry that renders a clickable link. |
| | | * |
| | | * A passed {@link options#handleClick} handler is responsible |
| | | * to process the click. |
| | | * |
| | | * The link may be conditionally shown or hidden. This can be |
| | | * controlled via the {@link options.showLink}. |
| | | * |
| | | * @param {Object} options |
| | | * @param {String} options.id |
| | | * @param {String} [options.label] |
| | | * @param {Function} options.handleClick |
| | | * @param {Function} [options.showLink] returning false to hide link |
| | | * @param {String} [options.description] |
| | | * |
| | | * @example |
| | | * |
| | | * var linkEntry = link({ |
| | | * id: 'foo', |
| | | * description: 'Some Description', |
| | | * handleClick: function(element, node, event) { ... }, |
| | | * showLink: function(element, node) { ... } |
| | | * }); |
| | | * |
| | | * @return {Entry} the newly created entry |
| | | */ |
| | | function link(options) { |
| | | |
| | | var id = options.id, |
| | | label = options.label || id, |
| | | showLink = options.showLink, |
| | | handleClick = options.handleClick, |
| | | description = options.description; |
| | | |
| | | if (showLink && typeof showLink !== 'function') { |
| | | throw new Error('options.showLink must be a function'); |
| | | } |
| | | |
| | | if (typeof handleClick !== 'function') { |
| | | throw new Error('options.handleClick must be a function'); |
| | | } |
| | | |
| | | var resource = { |
| | | id: id |
| | | }; |
| | | |
| | | resource.html = |
| | | '<a data-action="handleClick" ' + |
| | | (showLink ? 'data-show="showLink" ' : '') + |
| | | 'class="bpp-entry-link' + (options.cssClasses ? ' ' + escapeHTML(options.cssClasses) : '') + |
| | | '">' + escapeHTML(label) + '</a>'; |
| | | |
| | | // add description below link entry field |
| | | if (description) { |
| | | resource.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | resource.handleClick = bind(handleClick, resource); |
| | | |
| | | if (typeof showLink === 'function') { |
| | | resource.showLink = function() { |
| | | return showLink.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | return resource; |
| | | } |
| | | |
| | | module.exports = link; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var domify = require('min-dom').domify; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | |
| | | var isList = function(list) { |
| | | return !(!list || Object.prototype.toString.call(list) !== '[object Array]'); |
| | | }; |
| | | |
| | | var addEmptyParameter = function(list) { |
| | | return list.concat([ { name: '', value: '' } ]); |
| | | }; |
| | | |
| | | var createOption = function(option) { |
| | | return '<option value="' + option.value + '">' + option.name + '</option>'; |
| | | }; |
| | | |
| | | /** |
| | | * @param {Object} options |
| | | * @param {string} options.id |
| | | * @param {string} [options.label] |
| | | * @param {Array<Object>} options.selectOptions |
| | | * @param {string} options.modelProperty |
| | | * @param {boolean} options.emptyParameter |
| | | * @param {function} options.disabled |
| | | * @param {function} options.hidden |
| | | * @param {Object} defaultParameters |
| | | * |
| | | * @return {Object} |
| | | */ |
| | | var selectbox = function(options, defaultParameters) { |
| | | var resource = defaultParameters, |
| | | label = options.label || resource.id, |
| | | selectOptions = options.selectOptions || [ { name: '', value: '' } ], |
| | | modelProperty = options.modelProperty, |
| | | emptyParameter = options.emptyParameter, |
| | | canBeDisabled = !!options.disabled && typeof options.disabled === 'function', |
| | | canBeHidden = !!options.hidden && typeof options.hidden === 'function', |
| | | description = options.description; |
| | | |
| | | |
| | | if (emptyParameter) { |
| | | selectOptions = addEmptyParameter(selectOptions); |
| | | } |
| | | |
| | | |
| | | resource.html = |
| | | '<label for="activiti-' + escapeHTML(resource.id) + '"' + |
| | | (canBeDisabled ? 'data-disable="isDisabled" ' : '') + |
| | | (canBeHidden ? 'data-show="isHidden" ' : '') + |
| | | '>' + escapeHTML(label) + '</label>' + |
| | | '<select id="activiti-' + escapeHTML(resource.id) + '-select" name="' + |
| | | escapeHTML(modelProperty) + '"' + |
| | | (canBeDisabled ? 'data-disable="isDisabled" ' : '') + |
| | | (canBeHidden ? 'data-show="isHidden" ' : '') + |
| | | ' data-value>'; |
| | | |
| | | if (isList(selectOptions)) { |
| | | forEach(selectOptions, function(option) { |
| | | resource.html += '<option value="' + escapeHTML(option.value) + '">' + |
| | | (option.name ? escapeHTML(option.name) : '') + '</option>'; |
| | | }); |
| | | } |
| | | |
| | | resource.html += '</select>'; |
| | | |
| | | // add description below select box entry field |
| | | if (description && typeof options.showCustomInput !== 'function') { |
| | | resource.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | /** |
| | | * Fill the select box options dynamically. |
| | | * |
| | | * Calls the defined function #selectOptions in the entry to get the |
| | | * values for the options and set the value to the inputNode. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {HTMLElement} entryNode |
| | | * @param {EntryDescriptor} inputNode |
| | | * @param {Object} inputName |
| | | * @param {Object} newValue |
| | | */ |
| | | resource.setControlValue = function(element, entryNode, inputNode, inputName, newValue) { |
| | | if (typeof selectOptions === 'function') { |
| | | |
| | | var options = selectOptions(element, inputNode); |
| | | |
| | | if (options) { |
| | | |
| | | // remove existing options |
| | | while (inputNode.firstChild) { |
| | | inputNode.removeChild(inputNode.firstChild); |
| | | } |
| | | |
| | | // add options |
| | | forEach(options, function(option) { |
| | | var template = domify(createOption(option)); |
| | | |
| | | inputNode.appendChild(template); |
| | | }); |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | // set select value |
| | | if (newValue !== undefined) { |
| | | inputNode.value = newValue; |
| | | } |
| | | |
| | | }; |
| | | |
| | | if (canBeDisabled) { |
| | | resource.isDisabled = function() { |
| | | return options.disabled.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | if (canBeHidden) { |
| | | resource.isHidden = function() { |
| | | return !options.hidden.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | resource.cssClasses = ['bpp-dropdown']; |
| | | |
| | | return resource; |
| | | }; |
| | | |
| | | module.exports = selectbox; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var cmdHelper = require('../helper/CmdHelper'); |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domAttr = require('min-dom').attr, |
| | | domClosest = require('min-dom').closest; |
| | | |
| | | var filter = require('lodash/filter'), |
| | | forEach = require('lodash/forEach'), |
| | | keys = require('lodash/keys'); |
| | | |
| | | var domify = require('min-dom').domify; |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | var updateSelection = require('selection-update'); |
| | | |
| | | var TABLE_ROW_DIV_SNIPPET = '<div class="bpp-field-wrapper bpp-table-row">'; |
| | | var DELETE_ROW_BUTTON_SNIPPET = '<button class="clear" data-action="deleteElement">' + |
| | | '<span>X</span>' + |
| | | '</button>'; |
| | | |
| | | function createInputRowTemplate(properties, canRemove) { |
| | | var template = TABLE_ROW_DIV_SNIPPET; |
| | | template += createInputTemplate(properties, canRemove); |
| | | template += canRemove ? DELETE_ROW_BUTTON_SNIPPET : ''; |
| | | template += '</div>'; |
| | | |
| | | return template; |
| | | } |
| | | |
| | | function createInputTemplate(properties, canRemove) { |
| | | var columns = properties.length; |
| | | var template = ''; |
| | | forEach(properties, function(prop) { |
| | | template += '<input class="bpp-table-row-columns-' + columns + ' ' + |
| | | (canRemove ? 'bpp-table-row-removable' : '') + '" ' + |
| | | 'id="activiti-table-row-cell-input-value" ' + |
| | | 'type="text" ' + |
| | | 'name="' + escapeHTML(prop) + '" />'; |
| | | }); |
| | | return template; |
| | | } |
| | | |
| | | function createLabelRowTemplate(labels) { |
| | | var template = TABLE_ROW_DIV_SNIPPET; |
| | | template += createLabelTemplate(labels); |
| | | template += '</div>'; |
| | | |
| | | return template; |
| | | } |
| | | |
| | | function createLabelTemplate(labels) { |
| | | var columns = labels.length; |
| | | var template = ''; |
| | | forEach(labels, function(label) { |
| | | template += '<label class="bpp-table-row-columns-' + columns + '">' + escapeHTML(label) + '</label>'; |
| | | }); |
| | | return template; |
| | | } |
| | | |
| | | function pick(elements, properties) { |
| | | return (elements || []).map(function(elem) { |
| | | var newElement = {}; |
| | | forEach(properties, function(prop) { |
| | | newElement[prop] = elem[prop] || ''; |
| | | }); |
| | | return newElement; |
| | | }); |
| | | } |
| | | |
| | | function diff(element, node, values, oldValues, editable) { |
| | | return filter(values, function(value, idx) { |
| | | return !valueEqual(element, node, value, oldValues[idx], editable, idx); |
| | | }); |
| | | } |
| | | |
| | | function valueEqual(element, node, value, oldValue, editable, idx) { |
| | | if (value && !oldValue) { |
| | | return false; |
| | | } |
| | | var allKeys = keys(value).concat(keys(oldValue)); |
| | | |
| | | return allKeys.every(function(key) { |
| | | var n = value[key] || undefined; |
| | | var o = oldValue[key] || undefined; |
| | | return !editable(element, node, key, idx) || n === o; |
| | | }); |
| | | } |
| | | |
| | | function getEntryNode(node) { |
| | | return domClosest(node, '[data-entry]', true); |
| | | } |
| | | |
| | | function getContainer(node) { |
| | | return domQuery('div[data-list-entry-container]', node); |
| | | } |
| | | |
| | | function getSelection(node) { |
| | | return { |
| | | start: node.selectionStart, |
| | | end: node.selectionEnd |
| | | }; |
| | | } |
| | | |
| | | function setSelection(node, selection) { |
| | | node.selectionStart = selection.start; |
| | | node.selectionEnd = selection.end; |
| | | } |
| | | |
| | | /** |
| | | * @param {Object} options |
| | | * @param {string} options.id |
| | | * @param {string} options.description |
| | | * @param {Array<string>} options.modelProperties |
| | | * @param {Array<string>} options.labels |
| | | * @param {Function} options.getElements - this callback function must return a list of business object items |
| | | * @param {Function} options.removeElement |
| | | * @param {Function} options.addElement |
| | | * @param {Function} options.updateElement |
| | | * @param {Function} options.editable |
| | | * @param {Function} options.setControlValue |
| | | * @param {Function} options.show |
| | | * |
| | | * @return {Object} |
| | | */ |
| | | module.exports = function(options) { |
| | | |
| | | var id = options.id, |
| | | modelProperties = options.modelProperties, |
| | | labels = options.labels, |
| | | description = options.description; |
| | | |
| | | var labelRow = createLabelRowTemplate(labels); |
| | | |
| | | var getElements = options.getElements; |
| | | |
| | | var removeElement = options.removeElement, |
| | | canRemove = typeof removeElement === 'function'; |
| | | |
| | | var addElement = options.addElement, |
| | | canAdd = typeof addElement === 'function', |
| | | addLabel = options.addLabel || 'Add Value'; |
| | | |
| | | var updateElement = options.updateElement, |
| | | canUpdate = typeof updateElement === 'function'; |
| | | |
| | | var editable = options.editable || function() { return true; }, |
| | | setControlValue = options.setControlValue; |
| | | |
| | | var show = options.show, |
| | | canBeShown = typeof show === 'function'; |
| | | |
| | | var elements = function(element, node) { |
| | | return pick(getElements(element, node), modelProperties); |
| | | }; |
| | | |
| | | var factory = { |
| | | id: id, |
| | | html: (canAdd ? |
| | | '<div class="bpp-table-add-row" ' + (canBeShown ? 'data-show="show"' : '') + '>' + |
| | | '<label>' + escapeHTML(addLabel) + '</label>' + |
| | | '<button class="add" data-action="addElement"><span>+</span></button>' + |
| | | '</div>' : '') + |
| | | '<div class="bpp-table" data-show="showTable">' + |
| | | '<div class="bpp-field-wrapper bpp-table-row">' + |
| | | labelRow + |
| | | '</div>' + |
| | | '<div data-list-entry-container>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | |
| | | // add description below table entry field |
| | | (description ? entryFieldDescription(description) : ''), |
| | | |
| | | get: function(element, node) { |
| | | var boElements = elements(element, node, this.__invalidValues); |
| | | |
| | | var invalidValues = this.__invalidValues; |
| | | |
| | | delete this.__invalidValues; |
| | | |
| | | forEach(invalidValues, function(value, idx) { |
| | | var element = boElements[idx]; |
| | | |
| | | forEach(modelProperties, function(prop) { |
| | | element[prop] = value[prop]; |
| | | }); |
| | | }); |
| | | |
| | | return boElements; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var action = this.__action || {}; |
| | | delete this.__action; |
| | | |
| | | if (action.id === 'delete-element') { |
| | | return removeElement(element, node, action.idx); |
| | | } |
| | | else if (action.id === 'add-element') { |
| | | return addElement(element, node); |
| | | } |
| | | else if (canUpdate) { |
| | | var commands = [], |
| | | valuesToValidate = values; |
| | | |
| | | if (typeof options.validate !== 'function') { |
| | | valuesToValidate = diff(element, node, values, elements(element, node), editable); |
| | | } |
| | | |
| | | var self = this; |
| | | |
| | | forEach(valuesToValidate, function(value) { |
| | | var validationError, |
| | | idx = values.indexOf(value); |
| | | |
| | | if (typeof options.validate === 'function') { |
| | | validationError = options.validate(element, value, node, idx); |
| | | } |
| | | |
| | | if (!validationError) { |
| | | var cmd = updateElement(element, value, node, idx); |
| | | |
| | | if (cmd) { |
| | | commands.push(cmd); |
| | | } |
| | | } else { |
| | | // cache invalid value in an object by index as key |
| | | self.__invalidValues = self.__invalidValues || {}; |
| | | self.__invalidValues[idx] = value; |
| | | |
| | | // execute a command, which does not do anything |
| | | commands.push(cmdHelper.updateProperties(element, {})); |
| | | } |
| | | }); |
| | | |
| | | return commands; |
| | | } |
| | | }, |
| | | createListEntryTemplate: function(value, index, selectBox) { |
| | | return createInputRowTemplate(modelProperties, canRemove); |
| | | }, |
| | | |
| | | addElement: function(element, node, event, scopeNode) { |
| | | var template = domify(createInputRowTemplate(modelProperties, canRemove)); |
| | | |
| | | var container = getContainer(node); |
| | | container.appendChild(template); |
| | | |
| | | this.__action = { |
| | | id: 'add-element' |
| | | }; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | deleteElement: function(element, node, event, scopeNode) { |
| | | var container = getContainer(node); |
| | | var rowToDelete = event.delegateTarget.parentNode; |
| | | var idx = parseInt(domAttr(rowToDelete, 'data-index'), 10); |
| | | |
| | | container.removeChild(rowToDelete); |
| | | |
| | | this.__action = { |
| | | id: 'delete-element', |
| | | idx: idx |
| | | }; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | editable: function(element, rowNode, input, prop, value, idx) { |
| | | var entryNode = domClosest(rowNode, '[data-entry]'); |
| | | return editable(element, entryNode, prop, idx); |
| | | }, |
| | | |
| | | show: function(element, entryNode, node, scopeNode) { |
| | | entryNode = getEntryNode(entryNode); |
| | | return show(element, entryNode, node, scopeNode); |
| | | }, |
| | | |
| | | showTable: function(element, entryNode, node, scopeNode) { |
| | | entryNode = getEntryNode(entryNode); |
| | | var elems = elements(element, entryNode); |
| | | return elems && elems.length && (!canBeShown || show(element, entryNode, node, scopeNode)); |
| | | }, |
| | | |
| | | validateListItem: function(element, value, node, idx) { |
| | | if (typeof options.validate === 'function') { |
| | | return options.validate(element, value, node, idx); |
| | | } |
| | | } |
| | | |
| | | }; |
| | | |
| | | // Update/set the selection on the correct position. |
| | | // It's the same code like for an input value in the PropertiesPanel.js. |
| | | if (setControlValue) { |
| | | factory.setControlValue = function(element, rowNode, input, prop, value, idx) { |
| | | var entryNode = getEntryNode(rowNode); |
| | | |
| | | var isReadOnly = domAttr(input, 'readonly'); |
| | | var oldValue = input.value; |
| | | |
| | | var selection; |
| | | |
| | | // prevents input fields from having the value 'undefined' |
| | | if (value === undefined) { |
| | | value = ''; |
| | | } |
| | | |
| | | // when the attribute 'readonly' exists, ignore the comparison |
| | | // with 'oldValue' and 'value' |
| | | if (!!isReadOnly && oldValue === value) { |
| | | return; |
| | | } |
| | | |
| | | // update selection on undo/redo |
| | | if (document.activeElement === input) { |
| | | selection = updateSelection(getSelection(input), oldValue, value); |
| | | } |
| | | |
| | | setControlValue(element, entryNode, input, prop, value, idx); |
| | | |
| | | if (selection) { |
| | | setSelection(input, selection); |
| | | } |
| | | |
| | | }; |
| | | } |
| | | |
| | | return factory; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | |
| | | var textBox = function(options, defaultParameters) { |
| | | |
| | | var resource = defaultParameters, |
| | | label = options.label || resource.id, |
| | | canBeShown = !!options.show && typeof options.show === 'function', |
| | | description = options.description; |
| | | |
| | | resource.html = |
| | | '<label for="activiti-' + escapeHTML(resource.id) + '" ' + |
| | | (canBeShown ? 'data-show="isShown"' : '') + |
| | | '>' + label + '</label>' + |
| | | '<div class="bpp-field-wrapper" ' + |
| | | (canBeShown ? 'data-show="isShown"' : '') + |
| | | '>' + |
| | | '<div contenteditable="true" id="activiti-' + escapeHTML(resource.id) + '" ' + |
| | | 'name="' + escapeHTML(options.modelProperty) + '" />' + |
| | | '</div>'; |
| | | |
| | | // add description below text box entry field |
| | | if (description) { |
| | | resource.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | if (canBeShown) { |
| | | resource.isShown = function() { |
| | | return options.show.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | resource.cssClasses = ['bpp-textbox']; |
| | | |
| | | return resource; |
| | | }; |
| | | |
| | | module.exports = textBox; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var escapeHTML = require('../Utils').escapeHTML; |
| | | |
| | | var domQuery = require('min-dom').query; |
| | | |
| | | var entryFieldDescription = require('./EntryFieldDescription'); |
| | | |
| | | |
| | | var textField = function(options, defaultParameters) { |
| | | |
| | | // Default action for the button next to the input-field |
| | | var defaultButtonAction = function(element, inputNode) { |
| | | var input = domQuery('input[name="' + options.modelProperty + '"]', inputNode); |
| | | input.value = ''; |
| | | |
| | | return true; |
| | | }; |
| | | |
| | | // default method to determine if the button should be visible |
| | | var defaultButtonShow = function(element, inputNode) { |
| | | var input = domQuery('input[name="' + options.modelProperty + '"]', inputNode); |
| | | |
| | | return input.value !== ''; |
| | | }; |
| | | |
| | | |
| | | var resource = defaultParameters, |
| | | label = options.label || resource.id, |
| | | dataValueLabel = options.dataValueLabel, |
| | | buttonLabel = (options.buttonLabel || 'X'), |
| | | actionName = (typeof options.buttonAction != 'undefined') ? options.buttonAction.name : 'clear', |
| | | actionMethod = (typeof options.buttonAction != 'undefined') ? options.buttonAction.method : defaultButtonAction, |
| | | showName = (typeof options.buttonShow != 'undefined') ? options.buttonShow.name : 'canClear', |
| | | showMethod = (typeof options.buttonShow != 'undefined') ? options.buttonShow.method : defaultButtonShow, |
| | | canBeDisabled = !!options.disabled && typeof options.disabled === 'function', |
| | | canBeHidden = !!options.hidden && typeof options.hidden === 'function', |
| | | description = options.description; |
| | | |
| | | resource.html = |
| | | '<label for="activiti-' + escapeHTML(resource.id) + '" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled" ' : '') + |
| | | (canBeHidden ? 'data-show="isHidden" ' : '') + |
| | | (dataValueLabel ? 'data-value="' + escapeHTML(dataValueLabel) + '"' : '') + '>'+ escapeHTML(label) +'</label>' + |
| | | '<div class="bpp-field-wrapper" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled"' : '') + |
| | | (canBeHidden ? 'data-show="isHidden"' : '') + |
| | | '>' + |
| | | '<input id="activiti-' + escapeHTML(resource.id) + '" type="text" name="' + escapeHTML(options.modelProperty) + '" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled"' : '') + |
| | | (canBeHidden ? 'data-show="isHidden"' : '') + |
| | | ' />' + |
| | | '<button class="' + escapeHTML(actionName) + '" data-action="' + escapeHTML(actionName) + '" data-show="' + escapeHTML(showName) + '" ' + |
| | | (canBeDisabled ? 'data-disable="isDisabled"' : '') + |
| | | (canBeHidden ? ' data-show="isHidden"' : '') + '>' + |
| | | '<span>' + escapeHTML(buttonLabel) + '</span>' + |
| | | '</button>' + |
| | | '</div>'; |
| | | |
| | | // add description below text input entry field |
| | | if (description) { |
| | | resource.html += entryFieldDescription(description); |
| | | } |
| | | |
| | | resource[actionName] = actionMethod; |
| | | resource[showName] = showMethod; |
| | | |
| | | if (canBeDisabled) { |
| | | resource.isDisabled = function() { |
| | | return options.disabled.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | if (canBeHidden) { |
| | | resource.isHidden = function() { |
| | | return !options.hidden.apply(resource, arguments); |
| | | }; |
| | | } |
| | | |
| | | resource.cssClasses = ['bpp-textfield']; |
| | | |
| | | return resource; |
| | | }; |
| | | |
| | | module.exports = textField; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var textField = require('./TextInputEntryFactory'); |
| | | |
| | | /** |
| | | * This function is a wrapper around TextInputEntryFactory. |
| | | * It adds functionality to cache an invalid value entered in the |
| | | * text input, instead of setting it on the business object. |
| | | */ |
| | | var validationAwareTextField = function(options, defaultParameters) { |
| | | |
| | | var modelProperty = options.modelProperty; |
| | | |
| | | defaultParameters.get = function(element, node) { |
| | | var value = this.__lastInvalidValue; |
| | | |
| | | delete this.__lastInvalidValue; |
| | | |
| | | var properties = {}; |
| | | |
| | | properties[modelProperty] = value !== undefined ? value : options.getProperty(element, node); |
| | | |
| | | return properties; |
| | | }; |
| | | |
| | | defaultParameters.set = function(element, values, node) { |
| | | var validationErrors = validate.apply(this, [ element, values, node ]), |
| | | propertyValue = values[modelProperty]; |
| | | |
| | | // make sure we do not update the id |
| | | if (validationErrors && validationErrors[modelProperty]) { |
| | | this.__lastInvalidValue = propertyValue; |
| | | |
| | | return options.setProperty(element, {}, node); |
| | | } else { |
| | | var properties = {}; |
| | | |
| | | properties[modelProperty] = propertyValue; |
| | | |
| | | return options.setProperty(element, properties, node); |
| | | } |
| | | }; |
| | | |
| | | var validate = defaultParameters.validate = function(element, values, node) { |
| | | var value = values[modelProperty] || this.__lastInvalidValue; |
| | | |
| | | var property = {}; |
| | | property[modelProperty] = value; |
| | | |
| | | return options.validate(element, property, node); |
| | | }; |
| | | |
| | | return textField(options, defaultParameters); |
| | | }; |
| | | |
| | | module.exports = validationAwareTextField; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var map = require('lodash/map'); |
| | | |
| | | var extensionElementsHelper = require('./ExtensionElementsHelper'); |
| | | |
| | | /** |
| | | * Returns true if the attribute 'activiti:asyncBefore' is set |
| | | * to true. |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | function isAsyncBefore(bo) { |
| | | return !!(bo.get('activiti:asyncBefore') || bo.get('activiti:async')); |
| | | } |
| | | |
| | | module.exports.isAsyncBefore = isAsyncBefore; |
| | | |
| | | /** |
| | | * Returns true if the attribute 'activiti:asyncAfter' is set |
| | | * to true. |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | function isAsyncAfter(bo) { |
| | | return !!bo.get('activiti:asyncAfter'); |
| | | } |
| | | |
| | | module.exports.isAsyncAfter = isAsyncAfter; |
| | | |
| | | /** |
| | | * Returns true if the attribute 'activiti:exclusive' is set |
| | | * to true. |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | function isExclusive(bo) { |
| | | return !!bo.get('activiti:exclusive'); |
| | | } |
| | | |
| | | module.exports.isExclusive = isExclusive; |
| | | |
| | | /** |
| | | * Get first 'activiti:FailedJobRetryTimeCycle' from the business object. |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * |
| | | * @return {Array<ModdleElement>} a list of 'activiti:FailedJobRetryTimeCycle' |
| | | */ |
| | | function getFailedJobRetryTimeCycle(bo) { |
| | | return (extensionElementsHelper.getExtensionElements(bo, 'activiti:FailedJobRetryTimeCycle') || [])[0]; |
| | | } |
| | | |
| | | module.exports.getFailedJobRetryTimeCycle = getFailedJobRetryTimeCycle; |
| | | |
| | | /** |
| | | * Removes all existing 'activiti:FailedJobRetryTimeCycle' from the business object |
| | | * |
| | | * @param {ModdleElement} bo |
| | | * |
| | | * @return {Array<ModdleElement>} a list of 'activiti:FailedJobRetryTimeCycle' |
| | | */ |
| | | function removeFailedJobRetryTimeCycle(bo, element) { |
| | | var retryTimeCycles = extensionElementsHelper.getExtensionElements(bo, 'activiti:FailedJobRetryTimeCycle'); |
| | | return map(retryTimeCycles, function(cycle) { |
| | | return extensionElementsHelper.removeEntry(bo, element, cycle); |
| | | }); |
| | | } |
| | | |
| | | module.exports.removeFailedJobRetryTimeCycle = removeFailedJobRetryTimeCycle; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var collectionAdd = require('diagram-js/lib/util/Collections').add, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var CategoryHelper = {}; |
| | | |
| | | module.exports = CategoryHelper; |
| | | |
| | | /** |
| | | * Creates a new bpmn:CategoryValue inside a new bpmn:Category |
| | | * |
| | | * @param {ModdleElement} definitions |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} categoryValue. |
| | | */ |
| | | CategoryHelper.createCategoryValue = function(definitions, bpmnFactory) { |
| | | var categoryValue = bpmnFactory.create('bpmn:CategoryValue'), |
| | | category = bpmnFactory.create('bpmn:Category', { |
| | | categoryValue: [ categoryValue ] |
| | | }); |
| | | |
| | | // add to correct place |
| | | collectionAdd(definitions.get('rootElements'), category); |
| | | getBusinessObject(category).$parent = definitions; |
| | | getBusinessObject(categoryValue).$parent = category; |
| | | |
| | | return categoryValue; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var CmdHelper = {}; |
| | | module.exports = CmdHelper; |
| | | |
| | | CmdHelper.updateProperties = function(element, properties) { |
| | | return { |
| | | cmd: 'element.updateProperties', |
| | | context: { element: element, properties: properties } |
| | | }; |
| | | }; |
| | | |
| | | CmdHelper.updateBusinessObject = function(element, businessObject, newProperties) { |
| | | return { |
| | | cmd: 'properties-panel.update-businessobject', |
| | | context: { |
| | | element: element, |
| | | businessObject: businessObject, |
| | | properties: newProperties |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | CmdHelper.addElementsTolist = function(element, businessObject, listPropertyName, objectsToAdd) { |
| | | return { |
| | | cmd: 'properties-panel.update-businessobject-list', |
| | | context: { |
| | | element: element, |
| | | currentObject: businessObject, |
| | | propertyName: listPropertyName, |
| | | objectsToAdd: objectsToAdd |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | CmdHelper.removeElementsFromList = function(element, businessObject, listPropertyName, referencePropertyName, objectsToRemove) { |
| | | |
| | | return { |
| | | cmd: 'properties-panel.update-businessobject-list', |
| | | context: { |
| | | element: element, |
| | | currentObject: businessObject, |
| | | propertyName: listPropertyName, |
| | | referencePropertyName: referencePropertyName, |
| | | objectsToRemove: objectsToRemove |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | |
| | | CmdHelper.addAndRemoveElementsFromList = function(element, businessObject, listPropertyName, referencePropertyName, objectsToAdd, objectsToRemove) { |
| | | |
| | | return { |
| | | cmd: 'properties-panel.update-businessobject-list', |
| | | context: { |
| | | element: element, |
| | | currentObject: businessObject, |
| | | propertyName: listPropertyName, |
| | | referencePropertyName: referencePropertyName, |
| | | objectsToAdd: objectsToAdd, |
| | | objectsToRemove: objectsToRemove |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | |
| | | CmdHelper.setList = function(element, businessObject, listPropertyName, updatedObjectList) { |
| | | return { |
| | | cmd: 'properties-panel.update-businessobject-list', |
| | | context: { |
| | | element: element, |
| | | currentObject: businessObject, |
| | | propertyName: listPropertyName, |
| | | updatedObjectList: updatedObjectList |
| | | } |
| | | }; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ElementHelper = {}; |
| | | module.exports = ElementHelper; |
| | | |
| | | /** |
| | | * Creates a new element and set the parent to it |
| | | * |
| | | * @method ElementHelper#createElement |
| | | * |
| | | * @param {String} elementType of the new element |
| | | * @param {Object} properties of the new element in key-value pairs |
| | | * @param {moddle.object} parent of the new element |
| | | * @param {BpmnFactory} factory which creates the new element |
| | | * |
| | | * @returns {djs.model.Base} element which is created |
| | | */ |
| | | ElementHelper.createElement = function(elementType, properties, parent, factory) { |
| | | var element = factory.create(elementType, properties); |
| | | element.$parent = parent; |
| | | |
| | | return element; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | forEach = require('lodash/forEach'); |
| | | |
| | | var EventDefinitionHelper = {}; |
| | | |
| | | module.exports = EventDefinitionHelper; |
| | | |
| | | EventDefinitionHelper.getEventDefinition = function(element, eventType) { |
| | | |
| | | var bo = getBusinessObject(element), |
| | | eventDefinition = null; |
| | | |
| | | if (bo.eventDefinitions) { |
| | | forEach(bo.eventDefinitions, function(event) { |
| | | if (is(event, eventType)) { |
| | | eventDefinition = event; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return eventDefinition; |
| | | }; |
| | | |
| | | EventDefinitionHelper.getTimerEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:TimerEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getMessageEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:MessageEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getSignalEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:SignalEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getErrorEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:ErrorEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getEscalationEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:EscalationEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getCompensateEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:CompensateEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getLinkEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:LinkEventDefinition'); |
| | | }; |
| | | |
| | | EventDefinitionHelper.getConditionalEventDefinition = function(element) { |
| | | return this.getEventDefinition(element, 'bpmn:ConditionalEventDefinition'); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var cmdHelper = require('./CmdHelper'), |
| | | elementHelper = require('./ElementHelper'); |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var ExtensionElementsHelper = {}; |
| | | |
| | | var getExtensionElements = function(bo) { |
| | | return bo.get('extensionElements'); |
| | | }; |
| | | |
| | | ExtensionElementsHelper.getExtensionElements = function(bo, type) { |
| | | var extensionElements = getExtensionElements(bo); |
| | | if (typeof extensionElements !== 'undefined') { |
| | | var extensionValues = extensionElements.get('values'); |
| | | if (typeof extensionValues !== 'undefined') { |
| | | var elements = extensionValues.filter(function(value) { |
| | | return is(value, type); |
| | | }); |
| | | if (elements.length) { |
| | | return elements; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | ExtensionElementsHelper.addEntry = function(bo, element, entry, bpmnFactory) { |
| | | var extensionElements = bo.get('extensionElements'); |
| | | |
| | | // if there is no extensionElements list, create one |
| | | if (!extensionElements) { |
| | | // TODO: Ask Daniel which operation costs more |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [entry] }, bo, bpmnFactory); |
| | | return { extensionElements : extensionElements }; |
| | | } else { |
| | | // add new failedJobRetryExtensionElement to existing extensionElements list |
| | | return cmdHelper.addElementsTolist(element, extensionElements, 'values', [entry]); |
| | | } |
| | | }; |
| | | |
| | | ExtensionElementsHelper.removeEntry = function(bo, element, entry) { |
| | | var extensionElements = bo.get('extensionElements'); |
| | | |
| | | if (!extensionElements) { |
| | | |
| | | // return an empty command when there is no extensionElements list |
| | | return {}; |
| | | } |
| | | |
| | | return cmdHelper.removeElementsFromList(element, extensionElements, 'values', 'extensionElements', [entry]); |
| | | }; |
| | | |
| | | module.exports = ExtensionElementsHelper; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | getExtensionElements = require('./ExtensionElementsHelper').getExtensionElements; |
| | | |
| | | var FormHelper = {}; |
| | | |
| | | module.exports = FormHelper; |
| | | |
| | | /** |
| | | * Return form data from business object or undefined if none exist |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement|undefined} formData |
| | | * |
| | | * 此方法废弃 |
| | | * |
| | | */ |
| | | FormHelper.getFormData = function(element) { |
| | | /* var bo = getBusinessObject(element); |
| | | |
| | | var formFields = getExtensionElements(bo, 'activiti:FormProperty'); |
| | | |
| | | var formData = {} |
| | | |
| | | if (typeof formData !== 'undefined') { |
| | | return formData[0]; |
| | | }*/ |
| | | return {}; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Return all form fields existing in the business object, and |
| | | * an empty array if none exist. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {Array} a list of form field objects |
| | | */ |
| | | FormHelper.getFormFields = function(element) { |
| | | |
| | | /**直接获取 ExtensionElements的 activiti:FormProperty元素*/ |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var formFields = getExtensionElements(bo, 'activiti:FormProperty'); |
| | | |
| | | return formFields || []; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Get a form field from the business object at given index |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {number} idx |
| | | * |
| | | * @return {ModdleElement} the form field |
| | | */ |
| | | FormHelper.getFormField = function(element, idx) { |
| | | |
| | | var formFields = this.getFormFields(element); |
| | | |
| | | return formFields[idx]; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Get all constraints for a specific form field from the business object |
| | | * |
| | | * @param {ModdleElement} formField |
| | | * |
| | | * @return {Array<ModdleElement>} a list of constraint objects |
| | | */ |
| | | FormHelper.getConstraints = function(formField) { |
| | | if (formField && formField.validation && formField.validation.constraints) { |
| | | return formField.validation.constraints; |
| | | } |
| | | return []; |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * Get all activiti:value objects for a specific form field from the business object |
| | | * |
| | | * @param {ModdleElement} formField |
| | | * |
| | | * @return {Array<ModdleElement>} a list of activiti:value objects |
| | | */ |
| | | FormHelper.getEnumValues = function(formField) { |
| | | if (formField && formField.values) { |
| | | return formField.values; |
| | | } |
| | | return []; |
| | | }; |
| | | |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ModelUtil = require('bpmn-js/lib/util/ModelUtil'), |
| | | is = ModelUtil.is, |
| | | getBusinessObject = ModelUtil.getBusinessObject; |
| | | |
| | | var eventDefinitionHelper = require('./EventDefinitionHelper'); |
| | | var extensionsElementHelper = require('./ExtensionElementsHelper'); |
| | | |
| | | var ImplementationTypeHelper = {}; |
| | | |
| | | module.exports = ImplementationTypeHelper; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:ServiceTaskLike' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isServiceTaskLike = function(element) { |
| | | return is(element, 'activiti:ServiceTaskLike'); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:DmnCapable' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isDmnCapable = function(element) { |
| | | return is(element, 'activiti:DmnCapable'); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:ExternalCapable' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isExternalCapable = function(element) { |
| | | return is(element, 'activiti:ExternalCapable'); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:TaskListener' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isTaskListener = function(element) { |
| | | return is(element, 'activiti:TaskListener'); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:ExecutionListener' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isExecutionListener = function(element) { |
| | | return is(element, 'activiti:ExecutionListener'); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'activiti:ExecutionListener' or |
| | | * 'activiti:TaskListener' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isListener = function(element) { |
| | | return this.isTaskListener(element) || this.isExecutionListener(element); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element is 'bpmn:SequenceFlow' |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | ImplementationTypeHelper.isSequenceFlow = function(element) { |
| | | return is(element, 'bpmn:SequenceFlow'); |
| | | }; |
| | | |
| | | /** |
| | | * Get a 'activiti:ServiceTaskLike' business object. |
| | | * |
| | | * If the given element is not a 'activiti:ServiceTaskLike', then 'false' |
| | | * is returned. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement} the 'activiti:ServiceTaskLike' business object |
| | | */ |
| | | ImplementationTypeHelper.getServiceTaskLikeBusinessObject = function(element) { |
| | | |
| | | if (is(element, 'bpmn:IntermediateThrowEvent') || is(element, 'bpmn:EndEvent')) { |
| | | |
| | | // change business object to 'messageEventDefinition' when |
| | | // the element is a message intermediate throw event or message end event |
| | | // because the activiti extensions (e.g. activiti:class) are in the message |
| | | // event definition tag and not in the intermediate throw event or end event tag |
| | | var messageEventDefinition = eventDefinitionHelper.getMessageEventDefinition(element); |
| | | if (messageEventDefinition) { |
| | | element = messageEventDefinition; |
| | | } |
| | | } |
| | | |
| | | return this.isServiceTaskLike(element) && getBusinessObject(element); |
| | | |
| | | }; |
| | | |
| | | /** |
| | | * Returns the implementation type of the given element. |
| | | * |
| | | * Possible implementation types are: |
| | | * - dmn |
| | | * - connector |
| | | * - external |
| | | * - class |
| | | * - expression |
| | | * - delegateExpression |
| | | * - script |
| | | * - or undefined, when no matching implementation type is found |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {String} the implementation type |
| | | */ |
| | | ImplementationTypeHelper.getImplementationType = function(element) { |
| | | |
| | | var bo = this.getServiceTaskLikeBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | if (this.isListener(element)) { |
| | | bo = element; |
| | | } else { |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if (this.isDmnCapable(bo)) { |
| | | var decisionRef = bo.get('activiti:decisionRef'); |
| | | if (typeof decisionRef !== 'undefined') { |
| | | return 'dmn'; |
| | | } |
| | | } |
| | | |
| | | if (this.isServiceTaskLike(bo)) { |
| | | var connectors = extensionsElementHelper.getExtensionElements(bo, 'activiti:Connector'); |
| | | if (typeof connectors !== 'undefined') { |
| | | return 'connector'; |
| | | } |
| | | } |
| | | |
| | | if (this.isExternalCapable(bo)) { |
| | | var type = bo.get('activiti:type'); |
| | | if (type === 'external') { |
| | | return 'external'; |
| | | } |
| | | } |
| | | |
| | | var cls = bo.get('activiti:class'); |
| | | if (typeof cls !== 'undefined') { |
| | | return 'class'; |
| | | } |
| | | |
| | | var expression = bo.get('activiti:expression'); |
| | | if (typeof expression !== 'undefined') { |
| | | return 'expression'; |
| | | } |
| | | |
| | | var delegateExpression = bo.get('activiti:delegateExpression'); |
| | | if (typeof delegateExpression !== 'undefined') { |
| | | return 'delegateExpression'; |
| | | } |
| | | |
| | | if (this.isListener(bo)) { |
| | | var script = bo.get('script'); |
| | | if (typeof script !== 'undefined') { |
| | | return 'script'; |
| | | } |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ModelUtil = require('bpmn-js/lib/util/ModelUtil'), |
| | | is = ModelUtil.is, |
| | | getBusinessObject = ModelUtil.getBusinessObject; |
| | | |
| | | var extensionElementsHelper = require('./ExtensionElementsHelper'), |
| | | implementationTypeHelper = require('./ImplementationTypeHelper'); |
| | | |
| | | var InputOutputHelper = {}; |
| | | |
| | | module.exports = InputOutputHelper; |
| | | |
| | | function getElements(bo, type, prop) { |
| | | var elems = extensionElementsHelper.getExtensionElements(bo, type) || []; |
| | | return !prop ? elems : (elems[0] || {})[prop] || []; |
| | | } |
| | | |
| | | function getParameters(element, prop, insideConnector) { |
| | | var inputOutput = InputOutputHelper.getInputOutput(element, insideConnector); |
| | | return (inputOutput && inputOutput.get(prop)) || []; |
| | | } |
| | | |
| | | /** |
| | | * Get a inputOutput from the business object |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * |
| | | * @return {ModdleElement} the inputOutput object |
| | | */ |
| | | InputOutputHelper.getInputOutput = function(element, insideConnector) { |
| | | if (!insideConnector) { |
| | | var bo = getBusinessObject(element); |
| | | return (getElements(bo, 'activiti:InputOutput') || [])[0]; |
| | | } |
| | | var connector = this.getConnector(element); |
| | | return connector && connector.get('inputOutput'); |
| | | }; |
| | | |
| | | /** |
| | | * Get a connector from the business object |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement} the connector object |
| | | */ |
| | | InputOutputHelper.getConnector = function(element) { |
| | | var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | return bo && (getElements(bo, 'activiti:Connector') || [])[0]; |
| | | }; |
| | | |
| | | /** |
| | | * Return all input parameters existing in the business object, and |
| | | * an empty array if none exist. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * |
| | | * @return {Array} a list of input parameter objects |
| | | */ |
| | | InputOutputHelper.getInputParameters = function(element, insideConnector) { |
| | | return getParameters.apply(this, [ element, 'inputParameters', insideConnector ]); |
| | | }; |
| | | |
| | | /** |
| | | * Return all output parameters existing in the business object, and |
| | | * an empty array if none exist. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * |
| | | * @return {Array} a list of output parameter objects |
| | | */ |
| | | InputOutputHelper.getOutputParameters = function(element, insideConnector) { |
| | | return getParameters.apply(this, [ element, 'outputParameters', insideConnector ]); |
| | | }; |
| | | |
| | | /** |
| | | * Get a input parameter from the business object at given index |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * @param {number} idx |
| | | * |
| | | * @return {ModdleElement} input parameter |
| | | */ |
| | | InputOutputHelper.getInputParameter = function(element, insideConnector, idx) { |
| | | return this.getInputParameters(element, insideConnector)[idx]; |
| | | }; |
| | | |
| | | /** |
| | | * Get a output parameter from the business object at given index |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * @param {number} idx |
| | | * |
| | | * @return {ModdleElement} output parameter |
| | | */ |
| | | InputOutputHelper.getOutputParameter = function(element, insideConnector, idx) { |
| | | return this.getOutputParameters(element, insideConnector)[idx]; |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element supports inputOutput |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | InputOutputHelper.isInputOutputSupported = function(element, insideConnector) { |
| | | |
| | | if (insideConnector) { |
| | | return true; |
| | | } |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | return ( |
| | | is(bo, 'bpmn:FlowNode') && !( |
| | | is(bo, 'bpmn:StartEvent') || |
| | | is(bo, 'bpmn:Gateway') || |
| | | is(bo, 'bpmn:BoundaryEvent') || |
| | | ( |
| | | is(bo, 'bpmn:SubProcess') && bo.get('triggeredByEvent') |
| | | ) |
| | | ) |
| | | ); |
| | | }; |
| | | |
| | | /** |
| | | * Returns 'true' if the given element supports output parameters |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {boolean} insideConnector |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | InputOutputHelper.areOutputParametersSupported = function(element, insideConnector) { |
| | | var bo = getBusinessObject(element); |
| | | return insideConnector || (!is(bo, 'bpmn:EndEvent') && !bo.loopCharacteristics); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | cmdHelper = require('./CmdHelper'); |
| | | |
| | | |
| | | var ParticipantHelper = {}; |
| | | |
| | | module.exports = ParticipantHelper; |
| | | |
| | | ParticipantHelper.modifyProcessBusinessObject = function(element, property, values) { |
| | | if (!is(element, 'bpmn:Participant')) { |
| | | return {}; |
| | | } |
| | | |
| | | var bo = getBusinessObject(element).get('processRef'), |
| | | properties = {}; |
| | | |
| | | properties[property] = values[property]; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, bo, properties); |
| | | }; |
| | | |
| | | ParticipantHelper.getProcessBusinessObject = function(element, propertyName) { |
| | | if (!is(element, 'bpmn:Participant')) { |
| | | return {}; |
| | | } |
| | | |
| | | var bo = getBusinessObject(element).get('processRef'), |
| | | properties = {}; |
| | | |
| | | properties[propertyName] = bo.get(propertyName); |
| | | |
| | | return properties; |
| | | }; |
New file |
| | |
| | | module.exports = { |
| | | __depends__: [ |
| | | require('./index'), |
| | | require('diagram-js/lib/i18n/translate').default |
| | | ], |
| | | __init__: [ 'propertiesPanel' ], |
| | | propertiesPanel: [ 'type', require('./PropertiesPanel') ] |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domClasses = require('min-dom').classes, |
| | | domify = require('min-dom').domify, |
| | | bind = require('lodash/bind'); |
| | | |
| | | /** |
| | | * @class |
| | | * @constructor |
| | | */ |
| | | function Popup(options) { |
| | | options = options || {}; |
| | | this.template = options.template || this.template; |
| | | var el = this.el = domify(this.template); |
| | | |
| | | this.header = domQuery('.popup-header', el); |
| | | this.body = domQuery('.popup-body', el); |
| | | this.footer = domQuery('.popup-footer', el); |
| | | |
| | | document.body.appendChild(el); |
| | | |
| | | this._attachEvents(); |
| | | } |
| | | |
| | | Popup.prototype.template = '<div class="bpp-properties-panel-popup">' + |
| | | '<div class="underlay"></div>' + |
| | | '<div class="popup">' + |
| | | '<button class="popup-close"><span>Close</span></button>' + |
| | | '<div class="popup-header"></div>' + |
| | | '<div class="popup-body"></div>' + |
| | | '<div class="popup-footer"></div>' + |
| | | '</div>' + |
| | | '</div>'; |
| | | |
| | | |
| | | |
| | | Popup.prototype._attachEvents = function() { |
| | | var self = this; |
| | | var events = this.events; |
| | | var el = this.el; |
| | | |
| | | Object.keys(events).forEach(function(instruction) { |
| | | var cb = bind(self[events[instruction]], self); |
| | | var parts = instruction.split(' '); |
| | | var evtName = parts.shift(); |
| | | var target = parts.length ? parts.shift() : false; |
| | | target = target ? domQuery(target, el) : el; |
| | | if (!target) { return; } |
| | | target.addEventListener(evtName, cb); |
| | | }); |
| | | }; |
| | | |
| | | Popup.prototype._detachEvents = function() { |
| | | var self = this; |
| | | var events = this.events; |
| | | var el = this.el; |
| | | |
| | | Object.keys(events).forEach(function(instruction) { |
| | | var cb = bind(self[events[instruction]], self); |
| | | var parts = instruction.split(' '); |
| | | var evtName = parts.shift(); |
| | | var target = parts.length ? parts.shift() : false; |
| | | target = target ? domQuery(target, el) : el; |
| | | if (!target) { return; } |
| | | target.removeEventListener(evtName, cb); |
| | | }); |
| | | }; |
| | | |
| | | Popup.prototype.events = { |
| | | // 'keydown:esc': '_handleClose', |
| | | 'click .underlay': '_handleClose', |
| | | 'click .popup-close': '_handleClose' |
| | | }; |
| | | |
| | | |
| | | Popup.prototype._handleClose = function(evt) { |
| | | this.close(); |
| | | }; |
| | | |
| | | |
| | | Popup.prototype.open = function(content) { |
| | | domClasses(this.el).add('open'); |
| | | }; |
| | | |
| | | Popup.prototype.close = function() { |
| | | domClasses(this.el).remove('open'); |
| | | }; |
| | | |
| | | Popup.prototype.remove = function() { |
| | | this._detachEvents(); |
| | | if (document.body.contains(this.el)) { |
| | | document.body.removeChild(this.el); |
| | | } |
| | | }; |
| | | |
| | | var popup; |
| | | module.exports = function() { |
| | | if (!popup) { |
| | | popup = new Popup(); |
| | | } |
| | | return popup; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var inherits = require('inherits'); |
| | | |
| | | var PropertiesActivator = require('../../PropertiesActivator'); |
| | | |
| | | var asyncCapableHelper = require('../../helper/AsyncCapableHelper'), |
| | | ImplementationTypeHelper = require('../../helper/ImplementationTypeHelper'); |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | // bpmn properties |
| | | var processProps = require('../../provider/bpmn/parts/ProcessProps'), |
| | | eventProps = require('../../provider/bpmn/parts/EventProps'), |
| | | linkProps = require('../../provider/bpmn/parts/LinkProps'), |
| | | documentationProps = require('../../provider/bpmn/parts/DocumentationProps'), |
| | | idProps = require('../../provider/bpmn/parts/IdProps'), |
| | | nameProps = require('../../provider/bpmn/parts/NameProps'), |
| | | executableProps = require('../../provider/bpmn/parts/ExecutableProps'); |
| | | |
| | | // activiti properties |
| | | var serviceTaskDelegateProps = require('./parts/ServiceTaskDelegateProps'), |
| | | userTaskProps = require('./parts/UserTaskProps'), |
| | | asynchronousContinuationProps = require('./parts/AsynchronousContinuationProps'), |
| | | callActivityProps = require('./parts/CallActivityProps'), |
| | | multiInstanceProps = require('./parts/MultiInstanceLoopProps'), |
| | | conditionalProps = require('./parts/ConditionalProps'), |
| | | scriptProps = require('./parts/ScriptTaskProps'), |
| | | errorProps = require('./parts/ErrorEventProps'), |
| | | formProps = require('./parts/FormProps'), |
| | | startEventInitiator = require('./parts/StartEventInitiator'), |
| | | variableMapping = require('./parts/VariableMappingProps'), |
| | | versionTag = require('./parts/VersionTagProps'); |
| | | |
| | | var listenerProps = require('./parts/ListenerProps'), |
| | | listenerDetails = require('./parts/ListenerDetailProps'), |
| | | listenerFields = require('./parts/ListenerFieldInjectionProps'); |
| | | |
| | | var elementTemplateChooserProps = require('./element-templates/parts/ChooserProps'), |
| | | elementTemplateCustomProps = require('./element-templates/parts/CustomProps'); |
| | | |
| | | // Input/Output |
| | | var inputOutput = require('./parts/InputOutputProps'), |
| | | inputOutputParameter = require('./parts/InputOutputParameterProps'); |
| | | |
| | | // Connector |
| | | var connectorDetails = require('./parts/ConnectorDetailProps'), |
| | | connectorInputOutput = require('./parts/ConnectorInputOutputProps'), |
| | | connectorInputOutputParameter = require('./parts/ConnectorInputOutputParameterProps'); |
| | | |
| | | // properties |
| | | var properties = require('./parts/PropertiesProps'); |
| | | |
| | | // job configuration |
| | | var jobConfiguration = require('./parts/JobConfigurationProps'); |
| | | |
| | | // history time to live |
| | | var historyTimeToLive = require('./parts/HistoryTimeToLiveProps'); |
| | | |
| | | // candidate starter groups/users |
| | | var candidateStarter = require('./parts/CandidateStarterProps'); |
| | | |
| | | // tasklist |
| | | var tasklist = require('./parts/TasklistProps'); |
| | | |
| | | // external task configuration |
| | | var externalTaskConfiguration = require('./parts/ExternalTaskConfigurationProps'); |
| | | |
| | | // field injection |
| | | var fieldInjections = require('./parts/FieldInjectionProps'); |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | eventDefinitionHelper = require('../../helper/EventDefinitionHelper'), |
| | | implementationTypeHelper = require('../../helper/ImplementationTypeHelper'); |
| | | |
| | | // helpers //////////////////////////////////////// |
| | | |
| | | var isExternalTaskPriorityEnabled = function(element) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | // show only if element is a process, a participant ... |
| | | if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | return true; |
| | | } |
| | | |
| | | var externalBo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element), |
| | | isExternalTask = ImplementationTypeHelper.getImplementationType(externalBo) === 'external'; |
| | | |
| | | // ... or an external task with selected external implementation type |
| | | return !!ImplementationTypeHelper.isExternalCapable(externalBo) && isExternalTask; |
| | | }; |
| | | |
| | | var isJobConfigEnabled = function(element) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | return true; |
| | | } |
| | | |
| | | // async behavior |
| | | var bo = getBusinessObject(element); |
| | | if (asyncCapableHelper.isAsyncBefore(bo) || asyncCapableHelper.isAsyncAfter(bo)) { |
| | | return true; |
| | | } |
| | | |
| | | // timer definition |
| | | if (is(element, 'bpmn:Event')) { |
| | | return !!eventDefinitionHelper.getTimerEventDefinition(element); |
| | | } |
| | | |
| | | return false; |
| | | }; |
| | | |
| | | var getInputOutputParameterLabel = function(param, translate) { |
| | | |
| | | if (is(param, 'activiti:InputParameter')) { |
| | | return translate('Input Parameter'); |
| | | } |
| | | |
| | | if (is(param, 'activiti:OutputParameter')) { |
| | | return translate('Output Parameter'); |
| | | } |
| | | |
| | | return ''; |
| | | }; |
| | | |
| | | var getListenerLabel = function(param, translate) { |
| | | |
| | | if (is(param, 'activiti:ExecutionListener')) { |
| | | return translate('Execution Listener'); |
| | | } |
| | | |
| | | if (is(param, 'activiti:TaskListener')) { |
| | | return translate('Task Listener'); |
| | | } |
| | | |
| | | return ''; |
| | | }; |
| | | |
| | | var PROCESS_KEY_HINT = 'This maps to the process definition key.'; |
| | | var TASK_KEY_HINT = 'This maps to the task definition key.'; |
| | | |
| | | function createGeneralTabGroups( |
| | | element, canvas, bpmnFactory, |
| | | elementRegistry, elementTemplates, translate) { |
| | | |
| | | // refer to target element for external labels |
| | | element = element.labelTarget || element; |
| | | |
| | | var generalGroup = { |
| | | id: 'general', |
| | | label: translate('General'), |
| | | entries: [] |
| | | }; |
| | | |
| | | var idOptions; |
| | | var processOptions; |
| | | |
| | | if (is(element, 'bpmn:Process')) { |
| | | idOptions = { description: PROCESS_KEY_HINT }; |
| | | } |
| | | |
| | | if (is(element, 'bpmn:UserTask')) { |
| | | idOptions = { description: TASK_KEY_HINT }; |
| | | } |
| | | |
| | | if (is(element, 'bpmn:Participant')) { |
| | | processOptions = { processIdDescription: PROCESS_KEY_HINT }; |
| | | } |
| | | |
| | | idProps(generalGroup, element, translate, idOptions); |
| | | nameProps(generalGroup, element, bpmnFactory, canvas, translate); |
| | | processProps(generalGroup, element, translate, processOptions); |
| | | versionTag(generalGroup, element, translate); |
| | | executableProps(generalGroup, element, translate); |
| | | elementTemplateChooserProps(generalGroup, element, elementTemplates, translate); |
| | | |
| | | var customFieldsGroups = elementTemplateCustomProps(element, elementTemplates, bpmnFactory, translate); |
| | | |
| | | var detailsGroup = { |
| | | id: 'details', |
| | | label: translate('Details'), |
| | | entries: [] |
| | | }; |
| | | serviceTaskDelegateProps(detailsGroup, element, bpmnFactory, translate); |
| | | userTaskProps(detailsGroup, element, translate); |
| | | scriptProps(detailsGroup, element, bpmnFactory, translate); |
| | | linkProps(detailsGroup, element, translate); |
| | | callActivityProps(detailsGroup, element, bpmnFactory, translate); |
| | | eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate); |
| | | errorProps(detailsGroup, element, bpmnFactory, translate); |
| | | conditionalProps(detailsGroup, element, bpmnFactory, translate); |
| | | startEventInitiator(detailsGroup, element, translate); // this must be the last element of the details group! |
| | | |
| | | var multiInstanceGroup = { |
| | | id: 'multiInstance', |
| | | label: translate('Multi Instance'), |
| | | entries: [] |
| | | }; |
| | | multiInstanceProps(multiInstanceGroup, element, bpmnFactory, translate); |
| | | |
| | | var asyncGroup = { |
| | | id : 'async', |
| | | label: translate('Asynchronous Continuations'), |
| | | entries : [] |
| | | }; |
| | | asynchronousContinuationProps(asyncGroup, element, bpmnFactory, translate); |
| | | |
| | | var jobConfigurationGroup = { |
| | | id : 'jobConfiguration', |
| | | label : translate('Job Configuration'), |
| | | entries : [], |
| | | enabled: isJobConfigEnabled |
| | | }; |
| | | jobConfiguration(jobConfigurationGroup, element, bpmnFactory, translate); |
| | | |
| | | var externalTaskGroup = { |
| | | id : 'externalTaskConfiguration', |
| | | label : translate('External Task Configuration'), |
| | | entries : [], |
| | | enabled: isExternalTaskPriorityEnabled |
| | | }; |
| | | externalTaskConfiguration(externalTaskGroup, element, bpmnFactory, translate); |
| | | |
| | | |
| | | var candidateStarterGroup = { |
| | | id: 'candidateStarterConfiguration', |
| | | label: translate('Candidate Starter Configuration'), |
| | | entries: [] |
| | | }; |
| | | candidateStarter(candidateStarterGroup, element, bpmnFactory, translate); |
| | | |
| | | var historyTimeToLiveGroup = { |
| | | id: 'historyConfiguration', |
| | | label: translate('History Configuration'), |
| | | entries: [] |
| | | }; |
| | | historyTimeToLive(historyTimeToLiveGroup, element, bpmnFactory, translate); |
| | | |
| | | var tasklistGroup = { |
| | | id: 'tasklist', |
| | | label: translate('Tasklist Configuration'), |
| | | entries: [] |
| | | }; |
| | | tasklist(tasklistGroup, element, bpmnFactory, translate); |
| | | |
| | | var documentationGroup = { |
| | | id: 'documentation', |
| | | label: translate('Documentation'), |
| | | entries: [] |
| | | }; |
| | | documentationProps(documentationGroup, element, bpmnFactory, translate); |
| | | |
| | | var groups = []; |
| | | groups.push(generalGroup); |
| | | customFieldsGroups.forEach(function(group) { |
| | | groups.push(group); |
| | | }); |
| | | groups.push(detailsGroup); |
| | | groups.push(externalTaskGroup); |
| | | groups.push(multiInstanceGroup); |
| | | groups.push(asyncGroup); |
| | | groups.push(jobConfigurationGroup); |
| | | groups.push(candidateStarterGroup); |
| | | groups.push(historyTimeToLiveGroup); |
| | | groups.push(tasklistGroup); |
| | | groups.push(documentationGroup); |
| | | |
| | | return groups; |
| | | } |
| | | |
| | | function createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | var variablesGroup = { |
| | | id : 'variables', |
| | | label : translate('Variables'), |
| | | entries: [] |
| | | }; |
| | | variableMapping(variablesGroup, element, bpmnFactory, translate); |
| | | |
| | | return [ |
| | | variablesGroup |
| | | ]; |
| | | } |
| | | |
| | | function createFormsTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | var formGroup = { |
| | | id : 'forms', |
| | | label : translate('Forms'), |
| | | entries: [] |
| | | }; |
| | | formProps(formGroup, element, bpmnFactory, translate); |
| | | |
| | | return [ |
| | | formGroup |
| | | ]; |
| | | } |
| | | |
| | | function createListenersTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | |
| | | var listenersGroup = { |
| | | id : 'listeners', |
| | | label: translate('Listeners'), |
| | | entries: [] |
| | | }; |
| | | |
| | | var options = listenerProps(listenersGroup, element, bpmnFactory, translate); |
| | | |
| | | var listenerDetailsGroup = { |
| | | id: 'listener-details', |
| | | entries: [], |
| | | enabled: function(element, node) { |
| | | return options.getSelectedListener(element, node); |
| | | }, |
| | | label: function(element, node) { |
| | | var param = options.getSelectedListener(element, node); |
| | | return getListenerLabel(param, translate); |
| | | } |
| | | }; |
| | | |
| | | listenerDetails(listenerDetailsGroup, element, bpmnFactory, options, translate); |
| | | |
| | | var listenerFieldsGroup = { |
| | | id: 'listener-fields', |
| | | label: translate('Field Injection'), |
| | | entries: [], |
| | | enabled: function(element, node) { |
| | | return options.getSelectedListener(element, node); |
| | | } |
| | | }; |
| | | |
| | | listenerFields(listenerFieldsGroup, element, bpmnFactory, options, translate); |
| | | |
| | | return [ |
| | | listenersGroup, |
| | | listenerDetailsGroup, |
| | | listenerFieldsGroup |
| | | ]; |
| | | } |
| | | |
| | | function createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | |
| | | var inputOutputGroup = { |
| | | id: 'input-output', |
| | | label: translate('Parameters'), |
| | | entries: [] |
| | | }; |
| | | |
| | | var options = inputOutput(inputOutputGroup, element, bpmnFactory, translate); |
| | | |
| | | var inputOutputParameterGroup = { |
| | | id: 'input-output-parameter', |
| | | entries: [], |
| | | enabled: function(element, node) { |
| | | return options.getSelectedParameter(element, node); |
| | | }, |
| | | label: function(element, node) { |
| | | var param = options.getSelectedParameter(element, node); |
| | | return getInputOutputParameterLabel(param, translate); |
| | | } |
| | | }; |
| | | |
| | | inputOutputParameter(inputOutputParameterGroup, element, bpmnFactory, options, translate); |
| | | |
| | | return [ |
| | | inputOutputGroup, |
| | | inputOutputParameterGroup |
| | | ]; |
| | | } |
| | | |
| | | function createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | var connectorDetailsGroup = { |
| | | id: 'connector-details', |
| | | label: translate('Details'), |
| | | entries: [] |
| | | }; |
| | | |
| | | connectorDetails(connectorDetailsGroup, element, bpmnFactory, translate); |
| | | |
| | | var connectorInputOutputGroup = { |
| | | id: 'connector-input-output', |
| | | label: translate('Input/Output'), |
| | | entries: [] |
| | | }; |
| | | |
| | | var options = connectorInputOutput(connectorInputOutputGroup, element, bpmnFactory, translate); |
| | | |
| | | var connectorInputOutputParameterGroup = { |
| | | id: 'connector-input-output-parameter', |
| | | entries: [], |
| | | enabled: function(element, node) { |
| | | return options.getSelectedParameter(element, node); |
| | | }, |
| | | label: function(element, node) { |
| | | var param = options.getSelectedParameter(element, node); |
| | | return getInputOutputParameterLabel(param, translate); |
| | | } |
| | | }; |
| | | |
| | | connectorInputOutputParameter(connectorInputOutputParameterGroup, element, bpmnFactory, options, translate); |
| | | |
| | | return [ |
| | | connectorDetailsGroup, |
| | | connectorInputOutputGroup, |
| | | connectorInputOutputParameterGroup |
| | | ]; |
| | | } |
| | | |
| | | function createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | |
| | | var fieldGroup = { |
| | | id: 'field-injections-properties', |
| | | label: translate('Field Injections'), |
| | | entries: [] |
| | | }; |
| | | |
| | | fieldInjections(fieldGroup, element, bpmnFactory, translate); |
| | | |
| | | return [ |
| | | fieldGroup |
| | | ]; |
| | | } |
| | | |
| | | function createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate) { |
| | | |
| | | var propertiesGroup = { |
| | | id : 'extensionElements-properties', |
| | | label: translate('Properties'), |
| | | entries: [] |
| | | }; |
| | | properties(propertiesGroup, element, bpmnFactory, translate); |
| | | |
| | | return [ |
| | | propertiesGroup |
| | | ]; |
| | | } |
| | | |
| | | // activiti Properties Provider ///////////////////////////////////// |
| | | |
| | | |
| | | /** |
| | | * A properties provider for activiti related properties. |
| | | * |
| | | * @param {EventBus} eventBus |
| | | * @param {Canvas} canvas |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * @param {ElementRegistry} elementRegistry |
| | | * @param {ElementTemplates} elementTemplates |
| | | * @param {Translate} translate |
| | | */ |
| | | function ActivitiPropertiesProvider( |
| | | eventBus, canvas, bpmnFactory, |
| | | elementRegistry, elementTemplates, translate) { |
| | | |
| | | PropertiesActivator.call(this, eventBus); |
| | | |
| | | this.getTabs = function(element) { |
| | | |
| | | var generalTab = { |
| | | id: 'general', |
| | | label: translate('General'), |
| | | groups: createGeneralTabGroups( |
| | | element, canvas, bpmnFactory, |
| | | elementRegistry, elementTemplates, translate) |
| | | }; |
| | | |
| | | var variablesTab = { |
| | | id: 'variables', |
| | | label: translate('Variables'), |
| | | groups: createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | var formsTab = { |
| | | id: 'forms', |
| | | label: translate('Forms'), |
| | | groups: createFormsTabGroups(element, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | var listenersTab = { |
| | | id: 'listeners', |
| | | label: translate('Listeners'), |
| | | groups: createListenersTabGroups(element, bpmnFactory, elementRegistry, translate), |
| | | enabled: function(element) { |
| | | return !eventDefinitionHelper.getLinkEventDefinition(element) |
| | | || (!is(element, 'bpmn:IntermediateThrowEvent') |
| | | && eventDefinitionHelper.getLinkEventDefinition(element)); |
| | | } |
| | | }; |
| | | |
| | | var inputOutputTab = { |
| | | id: 'input-output', |
| | | label: translate('Input/Output'), |
| | | groups: createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | var connectorTab = { |
| | | id: 'connector', |
| | | label: translate('Connector'), |
| | | groups: createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate), |
| | | enabled: function(element) { |
| | | var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | return bo && implementationTypeHelper.getImplementationType(bo) === 'connector'; |
| | | } |
| | | }; |
| | | |
| | | var fieldInjectionsTab = { |
| | | id: 'field-injections', |
| | | label: translate('Field Injections'), |
| | | groups: createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | var extensionsTab = { |
| | | id: 'extensionElements', |
| | | label: translate('Extensions'), |
| | | groups: createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | return [ |
| | | generalTab, |
| | | variablesTab, |
| | | connectorTab, |
| | | formsTab, |
| | | listenersTab, |
| | | inputOutputTab, |
| | | fieldInjectionsTab, |
| | | extensionsTab |
| | | ]; |
| | | }; |
| | | |
| | | } |
| | | |
| | | ActivitiPropertiesProvider.$inject = [ |
| | | 'eventBus', |
| | | 'canvas', |
| | | 'bpmnFactory', |
| | | 'elementRegistry', |
| | | 'elementTemplates', |
| | | 'translate' |
| | | ]; |
| | | |
| | | inherits(ActivitiPropertiesProvider, PropertiesActivator); |
| | | |
| | | module.exports = ActivitiPropertiesProvider; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | /** |
| | | * Create an input parameter representing the given |
| | | * binding and value. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createInputParameter(binding, value, bpmnFactory) { |
| | | var scriptFormat = binding.scriptFormat, |
| | | parameterValue, |
| | | parameterDefinition; |
| | | |
| | | if (scriptFormat) { |
| | | parameterDefinition = bpmnFactory.create('activiti:Script', { |
| | | scriptFormat: scriptFormat, |
| | | value: value |
| | | }); |
| | | } else { |
| | | parameterValue = value; |
| | | } |
| | | |
| | | return bpmnFactory.create('activiti:InputParameter', { |
| | | name: binding.name, |
| | | value: parameterValue, |
| | | definition: parameterDefinition |
| | | }); |
| | | } |
| | | |
| | | module.exports.createInputParameter = createInputParameter; |
| | | |
| | | |
| | | /** |
| | | * Create an output parameter representing the given |
| | | * binding and value. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createOutputParameter(binding, value, bpmnFactory) { |
| | | var scriptFormat = binding.scriptFormat, |
| | | parameterValue, |
| | | parameterDefinition; |
| | | |
| | | if (scriptFormat) { |
| | | parameterDefinition = bpmnFactory.create('activiti:Script', { |
| | | scriptFormat: scriptFormat, |
| | | value: binding.source |
| | | }); |
| | | } else { |
| | | parameterValue = binding.source; |
| | | } |
| | | |
| | | return bpmnFactory.create('activiti:OutputParameter', { |
| | | name: value, |
| | | value: parameterValue, |
| | | definition: parameterDefinition |
| | | }); |
| | | } |
| | | |
| | | module.exports.createOutputParameter = createOutputParameter; |
| | | |
| | | |
| | | /** |
| | | * Create activiti property from the given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiProperty(binding, value, bpmnFactory) { |
| | | return bpmnFactory.create('activiti:Property', { |
| | | name: binding.name, |
| | | value: value || '' |
| | | }); |
| | | } |
| | | |
| | | module.exports.createActivitiProperty = createActivitiProperty; |
| | | |
| | | |
| | | /** |
| | | * Create activiti:in element from given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiIn(binding, value, bpmnFactory) { |
| | | |
| | | var properties = createActivitiInOutAttrs(binding, value); |
| | | |
| | | return bpmnFactory.create('activiti:In', properties); |
| | | } |
| | | |
| | | module.exports.createActivitiIn = createActivitiIn; |
| | | |
| | | |
| | | /** |
| | | * Create activiti:in with businessKey element from given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiInWithBusinessKey(binding, value, bpmnFactory) { |
| | | return bpmnFactory.create('activiti:In', { |
| | | businessKey: value |
| | | }); |
| | | } |
| | | |
| | | module.exports.createActivitiInWithBusinessKey = createActivitiInWithBusinessKey; |
| | | |
| | | |
| | | /** |
| | | * Create activiti:out element from given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiOut(binding, value, bpmnFactory) { |
| | | var properties = createActivitiInOutAttrs(binding, value); |
| | | |
| | | return bpmnFactory.create('activiti:Out', properties); |
| | | } |
| | | |
| | | module.exports.createActivitiOut = createActivitiOut; |
| | | |
| | | |
| | | /** |
| | | * Create activiti:executionListener element containing an inline script from given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiExecutionListenerScript(binding, value, bpmnFactory) { |
| | | var scriptFormat = binding.scriptFormat, |
| | | parameterValue, |
| | | parameterDefinition; |
| | | |
| | | if (scriptFormat) { |
| | | parameterDefinition = bpmnFactory.create('activiti:Script', { |
| | | scriptFormat: scriptFormat, |
| | | value: value |
| | | }); |
| | | } else { |
| | | parameterValue = value; |
| | | } |
| | | |
| | | return bpmnFactory.create('activiti:ExecutionListener', { |
| | | event: binding.event, |
| | | value: parameterValue, |
| | | script: parameterDefinition |
| | | }); |
| | | } |
| | | |
| | | module.exports.createActivitiExecutionListenerScript = createActivitiExecutionListenerScript; |
| | | |
| | | /** |
| | | * Create activiti:field element containing string or expression from given binding. |
| | | * |
| | | * @param {PropertyBinding} binding |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement} |
| | | */ |
| | | function createActivitiFieldInjection(binding, value, bpmnFactory) { |
| | | var DEFAULT_PROPS = { |
| | | 'string': undefined, |
| | | 'expression': undefined, |
| | | 'name': undefined |
| | | }; |
| | | |
| | | var props = assign({}, DEFAULT_PROPS); |
| | | |
| | | if (!binding.expression) { |
| | | props.string = value; |
| | | } else { |
| | | props.expression = value; |
| | | } |
| | | props.name = binding.name; |
| | | |
| | | return bpmnFactory.create('activiti:Field', props); |
| | | } |
| | | module.exports.createActivitiFieldInjection = createActivitiFieldInjection; |
| | | |
| | | |
| | | // helpers //////////////////////////// |
| | | |
| | | /** |
| | | * Create properties for activiti:in and activiti:out types. |
| | | */ |
| | | function createActivitiInOutAttrs(binding, value) { |
| | | |
| | | var properties = {}; |
| | | |
| | | // activiti:in source(Expression) target |
| | | if (binding.target) { |
| | | |
| | | properties.target = binding.target; |
| | | |
| | | if (binding.expression) { |
| | | properties.sourceExpression = value; |
| | | } else { |
| | | properties.source = value; |
| | | } |
| | | } else |
| | | |
| | | // activiti:(in|out) variables local |
| | | if (binding.variables) { |
| | | properties.variables = 'all'; |
| | | |
| | | if (binding.variables === 'local') { |
| | | properties.local = true; |
| | | } |
| | | } |
| | | |
| | | // activiti:out source(Expression) target |
| | | else { |
| | | properties.target = value; |
| | | |
| | | [ 'source', 'sourceExpression' ].forEach(function(k) { |
| | | if (binding[k]) { |
| | | properties[k] = binding[k]; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return properties; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var inherits = require('inherits'); |
| | | |
| | | var getTemplate = require('./Helper').getTemplate; |
| | | |
| | | var PropertiesActivator = require('../../../PropertiesActivator'); |
| | | |
| | | var HIGHER_PRIORITY = 1100; |
| | | |
| | | /** |
| | | * Applies template visibility settings. |
| | | * |
| | | * Controlled using `entriesVisible` on template config object: |
| | | * |
| | | * ```json |
| | | * "entriesVisible": { |
| | | * "_all": true|false, |
| | | * "entryName": true|false, |
| | | * ... |
| | | * } |
| | | * ``` |
| | | * |
| | | * @param {EventBus} eventBus |
| | | * @param {ElementTemplates} elementTemplates |
| | | */ |
| | | function CustomElementsPropertiesActivator(eventBus, elementTemplates) { |
| | | PropertiesActivator.call(this, eventBus, HIGHER_PRIORITY); |
| | | |
| | | this.isEntryVisible = function(entry, element) { |
| | | |
| | | var template = getTemplate(element, elementTemplates); |
| | | |
| | | if (template && !isEntryVisible(entry, template)) { |
| | | return false; |
| | | } |
| | | }; |
| | | |
| | | this.isPropertyEditable = function(entry, propertyName, element) { |
| | | |
| | | var template = getTemplate(element, elementTemplates); |
| | | |
| | | if (template && !isEntryEditable(entry, template)) { |
| | | return false; |
| | | } |
| | | }; |
| | | } |
| | | |
| | | CustomElementsPropertiesActivator.$inject = [ 'eventBus', 'elementTemplates' ]; |
| | | |
| | | inherits(CustomElementsPropertiesActivator, PropertiesActivator); |
| | | |
| | | module.exports = CustomElementsPropertiesActivator; |
| | | |
| | | |
| | | |
| | | // helpers //////////////////////////////////// |
| | | |
| | | |
| | | var CUSTOM_PROPERTIES_PATTERN = /^custom-/; |
| | | |
| | | var DEFAULT_ENTRIES_VISIBLE = { |
| | | _all: false, |
| | | id: true, |
| | | name: true |
| | | }; |
| | | |
| | | function isCustomEntry(entry) { |
| | | return CUSTOM_PROPERTIES_PATTERN.test(entry.id); |
| | | } |
| | | |
| | | function isEntryVisible(entry, template) { |
| | | |
| | | var entryId = entry.id; |
| | | |
| | | if (entryId === 'elementTemplate-chooser' || isCustomEntry(entry)) { |
| | | return true; |
| | | } |
| | | |
| | | var entriesVisible = template.entriesVisible || DEFAULT_ENTRIES_VISIBLE; |
| | | |
| | | if (typeof entriesVisible === 'boolean') { |
| | | return entriesVisible; |
| | | } |
| | | |
| | | var defaultVisible = entriesVisible._all || false, |
| | | entryVisible = entriesVisible[entryId]; |
| | | |
| | | // d = true, e = false => false |
| | | // d = false, e = true => true |
| | | // d = false, e = false |
| | | return ( |
| | | (defaultVisible === true && entryVisible !== false) || |
| | | (defaultVisible === false && entryVisible === true) |
| | | ); |
| | | } |
| | | |
| | | function isEntryEditable(entry, template) { |
| | | |
| | | var property; |
| | | |
| | | if (isCustomEntry(entry)) { |
| | | property = getProperty(template, entry); |
| | | |
| | | return property && property.editable !== false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | function getProperty(template, entry) { |
| | | |
| | | var index; |
| | | var idx = entry.id.replace('custom-' + template.id + '-', ''); |
| | | if (idx.indexOf('-') !== -1) { |
| | | var indexes = idx.split('-'); |
| | | if (indexes.length == 2) { |
| | | var scopeName = indexes[0].replace(/_/g, ':'); |
| | | index = parseInt(indexes[1], 10); |
| | | if (scopeName && !isNaN(index)) { |
| | | return template.scopes[scopeName].properties[index]; |
| | | } |
| | | } |
| | | } else { |
| | | index = parseInt(idx, 10); |
| | | if (!isNaN(index)) { |
| | | return template.properties[index]; |
| | | } |
| | | } |
| | | |
| | | throw new Error('cannot extract property index for entry <' + entry.id + '>'); |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var values = require('lodash/values'); |
| | | |
| | | /** |
| | | * The guy knowing all configured element templates. |
| | | * |
| | | * This registry won't validate. Use the {@link Validator} |
| | | * to verify a template is valid prior to adding it to |
| | | * this registry. |
| | | */ |
| | | function ElementTemplates() { |
| | | |
| | | this._templates = {}; |
| | | |
| | | /** |
| | | * Sets the known element templates. |
| | | * |
| | | * @param {Array<TemplateDescriptor>} descriptors |
| | | * |
| | | * @return {ElementTemplates} |
| | | */ |
| | | this.set = function(descriptors) { |
| | | |
| | | var templates = this._templates = {}; |
| | | |
| | | descriptors.forEach(function(descriptor) { |
| | | templates[descriptor.id] = descriptor; |
| | | }); |
| | | |
| | | return this; |
| | | }; |
| | | |
| | | /** |
| | | * Get template descriptor with given id. |
| | | * |
| | | * @param {String} id |
| | | * |
| | | * @return {TemplateDescriptor} |
| | | */ |
| | | this.get = function(id) { |
| | | return this._templates[id]; |
| | | }; |
| | | |
| | | /** |
| | | * Return all known template descriptors. |
| | | * |
| | | * @return {Array<TemplateDescriptor>} |
| | | */ |
| | | this.getAll = function() { |
| | | return values(this._templates); |
| | | }; |
| | | |
| | | } |
| | | |
| | | module.exports = ElementTemplates; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var Validator = require('./Validator'); |
| | | |
| | | /** |
| | | * The guy responsible for template loading. |
| | | * |
| | | * Provide the actual templates via the `config.elementTemplates`. |
| | | * |
| | | * That configuration can either be an array of template |
| | | * descriptors or a node style callback to retrieve |
| | | * the templates asynchronously. |
| | | * |
| | | * @param {Array<TemplateDescriptor>|Function} loadTemplates |
| | | * @param {EventBus} eventBus |
| | | * @param {ElementTemplates} elementTemplates |
| | | */ |
| | | function ElementTemplatesLoader(loadTemplates, eventBus, elementTemplates) { |
| | | this._loadTemplates = loadTemplates; |
| | | this._eventBus = eventBus; |
| | | this._elementTemplates = elementTemplates; |
| | | |
| | | var self = this; |
| | | |
| | | eventBus.on('diagram.init', function() { |
| | | self.reload(); |
| | | }); |
| | | } |
| | | |
| | | module.exports = ElementTemplatesLoader; |
| | | |
| | | ElementTemplatesLoader.$inject = [ |
| | | 'config.elementTemplates', |
| | | 'eventBus', |
| | | 'elementTemplates' |
| | | ]; |
| | | |
| | | |
| | | ElementTemplatesLoader.prototype.reload = function() { |
| | | |
| | | var self = this; |
| | | |
| | | var loadTemplates = this._loadTemplates; |
| | | |
| | | // no templates specified |
| | | if (typeof loadTemplates === 'undefined') { |
| | | return; |
| | | } |
| | | |
| | | // template loader function specified |
| | | if (typeof loadTemplates === 'function') { |
| | | |
| | | return loadTemplates(function(err, templates) { |
| | | |
| | | if (err) { |
| | | return self.templateErrors([ err ]); |
| | | } |
| | | |
| | | self.setTemplates(templates); |
| | | }); |
| | | } |
| | | |
| | | // templates array specified |
| | | if (loadTemplates.length) { |
| | | return this.setTemplates(loadTemplates); |
| | | } |
| | | |
| | | }; |
| | | |
| | | ElementTemplatesLoader.prototype.setTemplates = function(templates) { |
| | | |
| | | var elementTemplates = this._elementTemplates; |
| | | |
| | | var validator = new Validator().addAll(templates); |
| | | |
| | | var errors = validator.getErrors(), |
| | | validTemplates = validator.getValidTemplates(); |
| | | |
| | | elementTemplates.set(validTemplates); |
| | | |
| | | if (errors.length) { |
| | | this.templateErrors(errors); |
| | | } |
| | | |
| | | this.templatesChanged(); |
| | | }; |
| | | |
| | | ElementTemplatesLoader.prototype.templatesChanged = function() { |
| | | this._eventBus.fire('elementTemplates.changed'); |
| | | }; |
| | | |
| | | ElementTemplatesLoader.prototype.templateErrors = function(errors) { |
| | | this._eventBus.fire('elementTemplates.errors', { |
| | | errors: errors |
| | | }); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny; |
| | | |
| | | var find = require('lodash/find'); |
| | | |
| | | |
| | | var TEMPLATE_ATTR = 'activiti:modelerTemplate'; |
| | | |
| | | /** |
| | | * The BPMN 2.0 extension attribute name under |
| | | * which the element template is stored. |
| | | * |
| | | * @type {String} |
| | | */ |
| | | module.exports.TEMPLATE_ATTR = TEMPLATE_ATTR; |
| | | |
| | | |
| | | /** |
| | | * Get template id for a given diagram element. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {String} |
| | | */ |
| | | function getTemplateId(element) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (bo) { |
| | | return bo.get(TEMPLATE_ATTR); |
| | | } |
| | | } |
| | | |
| | | module.exports.getTemplateId = getTemplateId; |
| | | |
| | | |
| | | /** |
| | | * Get template of a given element. |
| | | * |
| | | * @param {Element} element |
| | | * @param {ElementTemplates} elementTemplates |
| | | * |
| | | * @return {TemplateDefinition} |
| | | */ |
| | | function getTemplate(element, elementTemplates) { |
| | | var id = getTemplateId(element); |
| | | |
| | | return id && elementTemplates.get(id); |
| | | } |
| | | |
| | | module.exports.getTemplate = getTemplate; |
| | | |
| | | /** |
| | | * Get default template for a given element. |
| | | * |
| | | * @param {Element} element |
| | | * @param {ElementTemplates} elementTemplates |
| | | * |
| | | * @return {TemplateDefinition} |
| | | */ |
| | | function getDefaultTemplate(element, elementTemplates) { |
| | | |
| | | // return first default template, if any exists |
| | | return ( |
| | | elementTemplates.getAll().filter(function(t) { |
| | | return isAny(element, t.appliesTo) && t.isDefault; |
| | | }) |
| | | )[0]; |
| | | } |
| | | |
| | | module.exports.getDefaultTemplate = getDefaultTemplate; |
| | | |
| | | |
| | | /** |
| | | * Find extension with given type in |
| | | * BPMN element, diagram element or ExtensionElement. |
| | | * |
| | | * @param {ModdleElement|djs.model.Base} element |
| | | * @param {String} type |
| | | * |
| | | * @return {ModdleElement} the extension |
| | | */ |
| | | function findExtension(element, type) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var extensionElements; |
| | | |
| | | if (is(bo, 'bpmn:ExtensionElements')) { |
| | | extensionElements = bo; |
| | | } else { |
| | | extensionElements = bo.extensionElements; |
| | | } |
| | | |
| | | if (!extensionElements) { |
| | | return null; |
| | | } |
| | | |
| | | return find(extensionElements.get('values'), function(e) { |
| | | return is(e, type); |
| | | }); |
| | | } |
| | | |
| | | module.exports.findExtension = findExtension; |
| | | |
| | | |
| | | function findExtensions(element, types) { |
| | | var extensionElements = getExtensionElements(element); |
| | | |
| | | if (!extensionElements) { |
| | | return []; |
| | | } |
| | | |
| | | return extensionElements.get('values').filter(function(e) { |
| | | return isAny(e, types); |
| | | }); |
| | | } |
| | | |
| | | module.exports.findExtensions = findExtensions; |
| | | |
| | | |
| | | function findActivitiInOut(element, binding) { |
| | | |
| | | var extensionElements = getExtensionElements(element); |
| | | |
| | | if (!extensionElements) { |
| | | return; |
| | | } |
| | | |
| | | var matcher; |
| | | |
| | | if (binding.type === 'activiti:in') { |
| | | matcher = function(e) { |
| | | return is(e, 'activiti:In') && isInOut(e, binding); |
| | | }; |
| | | } else |
| | | if (binding.type === 'activiti:out') { |
| | | matcher = function(e) { |
| | | return is(e, 'activiti:Out') && isInOut(e, binding); |
| | | }; |
| | | } else |
| | | if (binding.type === 'activiti:in:businessKey') { |
| | | matcher = function(e) { |
| | | return is(e, 'activiti:In') && 'businessKey' in e; |
| | | }; |
| | | } |
| | | |
| | | return find(extensionElements.get('values'), matcher); |
| | | } |
| | | |
| | | module.exports.findActivitiInOut = findActivitiInOut; |
| | | |
| | | function findActivitiProperty(activitiProperties, binding) { |
| | | return find(activitiProperties.get('values'), function(p) { |
| | | return p.name === binding.name; |
| | | }); |
| | | } |
| | | |
| | | module.exports.findActivitiProperty = findActivitiProperty; |
| | | |
| | | |
| | | function findInputParameter(inputOutput, binding) { |
| | | var parameters = inputOutput.get('inputParameters'); |
| | | |
| | | return find(parameters, function(p) { |
| | | return p.name === binding.name; |
| | | }); |
| | | } |
| | | |
| | | module.exports.findInputParameter = findInputParameter; |
| | | |
| | | |
| | | function findOutputParameter(inputOutput, binding) { |
| | | var parameters = inputOutput.get('outputParameters'); |
| | | |
| | | return find(parameters, function(p) { |
| | | var value = p.value; |
| | | |
| | | if (!binding.scriptFormat) { |
| | | return value === binding.source; |
| | | } |
| | | |
| | | var definition = p.definition; |
| | | |
| | | if (!definition || binding.scriptFormat !== definition.scriptFormat) { |
| | | return false; |
| | | } |
| | | |
| | | return definition.value === binding.source; |
| | | }); |
| | | } |
| | | |
| | | module.exports.findOutputParameter = findOutputParameter; |
| | | |
| | | |
| | | |
| | | // helpers ///////////////////////////////// |
| | | |
| | | function getExtensionElements(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (is(bo, 'bpmn:ExtensionElements')) { |
| | | return bo; |
| | | } else { |
| | | return bo.extensionElements; |
| | | } |
| | | } |
| | | |
| | | |
| | | function isInOut(element, binding) { |
| | | |
| | | if (binding.type === 'activiti:in') { |
| | | // find based on target attribute |
| | | if (binding.target) { |
| | | return element.target === binding.target; |
| | | } |
| | | } |
| | | |
| | | if (binding.type === 'activiti:out') { |
| | | // find based on source / sourceExpression |
| | | if (binding.source) { |
| | | return element.source === binding.source; |
| | | } |
| | | |
| | | if (binding.sourceExpression) { |
| | | return element.sourceExpression === binding.sourceExpression; |
| | | } |
| | | } |
| | | |
| | | // find based variables / local combination |
| | | if (binding.variables) { |
| | | return element.variables === 'all' && ( |
| | | binding.variables !== 'local' || element.local |
| | | ); |
| | | } |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var isArray = require('lodash/isArray'); |
| | | var isObject = require('lodash/isObject'); |
| | | |
| | | var DROPDOWN_TYPE = 'Dropdown'; |
| | | |
| | | var VALID_TYPES = [ 'String', 'Text', 'Boolean', 'Hidden', DROPDOWN_TYPE ]; |
| | | |
| | | var PROPERTY_TYPE = 'property', |
| | | ACTIVITI_PROPERTY_TYPE = 'activiti:property', |
| | | ACTIVITI_INPUT_PARAMETER_TYPE = 'activiti:inputParameter', |
| | | ACTIVITI_OUTPUT_PARAMETER_TYPE = 'activiti:outputParameter', |
| | | ACTIVITI_IN_TYPE = 'activiti:in', |
| | | ACTIVITI_OUT_TYPE = 'activiti:out', |
| | | ACTIVITI_IN_BUSINESS_KEY_TYPE = 'activiti:in:businessKey', |
| | | ACTIVITI_EXECUTION_LISTENER = 'activiti:executionListener', |
| | | ACTIVITI_FIELD = 'activiti:field'; |
| | | |
| | | var VALID_BINDING_TYPES = [ |
| | | PROPERTY_TYPE, |
| | | ACTIVITI_PROPERTY_TYPE, |
| | | ACTIVITI_INPUT_PARAMETER_TYPE, |
| | | ACTIVITI_OUTPUT_PARAMETER_TYPE, |
| | | ACTIVITI_IN_TYPE, |
| | | ACTIVITI_OUT_TYPE, |
| | | ACTIVITI_IN_BUSINESS_KEY_TYPE, |
| | | ACTIVITI_EXECUTION_LISTENER, |
| | | ACTIVITI_FIELD |
| | | ]; |
| | | |
| | | |
| | | /** |
| | | * A element template validator. |
| | | */ |
| | | function Validator() { |
| | | |
| | | this._templatesById = {}; |
| | | |
| | | this._validTemplates = []; |
| | | this._errors = []; |
| | | |
| | | |
| | | /** |
| | | * Adds the templates. |
| | | * |
| | | * @param {Array<TemplateDescriptor>} templates |
| | | * |
| | | * @return {Validator} self |
| | | */ |
| | | this.addAll = function(templates) { |
| | | |
| | | if (!isArray(templates)) { |
| | | this._logError('templates must be []'); |
| | | } else { |
| | | templates.forEach(this.add, this); |
| | | } |
| | | |
| | | return this; |
| | | }; |
| | | |
| | | /** |
| | | * Add the given element template, if it is valid. |
| | | * |
| | | * @param {TemplateDescriptor} template |
| | | * |
| | | * @return {Validator} self |
| | | */ |
| | | this.add = function(template) { |
| | | |
| | | var err = this._validateTemplate(template); |
| | | |
| | | if (!err) { |
| | | this._templatesById[template.id] = template; |
| | | |
| | | this._validTemplates.push(template); |
| | | } |
| | | |
| | | return this; |
| | | }; |
| | | |
| | | /** |
| | | * Validate given template and return error (if any). |
| | | * |
| | | * @param {TemplateDescriptor} template |
| | | * |
| | | * @return {Error} validation error, if any |
| | | */ |
| | | this._validateTemplate = function(template) { |
| | | |
| | | var err, |
| | | id = template.id, |
| | | appliesTo = template.appliesTo, |
| | | properties = template.properties, |
| | | scopes = template.scopes; |
| | | |
| | | if (!id) { |
| | | return this._logError('missing template id'); |
| | | } |
| | | |
| | | if (id in this._templatesById) { |
| | | return this._logError('template id <' + id + '> already used'); |
| | | } |
| | | |
| | | if (!isArray(appliesTo)) { |
| | | err = this._logError('missing appliesTo=[]', template); |
| | | } |
| | | |
| | | if (!isArray(properties)) { |
| | | err = this._logError('missing properties=[]', template); |
| | | } else { |
| | | if (!this._validateProperties(properties)) { |
| | | err = new Error('invalid properties'); |
| | | } |
| | | } |
| | | |
| | | if (scopes) { |
| | | err = this._validateScopes(template, scopes); |
| | | } |
| | | |
| | | return err; |
| | | }; |
| | | |
| | | this._validateScopes = function(template, scopes) { |
| | | |
| | | var err, |
| | | scope, |
| | | scopeName; |
| | | |
| | | if (!isObject(scopes) || isArray(scopes)) { |
| | | return this._logError('invalid scopes, should be scopes={}', template); |
| | | } |
| | | |
| | | for (scopeName in scopes) { |
| | | scope = scopes[scopeName]; |
| | | |
| | | if (!isObject(scope) || isArray(scope)) { |
| | | err = this._logError('invalid scope, should be scope={}', template); |
| | | } |
| | | |
| | | if (!isArray(scope.properties)) { |
| | | err = this._logError( |
| | | 'missing properties=[] in scope <' + scopeName + '>', template |
| | | ); |
| | | } else { |
| | | if (!this._validateProperties(scope.properties)) { |
| | | err = new Error('invalid properties in scope <' + scopeName + '>'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return err; |
| | | }; |
| | | |
| | | /** |
| | | * Validate properties and return false if any is invalid. |
| | | * |
| | | * @param {Array<PropertyDescriptor>} properties |
| | | * |
| | | * @return {Boolean} true if all properties are valid |
| | | */ |
| | | this._validateProperties = function(properties) { |
| | | var validProperties = properties.filter(this._validateProperty, this); |
| | | |
| | | return properties.length === validProperties.length; |
| | | }; |
| | | |
| | | /** |
| | | * Validate property and return false, if there was |
| | | * a validation error. |
| | | * |
| | | * @param {PropertyDescriptor} property |
| | | * |
| | | * @return {Boolean} true if property is valid |
| | | */ |
| | | this._validateProperty = function(property) { |
| | | |
| | | var type = property.type, |
| | | binding = property.binding; |
| | | |
| | | var err; |
| | | |
| | | var bindingType = binding.type; |
| | | |
| | | if (VALID_TYPES.indexOf(type) === -1) { |
| | | err = this._logError( |
| | | 'invalid property type <' + type + '>; ' + |
| | | 'must be any of { ' + VALID_TYPES.join(', ') + ' }' |
| | | ); |
| | | } |
| | | |
| | | if (type === DROPDOWN_TYPE && bindingType !== ACTIVITI_EXECUTION_LISTENER) { |
| | | if (!isArray(property.choices)) { |
| | | err = this._logError( |
| | | 'must provide choices=[] with ' + DROPDOWN_TYPE + ' type' |
| | | ); |
| | | } else |
| | | |
| | | if (!property.choices.every(isDropdownChoiceValid)) { |
| | | err = this._logError( |
| | | '{ name, value } must be specified for ' + |
| | | DROPDOWN_TYPE + ' choices' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | if (!binding) { |
| | | return this._logError('property missing binding'); |
| | | } |
| | | |
| | | if (VALID_BINDING_TYPES.indexOf(bindingType) === -1) { |
| | | err = this._logError( |
| | | 'invalid property.binding type <' + bindingType + '>; ' + |
| | | 'must be any of { ' + VALID_BINDING_TYPES.join(', ') + ' }' |
| | | ); |
| | | } |
| | | |
| | | if (bindingType === PROPERTY_TYPE || |
| | | bindingType === ACTIVITI_PROPERTY_TYPE || |
| | | bindingType === ACTIVITI_INPUT_PARAMETER_TYPE || |
| | | bindingType === ACTIVITI_FIELD) { |
| | | |
| | | if (!binding.name) { |
| | | err = this._logError( |
| | | 'property.binding <' + bindingType + '> requires name' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_OUTPUT_PARAMETER_TYPE) { |
| | | if (!binding.source) { |
| | | err = this._logError( |
| | | 'property.binding <' + bindingType + '> requires source' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_IN_TYPE) { |
| | | |
| | | if (!binding.variables && !binding.target) { |
| | | err = this._logError( |
| | | 'property.binding <' + bindingType + '> requires ' + |
| | | 'variables or target' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_OUT_TYPE) { |
| | | |
| | | if (!binding.variables && !binding.source && !binding.sourceExpression) { |
| | | err = this._logError( |
| | | 'property.binding <' + bindingType + '> requires ' + |
| | | 'variables, sourceExpression or source' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_EXECUTION_LISTENER) { |
| | | |
| | | if (type !== 'Hidden') { |
| | | err = this._logError( |
| | | 'invalid property type <' + type + '> for ' + ACTIVITI_EXECUTION_LISTENER + '; ' + |
| | | 'must be <Hidden>' |
| | | ); |
| | | } |
| | | } |
| | | |
| | | return !err; |
| | | }; |
| | | |
| | | |
| | | this._logError = function(err, template) { |
| | | |
| | | if (typeof err === 'string') { |
| | | if (template) { |
| | | err = 'template(id: ' + template.id + ') ' + err; |
| | | } |
| | | |
| | | err = new Error(err); |
| | | } |
| | | |
| | | this._errors.push(err); |
| | | |
| | | return err; |
| | | }; |
| | | |
| | | this.getErrors = function() { |
| | | return this._errors; |
| | | }; |
| | | |
| | | this.getValidTemplates = function() { |
| | | return this._validTemplates; |
| | | }; |
| | | } |
| | | |
| | | module.exports = Validator; |
| | | |
| | | |
| | | // helpers /////////////////////////////////// |
| | | |
| | | function isDropdownChoiceValid(c) { |
| | | return 'name' in c && 'value' in c; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var findExtension = require('../Helper').findExtension, |
| | | findExtensions = require('../Helper').findExtensions; |
| | | |
| | | var createActivitiProperty = require('../CreateHelper').createActivitiProperty, |
| | | createInputParameter = require('../CreateHelper').createInputParameter, |
| | | createOutputParameter = require('../CreateHelper').createOutputParameter, |
| | | createActivitiIn = require('../CreateHelper').createActivitiIn, |
| | | createActivitiOut = require('../CreateHelper').createActivitiOut, |
| | | createActivitiInWithBusinessKey = require('../CreateHelper').createActivitiInWithBusinessKey, |
| | | createActivitiExecutionListenerScript = require('../CreateHelper').createActivitiExecutionListenerScript, |
| | | createActivitiFieldInjection = require('../CreateHelper').createActivitiFieldInjection; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var ACTIVITI_SERVICE_TASK_LIKE = [ |
| | | 'activiti:class', |
| | | 'activiti:delegateExpression', |
| | | 'activiti:expression' |
| | | ]; |
| | | |
| | | /** |
| | | * A handler that changes the modeling template of a BPMN element. |
| | | */ |
| | | function ChangeElementTemplateHandler(modeling, commandStack, bpmnFactory) { |
| | | |
| | | function getOrCreateExtensionElements(element) { |
| | | |
| | | var bo = element.businessObject; |
| | | |
| | | var extensionElements = bo.extensionElements; |
| | | |
| | | // add extension elements |
| | | if (!extensionElements) { |
| | | extensionElements = bpmnFactory.create('bpmn:ExtensionElements', { |
| | | values: [] |
| | | }); |
| | | |
| | | modeling.updateProperties(element, { |
| | | extensionElements: extensionElements |
| | | }); |
| | | } |
| | | |
| | | return extensionElements; |
| | | } |
| | | |
| | | function updateModelerTemplate(element, newTemplate) { |
| | | modeling.updateProperties(element, { |
| | | 'activiti:modelerTemplate': newTemplate && newTemplate.id |
| | | }); |
| | | } |
| | | |
| | | function updateIoMappings(element, newTemplate, context) { |
| | | |
| | | var newMappings = createInputOutputMappings(newTemplate, bpmnFactory), |
| | | oldMappings; |
| | | |
| | | if (!newMappings) { |
| | | return; |
| | | } |
| | | |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: { inputOutput: newMappings } |
| | | }); |
| | | } else { |
| | | context = getOrCreateExtensionElements(element); |
| | | oldMappings = findExtension(element, 'activiti:InputOutput'); |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: context, |
| | | propertyName: 'values', |
| | | objectsToAdd: [ newMappings ], |
| | | objectsToRemove: oldMappings ? [ oldMappings ] : [] |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function updateActivitiField(element, newTemplate, context) { |
| | | |
| | | var newMappings = createActivitiFieldInjections(newTemplate, bpmnFactory), |
| | | oldMappings; |
| | | |
| | | if (!newMappings) { |
| | | return; |
| | | } |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: { field: newMappings } |
| | | }); |
| | | } else { |
| | | context = getOrCreateExtensionElements(element); |
| | | oldMappings = findExtensions(element, ['activiti:Field']); |
| | | |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: context, |
| | | propertyName: 'values', |
| | | objectsToAdd: newMappings, |
| | | objectsToRemove: oldMappings ? oldMappings : [] |
| | | }); |
| | | } |
| | | } |
| | | |
| | | |
| | | function updateActivitiProperties(element, newTemplate, context) { |
| | | |
| | | var newProperties = createActivitiProperties(newTemplate, bpmnFactory), |
| | | oldProperties; |
| | | |
| | | if (!newProperties) { |
| | | return; |
| | | } |
| | | |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: { properties: newProperties } |
| | | }); |
| | | } else { |
| | | context = getOrCreateExtensionElements(element); |
| | | oldProperties = findExtension(element, 'activiti:Properties'); |
| | | |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: context, |
| | | propertyName: 'values', |
| | | objectsToAdd: [ newProperties ], |
| | | objectsToRemove: oldProperties ? [ oldProperties ] : [] |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function updateProperties(element, newTemplate, context) { |
| | | |
| | | var newProperties = createBpmnPropertyUpdates(newTemplate, bpmnFactory); |
| | | |
| | | var newPropertiesCount = Object.keys(newProperties).length; |
| | | |
| | | if (!newPropertiesCount) { |
| | | return; |
| | | } |
| | | |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: newProperties |
| | | }); |
| | | } else { |
| | | modeling.updateProperties(element, newProperties); |
| | | } |
| | | } |
| | | |
| | | function updateInOut(element, newTemplate, context) { |
| | | |
| | | var newInOut = createActivitiInOut(newTemplate, bpmnFactory), |
| | | oldInOut; |
| | | |
| | | if (!newInOut) { |
| | | return; |
| | | } |
| | | |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: { inout: newInOut } |
| | | }); |
| | | } else { |
| | | context = getOrCreateExtensionElements(element); |
| | | oldInOut = findExtensions(context, [ 'activiti:In', 'activiti:Out' ]); |
| | | |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: context, |
| | | propertyName: 'values', |
| | | objectsToAdd: newInOut, |
| | | objectsToRemove: oldInOut |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function updateExecutionListener(element, newTemplate, context) { |
| | | |
| | | var newExecutionListeners = createActivitiExecutionListeners(newTemplate, bpmnFactory), |
| | | oldExecutionsListeners; |
| | | |
| | | if (!newExecutionListeners.length) { |
| | | return; |
| | | } |
| | | |
| | | if (context) { |
| | | commandStack.execute('properties-panel.update-businessobject', { |
| | | element: element, |
| | | businessObject: context, |
| | | properties: { executionListener: newExecutionListeners } |
| | | }); |
| | | } else { |
| | | context = getOrCreateExtensionElements(element); |
| | | oldExecutionsListeners = findExtensions(context, [ 'activiti:ExecutionListener' ]); |
| | | |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: context, |
| | | propertyName: 'values', |
| | | objectsToAdd: newExecutionListeners, |
| | | objectsToRemove: oldExecutionsListeners |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Update / recreate a scoped element. |
| | | * |
| | | * @param {djs.model.Base} element the diagram parent element |
| | | * @param {String} scopeName name of the scope, i.e. activiti:Connector |
| | | * @param {Object} scopeDefinition |
| | | */ |
| | | function updateScopeElements(element, scopeName, scopeDefinition) { |
| | | |
| | | var scopeElement = bpmnFactory.create(scopeName); |
| | | |
| | | // update activiti:inputOutput |
| | | updateIoMappings(element, scopeDefinition, scopeElement); |
| | | |
| | | // update activiti:field |
| | | updateActivitiField(element, scopeDefinition, scopeElement); |
| | | |
| | | // update activiti:properties |
| | | updateActivitiProperties(element, scopeDefinition, scopeElement); |
| | | |
| | | // update other properties (bpmn:condition, activiti:async, ...) |
| | | updateProperties(element, scopeDefinition, scopeElement); |
| | | |
| | | // update activiti:in and activiti:out |
| | | updateInOut(element, scopeDefinition, scopeElement); |
| | | |
| | | // update activiti:executionListener |
| | | updateExecutionListener(element, scopeDefinition, scopeElement); |
| | | |
| | | var extensionElements = getOrCreateExtensionElements(element); |
| | | var oldScope = findExtension(extensionElements, scopeName); |
| | | |
| | | commandStack.execute('properties-panel.update-businessobject-list', { |
| | | element: element, |
| | | currentObject: extensionElements, |
| | | propertyName: 'values', |
| | | objectsToAdd: [ scopeElement ], |
| | | objectsToRemove: oldScope ? [ oldScope ] : [] |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Compose an element template change action, updating all |
| | | * necessary underlying properties. |
| | | * |
| | | * @param {Object} context |
| | | * @param {Object} context.element |
| | | * @param {Object} context.oldTemplate |
| | | * @param {Object} context.newTemplate |
| | | */ |
| | | this.preExecute = function(context) { |
| | | |
| | | var element = context.element, |
| | | newTemplate = context.newTemplate; |
| | | |
| | | // update activiti:modelerTemplate attribute |
| | | updateModelerTemplate(element, newTemplate); |
| | | |
| | | if (newTemplate) { |
| | | |
| | | // update activiti:inputOutput |
| | | updateIoMappings(element, newTemplate); |
| | | |
| | | // update activiti:field |
| | | updateActivitiField(element, newTemplate); |
| | | |
| | | // update activiti:properties |
| | | updateActivitiProperties(element, newTemplate); |
| | | |
| | | // update other properties (bpmn:condition, activiti:async, ...) |
| | | updateProperties(element, newTemplate); |
| | | |
| | | // update activiti:in and activiti:out |
| | | updateInOut(element, newTemplate); |
| | | |
| | | // update activiti:executionListener |
| | | updateExecutionListener(element, newTemplate); |
| | | |
| | | // loop on scopes properties |
| | | forEach(newTemplate.scopes, function(scopeDefinition, scopeName) { |
| | | updateScopeElements(element, scopeName, scopeDefinition); |
| | | }); |
| | | |
| | | } |
| | | }; |
| | | } |
| | | |
| | | ChangeElementTemplateHandler.$inject = [ 'modeling', 'commandStack', 'bpmnFactory' ]; |
| | | |
| | | module.exports = ChangeElementTemplateHandler; |
| | | |
| | | |
| | | |
| | | // helpers ///////////////////////////// |
| | | |
| | | function createBpmnPropertyUpdates(template, bpmnFactory) { |
| | | |
| | | var propertyUpdates = {}; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | |
| | | var binding = p.binding, |
| | | bindingTarget = binding.name, |
| | | propertyValue; |
| | | |
| | | if (binding.type === 'property') { |
| | | |
| | | if (bindingTarget === 'conditionExpression') { |
| | | propertyValue = bpmnFactory.create('bpmn:FormalExpression', { |
| | | body: p.value, |
| | | language: binding.scriptFormat |
| | | }); |
| | | } else { |
| | | propertyValue = p.value; |
| | | } |
| | | |
| | | // assigning activiti:async to true|false |
| | | // assigning bpmn:conditionExpression to { $type: 'bpmn:FormalExpression', ... } |
| | | propertyUpdates[bindingTarget] = propertyValue; |
| | | |
| | | // make sure we unset other "implementation types" |
| | | // when applying a activiti:class template onto a preconfigured |
| | | // activiti:delegateExpression element |
| | | if (ACTIVITI_SERVICE_TASK_LIKE.indexOf(bindingTarget) !== -1) { |
| | | ACTIVITI_SERVICE_TASK_LIKE.forEach(function(prop) { |
| | | if (prop !== bindingTarget) { |
| | | propertyUpdates[prop] = undefined; |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | return propertyUpdates; |
| | | } |
| | | |
| | | function createActivitiFieldInjections(template, bpmnFactory) { |
| | | var injections = []; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | var binding = p.binding, |
| | | bindingType = binding.type; |
| | | if (bindingType === 'activiti:field') { |
| | | injections.push(createActivitiFieldInjection( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | if (injections.length) { |
| | | return injections; |
| | | } |
| | | } |
| | | |
| | | function createActivitiProperties(template, bpmnFactory) { |
| | | |
| | | var properties = []; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | var binding = p.binding, |
| | | bindingType = binding.type; |
| | | |
| | | if (bindingType === 'activiti:property') { |
| | | properties.push(createActivitiProperty( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | if (properties.length) { |
| | | return bpmnFactory.create('activiti:Properties', { |
| | | values: properties |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function createInputOutputMappings(template, bpmnFactory) { |
| | | |
| | | var inputParameters = [], |
| | | outputParameters = []; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | var binding = p.binding, |
| | | bindingType = binding.type; |
| | | |
| | | if (bindingType === 'activiti:inputParameter') { |
| | | inputParameters.push(createInputParameter( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | |
| | | if (bindingType === 'activiti:outputParameter') { |
| | | outputParameters.push(createOutputParameter( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | // do we need to create new ioMappings (?) |
| | | if (outputParameters.length || inputParameters.length) { |
| | | return bpmnFactory.create('activiti:InputOutput', { |
| | | inputParameters: inputParameters, |
| | | outputParameters: outputParameters |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function createActivitiInOut(template, bpmnFactory) { |
| | | |
| | | var inOuts = []; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | var binding = p.binding, |
| | | bindingType = binding.type; |
| | | |
| | | if (bindingType === 'activiti:in') { |
| | | inOuts.push(createActivitiIn( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } else |
| | | if (bindingType === 'activiti:out') { |
| | | inOuts.push(createActivitiOut( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } else |
| | | if (bindingType === 'activiti:in:businessKey') { |
| | | inOuts.push(createActivitiInWithBusinessKey( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | return inOuts; |
| | | } |
| | | |
| | | |
| | | function createActivitiExecutionListeners(template, bpmnFactory) { |
| | | |
| | | var executionListener = []; |
| | | |
| | | template.properties.forEach(function(p) { |
| | | var binding = p.binding, |
| | | bindingType = binding.type; |
| | | |
| | | if (bindingType === 'activiti:executionListener') { |
| | | executionListener.push(createActivitiExecutionListenerScript( |
| | | binding, p.value, bpmnFactory |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | return executionListener; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ChangeElementTemplateHandler = require('./ChangeElementTemplateHandler'); |
| | | |
| | | var getTemplate = require('../Helper').getTemplate, |
| | | getDefaultTemplate = require('../Helper').getDefaultTemplate; |
| | | |
| | | function registerHandlers(commandStack, elementTemplates, eventBus, elementRegistry) { |
| | | commandStack.registerHandler( |
| | | 'propertiesPanel.activiti.changeTemplate', |
| | | ChangeElementTemplateHandler |
| | | ); |
| | | |
| | | // apply default element templates on shape creation |
| | | eventBus.on([ 'commandStack.shape.create.postExecuted' ], function(context) { |
| | | applyDefaultTemplate(context.context.shape, elementTemplates, commandStack); |
| | | }); |
| | | |
| | | // apply default element templates on connection creation |
| | | eventBus.on([ 'commandStack.connection.create.postExecuted' ], function(context) { |
| | | applyDefaultTemplate(context.context.connection, elementTemplates, commandStack); |
| | | }); |
| | | } |
| | | |
| | | registerHandlers.$inject = [ 'commandStack', 'elementTemplates', 'eventBus', 'elementRegistry' ]; |
| | | |
| | | |
| | | module.exports = { |
| | | __init__: [ registerHandlers ] |
| | | }; |
| | | |
| | | |
| | | function applyDefaultTemplate(element, elementTemplates, commandStack) { |
| | | |
| | | if (!getTemplate(element, elementTemplates) |
| | | && getDefaultTemplate(element, elementTemplates)) { |
| | | |
| | | var command = 'propertiesPanel.activiti.changeTemplate'; |
| | | var commandContext = { |
| | | element: element, |
| | | newTemplate: getDefaultTemplate(element, elementTemplates) |
| | | }; |
| | | |
| | | commandStack.execute(command, commandContext); |
| | | } |
| | | } |
New file |
| | |
| | | module.exports = { |
| | | __depends__: [ |
| | | require('./cmd/index'), |
| | | require('diagram-js/lib/i18n/translate').default |
| | | ], |
| | | __init__: [ |
| | | 'customElementsPropertiesActivator', |
| | | 'elementTemplatesLoader' |
| | | ], |
| | | customElementsPropertiesActivator: [ 'type', require('./CustomElementsPropertiesActivator') ], |
| | | elementTemplates: [ 'type', require('./ElementTemplates') ], |
| | | elementTemplatesLoader: [ 'type', require('./ElementTemplatesLoader') ] |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getTemplate = require('../Helper').getTemplate, |
| | | getTemplateId = require('../Helper').getTemplateId; |
| | | |
| | | var find = require('lodash/find'); |
| | | |
| | | var TEMPLATE_ATTR = require('../Helper').TEMPLATE_ATTR; |
| | | |
| | | function isAny(element, types) { |
| | | return types.reduce(function(result, type) { |
| | | return result || is(element, type); |
| | | }, false); |
| | | } |
| | | |
| | | |
| | | module.exports = function(group, element, elementTemplates, translate) { |
| | | |
| | | var options = getTemplateOptions(element, elementTemplates, translate); |
| | | |
| | | if (options.length === 1 && !options[0].isDefault) { |
| | | return; |
| | | } |
| | | |
| | | // select element template (via dropdown) |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'elementTemplate-chooser', |
| | | label: translate('Element Template'), |
| | | modelProperty: 'activiti:modelerTemplate', |
| | | selectOptions: options, |
| | | set: function(element, properties) { |
| | | return applyTemplate(element, properties[TEMPLATE_ATTR], elementTemplates); |
| | | }, |
| | | disabled: function() { |
| | | var template = getTemplate(element, elementTemplates); |
| | | |
| | | return template && isDefaultTemplate(template); |
| | | } |
| | | })); |
| | | |
| | | }; |
| | | |
| | | |
| | | // helpers ////////////////////////////////////// |
| | | |
| | | function applyTemplate(element, newTemplateId, elementTemplates) { |
| | | |
| | | // cleanup |
| | | // clear input output mappings |
| | | // undo changes to properties defined in template |
| | | |
| | | // re-establish |
| | | // set input output mappings |
| | | // apply changes to properties as defined in new template |
| | | |
| | | var oldTemplate = getTemplate(element, elementTemplates), |
| | | newTemplate = elementTemplates.get(newTemplateId); |
| | | |
| | | if (oldTemplate === newTemplate) { |
| | | return; |
| | | } |
| | | |
| | | return { |
| | | cmd: 'propertiesPanel.activiti.changeTemplate', |
| | | context: { |
| | | element: element, |
| | | oldTemplate: oldTemplate, |
| | | newTemplate: newTemplate |
| | | } |
| | | }; |
| | | } |
| | | |
| | | function getTemplateOptions(element, elementTemplates, translate) { |
| | | |
| | | var currentTemplateId = getTemplateId(element); |
| | | |
| | | var emptyOption = { |
| | | name: '', |
| | | value: '' |
| | | }; |
| | | |
| | | var allOptions = elementTemplates.getAll().reduce(function(templates, t) { |
| | | if (!isAny(element, t.appliesTo)) { |
| | | return templates; |
| | | } |
| | | |
| | | return templates.concat({ |
| | | name: translate(t.name), |
| | | value: t.id, |
| | | isDefault: t.isDefault |
| | | }); |
| | | }, [ emptyOption ]); |
| | | |
| | | |
| | | var defaultOption = find(allOptions, function(option) { |
| | | return isDefaultTemplate(option); |
| | | }); |
| | | |
| | | var currentOption = find(allOptions, function(option) { |
| | | return option.value === currentTemplateId; |
| | | }); |
| | | |
| | | if (currentTemplateId && !currentOption) { |
| | | currentOption = unknownTemplate(currentTemplateId, translate); |
| | | |
| | | allOptions.push(currentOption); |
| | | } |
| | | |
| | | if (!defaultOption) { |
| | | |
| | | // return all options, including empty |
| | | // and optionally unknownTemplate option |
| | | return allOptions; |
| | | } |
| | | |
| | | // special limited handling for |
| | | // default options |
| | | |
| | | var options = []; |
| | | |
| | | // current template not set |
| | | if (!currentTemplateId) { |
| | | options.push({ |
| | | name: '', |
| | | value: '' |
| | | }); |
| | | } |
| | | |
| | | // current template not default |
| | | if (currentOption && currentOption !== defaultOption) { |
| | | options.push(currentOption); |
| | | } |
| | | |
| | | options.push(defaultOption); |
| | | |
| | | // [ (empty), (current), defaultOption ] |
| | | return options; |
| | | } |
| | | |
| | | function unknownTemplate(templateId, translate) { |
| | | return { |
| | | name: translate('[unknown template: {templateId}]', { templateId: templateId }), |
| | | value: templateId |
| | | }; |
| | | } |
| | | |
| | | function isDefaultTemplate(elementTemplate) { |
| | | return elementTemplate.isDefault; |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | getTemplate = require('../Helper').getTemplate, |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | elementHelper = require('../../../../helper/ElementHelper'); |
| | | |
| | | var findExtension = require('../Helper').findExtension, |
| | | findExtensions = require('../Helper').findExtensions, |
| | | findInputParameter = require('../Helper').findInputParameter, |
| | | findOutputParameter = require('../Helper').findOutputParameter, |
| | | findActivitiProperty = require('../Helper').findActivitiProperty, |
| | | findActivitiInOut = require('../Helper').findActivitiInOut; |
| | | |
| | | var createActivitiProperty = require('../CreateHelper').createActivitiProperty, |
| | | createInputParameter = require('../CreateHelper').createInputParameter, |
| | | createOutputParameter = require('../CreateHelper').createOutputParameter, |
| | | createActivitiIn = require('../CreateHelper').createActivitiIn, |
| | | createActivitiOut = require('../CreateHelper').createActivitiOut, |
| | | createActivitiInWithBusinessKey = require('../CreateHelper').createActivitiInWithBusinessKey, |
| | | createActivitiFieldInjection = require('../CreateHelper').createActivitiFieldInjection; |
| | | |
| | | var ACTIVITI_PROPERTY_TYPE = 'activiti:property', |
| | | ACTIVITI_INPUT_PARAMETER_TYPE = 'activiti:inputParameter', |
| | | ACTIVITI_OUTPUT_PARAMETER_TYPE = 'activiti:outputParameter', |
| | | ACTIVITI_IN_TYPE = 'activiti:in', |
| | | ACTIVITI_OUT_TYPE = 'activiti:out', |
| | | ACTIVITI_IN_BUSINESS_KEY_TYPE = 'activiti:in:businessKey', |
| | | ACTIVITI_EXECUTION_LISTENER_TYPE = 'activiti:executionListener', |
| | | ACTIVITI_FIELD = 'activiti:field'; |
| | | |
| | | var BASIC_MODDLE_TYPES = [ |
| | | 'Boolean', |
| | | 'Integer', |
| | | 'String' |
| | | ]; |
| | | |
| | | var EXTENSION_BINDING_TYPES = [ |
| | | ACTIVITI_PROPERTY_TYPE, |
| | | ACTIVITI_INPUT_PARAMETER_TYPE, |
| | | ACTIVITI_OUTPUT_PARAMETER_TYPE, |
| | | ACTIVITI_IN_TYPE, |
| | | ACTIVITI_OUT_TYPE, |
| | | ACTIVITI_IN_BUSINESS_KEY_TYPE, |
| | | ACTIVITI_FIELD |
| | | ]; |
| | | |
| | | var IO_BINDING_TYPES = [ |
| | | ACTIVITI_INPUT_PARAMETER_TYPE, |
| | | ACTIVITI_OUTPUT_PARAMETER_TYPE |
| | | ]; |
| | | |
| | | var IN_OUT_BINDING_TYPES = [ |
| | | ACTIVITI_IN_TYPE, |
| | | ACTIVITI_OUT_TYPE, |
| | | ACTIVITI_IN_BUSINESS_KEY_TYPE |
| | | ]; |
| | | |
| | | /** |
| | | * Injects custom properties into the given group. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {ElementTemplates} elementTemplates |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * @param {Function} translate |
| | | */ |
| | | module.exports = function(element, elementTemplates, bpmnFactory, translate) { |
| | | |
| | | var template = getTemplate(element, elementTemplates); |
| | | |
| | | if (!template) { |
| | | return []; |
| | | } |
| | | |
| | | var renderCustomField = function(id, p, idx) { |
| | | var propertyType = p.type; |
| | | |
| | | var entryOptions = { |
| | | id: id, |
| | | description: p.description, |
| | | label: p.label ? translate(p.label) : p.label, |
| | | modelProperty: id, |
| | | get: propertyGetter(id, p), |
| | | set: propertySetter(id, p, bpmnFactory), |
| | | validate: propertyValidator(id, p, translate) |
| | | }; |
| | | |
| | | var entry; |
| | | |
| | | if (propertyType === 'Boolean') { |
| | | entry = entryFactory.checkbox(entryOptions); |
| | | } |
| | | |
| | | if (propertyType === 'String') { |
| | | entry = entryFactory.textField(entryOptions); |
| | | } |
| | | |
| | | if (propertyType === 'Text') { |
| | | entry = entryFactory.textBox(entryOptions); |
| | | } |
| | | |
| | | if (propertyType === 'Dropdown') { |
| | | entryOptions.selectOptions = p.choices; |
| | | |
| | | entry = entryFactory.selectBox(entryOptions); |
| | | } |
| | | |
| | | return entry; |
| | | }; |
| | | |
| | | var groups = []; |
| | | var id, entry; |
| | | |
| | | var customFieldsGroup = { |
| | | id: 'customField', |
| | | label: translate('Custom Fields'), |
| | | entries: [] |
| | | }; |
| | | template.properties.forEach(function(p, idx) { |
| | | |
| | | id = 'custom-' + template.id + '-' + idx; |
| | | |
| | | entry = renderCustomField(id, p, idx); |
| | | if (entry) { |
| | | customFieldsGroup.entries.push(entry); |
| | | } |
| | | }); |
| | | if (customFieldsGroup.entries.length > 0) { |
| | | groups.push(customFieldsGroup); |
| | | } |
| | | |
| | | if (template.scopes) { |
| | | for (var scopeName in template.scopes) { |
| | | |
| | | var scope = template.scopes[scopeName]; |
| | | var idScopeName = scopeName.replace(/:/g, '_'); |
| | | |
| | | var customScopeFieldsGroup = { |
| | | id: 'customField-' + idScopeName, |
| | | label: translate('Custom Fields for scope: ') + scopeName, |
| | | entries: [] |
| | | }; |
| | | |
| | | scope.properties.forEach(function(p, idx) { |
| | | |
| | | var propertyId = 'custom-' + template.id + '-' + idScopeName + '-' + idx; |
| | | |
| | | var scopedProperty = propertyWithScope(p, scopeName); |
| | | |
| | | entry = renderCustomField(propertyId, scopedProperty, idx); |
| | | if (entry) { |
| | | customScopeFieldsGroup.entries.push(entry); |
| | | } |
| | | }); |
| | | |
| | | if (customScopeFieldsGroup.entries.length > 0) { |
| | | groups.push(customScopeFieldsGroup); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return groups; |
| | | }; |
| | | |
| | | |
| | | // getters, setters and validators /////////////// |
| | | |
| | | |
| | | /** |
| | | * Return a getter that retrieves the given property. |
| | | * |
| | | * @param {String} name |
| | | * @param {PropertyDescriptor} property |
| | | * |
| | | * @return {Function} |
| | | */ |
| | | function propertyGetter(name, property) { |
| | | |
| | | /* getter */ |
| | | return function get(element) { |
| | | var value = getPropertyValue(element, property); |
| | | |
| | | return objectWithKey(name, value); |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Return a setter that updates the given property. |
| | | * |
| | | * @param {String} name |
| | | * @param {PropertyDescriptor} property |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {Function} |
| | | */ |
| | | function propertySetter(name, property, bpmnFactory) { |
| | | |
| | | /* setter */ |
| | | return function set(element, values) { |
| | | |
| | | var value = values[name]; |
| | | |
| | | return setPropertyValue(element, property, value, bpmnFactory); |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Return a validator that ensures the property is ok. |
| | | * |
| | | * @param {String} name |
| | | * @param {PropertyDescriptor} property |
| | | * @param {Function} translate |
| | | * |
| | | * @return {Function} |
| | | */ |
| | | function propertyValidator(name, property, translate) { |
| | | |
| | | /* validator */ |
| | | return function validate(element, values) { |
| | | var value = values[name]; |
| | | |
| | | var error = validateValue(value, property, translate); |
| | | |
| | | if (error) { |
| | | return objectWithKey(name, error); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | |
| | | // get, set and validate helpers /////////////////// |
| | | |
| | | /** |
| | | * Return the value of the specified property descriptor, |
| | | * on the passed diagram element. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {PropertyDescriptor} property |
| | | * |
| | | * @return {Any} |
| | | */ |
| | | function getPropertyValue(element, property) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var binding = property.binding, |
| | | scope = property.scope; |
| | | |
| | | var bindingType = binding.type, |
| | | bindingName = binding.name; |
| | | |
| | | var propertyValue = property.value || ''; |
| | | |
| | | if (scope) { |
| | | bo = findExtension(bo, scope.name); |
| | | if (!bo) { |
| | | return propertyValue; |
| | | } |
| | | } |
| | | |
| | | // property |
| | | if (bindingType === 'property') { |
| | | |
| | | var value = bo.get(bindingName); |
| | | |
| | | if (bindingName === 'conditionExpression') { |
| | | if (value) { |
| | | return value.body; |
| | | } else { |
| | | // return defined default |
| | | return propertyValue; |
| | | } |
| | | } else { |
| | | // return value; default to defined default |
| | | return typeof value !== 'undefined' ? value : propertyValue; |
| | | } |
| | | } |
| | | |
| | | var activitiProperties, |
| | | activitiProperty; |
| | | |
| | | if (bindingType === ACTIVITI_PROPERTY_TYPE) { |
| | | if (scope) { |
| | | activitiProperties = bo.get('properties'); |
| | | } else { |
| | | activitiProperties = findExtension(bo, 'activiti:Properties'); |
| | | } |
| | | |
| | | if (activitiProperties) { |
| | | activitiProperty = findActivitiProperty(activitiProperties, binding); |
| | | |
| | | if (activitiProperty) { |
| | | return activitiProperty.value; |
| | | } |
| | | } |
| | | |
| | | return propertyValue; |
| | | } |
| | | |
| | | var inputOutput, |
| | | ioParameter; |
| | | |
| | | if (IO_BINDING_TYPES.indexOf(bindingType) !== -1) { |
| | | |
| | | if (scope) { |
| | | inputOutput = bo.get('inputOutput'); |
| | | } else { |
| | | inputOutput = findExtension(bo, 'activiti:InputOutput'); |
| | | } |
| | | |
| | | if (!inputOutput) { |
| | | // ioParameter cannot exist yet, return property value |
| | | return propertyValue; |
| | | } |
| | | } |
| | | |
| | | // activiti input parameter |
| | | if (bindingType === ACTIVITI_INPUT_PARAMETER_TYPE) { |
| | | ioParameter = findInputParameter(inputOutput, binding); |
| | | |
| | | if (ioParameter) { |
| | | if (binding.scriptFormat) { |
| | | if (ioParameter.definition) { |
| | | return ioParameter.definition.value; |
| | | } |
| | | } else { |
| | | return ioParameter.value || ''; |
| | | } |
| | | } |
| | | |
| | | return propertyValue; |
| | | } |
| | | |
| | | // activiti output parameter |
| | | if (binding.type === ACTIVITI_OUTPUT_PARAMETER_TYPE) { |
| | | ioParameter = findOutputParameter(inputOutput, binding); |
| | | |
| | | if (ioParameter) { |
| | | return ioParameter.name; |
| | | } |
| | | |
| | | return propertyValue; |
| | | } |
| | | |
| | | |
| | | var ioElement; |
| | | |
| | | if (IN_OUT_BINDING_TYPES.indexOf(bindingType) != -1) { |
| | | ioElement = findActivitiInOut(bo, binding); |
| | | |
| | | if (ioElement) { |
| | | if (bindingType === ACTIVITI_IN_BUSINESS_KEY_TYPE) { |
| | | return ioElement.businessKey; |
| | | } else |
| | | if (bindingType === ACTIVITI_OUT_TYPE) { |
| | | return ioElement.target; |
| | | } else |
| | | if (bindingType === ACTIVITI_IN_TYPE) { |
| | | return ioElement[binding.expression ? 'sourceExpression' : 'source']; |
| | | } |
| | | } |
| | | |
| | | return propertyValue; |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_EXECUTION_LISTENER_TYPE) { |
| | | var executionListener; |
| | | if (scope) { |
| | | executionListener = bo.get('executionListener'); |
| | | } else { |
| | | executionListener = findExtension(bo, 'activiti:ExecutionListener'); |
| | | } |
| | | |
| | | return executionListener.script.value; |
| | | } |
| | | |
| | | var fieldInjection; |
| | | if (ACTIVITI_FIELD === bindingType) { |
| | | var fieldInjections = findExtensions(bo, [ 'activiti:Field' ]); |
| | | fieldInjections.forEach(function(item) { |
| | | if (item.name === binding.name) { |
| | | fieldInjection = item; |
| | | } |
| | | }); |
| | | if (fieldInjection) { |
| | | return fieldInjection.string || fieldInjection.expression; |
| | | } else { |
| | | return ''; |
| | | } |
| | | } |
| | | |
| | | throw unknownPropertyBinding(property); |
| | | } |
| | | |
| | | module.exports.getPropertyValue = getPropertyValue; |
| | | |
| | | |
| | | /** |
| | | * Return an update operation that changes the diagram |
| | | * element's custom property to the given value. |
| | | * |
| | | * The response of this method will be processed via |
| | | * {@link PropertiesPanel#applyChanges}. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {PropertyDescriptor} property |
| | | * @param {String} value |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {Object|Array<Object>} results to be processed |
| | | */ |
| | | function setPropertyValue(element, property, value, bpmnFactory) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var binding = property.binding, |
| | | scope = property.scope; |
| | | |
| | | var bindingType = binding.type, |
| | | bindingName = binding.name; |
| | | |
| | | var propertyValue; |
| | | |
| | | var updates = []; |
| | | |
| | | var extensionElements; |
| | | |
| | | if (EXTENSION_BINDING_TYPES.indexOf(bindingType) !== -1) { |
| | | extensionElements = bo.get('extensionElements'); |
| | | |
| | | // create extension elements, if they do not exist (yet) |
| | | if (!extensionElements) { |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', null, element, bpmnFactory); |
| | | |
| | | updates.push(cmdHelper.updateBusinessObject( |
| | | element, bo, objectWithKey('extensionElements', extensionElements) |
| | | )); |
| | | } |
| | | } |
| | | |
| | | if (scope) { |
| | | bo = findExtension(bo, scope.name); |
| | | if (!bo) { |
| | | bo = elementHelper.createElement(scope.name, null, element, bpmnFactory); |
| | | |
| | | updates.push(cmdHelper.addElementsTolist( |
| | | bo, extensionElements, 'values', [ bo ] |
| | | )); |
| | | } |
| | | } |
| | | |
| | | // property |
| | | if (bindingType === 'property') { |
| | | |
| | | if (bindingName === 'conditionExpression') { |
| | | |
| | | propertyValue = elementHelper.createElement('bpmn:FormalExpression', { |
| | | body: value, |
| | | language: binding.scriptFormat |
| | | }, bo, bpmnFactory); |
| | | } else { |
| | | |
| | | var moddlePropertyDescriptor = bo.$descriptor.propertiesByName[bindingName]; |
| | | |
| | | var moddleType = moddlePropertyDescriptor.type; |
| | | |
| | | // make sure we only update String, Integer, Real and |
| | | // Boolean properties (do not accidentally override complex objects...) |
| | | if (BASIC_MODDLE_TYPES.indexOf(moddleType) === -1) { |
| | | throw new Error('cannot set moddle type <' + moddleType + '>'); |
| | | } |
| | | |
| | | if (moddleType === 'Boolean') { |
| | | propertyValue = !!value; |
| | | } else |
| | | if (moddleType === 'Integer') { |
| | | propertyValue = parseInt(value, 10); |
| | | |
| | | if (isNaN(propertyValue)) { |
| | | // do not write NaN value |
| | | propertyValue = undefined; |
| | | } |
| | | } else { |
| | | propertyValue = value; |
| | | } |
| | | } |
| | | |
| | | if (propertyValue !== undefined) { |
| | | updates.push(cmdHelper.updateBusinessObject( |
| | | element, bo, objectWithKey(bindingName, propertyValue) |
| | | )); |
| | | } |
| | | } |
| | | |
| | | // activiti:property |
| | | var activitiProperties, |
| | | existingActivitiProperty, |
| | | newActivitiProperty; |
| | | |
| | | if (bindingType === ACTIVITI_PROPERTY_TYPE) { |
| | | |
| | | if (scope) { |
| | | activitiProperties = bo.get('properties'); |
| | | } else { |
| | | activitiProperties = findExtension(extensionElements, 'activiti:Properties'); |
| | | } |
| | | |
| | | if (!activitiProperties) { |
| | | activitiProperties = elementHelper.createElement('activiti:Properties', null, bo, bpmnFactory); |
| | | |
| | | if (scope) { |
| | | updates.push(cmdHelper.updateBusinessObject( |
| | | element, bo, { properties: activitiProperties } |
| | | )); |
| | | } |
| | | else { |
| | | updates.push(cmdHelper.addElementsTolist( |
| | | element, extensionElements, 'values', [ activitiProperties ] |
| | | )); |
| | | } |
| | | } |
| | | |
| | | existingActivitiProperty = findActivitiProperty(activitiProperties, binding); |
| | | |
| | | newActivitiProperty = createActivitiProperty(binding, value, bpmnFactory); |
| | | |
| | | updates.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | activitiProperties, |
| | | 'values', |
| | | null, |
| | | [ newActivitiProperty ], |
| | | existingActivitiProperty ? [ existingActivitiProperty ] : [] |
| | | )); |
| | | } |
| | | |
| | | // activiti:inputParameter |
| | | // activiti:outputParameter |
| | | var inputOutput, |
| | | existingIoParameter, |
| | | newIoParameter; |
| | | |
| | | if (IO_BINDING_TYPES.indexOf(bindingType) !== -1) { |
| | | |
| | | if (scope) { |
| | | inputOutput = bo.get('inputOutput'); |
| | | } else { |
| | | inputOutput = findExtension(extensionElements, 'activiti:InputOutput'); |
| | | } |
| | | |
| | | // create inputOutput element, if it do not exist (yet) |
| | | if (!inputOutput) { |
| | | inputOutput = elementHelper.createElement('activiti:InputOutput', null, bo, bpmnFactory); |
| | | |
| | | if (scope) { |
| | | updates.push(cmdHelper.updateBusinessObject( |
| | | element, bo, { inputOutput: inputOutput } |
| | | )); |
| | | } |
| | | else { |
| | | updates.push(cmdHelper.addElementsTolist( |
| | | element, extensionElements, 'values', inputOutput |
| | | )); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_INPUT_PARAMETER_TYPE) { |
| | | |
| | | existingIoParameter = findInputParameter(inputOutput, binding); |
| | | |
| | | newIoParameter = createInputParameter(binding, value, bpmnFactory); |
| | | |
| | | updates.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | inputOutput, |
| | | 'inputParameters', |
| | | null, |
| | | [ newIoParameter ], |
| | | existingIoParameter ? [ existingIoParameter ] : [] |
| | | )); |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_OUTPUT_PARAMETER_TYPE) { |
| | | |
| | | existingIoParameter = findOutputParameter(inputOutput, binding); |
| | | |
| | | newIoParameter = createOutputParameter(binding, value, bpmnFactory); |
| | | |
| | | updates.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | inputOutput, |
| | | 'outputParameters', |
| | | null, |
| | | [ newIoParameter ], |
| | | existingIoParameter ? [ existingIoParameter ] : [] |
| | | )); |
| | | } |
| | | |
| | | |
| | | // activiti:in |
| | | // activiti:out |
| | | // activiti:in:businessKey |
| | | var existingInOut, |
| | | newInOut; |
| | | |
| | | if (IN_OUT_BINDING_TYPES.indexOf(bindingType) !== -1) { |
| | | |
| | | existingInOut = findActivitiInOut(bo, binding); |
| | | |
| | | if (bindingType === ACTIVITI_IN_TYPE) { |
| | | newInOut = createActivitiIn(binding, value, bpmnFactory); |
| | | } else |
| | | if (bindingType === ACTIVITI_OUT_TYPE) { |
| | | newInOut = createActivitiOut(binding, value, bpmnFactory); |
| | | } else { |
| | | newInOut = createActivitiInWithBusinessKey(binding, value, bpmnFactory); |
| | | } |
| | | |
| | | updates.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | null, |
| | | [ newInOut ], |
| | | existingInOut ? [ existingInOut ] : [] |
| | | )); |
| | | } |
| | | |
| | | if (bindingType === ACTIVITI_FIELD) { |
| | | var existingFieldInjections = findExtensions(bo, [ 'activiti:Field' ]); |
| | | var newFieldInjections = []; |
| | | |
| | | if (existingFieldInjections.length > 0) { |
| | | existingFieldInjections.forEach(function(item) { |
| | | if (item.name === binding.name) { |
| | | newFieldInjections.push(createActivitiFieldInjection(binding, value, bpmnFactory)); |
| | | } else { |
| | | newFieldInjections.push(item); |
| | | } |
| | | }); |
| | | } else { |
| | | newFieldInjections.push(createActivitiFieldInjection(binding, value, bpmnFactory)); |
| | | } |
| | | |
| | | updates.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | null, |
| | | newFieldInjections, |
| | | existingFieldInjections ? existingFieldInjections : [] |
| | | )); |
| | | } |
| | | |
| | | if (updates.length) { |
| | | return updates; |
| | | } |
| | | |
| | | // quick warning for better debugging |
| | | console.warn('no update', element, property, value); |
| | | } |
| | | |
| | | module.exports.setPropertyValue = setPropertyValue; |
| | | |
| | | /** |
| | | * Validate value of a given property. |
| | | * |
| | | * @param {String} value |
| | | * @param {PropertyDescriptor} property |
| | | * @param {Function} translate |
| | | * |
| | | * @return {Object} with validation errors |
| | | */ |
| | | function validateValue(value, property, translate) { |
| | | |
| | | var constraints = property.constraints || {}; |
| | | |
| | | if (constraints.notEmpty && isEmpty(value)) { |
| | | return translate('Must not be empty'); |
| | | } |
| | | |
| | | if (constraints.maxLength && value.length > constraints.maxLength) { |
| | | return translate('Must have max length {length}', { length: constraints.maxLength }); |
| | | } |
| | | |
| | | if (constraints.minLength && value.length < constraints.minLength) { |
| | | return translate('Must have min length {length}', { length: constraints.minLength }); |
| | | } |
| | | |
| | | var pattern = constraints.pattern, |
| | | message; |
| | | |
| | | if (pattern) { |
| | | |
| | | if (typeof pattern !== 'string') { |
| | | message = pattern.message; |
| | | pattern = pattern.value; |
| | | } |
| | | |
| | | if (!matchesPattern(value, pattern)) { |
| | | return message || translate('Must match pattern {pattern}', { pattern: pattern }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // misc helpers /////////////////////////////// |
| | | |
| | | function propertyWithScope(property, scopeName) { |
| | | if (!scopeName) { |
| | | return property; |
| | | } |
| | | |
| | | return assign({}, property, { |
| | | scope: { |
| | | name: scopeName |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Return an object with a single key -> value association. |
| | | * |
| | | * @param {String} key |
| | | * @param {Any} value |
| | | * |
| | | * @return {Object} |
| | | */ |
| | | function objectWithKey(key, value) { |
| | | var obj = {}; |
| | | |
| | | obj[key] = value; |
| | | |
| | | return obj; |
| | | } |
| | | |
| | | /** |
| | | * Does the given string match the specified pattern? |
| | | * |
| | | * @param {String} str |
| | | * @param {String} pattern |
| | | * |
| | | * @return {Boolean} |
| | | */ |
| | | function matchesPattern(str, pattern) { |
| | | var regexp = new RegExp(pattern); |
| | | |
| | | return regexp.test(str); |
| | | } |
| | | |
| | | function isEmpty(str) { |
| | | return !str || /^\s*$/.test(str); |
| | | } |
| | | |
| | | /** |
| | | * Create a new {@link Error} indicating an unknown |
| | | * property binding. |
| | | * |
| | | * @param {PropertyDescriptor} property |
| | | * |
| | | * @return {Error} |
| | | */ |
| | | function unknownPropertyBinding(property) { |
| | | var binding = property.binding; |
| | | |
| | | return new Error('unknown binding: <' + binding.type + '>'); |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var Validator = require('../Validator'); |
| | | |
| | | /** |
| | | * Validate the given template descriptors and |
| | | * return a list of errors. |
| | | * |
| | | * @param {Array<TemplateDescriptor>} descriptors |
| | | * |
| | | * @return {Array<Error>} |
| | | */ |
| | | module.exports = function validate(descriptors) { |
| | | |
| | | return new Validator().addAll(descriptors).getErrors(); |
| | | }; |
New file |
| | |
| | | module.exports = { |
| | | __depends__: [ |
| | | require('./element-templates/index'), |
| | | require('diagram-js/lib/i18n/translate').default |
| | | ], |
| | | __init__: [ 'propertiesProvider' ], |
| | | propertiesProvider: [ 'type', require('./ActivitiPropertiesProvider') ] |
| | | }; |
| | | |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | asyncContinuation = require('./implementation/AsyncContinuation'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | if (is(element, 'activiti:AsyncCapable')) { |
| | | |
| | | group.entries = group.entries.concat(asyncContinuation(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject |
| | | }, translate)); |
| | | |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | var callable = require('./implementation/Callable'); |
| | | |
| | | var cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | var flattenDeep = require('lodash/flattenDeep'); |
| | | var assign = require('lodash/assign'); |
| | | |
| | | function getCallableType(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var boCalledElement = bo.get('calledElement'), |
| | | boCaseRef = bo.get('activiti:caseRef'); |
| | | |
| | | var callActivityType = ''; |
| | | if (typeof boCalledElement !== 'undefined') { |
| | | callActivityType = 'bpmn'; |
| | | } else |
| | | |
| | | if (typeof boCaseRef !== 'undefined') { |
| | | callActivityType = 'cmmn'; |
| | | } |
| | | |
| | | return callActivityType; |
| | | } |
| | | |
| | | var DEFAULT_PROPS = { |
| | | calledElement: undefined, |
| | | 'activiti:calledElementBinding': 'latest', |
| | | 'activiti:calledElementVersion': undefined, |
| | | 'activiti:calledElementTenantId': undefined, |
| | | 'activiti:variableMappingClass' : undefined, |
| | | 'activiti:variableMappingDelegateExpression' : undefined, |
| | | 'activiti:caseRef': undefined, |
| | | 'activiti:caseBinding': 'latest', |
| | | 'activiti:caseVersion': undefined, |
| | | 'activiti:caseTenantId': undefined |
| | | }; |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | if (!is(element, 'activiti:CallActivity')) { |
| | | return; |
| | | } |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id : 'callActivity', |
| | | label: translate('CallActivity Type'), |
| | | selectOptions: [ |
| | | { name: 'BPMN', value: 'bpmn' }, |
| | | { name: 'CMMN', value: 'cmmn' } |
| | | ], |
| | | emptyParameter: true, |
| | | modelProperty: 'callActivityType', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | callActivityType: getCallableType(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var type = values.callActivityType; |
| | | |
| | | var props = assign({}, DEFAULT_PROPS); |
| | | |
| | | if (type === 'bpmn') { |
| | | props.calledElement = ''; |
| | | } |
| | | else if (type === 'cmmn') { |
| | | props['activiti:caseRef'] = ''; |
| | | } |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | } |
| | | |
| | | })); |
| | | |
| | | group.entries.push(callable(element, bpmnFactory, { |
| | | getCallableType: getCallableType |
| | | }, translate)); |
| | | |
| | | group.entries = flattenDeep(group.entries); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var candidateStarter = require('./implementation/CandidateStarter'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | if (is(element, 'activiti:Process') || |
| | | is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | |
| | | group.entries = group.entries.concat(candidateStarter(element, bpmnFactory, { |
| | | getBusinessObject: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!is(bo, 'bpmn:Participant')) { |
| | | return bo; |
| | | } |
| | | |
| | | return bo.get('processRef'); |
| | | } |
| | | }, translate)); |
| | | |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | escapeHTML = require('../../../Utils').escapeHTML, |
| | | domQuery = require('min-dom').query, |
| | | cmdHelper = require('../../../helper/CmdHelper'), |
| | | elementHelper = require('../../../helper/ElementHelper'), |
| | | eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'), |
| | | scriptImplementation = require('./implementation/Script'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element); |
| | | |
| | | if (!(is(element, 'bpmn:SequenceFlow') && isConditionalSource(element.source)) |
| | | && !conditionalEventDefinition) { |
| | | return; |
| | | } |
| | | |
| | | var script = scriptImplementation('language', 'body', true, translate); |
| | | group.entries.push({ |
| | | id: 'condition', |
| | | label: translate('Condition'), |
| | | html: '<div class="bpp-row">' + |
| | | '<label for="cam-condition-type">'+ escapeHTML(translate('Condition Type')) + '</label>' + |
| | | '<div class="bpp-field-wrapper">' + |
| | | '<select id="cam-condition-type" name="conditionType" data-value>' + |
| | | '<option value="expression">'+ escapeHTML(translate('Expression')) + '</option>' + |
| | | '<option value="script">'+ escapeHTML(translate('Script')) + '</option>' + |
| | | '<option value="" selected></option>' + |
| | | '</select>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | |
| | | // expression |
| | | '<div class="bpp-row">' + |
| | | '<label for="cam-condition" data-show="isExpression">' + escapeHTML(translate('Expression')) + '</label>' + |
| | | '<div class="bpp-field-wrapper" data-show="isExpression">' + |
| | | '<input id="cam-condition" type="text" name="condition" />' + |
| | | '<button class="clear" data-action="clear" data-show="canClear">' + |
| | | '<span>X</span>' + |
| | | '</button>' + |
| | | '</div>' + |
| | | '<div data-show="isScript">' + |
| | | script.template + |
| | | '</div>' + |
| | | '</div>', |
| | | |
| | | get: function(element, propertyName) { |
| | | var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element); |
| | | |
| | | var conditionExpression = conditionalEventDefinition |
| | | ? conditionalEventDefinition.condition |
| | | : bo.conditionExpression; |
| | | |
| | | var values = {}, |
| | | conditionType = ''; |
| | | |
| | | if (conditionExpression) { |
| | | var conditionLanguage = conditionExpression.language; |
| | | if (typeof conditionLanguage !== 'undefined') { |
| | | conditionType = 'script'; |
| | | values = script.get(element, conditionExpression); |
| | | } else { |
| | | conditionType = 'expression'; |
| | | values.condition = conditionExpression.get('body'); |
| | | } |
| | | } |
| | | |
| | | values.conditionType = conditionType; |
| | | |
| | | return values; |
| | | |
| | | }, |
| | | |
| | | set: function(element, values, containerElement) { |
| | | var conditionType = values.conditionType; |
| | | var commands = []; |
| | | |
| | | var conditionProps = { |
| | | body: undefined |
| | | }; |
| | | |
| | | if (conditionType === 'script') { |
| | | conditionProps = script.set(element, values, containerElement); |
| | | } else { |
| | | var condition = values.condition; |
| | | |
| | | conditionProps.body = condition; |
| | | } |
| | | |
| | | var conditionOrConditionExpression; |
| | | |
| | | if (conditionType) { |
| | | conditionOrConditionExpression = elementHelper.createElement( |
| | | 'bpmn:FormalExpression', |
| | | conditionProps, |
| | | conditionalEventDefinition || bo, |
| | | bpmnFactory |
| | | ); |
| | | |
| | | var source = element.source; |
| | | |
| | | // if default-flow, remove default-property from source |
| | | if (source && source.businessObject.default === bo) { |
| | | commands.push(cmdHelper.updateProperties(source, { 'default': undefined })); |
| | | } |
| | | } |
| | | |
| | | var update = conditionalEventDefinition |
| | | ? { condition: conditionOrConditionExpression } |
| | | : { conditionExpression: conditionOrConditionExpression }; |
| | | |
| | | commands.push(cmdHelper.updateBusinessObject(element, conditionalEventDefinition || bo, update)); |
| | | |
| | | return commands; |
| | | }, |
| | | |
| | | validate: function(element, values) { |
| | | var validationResult = {}; |
| | | |
| | | if (!values.condition && values.conditionType === 'expression') { |
| | | validationResult.condition = translate('Must provide a value'); |
| | | } |
| | | else if (values.conditionType === 'script') { |
| | | validationResult = script.validate(element, values); |
| | | } |
| | | |
| | | return validationResult; |
| | | }, |
| | | |
| | | isExpression: function(element, inputNode) { |
| | | var conditionType = domQuery('select[name=conditionType]', inputNode); |
| | | if (conditionType.selectedIndex >= 0) { |
| | | return conditionType.options[conditionType.selectedIndex].value === 'expression'; |
| | | } |
| | | }, |
| | | |
| | | isScript: function(element, inputNode) { |
| | | var conditionType = domQuery('select[name=conditionType]', inputNode); |
| | | if (conditionType.selectedIndex >= 0) { |
| | | return conditionType.options[conditionType.selectedIndex].value === 'script'; |
| | | } |
| | | }, |
| | | |
| | | clear: function(element, inputNode) { |
| | | // clear text input |
| | | domQuery('input[name=condition]', inputNode).value=''; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | canClear: function(element, inputNode) { |
| | | var input = domQuery('input[name=condition]', inputNode); |
| | | |
| | | return input.value !== ''; |
| | | }, |
| | | |
| | | script : script, |
| | | |
| | | cssClasses: [ 'bpp-textfield' ] |
| | | }); |
| | | }; |
| | | |
| | | |
| | | // utilities ////////////////////////// |
| | | |
| | | var CONDITIONAL_SOURCES = [ |
| | | 'bpmn:Activity', |
| | | 'bpmn:ExclusiveGateway', |
| | | 'bpmn:InclusiveGateway', |
| | | 'bpmn:ComplexGateway' |
| | | ]; |
| | | |
| | | function isConditionalSource(element) { |
| | | return isAny(element, CONDITIONAL_SOURCES); |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'), |
| | | InputOutputHelper = require('../../../helper/InputOutputHelper'); |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | function getImplementationType(element) { |
| | | return ImplementationTypeHelper.getImplementationType(element); |
| | | } |
| | | |
| | | function getBusinessObject(element) { |
| | | return ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | } |
| | | |
| | | function getConnector(bo) { |
| | | return InputOutputHelper.getConnector(bo); |
| | | } |
| | | |
| | | function isConnector(element) { |
| | | return getImplementationType(element) === 'connector'; |
| | | } |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'connectorId', |
| | | label: translate('Connector Id'), |
| | | modelProperty: 'connectorId', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var connector = bo && getConnector(bo); |
| | | var value = connector && connector.get('connectorId'); |
| | | return { connectorId: value }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element); |
| | | var connector = getConnector(bo); |
| | | return cmdHelper.updateBusinessObject(element, connector, { |
| | | connectorId: values.connectorId || undefined |
| | | }); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | return isConnector(element) && !values.connectorId ? { connectorId: translate('Must provide a value') } : {}; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isConnector(element); |
| | | } |
| | | |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | var inputOutputParameter = require('./implementation/InputOutputParameter'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, options, translate) { |
| | | |
| | | options = assign({ |
| | | idPrefix: 'connector-', |
| | | insideConnector: true |
| | | }, options); |
| | | |
| | | group.entries = group.entries.concat(inputOutputParameter(element, bpmnFactory, options, translate)); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var inputOutput = require('./implementation/InputOutput'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var inputOutputEntry = inputOutput(element, bpmnFactory, { |
| | | idPrefix: 'connector-', |
| | | insideConnector: true |
| | | }, translate); |
| | | |
| | | group.entries = group.entries.concat(inputOutputEntry.entries); |
| | | |
| | | return { |
| | | getSelectedParameter: inputOutputEntry.getSelectedParameter |
| | | }; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'), |
| | | error = require('./implementation/ErrorEventDefinition'); |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var errorEvents = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:EndEvent' |
| | | ]; |
| | | |
| | | forEach(errorEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | var errorEventDefinition = eventDefinitionHelper.getErrorEventDefinition(element); |
| | | |
| | | if (errorEventDefinition) { |
| | | var isCatchingErrorEvent = is(element, 'bpmn:StartEvent') || is (element, 'bpmn:BoundaryEvent'); |
| | | |
| | | var showErrorCodeVariable = isCatchingErrorEvent, |
| | | showErrorMessageVariable = isCatchingErrorEvent; |
| | | |
| | | error( |
| | | group, |
| | | element, |
| | | bpmnFactory, |
| | | errorEventDefinition, |
| | | showErrorCodeVariable, |
| | | showErrorMessageVariable, |
| | | translate); |
| | | } |
| | | } |
| | | }); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'); |
| | | |
| | | var externalTaskPriority = require('./implementation/ExternalTaskPriority'); |
| | | |
| | | function getServiceTaskLikeBusinessObject(element) { |
| | | var bo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | |
| | | // if the element is not a serviceTaskLike element, fetch the normal business object |
| | | // This avoids the loss of the process / participant business object |
| | | if (!bo) { |
| | | bo = getBusinessObject(element); |
| | | } |
| | | |
| | | return bo; |
| | | } |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var bo = getServiceTaskLikeBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | if (is(bo, 'activiti:TaskPriorized') || (is(bo, 'bpmn:Participant')) && bo.get('processRef')) { |
| | | group.entries = group.entries.concat(externalTaskPriority(element, bpmnFactory, { |
| | | getBusinessObject: function(element) { |
| | | if (!is(bo, 'bpmn:Participant')) { |
| | | return bo; |
| | | } |
| | | return bo.get('processRef'); |
| | | } |
| | | }, translate)); |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'); |
| | | |
| | | var fieldInjection = require('./implementation/FieldInjection'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var bo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | var fieldInjectionEntry = fieldInjection(element, bpmnFactory, translate, { businessObject: bo }); |
| | | |
| | | if (fieldInjectionEntry && fieldInjectionEntry.length > 0) { |
| | | group.entries = group.entries.concat(fieldInjectionEntry); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | getExtensionElements = require('../../../helper/ExtensionElementsHelper').getExtensionElements, |
| | | removeEntry = require('../../../helper/ExtensionElementsHelper').removeEntry, |
| | | extensionElements = require('./implementation/ExtensionElements'), |
| | | properties = require('./implementation/Properties'), |
| | | entryFactory = require('../../../factory/EntryFactory'), |
| | | elementHelper = require('../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../helper/CmdHelper'), |
| | | formHelper = require('../../../helper/FormHelper'), |
| | | utils = require('../../../Utils'), |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | find = require('lodash/find'), |
| | | each = require('lodash/forEach'); |
| | | |
| | | function generateValueId() { |
| | | return utils.nextId('Value_'); |
| | | } |
| | | |
| | | /** |
| | | * Generate a form field specific textField using entryFactory. |
| | | * |
| | | * @param {string} options.id |
| | | * @param {string} options.label |
| | | * @param {string} options.modelProperty |
| | | * @param {function} options.validate |
| | | * |
| | | * @return {Object} an entryFactory.textField object |
| | | */ |
| | | function formFieldTextField(options, getSelectedFormField) { |
| | | |
| | | var id = options.id, |
| | | label = options.label, |
| | | modelProperty = options.modelProperty, |
| | | validate = options.validate; |
| | | |
| | | return entryFactory.textField({ |
| | | id: id, |
| | | label: label, |
| | | modelProperty: modelProperty, |
| | | get: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node) || {}, |
| | | values = {}; |
| | | |
| | | values[modelProperty] = selectedFormField[modelProperty]; |
| | | |
| | | return values; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var commands = []; |
| | | |
| | | if (typeof options.set === 'function') { |
| | | var cmd = options.set(element, values, node); |
| | | |
| | | if (cmd) { |
| | | commands.push(cmd); |
| | | } |
| | | } |
| | | |
| | | var formField = getSelectedFormField(element, node), |
| | | properties = {}; |
| | | |
| | | properties[modelProperty] = values[modelProperty] || undefined; |
| | | |
| | | commands.push(cmdHelper.updateBusinessObject(element, formField, properties)); |
| | | |
| | | return commands; |
| | | }, |
| | | hidden: function(element, node) { |
| | | return !getSelectedFormField(element, node); |
| | | }, |
| | | validate: validate |
| | | }); |
| | | } |
| | | |
| | | function ensureFormKeyAndDataSupported(element) { |
| | | return ( |
| | | is(element, 'bpmn:StartEvent') && !is(element.parent, 'bpmn:SubProcess') |
| | | ) || is(element, 'bpmn:UserTask'); |
| | | } |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | if (!ensureFormKeyAndDataSupported(element)) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Return the currently selected form field querying the form field select box |
| | | * from the DOM. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {DOMElement} node - DOM element of any form field text input |
| | | * |
| | | * @return {ModdleElement} the currently selected form field |
| | | */ |
| | | function getSelectedFormField(element, node) { |
| | | var selected = formFieldsEntry.getSelected(element, node.parentNode); |
| | | |
| | | if (selected.idx === -1) { |
| | | return; |
| | | } |
| | | |
| | | return formHelper.getFormField(element, selected.idx); |
| | | } |
| | | |
| | | // [FormKey] form key text input field |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'form-key', |
| | | label : translate('Form Key'), |
| | | modelProperty: 'formKey', |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | return { |
| | | formKey: bo.get('activiti:formKey') |
| | | }; |
| | | }, |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element), |
| | | formKey = values.formKey || undefined; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, bo, { 'activiti:formKey': formKey }); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field select box |
| | | var formFieldsEntry = extensionElements(element, bpmnFactory, { |
| | | id: 'form-fields', |
| | | label: translate('Form Fields'), |
| | | modelProperty: 'id', |
| | | prefix: 'FormProperty', |
| | | createExtensionElement: function(element, extensionElements, value) { |
| | | var bo = getBusinessObject(element), commands = []; |
| | | |
| | | if (!extensionElements) { |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); |
| | | commands.push(cmdHelper.updateProperties(element, { extensionElements: extensionElements })); |
| | | } |
| | | /* var formData = formHelper.getFormData(element); |
| | | |
| | | if (!formData) { |
| | | formData = elementHelper.createElement('activiti:FormData', { fields: [] }, extensionElements, bpmnFactory); |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | 'extensionElements', |
| | | [formData], |
| | | [] |
| | | )); |
| | | }*/ |
| | | /**activiti 是向 extensionElements 下追加元素,而不是 formData 下,*/ |
| | | var field = elementHelper.createElement('activiti:FormProperty', { id: value }, extensionElements, bpmnFactory); |
| | | if (typeof extensionElements.values !== 'undefined') { |
| | | commands.push(cmdHelper.addElementsTolist(element, extensionElements, 'values', [ field ])); |
| | | } else { |
| | | commands.push(cmdHelper.updateBusinessObject(element, extensionElements, { |
| | | values: [ field ] |
| | | })); |
| | | } |
| | | return commands; |
| | | }, |
| | | removeExtensionElement: function(element, extensionElements, value, idx) { |
| | | var fields = formHelper.getFormFields(element); |
| | | var entry = fields[idx], |
| | | commands = []; |
| | | |
| | | if (fields.length < 2) { |
| | | commands.push(removeEntry(getBusinessObject(element), element, extensionElements)); |
| | | } else { |
| | | commands.push(cmdHelper.removeElementsFromList(element, extensionElements, 'values', null, [entry])); |
| | | /* if (entry.id === formData.get('businessKey')) { |
| | | commands.push(cmdHelper.updateBusinessObject(element, extensionElements, { 'businessKey': undefined })); |
| | | }*/ |
| | | } |
| | | |
| | | return commands; |
| | | }, |
| | | getExtensionElements: function(element) { |
| | | return formHelper.getFormFields(element); |
| | | }, |
| | | hideExtensionElements: function(element, node) { |
| | | return false; |
| | | } |
| | | }); |
| | | group.entries.push(formFieldsEntry); |
| | | |
| | | |
| | | // [FormData] Form Field label |
| | | group.entries.push(entryFactory.label({ |
| | | id: 'form-field-header', |
| | | labelText: translate('Form Field'), |
| | | showLabel: function(element, node) { |
| | | return !!getSelectedFormField(element, node); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field id text input field |
| | | group.entries.push(entryFactory.validationAwareTextField({ |
| | | id: 'form-field-id', |
| | | label: translate('ID'), |
| | | modelProperty: 'id', |
| | | |
| | | getProperty: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node) || {}; |
| | | |
| | | return selectedFormField.id; |
| | | }, |
| | | |
| | | setProperty: function(element, properties, node) { |
| | | var formField = getSelectedFormField(element, node); |
| | | |
| | | return cmdHelper.updateBusinessObject(element, formField, properties); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !getSelectedFormField(element, node); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | |
| | | var formField = getSelectedFormField(element, node); |
| | | |
| | | if (formField) { |
| | | |
| | | var idValue = values.id; |
| | | |
| | | if (!idValue || idValue.trim() === '') { |
| | | return { id: 'Form field id must not be empty' }; |
| | | } |
| | | |
| | | var formFields = formHelper.getFormFields(element); |
| | | |
| | | var existingFormField = find(formFields, function(f) { |
| | | return f !== formField && f.id === idValue; |
| | | }); |
| | | |
| | | if (existingFormField) { |
| | | return { id: 'Form field id already used in form data.' }; |
| | | } |
| | | } |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field type combo box |
| | | group.entries.push(entryFactory.comboBox({ |
| | | id: 'form-field-type', |
| | | label: translate('Type'), |
| | | selectOptions: [ |
| | | { name: 'string', value: 'string' }, |
| | | { name: 'long', value: 'long' }, |
| | | { name: 'boolean', value: 'boolean' }, |
| | | { name: 'date', value: 'date' }, |
| | | { name: 'enum', value: 'enum' } |
| | | ], |
| | | modelProperty: 'type', |
| | | emptyParameter: true, |
| | | |
| | | get: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node); |
| | | |
| | | if (selectedFormField) { |
| | | return { type: selectedFormField.type }; |
| | | } else { |
| | | return {}; |
| | | } |
| | | }, |
| | | set: function(element, values, node) { |
| | | var selectedFormField = getSelectedFormField(element, node), |
| | | commands = []; |
| | | |
| | | if (selectedFormField.type === 'enum' && values.type !== 'enum') { |
| | | // delete activiti:value objects from formField.values when switching from type enum |
| | | commands.push(cmdHelper.updateBusinessObject(element, selectedFormField, { values: undefined })); |
| | | } |
| | | commands.push(cmdHelper.updateBusinessObject(element, selectedFormField, values)); |
| | | |
| | | return commands; |
| | | }, |
| | | hidden: function(element, node) { |
| | | return !getSelectedFormField(element, node); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field label text input field |
| | | group.entries.push(formFieldTextField({ |
| | | id: 'form-field-label', |
| | | label: translate('Label'), |
| | | modelProperty: 'label' |
| | | }, getSelectedFormField)); |
| | | |
| | | // [FormData] form field defaultValue text input field |
| | | group.entries.push(formFieldTextField({ |
| | | id: 'form-field-defaultValue', |
| | | label: translate('Default Value'), |
| | | modelProperty: 'defaultValue' |
| | | }, getSelectedFormField)); |
| | | |
| | | |
| | | // [FormData] form field enum values label |
| | | group.entries.push(entryFactory.label({ |
| | | id: 'form-field-enum-values-header', |
| | | labelText: translate('Values'), |
| | | divider: true, |
| | | showLabel: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node); |
| | | |
| | | return selectedFormField && selectedFormField.type === 'enum'; |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field enum values table |
| | | group.entries.push(entryFactory.table({ |
| | | id: 'form-field-enum-values', |
| | | labels: [ translate('Id'), translate('Name') ], |
| | | modelProperties: [ 'id', 'name' ], |
| | | addLabel:translate('Add Value'), |
| | | show: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node); |
| | | |
| | | return selectedFormField && selectedFormField.type === 'enum'; |
| | | }, |
| | | getElements: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node); |
| | | |
| | | return formHelper.getEnumValues(selectedFormField); |
| | | }, |
| | | addElement: function(element, node) { |
| | | var selectedFormField = getSelectedFormField(element, node), |
| | | id = generateValueId(); |
| | | |
| | | var enumValue = elementHelper.createElement( |
| | | 'activiti:Value', |
| | | { id: id, name: undefined }, |
| | | getBusinessObject(element), |
| | | bpmnFactory |
| | | ); |
| | | |
| | | return cmdHelper.addElementsTolist(element, selectedFormField, 'values', [enumValue]); |
| | | }, |
| | | removeElement: function(element, node, idx) { |
| | | var selectedFormField = getSelectedFormField(element, node), |
| | | enumValue = selectedFormField.values[idx]; |
| | | |
| | | return cmdHelper.removeElementsFromList(element, selectedFormField, 'values', null, [enumValue]); |
| | | }, |
| | | updateElement: function(element, value, node, idx) { |
| | | var selectedFormField = getSelectedFormField(element, node), |
| | | enumValue = selectedFormField.values[idx]; |
| | | |
| | | value.name = value.name || undefined; |
| | | return cmdHelper.updateBusinessObject(element, enumValue, value); |
| | | }, |
| | | validate: function(element, value, node, idx) { |
| | | |
| | | var selectedFormField = getSelectedFormField(element, node), |
| | | enumValue = selectedFormField.values[idx]; |
| | | |
| | | if (enumValue) { |
| | | // check if id is valid |
| | | var validationError = utils.isIdValid(enumValue, value.id, translate); |
| | | |
| | | if (validationError) { |
| | | return { id: validationError }; |
| | | } |
| | | } |
| | | } |
| | | })); |
| | | |
| | | // [FormData] Validation label |
| | | group.entries.push(entryFactory.label({ |
| | | id: 'form-field-validation-header', |
| | | labelText: translate('Validation'), |
| | | divider: true, |
| | | showLabel: function(element, node) { |
| | | return !!getSelectedFormField(element, node); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] form field constraints table |
| | | group.entries.push(entryFactory.table({ |
| | | id: 'constraints-list', |
| | | modelProperties: [ 'name', 'config' ], |
| | | labels: [ translate('Name'), translate('Config') ], |
| | | addLabel: translate('Add Constraint'), |
| | | getElements: function(element, node) { |
| | | var formField = getSelectedFormField(element, node); |
| | | |
| | | return formHelper.getConstraints(formField); |
| | | }, |
| | | addElement: function(element, node) { |
| | | |
| | | var commands = [], |
| | | formField = getSelectedFormField(element, node), |
| | | validation = formField.validation; |
| | | |
| | | if (!validation) { |
| | | // create validation business object and add it to form data, if it doesn't exist |
| | | validation = elementHelper.createElement('activiti:Validation', {}, getBusinessObject(element), bpmnFactory); |
| | | |
| | | commands.push(cmdHelper.updateBusinessObject(element, formField, { 'validation': validation })); |
| | | } |
| | | |
| | | var newConstraint = elementHelper.createElement( |
| | | 'activiti:Constraint', |
| | | { name: undefined, config: undefined }, |
| | | validation, |
| | | bpmnFactory |
| | | ); |
| | | |
| | | commands.push(cmdHelper.addElementsTolist(element, validation, 'constraints', [ newConstraint ])); |
| | | |
| | | return commands; |
| | | }, |
| | | updateElement: function(element, value, node, idx) { |
| | | var formField = getSelectedFormField(element, node), |
| | | constraint = formHelper.getConstraints(formField)[idx]; |
| | | |
| | | value.name = value.name || undefined; |
| | | value.config = value.config || undefined; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, constraint, value); |
| | | }, |
| | | removeElement: function(element, node, idx) { |
| | | var commands = [], |
| | | formField = getSelectedFormField(element, node), |
| | | constraints = formHelper.getConstraints(formField), |
| | | currentConstraint = constraints[idx]; |
| | | |
| | | commands.push(cmdHelper.removeElementsFromList( |
| | | element, |
| | | formField.validation, |
| | | 'constraints', |
| | | null, |
| | | [ currentConstraint ] |
| | | )); |
| | | |
| | | if (constraints.length === 1) { |
| | | // remove activiti:validation if the last existing constraint has been removed |
| | | commands.push(cmdHelper.updateBusinessObject(element, formField, { validation: undefined })); |
| | | } |
| | | |
| | | return commands; |
| | | }, |
| | | show: function(element, node) { |
| | | return !!getSelectedFormField(element, node); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] Properties label |
| | | group.entries.push(entryFactory.label({ |
| | | id: 'form-field-properties-header', |
| | | labelText: translate('Properties'), |
| | | divider: true, |
| | | showLabel: function(element, node) { |
| | | return !!getSelectedFormField(element, node); |
| | | } |
| | | })); |
| | | |
| | | // [FormData] activiti:properties table |
| | | group.entries.push(properties(element, bpmnFactory, { |
| | | id: 'form-field-properties', |
| | | modelProperties: [ 'id', 'value' ], |
| | | labels: [ translate('Id'), translate('Value') ], |
| | | getParent: function(element, node) { |
| | | return getSelectedFormField(element, node); |
| | | }, |
| | | show: function(element, node) { |
| | | return !!getSelectedFormField(element, node); |
| | | } |
| | | }, translate)); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var historyTimeToLive = require('./implementation/HistoryTimeToLive'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | if (is(element, 'activiti:Process') || |
| | | is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | |
| | | group.entries = group.entries.concat(historyTimeToLive(element, bpmnFactory, { |
| | | getBusinessObject: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!is(bo, 'bpmn:Participant')) { |
| | | return bo; |
| | | } |
| | | |
| | | return bo.get('processRef'); |
| | | } |
| | | }, translate)); |
| | | |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var inputOutputParameter = require('./implementation/InputOutputParameter'); |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, options, translate) { |
| | | |
| | | group.entries = group.entries.concat(inputOutputParameter(element, bpmnFactory, assign({}, options), translate)); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var inputOutput = require('./implementation/InputOutput'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var inputOutputEntry = inputOutput(element, bpmnFactory, {}, translate); |
| | | |
| | | group.entries = group.entries.concat(inputOutputEntry.entries); |
| | | |
| | | return { |
| | | getSelectedParameter: inputOutputEntry.getSelectedParameter |
| | | }; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var jobPriority = require('./implementation/JobPriority'), |
| | | jobRetryTimeCycle = require('./implementation/JobRetryTimeCycle'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | if (is(element, 'activiti:JobPriorized') || |
| | | is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | |
| | | group.entries = group.entries.concat(jobPriority(element, bpmnFactory, { |
| | | getBusinessObject: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!is(bo, 'bpmn:Participant')) { |
| | | return bo; |
| | | } |
| | | |
| | | return bo.get('processRef'); |
| | | } |
| | | }, translate)); |
| | | } |
| | | |
| | | if (is(element, 'activiti:AsyncCapable')) { |
| | | group.entries = group.entries.concat(jobRetryTimeCycle(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject |
| | | }, translate)); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../helper/CmdHelper'), |
| | | ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'), |
| | | |
| | | scriptImplementation = require('./implementation/Script'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, options, translate) { |
| | | |
| | | var LISTENER_TYPE_LABEL = { |
| | | class: translate('Java Class'), |
| | | expression: translate('Expression'), |
| | | delegateExpression: translate('Delegate Expression'), |
| | | script: translate('Script') |
| | | }; |
| | | |
| | | options = options || {}; |
| | | |
| | | var getSelectedListener = options.getSelectedListener; |
| | | |
| | | var classProp = 'class', |
| | | expressionProp = 'expression', |
| | | delegateExpressionProp = 'delegateExpression', |
| | | scriptProp = 'script'; |
| | | |
| | | var executionListenerEventTypeOptions = ImplementationTypeHelper.isSequenceFlow(element) ? [ |
| | | { name: translate('take'), value: 'take' } |
| | | ] : [ |
| | | { name: translate('start'), value: 'start' }, |
| | | { name: translate('end'), value: 'end' } |
| | | ]; |
| | | |
| | | var taskListenerEventTypeOptions = [ |
| | | { name: translate('create'), value: 'create' }, |
| | | { name: translate('assignment'), value: 'assignment' }, |
| | | { name: translate('complete'), value: 'complete' }, |
| | | { name: translate('delete'), value: 'delete' } |
| | | ]; |
| | | |
| | | var isSelected = function(element, node) { |
| | | return getSelectedListener(element, node); |
| | | }; |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'listener-event-type', |
| | | label: translate('Event Type'), |
| | | modelProperty: 'eventType', |
| | | emptyParameter: false, |
| | | |
| | | get: function(element, node) { |
| | | |
| | | |
| | | var listener = getSelectedListener(element, node); |
| | | |
| | | var eventType = listener && listener.get('event'); |
| | | |
| | | return { |
| | | eventType: eventType |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var eventType = values.eventType; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, getSelectedListener(element, node), { event: eventType }); |
| | | }, |
| | | |
| | | selectOptions: function(element, node) { |
| | | var eventTypeOptions; |
| | | |
| | | var selectedListener = getSelectedListener(element, node); |
| | | if (ImplementationTypeHelper.isTaskListener(selectedListener)) { |
| | | eventTypeOptions = taskListenerEventTypeOptions; |
| | | } else if (ImplementationTypeHelper.isExecutionListener(selectedListener)) { |
| | | eventTypeOptions = executionListenerEventTypeOptions; |
| | | } |
| | | |
| | | return eventTypeOptions; |
| | | |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'listener-type', |
| | | label: translate('Listener Type'), |
| | | selectOptions: [ |
| | | { value: classProp, name: translate('Java Class') }, |
| | | { value: expressionProp, name: translate('Expression') }, |
| | | { value: delegateExpressionProp, name: translate('Delegate Expression') }, |
| | | { value: scriptProp, name: translate('Script') } |
| | | ], |
| | | modelProperty: 'listenerType', |
| | | emptyParameter: false, |
| | | |
| | | get: function(element, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | return { |
| | | listenerType: ImplementationTypeHelper.getImplementationType(listener) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var listener = getSelectedListener(element, node), |
| | | listenerType = values.listenerType || undefined, |
| | | update = {}; |
| | | |
| | | update[classProp] = listenerType === classProp ? '' : undefined; |
| | | update[expressionProp] = listenerType === expressionProp ? '' : undefined; |
| | | update[delegateExpressionProp] = listenerType === delegateExpressionProp ? '' : undefined; |
| | | update[scriptProp] = listenerType === scriptProp ? bpmnFactory.create('activiti:Script') : undefined; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, listener, update); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'listener-value', |
| | | dataValueLabel: 'listenerValueLabel', |
| | | modelProperty: 'listenerValue', |
| | | |
| | | get: function(element, node) { |
| | | var value = {}, |
| | | listener = getSelectedListener(element, node), |
| | | listenerType = ImplementationTypeHelper.getImplementationType(listener); |
| | | |
| | | value.listenerValueLabel = LISTENER_TYPE_LABEL[listenerType] || ''; |
| | | value.listenerValue = (listener && listener.get(listenerType)) || undefined; |
| | | |
| | | return value; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var update = {}, |
| | | listener = getSelectedListener(element, node), |
| | | listenerType = ImplementationTypeHelper.getImplementationType(listener); |
| | | |
| | | update[listenerType] = values.listenerValue || ''; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, listener, update); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | return !listener || listener.script; |
| | | }, |
| | | |
| | | validate: function(element, values) { |
| | | var value = values.listenerValue, |
| | | validate = {}; |
| | | |
| | | if (!value) { |
| | | validate.listenerValue = translate('Must provide a value'); |
| | | } |
| | | |
| | | return validate; |
| | | } |
| | | |
| | | })); |
| | | |
| | | var script = scriptImplementation('scriptFormat', 'value', true, translate); |
| | | |
| | | group.entries.push({ |
| | | id: 'listener-script-value', |
| | | html: '<div data-show="isScript">' + |
| | | script.template + |
| | | '</div>', |
| | | |
| | | get: function(element, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | return listener && listener.script ? script.get(element, listener.script) : {}; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | var update = script.set(element, values, listener); |
| | | return cmdHelper.updateBusinessObject(element, listener.script, update); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | return listener && listener.script ? script.validate(element, values) : {}; |
| | | }, |
| | | |
| | | isScript: function(element, node) { |
| | | var listener = getSelectedListener(element, node); |
| | | return listener && listener.script; |
| | | }, |
| | | |
| | | script: script |
| | | |
| | | }); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | var fieldInjection = require('./implementation/FieldInjection'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, options, translate) { |
| | | |
| | | options = assign({ |
| | | idPrefix: 'listener-', |
| | | insideListener: true |
| | | }, options); |
| | | |
| | | var fieldInjectionEntry = fieldInjection(element, bpmnFactory, translate, options); |
| | | |
| | | if (fieldInjectionEntry && fieldInjectionEntry.length > 0) { |
| | | group.entries = group.entries.concat(fieldInjectionEntry); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var listener = require('./implementation/Listener'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var listenerEntry = listener(element, bpmnFactory, {}, translate); |
| | | |
| | | group.entries = group.entries.concat(listenerEntry.entries); |
| | | |
| | | return { |
| | | getSelectedListener: listenerEntry.getSelectedListener |
| | | }; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var multiInstanceLoopCharacteristics = require('./implementation/MultiInstanceLoopCharacteristics'); |
| | | |
| | | var jobRetryTimeCycle = require('./implementation/JobRetryTimeCycle'), |
| | | asyncContinuation = require('./implementation/AsyncContinuation'); |
| | | |
| | | |
| | | function getLoopCharacteristics(element) { |
| | | var bo = getBusinessObject(element); |
| | | return bo.loopCharacteristics; |
| | | } |
| | | |
| | | |
| | | function ensureMultiInstanceSupported(element) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | return !!loopCharacteristics && is(loopCharacteristics, 'activiti:Collectable'); |
| | | } |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | if (!ensureMultiInstanceSupported(element)) { |
| | | return; |
| | | } |
| | | |
| | | // multi instance properties |
| | | group.entries = group.entries.concat(multiInstanceLoopCharacteristics(element, bpmnFactory, translate)); |
| | | |
| | | // async continuation /////////////////////////////////////////////////////// |
| | | group.entries = group.entries.concat(asyncContinuation(element, bpmnFactory, { |
| | | getBusinessObject: getLoopCharacteristics, |
| | | idPrefix: 'multiInstance-', |
| | | labelPrefix: translate('Multi Instance ') |
| | | }, translate)); |
| | | |
| | | |
| | | // retry time cycle ////////////////////////////////////////////////////////// |
| | | group.entries = group.entries.concat(jobRetryTimeCycle(element, bpmnFactory, { |
| | | getBusinessObject: getLoopCharacteristics, |
| | | idPrefix: 'multiInstance-', |
| | | labelPrefix: translate('Multi Instance ') |
| | | }, translate)); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var properties = require('./implementation/Properties'), |
| | | elementHelper = require('../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var propertiesEntry = properties(element, bpmnFactory, { |
| | | id: 'properties', |
| | | modelProperties: [ 'name', 'value' ], |
| | | labels: [ translate('Name'), translate('Value') ], |
| | | |
| | | getParent: function(element, node, bo) { |
| | | return bo.extensionElements; |
| | | }, |
| | | |
| | | createParent: function(element, bo) { |
| | | var parent = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); |
| | | var cmd = cmdHelper.updateBusinessObject(element, bo, { extensionElements: parent }); |
| | | return { |
| | | cmd: cmd, |
| | | parent: parent |
| | | }; |
| | | } |
| | | }, translate); |
| | | |
| | | if (propertiesEntry) { |
| | | group.entries.push(propertiesEntry); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | entryFactory = require('../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../helper/CmdHelper'), |
| | | scriptImplementation = require('./implementation/Script'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var bo; |
| | | |
| | | if (is(element, 'bpmn:ScriptTask')) { |
| | | bo = getBusinessObject(element); |
| | | } |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | var script = scriptImplementation('scriptFormat', 'script', false, translate); |
| | | group.entries.push({ |
| | | id: 'script-implementation', |
| | | label: translate('Script'), |
| | | html: script.template, |
| | | |
| | | get: function(element) { |
| | | return script.get(element, bo); |
| | | }, |
| | | |
| | | set: function(element, values, containerElement) { |
| | | var properties = script.set(element, values, containerElement); |
| | | |
| | | return cmdHelper.updateProperties(element, properties); |
| | | }, |
| | | |
| | | validate: function(element, values) { |
| | | return script.validate(element, values); |
| | | }, |
| | | |
| | | script : script, |
| | | |
| | | cssClasses: ['bpp-textfield'] |
| | | |
| | | }); |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'scriptResultVariable', |
| | | label : translate('Result Variable'), |
| | | modelProperty : 'scriptResultVariable', |
| | | |
| | | get: function(element, propertyName) { |
| | | var boResultVariable = bo.get('activiti:resultVariable'); |
| | | |
| | | return { scriptResultVariable : boResultVariable }; |
| | | }, |
| | | |
| | | set: function(element, values, containerElement) { |
| | | return cmdHelper.updateProperties(element, { |
| | | 'activiti:resultVariable': values.scriptResultVariable.length |
| | | ? values.scriptResultVariable |
| | | : undefined |
| | | }); |
| | | } |
| | | |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'), |
| | | InputOutputHelper = require('../../../helper/InputOutputHelper'); |
| | | |
| | | var utils = require('../../../Utils'), |
| | | escapeHTML = utils.escapeHTML, |
| | | triggerClickEvent = utils.triggerClickEvent; |
| | | |
| | | var implementationType = require('./implementation/ImplementationType'), |
| | | delegate = require('./implementation/Delegate'), |
| | | external = require('./implementation/External'), |
| | | callable = require('./implementation/Callable'), |
| | | resultVariable = require('./implementation/ResultVariable'); |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domClosest = require('min-dom').closest, |
| | | domClasses = require('min-dom').classes; |
| | | |
| | | function getImplementationType(element) { |
| | | return ImplementationTypeHelper.getImplementationType(element); |
| | | } |
| | | |
| | | function getBusinessObject(element) { |
| | | return ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element); |
| | | } |
| | | |
| | | function isDmnCapable(element) { |
| | | return ImplementationTypeHelper.isDmnCapable(element); |
| | | } |
| | | |
| | | function isExternalCapable(element) { |
| | | return ImplementationTypeHelper.isExternalCapable(element); |
| | | } |
| | | |
| | | function isServiceTaskLike(element) { |
| | | return ImplementationTypeHelper.isServiceTaskLike(element); |
| | | } |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | if (!isServiceTaskLike(getBusinessObject(element))) { |
| | | return; |
| | | } |
| | | |
| | | var hasDmnSupport = isDmnCapable(element); |
| | | var hasExternalSupport = isExternalCapable(getBusinessObject(element)); |
| | | |
| | | // implementation type //////////////////////////////////// |
| | | |
| | | group.entries = group.entries.concat(implementationType(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject, |
| | | getImplementationType: getImplementationType, |
| | | hasDmnSupport: hasDmnSupport, |
| | | hasExternalSupport: hasExternalSupport, |
| | | hasServiceTaskLikeSupport: true |
| | | }, translate)); |
| | | |
| | | |
| | | // delegate (class, expression, delegateExpression) ////////// |
| | | |
| | | group.entries = group.entries.concat(delegate(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject, |
| | | getImplementationType: getImplementationType |
| | | }, translate)); |
| | | |
| | | |
| | | // result variable ///////////////////////////////////////// |
| | | |
| | | group.entries = group.entries.concat(resultVariable(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject, |
| | | getImplementationType: getImplementationType, |
| | | hideResultVariable: function(element, node) { |
| | | return getImplementationType(element) !== 'expression'; |
| | | } |
| | | }, translate)); |
| | | |
| | | // external ////////////////////////////////////////////////// |
| | | |
| | | if (hasExternalSupport) { |
| | | group.entries = group.entries.concat(external(element, bpmnFactory, { |
| | | getBusinessObject: getBusinessObject, |
| | | getImplementationType: getImplementationType |
| | | }, translate)); |
| | | } |
| | | |
| | | |
| | | // dmn //////////////////////////////////////////////////////// |
| | | |
| | | if (hasDmnSupport) { |
| | | group.entries = group.entries.concat(callable(element, bpmnFactory, { |
| | | getCallableType: getImplementationType |
| | | }, translate)); |
| | | } |
| | | |
| | | |
| | | // connector //////////////////////////////////////////////// |
| | | |
| | | var isConnector = function(element) { |
| | | return getImplementationType(element) === 'connector'; |
| | | }; |
| | | |
| | | group.entries.push(entryFactory.link({ |
| | | id: 'configureConnectorLink', |
| | | label: translate('Configure Connector'), |
| | | handleClick: function(element, node, event) { |
| | | |
| | | var connectorTabEl = getTabNode(node, 'connector'); |
| | | |
| | | if (connectorTabEl) { |
| | | triggerClickEvent(connectorTabEl); |
| | | } |
| | | |
| | | // suppress actual link click |
| | | return false; |
| | | }, |
| | | showLink: function(element, node) { |
| | | var link = domQuery('a', node); |
| | | link.textContent = ''; |
| | | |
| | | domClasses(link).remove('bpp-error-message'); |
| | | |
| | | if (isConnector(element)) { |
| | | var connectorId = InputOutputHelper.getConnector(element).get('connectorId'); |
| | | if (connectorId) { |
| | | link.textContent = translate('Configure Connector'); |
| | | } else { |
| | | link.innerHTML = '<span class="bpp-icon-warning"></span> ' + escapeHTML(translate('Must configure Connector')); |
| | | domClasses(link).add('bpp-error-message'); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | })); |
| | | |
| | | }; |
| | | |
| | | |
| | | |
| | | // helpers /////////////////////////// |
| | | |
| | | function getTabNode(el, id) { |
| | | var containerEl = domClosest(el, '.bpp-properties-panel'); |
| | | |
| | | return domQuery('a[data-tab-target="' + id + '"]', containerEl); |
| | | } |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'), |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | |
| | | module.exports = function(group, element, translate) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | if (is(element, 'activiti:Initiator') && !is(element.parent, 'bpmn:SubProcess')) { |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'initiator', |
| | | label: translate('Initiator'), |
| | | modelProperty: 'initiator' |
| | | })); |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var tasklist = require('./implementation/Tasklist'); |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | if (is(element, 'activiti:Process') || |
| | | is(element, 'bpmn:Participant') && businessObject.get('processRef')) { |
| | | |
| | | group.entries = group.entries.concat(tasklist(element, bpmnFactory, { |
| | | getBusinessObject: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!is(bo, 'bpmn:Participant')) { |
| | | return bo; |
| | | } |
| | | |
| | | return bo.get('processRef'); |
| | | } |
| | | }, translate)); |
| | | |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | |
| | | module.exports = function(group, element, translate) { |
| | | if (is(element, 'activiti:Assignable')) { |
| | | |
| | | // Assignee |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'assignee', |
| | | label : translate('Assignee'), |
| | | modelProperty : 'assignee' |
| | | })); |
| | | |
| | | // Candidate Users |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'candidateUsers', |
| | | label : translate('Candidate Users'), |
| | | modelProperty : 'candidateUsers' |
| | | })); |
| | | |
| | | // Candidate Groups |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'candidateGroups', |
| | | label : translate('Candidate Groups'), |
| | | modelProperty : 'candidateGroups' |
| | | })); |
| | | |
| | | // Due Date |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'dueDate', |
| | | description : translate('The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)'), |
| | | label : translate('Due Date'), |
| | | modelProperty : 'dueDate' |
| | | })); |
| | | |
| | | // FollowUp Date |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'followUpDate', |
| | | description : translate('The follow up date as an EL expression (e.g. ${someDate} or an ' + |
| | | 'ISO date (e.g. 2015-06-26T09:54:00)'), |
| | | label : translate('Follow Up Date'), |
| | | modelProperty : 'followUpDate' |
| | | })); |
| | | |
| | | // priority |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'priority', |
| | | label : translate('Priority'), |
| | | modelProperty : 'priority' |
| | | })); |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var filter = require('lodash/filter'); |
| | | |
| | | var extensionElementsHelper = require('../../../helper/ExtensionElementsHelper'), |
| | | cmdHelper = require('../../../helper/CmdHelper'), |
| | | elementHelper = require('../../../helper/ElementHelper'), |
| | | eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'); |
| | | |
| | | var extensionElementsEntry = require('./implementation/ExtensionElements'); |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | /** |
| | | * return depend on parameter 'type' activiti:in or activiti:out extension elements |
| | | */ |
| | | function getActivitiInOutMappings(element, type) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(bo); |
| | | |
| | | return extensionElementsHelper.getExtensionElements(signalEventDefinition || bo, type) || []; |
| | | } |
| | | |
| | | /** |
| | | * return depend on parameter 'type' activiti:in or activiti:out extension elements |
| | | * with source or sourceExpression attribute |
| | | */ |
| | | function getVariableMappings(element, type) { |
| | | var activitiMappings = getActivitiInOutMappings(element, type); |
| | | |
| | | return filter(activitiMappings, function(mapping) { |
| | | return !mapping.businessKey; |
| | | }); |
| | | } |
| | | |
| | | function getInOutType(mapping) { |
| | | var inOutType = 'source'; |
| | | |
| | | if (mapping.variables === 'all') { |
| | | inOutType = 'variables'; |
| | | } |
| | | else if (typeof mapping.source !== 'undefined') { |
| | | inOutType = 'source'; |
| | | } |
| | | else if (typeof mapping.sourceExpression !== 'undefined') { |
| | | inOutType = 'sourceExpression'; |
| | | } |
| | | |
| | | return inOutType; |
| | | } |
| | | |
| | | var ACTIVITI_IN_EXTENSION_ELEMENT = 'activiti:In', |
| | | ACTIVITI_OUT_EXTENSION_ELEMENT = 'activiti:Out'; |
| | | |
| | | var WHITESPACE_REGEX = /\s/; |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var inOutTypeOptions = [ |
| | | { |
| | | name: translate('Source'), |
| | | value: 'source' |
| | | }, |
| | | { |
| | | name: translate('Source Expression'), |
| | | value: 'sourceExpression' |
| | | }, |
| | | { |
| | | name: translate('All'), |
| | | value: 'variables' |
| | | } |
| | | ]; |
| | | |
| | | var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element); |
| | | |
| | | if (!is(element, 'activiti:CallActivity') && !signalEventDefinition) { |
| | | return; |
| | | } |
| | | |
| | | if (signalEventDefinition && !(isAny(element, [ |
| | | 'bpmn:IntermediateThrowEvent', |
| | | 'bpmn:EndEvent' |
| | | ]))) { |
| | | return; |
| | | } |
| | | |
| | | var isSelected = function(element, node) { |
| | | return !!getSelected(element, node); |
| | | }; |
| | | |
| | | var getSelected = function(element, node) { |
| | | var parentNode = node.parentNode; |
| | | var selection = inEntry.getSelected(element, parentNode); |
| | | |
| | | var parameter = getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT)[selection.idx]; |
| | | |
| | | if (!parameter && outEntry) { |
| | | selection = outEntry.getSelected(element, parentNode); |
| | | parameter = getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT)[selection.idx]; |
| | | } |
| | | |
| | | return parameter; |
| | | }; |
| | | |
| | | var setOptionLabelValue = function(type) { |
| | | return function(element, node, option, property, value, idx) { |
| | | var variableMappings = getVariableMappings(element, type); |
| | | var mappingValue = variableMappings[idx]; |
| | | var label = (mappingValue.target || '<undefined>') + ' := '; |
| | | var mappingType = getInOutType(mappingValue); |
| | | |
| | | if (mappingType === 'variables') { |
| | | label = 'all'; |
| | | } |
| | | else if (mappingType === 'source') { |
| | | label = label + (mappingValue.source || '<empty>'); |
| | | } |
| | | else if (mappingType === 'sourceExpression') { |
| | | label = label + (mappingValue.sourceExpression || '<empty>'); |
| | | } else { |
| | | label = label + '<empty>'; |
| | | } |
| | | |
| | | option.text = label; |
| | | }; |
| | | }; |
| | | |
| | | var newElement = function(type) { |
| | | return function(element, extensionElements, value) { |
| | | var newElem = elementHelper.createElement(type, { source: '' }, extensionElements, bpmnFactory); |
| | | |
| | | return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]); |
| | | }; |
| | | }; |
| | | |
| | | var removeElement = function(type) { |
| | | return function(element, extensionElements, value, idx) { |
| | | var variablesMappings= getVariableMappings(element, type); |
| | | var mapping = variablesMappings[idx]; |
| | | |
| | | if (mapping) { |
| | | return extensionElementsHelper |
| | | .removeEntry(signalEventDefinition || getBusinessObject(element), element, mapping); |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | // in mapping for source and sourceExpression /////////////////////////////////////////////////////////////// |
| | | |
| | | var inEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id: 'variableMapping-in', |
| | | label: translate('In Mapping'), |
| | | modelProperty: 'source', |
| | | prefix: 'In', |
| | | idGeneration: false, |
| | | resizable: true, |
| | | businessObject: signalEventDefinition || getBusinessObject(element), |
| | | |
| | | createExtensionElement: newElement(ACTIVITI_IN_EXTENSION_ELEMENT), |
| | | removeExtensionElement: removeElement(ACTIVITI_IN_EXTENSION_ELEMENT), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | outEntry && outEntry.deselect(element, node.parentNode); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(ACTIVITI_IN_EXTENSION_ELEMENT) |
| | | }); |
| | | group.entries.push(inEntry); |
| | | |
| | | // out mapping for source and sourceExpression /////////////////////////////////////////////////////// |
| | | |
| | | if (!signalEventDefinition) { |
| | | var outEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id: 'variableMapping-out', |
| | | label: translate('Out Mapping'), |
| | | modelProperty: 'source', |
| | | prefix: 'Out', |
| | | idGeneration: false, |
| | | resizable: true, |
| | | |
| | | createExtensionElement: newElement(ACTIVITI_OUT_EXTENSION_ELEMENT), |
| | | removeExtensionElement: removeElement(ACTIVITI_OUT_EXTENSION_ELEMENT), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | inEntry.deselect(element, node.parentNode); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(ACTIVITI_OUT_EXTENSION_ELEMENT) |
| | | }); |
| | | group.entries.push(outEntry); |
| | | } |
| | | |
| | | // label for selected mapping /////////////////////////////////////////////////////// |
| | | |
| | | group.entries.push(entryFactory.label({ |
| | | id: 'variableMapping-typeLabel', |
| | | get: function(element, node) { |
| | | var mapping = getSelected(element, node); |
| | | |
| | | var value = ''; |
| | | if (is(mapping, ACTIVITI_IN_EXTENSION_ELEMENT)) { |
| | | value = translate('In Mapping'); |
| | | } |
| | | else if (is(mapping, ACTIVITI_OUT_EXTENSION_ELEMENT)) { |
| | | value = translate('Out Mapping'); |
| | | } |
| | | |
| | | return { |
| | | label: value |
| | | }; |
| | | }, |
| | | |
| | | showLabel: function(element, node) { |
| | | return isSelected(element, node); |
| | | } |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'variableMapping-inOutType', |
| | | label: translate('Type'), |
| | | selectOptions: inOutTypeOptions, |
| | | modelProperty: 'inOutType', |
| | | get: function(element, node) { |
| | | var mapping = getSelected(element, node) || {}; |
| | | return { |
| | | inOutType: getInOutType(mapping) |
| | | }; |
| | | }, |
| | | set: function(element, values, node) { |
| | | var inOutType = values.inOutType; |
| | | |
| | | var props = { |
| | | 'source' : undefined, |
| | | 'sourceExpression' : undefined, |
| | | 'variables' : undefined |
| | | }; |
| | | |
| | | if (inOutType === 'source') { |
| | | props.source = ''; |
| | | } |
| | | else if (inOutType === 'sourceExpression') { |
| | | props.sourceExpression = ''; |
| | | } |
| | | else if (inOutType === 'variables') { |
| | | props.variables = 'all'; |
| | | props.target = undefined; |
| | | } |
| | | |
| | | var mapping = getSelected(element, node); |
| | | return cmdHelper.updateBusinessObject(element, mapping, props); |
| | | }, |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'variableMapping-source', |
| | | dataValueLabel: 'sourceLabel', |
| | | modelProperty: 'source', |
| | | get: function(element, node) { |
| | | var mapping = getSelected(element, node) || {}; |
| | | |
| | | var label = ''; |
| | | var inOutType = getInOutType(mapping); |
| | | if (inOutType === 'source') { |
| | | label = translate('Source'); |
| | | } |
| | | else if (inOutType === 'sourceExpression') { |
| | | label = translate('Source Expression'); |
| | | } |
| | | |
| | | return { |
| | | source: mapping[inOutType], |
| | | sourceLabel: label |
| | | }; |
| | | }, |
| | | set: function(element, values, node) { |
| | | values.source = values.source || undefined; |
| | | |
| | | var mapping = getSelected(element, node); |
| | | var inOutType = getInOutType(mapping); |
| | | |
| | | var props = {}; |
| | | props[inOutType] = values.source || ''; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, mapping, props); |
| | | }, |
| | | // one of both (source or sourceExpression) must have a value to make |
| | | // the configuration easier and more understandable |
| | | // it is not engine conform |
| | | validate: function(element, values, node) { |
| | | var mapping = getSelected(element, node); |
| | | |
| | | var validation = {}; |
| | | if (mapping) { |
| | | if (!values.source) { |
| | | validation.source = |
| | | validation.source = values.sourceLabel ? |
| | | translate('Mapping must have a {value}', { value: values.sourceLabel.toLowerCase() }) : |
| | | translate('Mapping must have a value'); |
| | | } |
| | | |
| | | var inOutType = getInOutType(mapping); |
| | | |
| | | if (WHITESPACE_REGEX.test(values.source) && inOutType !== 'sourceExpression') { |
| | | validation.source = translate('{label} must not contain whitespace', { label: values.sourceLabel }); |
| | | } |
| | | } |
| | | |
| | | return validation; |
| | | }, |
| | | hidden: function(element, node) { |
| | | var selectedMapping = getSelected(element, node); |
| | | return !selectedMapping || (selectedMapping && selectedMapping.variables); |
| | | } |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'variableMapping-target', |
| | | label: translate('Target'), |
| | | modelProperty: 'target', |
| | | get: function(element, node) { |
| | | return { |
| | | target: (getSelected(element, node) || {}).target |
| | | }; |
| | | }, |
| | | set: function(element, values, node) { |
| | | values.target = values.target || undefined; |
| | | var mapping = getSelected(element, node); |
| | | return cmdHelper.updateBusinessObject(element, mapping, values); |
| | | }, |
| | | validate: function(element, values, node) { |
| | | var mapping = getSelected(element, node); |
| | | |
| | | var validation = {}; |
| | | if (mapping) { |
| | | var mappingType = getInOutType(mapping); |
| | | |
| | | if (!values.target && mappingType !== 'variables') { |
| | | validation.target = translate('Mapping must have a target'); |
| | | } |
| | | |
| | | if (values.target |
| | | && WHITESPACE_REGEX.test(values.target) |
| | | && mappingType !== 'variables') { |
| | | validation.target = translate('Target must not contain whitespace'); |
| | | } |
| | | } |
| | | |
| | | return validation; |
| | | }, |
| | | hidden: function(element, node) { |
| | | var selectedMapping = getSelected(element, node); |
| | | return !selectedMapping || (selectedMapping && selectedMapping.variables); |
| | | } |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.checkbox({ |
| | | id: 'variableMapping-local', |
| | | label: translate('Local'), |
| | | modelProperty: 'local', |
| | | get: function(element, node) { |
| | | return { |
| | | local: (getSelected(element, node) || {}).local |
| | | }; |
| | | }, |
| | | set: function(element, values, node) { |
| | | values.local = values.local || false; |
| | | var mapping = getSelected(element, node); |
| | | return cmdHelper.updateBusinessObject(element, mapping, values); |
| | | }, |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../helper/CmdHelper'), |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | module.exports = function(group, element, translate) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && bo.get('processRef')) { |
| | | var versionTagEntry = entryFactory.textField({ |
| | | id: 'versionTag', |
| | | label: translate('Version Tag'), |
| | | modelProperty: 'versionTag' |
| | | }); |
| | | |
| | | // in participants we have to change the default behavior of set and get |
| | | if (is(element, 'bpmn:Participant')) { |
| | | versionTagEntry.get = function(element) { |
| | | var processBo = bo.get('processRef'); |
| | | |
| | | return { |
| | | versionTag: processBo.get('activiti:versionTag') |
| | | }; |
| | | }; |
| | | |
| | | versionTagEntry.set = function(element, values) { |
| | | var processBo = bo.get('processRef'); |
| | | |
| | | return cmdHelper.updateBusinessObject(element, processBo, { |
| | | 'activiti:versionTag': values.versionTag || undefined |
| | | }); |
| | | }; |
| | | } |
| | | |
| | | group.entries.push(versionTagEntry); |
| | | |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var asyncCapableHelper = require('../../../../helper/AsyncCapableHelper'), |
| | | eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | function isAsyncBefore(bo) { |
| | | return asyncCapableHelper.isAsyncBefore(bo); |
| | | } |
| | | |
| | | function isAsyncAfter(bo) { |
| | | return asyncCapableHelper.isAsyncAfter(bo); |
| | | } |
| | | |
| | | function isExclusive(bo) { |
| | | return asyncCapableHelper.isExclusive(bo); |
| | | } |
| | | |
| | | function removeFailedJobRetryTimeCycle(bo, element) { |
| | | return asyncCapableHelper.removeFailedJobRetryTimeCycle(bo, element); |
| | | } |
| | | |
| | | function canRemoveFailedJobRetryTimeCycle(element) { |
| | | return !eventDefinitionHelper.getTimerEventDefinition(element); |
| | | } |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var idPrefix = options.idPrefix || '', |
| | | labelPrefix = options.labelPrefix || ''; |
| | | |
| | | |
| | | var asyncBeforeEntry = entryFactory.checkbox({ |
| | | id: idPrefix + 'asyncBefore', |
| | | label: labelPrefix + translate('Asynchronous Before'), |
| | | modelProperty: 'asyncBefore', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { |
| | | asyncBefore: isAsyncBefore(bo) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | var asyncBefore = !!values.asyncBefore; |
| | | |
| | | var props = { |
| | | 'activiti:asyncBefore': asyncBefore, |
| | | 'activiti:async': false |
| | | }; |
| | | |
| | | var commands = []; |
| | | if (!isAsyncAfter(bo) && !asyncBefore) { |
| | | props = assign({ 'activiti:exclusive' : true }, props); |
| | | if (canRemoveFailedJobRetryTimeCycle(element)) { |
| | | commands.push(removeFailedJobRetryTimeCycle(bo, element)); |
| | | } |
| | | } |
| | | |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, props)); |
| | | return commands; |
| | | } |
| | | }); |
| | | |
| | | |
| | | var asyncAfterEntry = entryFactory.checkbox({ |
| | | id: idPrefix + 'asyncAfter', |
| | | label: labelPrefix + translate('Asynchronous After'), |
| | | modelProperty: 'asyncAfter', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { |
| | | asyncAfter: isAsyncAfter(bo) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | var asyncAfter = !!values.asyncAfter; |
| | | |
| | | var props = { |
| | | 'activiti:asyncAfter': asyncAfter |
| | | }; |
| | | |
| | | var commands = []; |
| | | if (!isAsyncBefore(bo) && !asyncAfter) { |
| | | props = assign({ 'activiti:exclusive' : true }, props); |
| | | if (canRemoveFailedJobRetryTimeCycle(element)) { |
| | | commands.push(removeFailedJobRetryTimeCycle(bo, element)); |
| | | } |
| | | } |
| | | |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, props)); |
| | | return commands; |
| | | } |
| | | }); |
| | | |
| | | |
| | | var exclusiveEntry = entryFactory.checkbox({ |
| | | id: idPrefix + 'exclusive', |
| | | label: labelPrefix + translate('Exclusive'), |
| | | modelProperty: 'exclusive', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { exclusive: isExclusive(bo) }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { 'activiti:exclusive': !!values.exclusive }); |
| | | }, |
| | | |
| | | hidden: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | return bo && !isAsyncAfter(bo) && !isAsyncBefore(bo); |
| | | } |
| | | }); |
| | | |
| | | return [ asyncBeforeEntry, asyncAfterEntry, exclusiveEntry ]; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'), |
| | | entryFactory = require('../../../../factory/EntryFactory'), |
| | | elementHelper = require('../../../../helper/ElementHelper'), |
| | | extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'); |
| | | |
| | | |
| | | var resultVariable = require('./ResultVariable'); |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var attributeInfo = { |
| | | bpmn: { |
| | | element: 'calledElement', |
| | | binding: 'activiti:calledElementBinding', |
| | | version: 'activiti:calledElementVersion', |
| | | versionTag: 'activiti:calledElementVersionTag', |
| | | tenantId: 'activiti:calledElementTenantId' |
| | | }, |
| | | |
| | | cmmn: { |
| | | element: 'activiti:caseRef', |
| | | binding: 'activiti:caseBinding', |
| | | version: 'activiti:caseVersion', |
| | | tenantId: 'activiti:caseTenantId' |
| | | }, |
| | | |
| | | dmn: { |
| | | element: 'activiti:decisionRef', |
| | | binding: 'activiti:decisionRefBinding', |
| | | version: 'activiti:decisionRefVersion', |
| | | versionTag: 'activiti:decisionRefVersionTag', |
| | | tenantId: 'activiti:decisionRefTenantId' |
| | | } |
| | | }; |
| | | |
| | | var mapDecisionResultOptions = [ |
| | | { |
| | | name: 'singleEntry (TypedValue)', |
| | | value: 'singleEntry' |
| | | }, |
| | | { |
| | | name:'singleResult (Map<String, Object>)', |
| | | value:'singleResult' |
| | | }, |
| | | { |
| | | name:'collectEntries (List<Object>)', |
| | | value:'collectEntries' |
| | | }, |
| | | { |
| | | name:'resultList (List<Map<String, Object>>)', |
| | | value:'resultList' |
| | | } |
| | | ]; |
| | | |
| | | var delegateVariableMappingOptions = [ |
| | | { |
| | | name: 'variableMappingClass', |
| | | value: 'variableMappingClass' |
| | | }, |
| | | { |
| | | name: 'variableMappingDelegateExpression', |
| | | value: 'variableMappingDelegateExpression' |
| | | } |
| | | ]; |
| | | |
| | | function getActivitiInWithBusinessKey(element) { |
| | | var activitiIn = [], |
| | | bo = getBusinessObject(element); |
| | | |
| | | var activitiInParams = extensionElementsHelper.getExtensionElements(bo, 'activiti:In'); |
| | | if (activitiInParams) { |
| | | forEach(activitiInParams, function(param) { |
| | | if (param.businessKey !== undefined) { |
| | | activitiIn.push(param); |
| | | } |
| | | }); |
| | | } |
| | | return activitiIn; |
| | | } |
| | | |
| | | function setBusinessKey(element, text, bpmnFactory) { |
| | | var commands = []; |
| | | |
| | | var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element); |
| | | |
| | | if (activitiInWithBusinessKey.length) { |
| | | commands.push(cmdHelper.updateBusinessObject(element, activitiInWithBusinessKey[0], { |
| | | businessKey: text |
| | | })); |
| | | } else { |
| | | var bo = getBusinessObject(element), |
| | | extensionElements = bo.extensionElements; |
| | | |
| | | if (!extensionElements) { |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); |
| | | commands.push(cmdHelper.updateProperties(element, { extensionElements: extensionElements })); |
| | | } |
| | | |
| | | var activitiIn = elementHelper.createElement( |
| | | 'activiti:In', |
| | | { 'businessKey': text }, |
| | | extensionElements, |
| | | bpmnFactory |
| | | ); |
| | | |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | 'extensionElements', |
| | | [ activitiIn ],[] |
| | | )); |
| | | } |
| | | |
| | | return commands; |
| | | } |
| | | |
| | | function deleteBusinessKey(element) { |
| | | var activitiInExtensions = getActivitiInWithBusinessKey(element); |
| | | var commands = []; |
| | | forEach(activitiInExtensions, function(elem) { |
| | | commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, elem)); |
| | | }); |
| | | return commands; |
| | | } |
| | | |
| | | function isSupportedCallableType(type) { |
| | | return [ 'bpmn', 'cmmn', 'dmn' ].indexOf(type) !== -1; |
| | | } |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var bindingOptions = [ |
| | | { |
| | | name: translate('latest'), |
| | | value: 'latest' |
| | | }, |
| | | { |
| | | name: translate('deployment'), |
| | | value: 'deployment' |
| | | }, |
| | | { |
| | | name: translate('version'), |
| | | value: 'version' |
| | | }, |
| | | { |
| | | name: translate('versionTag'), |
| | | value: 'versionTag' |
| | | } |
| | | ]; |
| | | |
| | | var getCallableType = options.getCallableType; |
| | | |
| | | var entries = []; |
| | | |
| | | function getAttribute(element, prop) { |
| | | var type = getCallableType(element); |
| | | return (attributeInfo[type] || {})[prop]; |
| | | } |
| | | |
| | | function getCallActivityBindingValue(element) { |
| | | var type = getCallableType(element); |
| | | var bo = getBusinessObject(element); |
| | | var attr = (attributeInfo[type] || {}).binding; |
| | | return bo.get(attr); |
| | | } |
| | | |
| | | function getDelegateVariableMappingType(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var boVariableMappingClass = bo.get('activiti:variableMappingClass'), |
| | | boVariableMappingDelegateExpression = bo.get('activiti:variableMappingDelegateExpression'); |
| | | |
| | | var delegateVariableMappingType = ''; |
| | | if (typeof boVariableMappingClass !== 'undefined') { |
| | | delegateVariableMappingType = 'variableMappingClass'; |
| | | } else |
| | | |
| | | if (typeof boVariableMappingDelegateExpression !== 'undefined') { |
| | | delegateVariableMappingType = 'variableMappingDelegateExpression'; |
| | | } |
| | | |
| | | return delegateVariableMappingType; |
| | | } |
| | | |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'callable-element-ref', |
| | | dataValueLabel: 'callableElementLabel', |
| | | modelProperty: 'callableElementRef', |
| | | |
| | | get: function(element, node) { |
| | | var callableElementRef; |
| | | |
| | | var attr = getAttribute(element, 'element'); |
| | | if (attr) { |
| | | var bo = getBusinessObject(element); |
| | | callableElementRef = bo.get(attr); |
| | | } |
| | | |
| | | var label = ''; |
| | | var type = getCallableType(element); |
| | | if (type === 'bpmn') { |
| | | label = translate('Called Element'); |
| | | } |
| | | else if (type === 'cmmn') { |
| | | label = translate('Case Ref'); |
| | | } |
| | | else if (type === 'dmn') { |
| | | label = translate('Decision Ref'); |
| | | } |
| | | |
| | | return { |
| | | callableElementRef: callableElementRef, |
| | | callableElementLabel: label |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var newCallableElementRef = values.callableElementRef; |
| | | var attr = getAttribute(element, 'element'); |
| | | |
| | | var props = {}; |
| | | props[attr] = newCallableElementRef || ''; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var elementRef = values.callableElementRef; |
| | | var type = getCallableType(element); |
| | | return isSupportedCallableType(type) && !elementRef ? { callableElementRef: translate('Must provide a value') } : {}; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSupportedCallableType(getCallableType(element)); |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id: 'callable-binding', |
| | | label: translate('Binding'), |
| | | selectOptions: function(element) { |
| | | var type = getCallableType(element); |
| | | var options; |
| | | |
| | | if (type === 'cmmn') { |
| | | options = bindingOptions.filter(function(bindingOption) { |
| | | return bindingOption.value !== 'versionTag'; |
| | | }); |
| | | } else { |
| | | options = bindingOptions; |
| | | } |
| | | return options; |
| | | }, |
| | | modelProperty: 'callableBinding', |
| | | |
| | | get: function(element, node) { |
| | | var callableBinding; |
| | | |
| | | var attr = getAttribute(element, 'binding'); |
| | | if (attr) { |
| | | var bo = getBusinessObject(element); |
| | | callableBinding = bo.get(attr) || 'latest'; |
| | | } |
| | | |
| | | return { |
| | | callableBinding: callableBinding |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var binding = values.callableBinding; |
| | | var attr = getAttribute(element, 'binding'), |
| | | attrVer = getAttribute(element, 'version'), |
| | | attrVerTag = getAttribute(element, 'versionTag'); |
| | | |
| | | var props = {}; |
| | | props[attr] = binding; |
| | | |
| | | // set version and versionTag values always to undefined to delete the existing value |
| | | props[attrVer] = undefined; |
| | | props[attrVerTag] = undefined; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSupportedCallableType(getCallableType(element)); |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'callable-version', |
| | | label: translate('Version'), |
| | | modelProperty: 'callableVersion', |
| | | |
| | | get: function(element, node) { |
| | | var callableVersion; |
| | | |
| | | var attr = getAttribute(element, 'version'); |
| | | if (attr) { |
| | | var bo = getBusinessObject(element); |
| | | callableVersion = bo.get(attr); |
| | | } |
| | | |
| | | return { |
| | | callableVersion: callableVersion |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var version = values.callableVersion; |
| | | var attr = getAttribute(element, 'version'); |
| | | |
| | | var props = {}; |
| | | props[attr] = version || undefined; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var version = values.callableVersion; |
| | | |
| | | var type = getCallableType(element); |
| | | return ( |
| | | isSupportedCallableType(type) && |
| | | getCallActivityBindingValue(element) === 'version' && ( |
| | | !version ? { callableVersion: translate('Must provide a value') } : {} |
| | | ) |
| | | ); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | var type = getCallableType(element); |
| | | return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'version'; |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'callable-version-tag', |
| | | label: translate('Version Tag'), |
| | | modelProperty: 'versionTag', |
| | | |
| | | get: function(element, node) { |
| | | var versionTag; |
| | | |
| | | var attr = getAttribute(element, 'versionTag'); |
| | | |
| | | if (attr) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | versionTag = bo.get(attr); |
| | | } |
| | | |
| | | return { |
| | | versionTag: versionTag |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var versionTag = values.versionTag; |
| | | |
| | | var attr = getAttribute(element, 'versionTag'); |
| | | |
| | | var props = {}; |
| | | |
| | | props[attr] = versionTag || undefined; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var versionTag = values.versionTag; |
| | | |
| | | var type = getCallableType(element); |
| | | |
| | | return ( |
| | | isSupportedCallableType(type) && |
| | | getCallActivityBindingValue(element) === 'versionTag' && ( |
| | | !versionTag ? { versionTag: translate('Must provide a value') } : {} |
| | | ) |
| | | ); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | var type = getCallableType(element); |
| | | |
| | | return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'versionTag'; |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'tenant-id', |
| | | label: translate('Tenant Id'), |
| | | modelProperty: 'tenantId', |
| | | |
| | | get: function(element, node) { |
| | | var tenantId; |
| | | |
| | | var attr = getAttribute(element, 'tenantId'); |
| | | if (attr) { |
| | | var bo = getBusinessObject(element); |
| | | tenantId = bo.get(attr); |
| | | } |
| | | |
| | | return { |
| | | tenantId: tenantId |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var tenantId = values.tenantId; |
| | | var attr = getAttribute(element, 'tenantId'); |
| | | |
| | | var props = {}; |
| | | props[attr] = tenantId || undefined; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | var type = getCallableType(element); |
| | | return !isSupportedCallableType(type); |
| | | } |
| | | |
| | | })); |
| | | |
| | | if (is(getBusinessObject(element), 'bpmn:CallActivity')) { |
| | | entries.push(entryFactory.checkbox({ |
| | | id: 'callable-business-key', |
| | | label: translate('Business Key'), |
| | | modelProperty: 'callableBusinessKey', |
| | | |
| | | get: function(element, node) { |
| | | var activitiIn = getActivitiInWithBusinessKey(element); |
| | | |
| | | return { |
| | | callableBusinessKey: !!(activitiIn && activitiIn.length > 0) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | if (values.callableBusinessKey) { |
| | | return setBusinessKey(element, '#{execution.processBusinessKey}', bpmnFactory); |
| | | } else { |
| | | return deleteBusinessKey(element); |
| | | } |
| | | } |
| | | })); |
| | | } |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'business-key-expression', |
| | | label: translate('Business Key Expression'), |
| | | modelProperty: 'businessKey', |
| | | |
| | | get: function(element, node) { |
| | | var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element); |
| | | |
| | | return { |
| | | businessKey: ( |
| | | activitiInWithBusinessKey.length ? |
| | | activitiInWithBusinessKey[0].get('activiti:businessKey') : |
| | | undefined |
| | | ) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var businessKey = values.businessKey; |
| | | |
| | | return setBusinessKey(element, businessKey, bpmnFactory); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var businessKey = values.businessKey; |
| | | |
| | | return businessKey === '' ? { businessKey: translate('Must provide a value') } : {}; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !getActivitiInWithBusinessKey(element).length; |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries = entries.concat(resultVariable(element, bpmnFactory, { |
| | | id: 'dmn-resultVariable', |
| | | getBusinessObject: getBusinessObject, |
| | | getImplementationType: getCallableType, |
| | | hideResultVariable: function(element, node) { |
| | | return getCallableType(element) !== 'dmn'; |
| | | } |
| | | }, translate)); |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id: 'dmn-map-decision-result', |
| | | label: translate('Map Decision Result'), |
| | | selectOptions: mapDecisionResultOptions, |
| | | modelProperty: 'mapDecisionResult', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { |
| | | mapDecisionResult: bo.get('activiti:mapDecisionResult') || 'resultList' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | return cmdHelper.updateProperties(element, { |
| | | 'activiti:mapDecisionResult': values.mapDecisionResult || 'resultList' |
| | | }); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var resultVariable = bo.get('activiti:resultVariable'); |
| | | return !(getCallableType(element) === 'dmn' && typeof resultVariable !== 'undefined'); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id: 'delegateVariableMappingType', |
| | | label: translate('Delegate Variable Mapping'), |
| | | selectOptions: delegateVariableMappingOptions, |
| | | emptyParameter: true, |
| | | modelProperty: 'delegateVariableMappingType', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | delegateVariableMappingType : getDelegateVariableMappingType(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var delegateVariableMappingType = values.delegateVariableMappingType; |
| | | |
| | | var props = { |
| | | 'activiti:variableMappingClass' : undefined, |
| | | 'activiti:variableMappingDelegateExpression' : undefined |
| | | }; |
| | | |
| | | if (delegateVariableMappingType === 'variableMappingClass') { |
| | | props['activiti:variableMappingClass'] = ''; |
| | | } |
| | | else if (delegateVariableMappingType === 'variableMappingDelegateExpression') { |
| | | props['activiti:variableMappingDelegateExpression'] = ''; |
| | | } |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return (getCallableType(element) !== 'bpmn'); |
| | | } |
| | | |
| | | })); |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'delegateVariableMapping', |
| | | dataValueLabel: 'delegateVariableMappingLabel', |
| | | modelProperty: 'delegateVariableMapping', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var label = ''; |
| | | var delegateVariableMapping = undefined; |
| | | var type = getDelegateVariableMappingType(element); |
| | | |
| | | if (type === 'variableMappingClass') { |
| | | label = translate('Class'); |
| | | delegateVariableMapping = bo.get('activiti:variableMappingClass'); |
| | | } |
| | | else if (type === 'variableMappingDelegateExpression') { |
| | | label = translate('Delegate Expression'); |
| | | delegateVariableMapping = bo.get('activiti:variableMappingDelegateExpression'); |
| | | } |
| | | |
| | | return { |
| | | delegateVariableMapping: delegateVariableMapping, |
| | | delegateVariableMappingLabel: label |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var delegateVariableMapping = values.delegateVariableMapping; |
| | | |
| | | var attr = 'activiti:' + getDelegateVariableMappingType(element); |
| | | |
| | | var props = {}; |
| | | props[attr] = delegateVariableMapping || undefined; |
| | | |
| | | return cmdHelper.updateProperties(element, props); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var delegateVariableMapping = values.delegateVariableMapping; |
| | | return ( |
| | | getCallableType(element) === 'bpmn' && ( |
| | | !delegateVariableMapping ? { delegateVariableMapping: translate('Must provide a value') } : {} |
| | | ) |
| | | ); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !(getCallableType(element) === 'bpmn' && getDelegateVariableMappingType(element) !== ''); |
| | | } |
| | | |
| | | })); |
| | | |
| | | return entries; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var candidateStarterGroupsEntry = entryFactory.textField({ |
| | | id: 'candidateStarterGroups', |
| | | label: translate('Candidate Starter Groups'), |
| | | modelProperty: 'candidateStarterGroups', |
| | | description: translate('Specify more than one group as a comma separated list.'), |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var candidateStarterGroups = bo.get('activiti:candidateStarterGroups'); |
| | | |
| | | return { |
| | | candidateStarterGroups: candidateStarterGroups ? candidateStarterGroups : '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:candidateStarterGroups': values.candidateStarterGroups || undefined |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | var candidateStarterUsersEntry = entryFactory.textField({ |
| | | id: 'candidateStarterUsers', |
| | | label: translate('Candidate Starter Users'), |
| | | modelProperty: 'candidateStarterUsers', |
| | | description: translate('Specify more than one user as a comma separated list.'), |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var candidateStarterUsers = bo.get('activiti:candidateStarterUsers'); |
| | | |
| | | return { |
| | | candidateStarterUsers: candidateStarterUsers ? candidateStarterUsers : '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:candidateStarterUsers': values.candidateStarterUsers || undefined |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ |
| | | candidateStarterGroupsEntry, |
| | | candidateStarterUsersEntry |
| | | ]; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var DELEGATE_TYPES = [ |
| | | 'class', |
| | | 'expression', |
| | | 'delegateExpression' |
| | | ]; |
| | | |
| | | var PROPERTIES = { |
| | | class: 'activiti:class', |
| | | expression: 'activiti:expression', |
| | | delegateExpression: 'activiti:delegateExpression' |
| | | }; |
| | | |
| | | function isDelegate(type) { |
| | | return DELEGATE_TYPES.indexOf(type) !== -1; |
| | | } |
| | | |
| | | function getAttribute(type) { |
| | | return PROPERTIES[type]; |
| | | } |
| | | |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getImplementationType = options.getImplementationType, |
| | | getBusinessObject = options.getBusinessObject; |
| | | |
| | | function getDelegationLabel(type) { |
| | | switch (type) { |
| | | case 'class': |
| | | return translate('Java Class'); |
| | | case 'expression': |
| | | return translate('Expression'); |
| | | case 'delegateExpression': |
| | | return translate('Delegate Expression'); |
| | | default: |
| | | return ''; |
| | | } |
| | | } |
| | | |
| | | var delegateEntry = entryFactory.textField({ |
| | | id: 'delegate', |
| | | label: translate('Value'), |
| | | dataValueLabel: 'delegationLabel', |
| | | modelProperty: 'delegate', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var type = getImplementationType(element); |
| | | var attr = getAttribute(type); |
| | | var label = getDelegationLabel(type); |
| | | return { |
| | | delegate: bo.get(attr), |
| | | delegationLabel: label |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element); |
| | | var type = getImplementationType(element); |
| | | var attr = getAttribute(type); |
| | | var prop = {}; |
| | | prop[attr] = values.delegate || ''; |
| | | return cmdHelper.updateBusinessObject(element, bo, prop); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | return isDelegate(getImplementationType(element)) && !values.delegate ? { delegate: translate('Must provide a value') } : {}; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isDelegate(getImplementationType(element)); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ delegateEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | elementReferenceProperty = require('../../../../provider/bpmn/parts/implementation/ElementReferenceProperty'); |
| | | |
| | | module.exports = function( |
| | | group, element, bpmnFactory, errorEventDefinition, |
| | | showErrorCodeVariable, showErrorMessageVariable, translate |
| | | ) { |
| | | |
| | | |
| | | var getValue = function(modelProperty) { |
| | | return function(element) { |
| | | var modelPropertyValue = errorEventDefinition.get('activiti:' + modelProperty); |
| | | var value = {}; |
| | | |
| | | value[modelProperty] = modelPropertyValue; |
| | | return value; |
| | | }; |
| | | }; |
| | | |
| | | var setValue = function(modelProperty) { |
| | | return function(element, values) { |
| | | var props = {}; |
| | | |
| | | props['activiti:' + modelProperty] = values[modelProperty] || undefined; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, errorEventDefinition, props); |
| | | }; |
| | | }; |
| | | |
| | | |
| | | group.entries = group.entries.concat( |
| | | elementReferenceProperty(element, errorEventDefinition, bpmnFactory, { |
| | | id: 'error-element-message', |
| | | label: translate('Error Message'), |
| | | referenceProperty: 'errorRef', |
| | | modelProperty: 'errorMessage' |
| | | }) |
| | | ); |
| | | |
| | | if (showErrorCodeVariable) { |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'errorCodeVariable', |
| | | label: translate('Error Code Variable'), |
| | | modelProperty : 'errorCodeVariable', |
| | | |
| | | get: getValue('errorCodeVariable'), |
| | | set: setValue('errorCodeVariable') |
| | | })); |
| | | } |
| | | |
| | | if (showErrorMessageVariable) { |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'errorMessageVariable', |
| | | label: translate('Error Message Variable'), |
| | | modelProperty: 'errorMessageVariable', |
| | | |
| | | get: getValue('errorMessageVariable'), |
| | | set: setValue('errorMessageVariable') |
| | | })); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domClosest = require('min-dom').closest, |
| | | domify = require('min-dom').domify, |
| | | forEach = require('lodash/forEach'); |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | utils = require('../../../../Utils'), |
| | | escapeHTML = utils.escapeHTML; |
| | | |
| | | function getSelectBox(node, id) { |
| | | var currentTab = domClosest(node, 'div.bpp-properties-tab'); |
| | | var query = 'select[name=selectedExtensionElement]' + (id ? '[id=cam-extensionElements-' + id + ']' : ''); |
| | | return domQuery(query, currentTab); |
| | | } |
| | | |
| | | function getSelected(node, id) { |
| | | var selectBox = getSelectBox(node, id); |
| | | return { |
| | | value: (selectBox || {}).value, |
| | | idx: (selectBox || {}).selectedIndex |
| | | }; |
| | | } |
| | | |
| | | function generateElementId(prefix) { |
| | | prefix = prefix + '_'; |
| | | return utils.nextId(prefix); |
| | | } |
| | | |
| | | var CREATE_EXTENSION_ELEMENT_ACTION = 'create-extension-element', |
| | | REMOVE_EXTENSION_ELEMENT_ACTION = 'remove-extension-element'; |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var id = options.id, |
| | | prefix = options.prefix || 'elem', |
| | | label = options.label || id, |
| | | idGeneration = (options.idGeneration === false) ? options.idGeneration : true, |
| | | businessObject = options.businessObject || getBusinessObject(element); |
| | | |
| | | var modelProperty = options.modelProperty || 'id'; |
| | | |
| | | var getElements = options.getExtensionElements; |
| | | |
| | | var createElement = options.createExtensionElement, |
| | | canCreate = typeof createElement === 'function'; |
| | | |
| | | var removeElement = options.removeExtensionElement, |
| | | canRemove = typeof removeElement === 'function'; |
| | | |
| | | var onSelectionChange = options.onSelectionChange; |
| | | |
| | | var hideElements = options.hideExtensionElements, |
| | | canBeHidden = typeof hideElements === 'function'; |
| | | |
| | | var setOptionLabelValue = options.setOptionLabelValue; |
| | | |
| | | var defaultSize = options.size || 5, |
| | | resizable = options.resizable; |
| | | |
| | | var reference = options.reference || undefined; |
| | | |
| | | var selectionChanged = function(element, node, event, scope) { |
| | | if (typeof onSelectionChange === 'function') { |
| | | return onSelectionChange(element, node, event, scope); |
| | | } |
| | | }; |
| | | |
| | | var createOption = function(value) { |
| | | return '<option value="' + escapeHTML(value) + '" data-value data-name="extensionElementValue">' + escapeHTML(value) + '</option>'; |
| | | }; |
| | | |
| | | var initSelectionSize = function(selectBox, optionsLength) { |
| | | if (resizable) { |
| | | selectBox.size = optionsLength > defaultSize ? optionsLength : defaultSize; |
| | | } |
| | | }; |
| | | |
| | | return { |
| | | id: id, |
| | | html: '<div class="bpp-row bpp-element-list" ' + |
| | | (canBeHidden ? 'data-show="hideElements"' : '') + '>' + |
| | | '<label for="cam-extensionElements-' + escapeHTML(id) + '">' + escapeHTML(label) + '</label>' + |
| | | '<div class="bpp-field-wrapper">' + |
| | | '<select id="cam-extensionElements-' + escapeHTML(id) + '"' + |
| | | 'name="selectedExtensionElement" ' + |
| | | 'size="' + escapeHTML(defaultSize) + '" ' + |
| | | 'data-list-entry-container ' + |
| | | 'data-on-change="selectElement">' + |
| | | '</select>' + |
| | | (canCreate ? '<button class="add" ' + |
| | | 'id="cam-extensionElements-create-' + escapeHTML(id) + '" ' + |
| | | 'data-action="createElement">' + |
| | | '<span>+</span>' + |
| | | '</button>' : '') + |
| | | (canRemove ? '<button class="clear" ' + |
| | | 'id="cam-extensionElements-remove-' + escapeHTML(id) + '" ' + |
| | | 'data-action="removeElement" ' + |
| | | 'data-disable="disableRemove">' + |
| | | '<span>-</span>' + |
| | | '</button>' : '') + |
| | | '</div>' + |
| | | '</div>', |
| | | |
| | | get: function(element, node) { |
| | | var elements = getElements(element, node); |
| | | |
| | | var result = []; |
| | | forEach(elements, function(elem) { |
| | | result.push({ |
| | | extensionElementValue: elem.get(modelProperty) |
| | | }); |
| | | }); |
| | | |
| | | var selectBox = getSelectBox(node.parentNode, id); |
| | | initSelectionSize(selectBox, result.length); |
| | | |
| | | return result; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var action = this.__action; |
| | | delete this.__action; |
| | | |
| | | businessObject = businessObject || getBusinessObject(element); |
| | | |
| | | var bo = |
| | | (reference && businessObject.get(reference)) |
| | | ? businessObject.get(reference) |
| | | : businessObject; |
| | | |
| | | var extensionElements = bo.get('extensionElements'); |
| | | |
| | | if (action.id === CREATE_EXTENSION_ELEMENT_ACTION) { |
| | | var commands = []; |
| | | if (!extensionElements) { |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements })); |
| | | } |
| | | commands.push(createElement(element, extensionElements, action.value, node)); |
| | | return commands; |
| | | |
| | | } |
| | | else if (action.id === REMOVE_EXTENSION_ELEMENT_ACTION) { |
| | | return removeElement(element, extensionElements, action.value, action.idx, node); |
| | | } |
| | | |
| | | }, |
| | | |
| | | createListEntryTemplate: function(value, index, selectBox) { |
| | | initSelectionSize(selectBox, selectBox.options.length + 1); |
| | | return createOption(value.extensionElementValue); |
| | | }, |
| | | |
| | | deselect: function(element, node) { |
| | | var selectBox = getSelectBox(node, id); |
| | | selectBox.selectedIndex = -1; |
| | | }, |
| | | |
| | | getSelected: function(element, node) { |
| | | return getSelected(node, id); |
| | | }, |
| | | |
| | | setControlValue: function(element, node, option, property, value, idx) { |
| | | node.value = value; |
| | | |
| | | if (!setOptionLabelValue) { |
| | | node.text = value; |
| | | } else { |
| | | setOptionLabelValue(element, node, option, property, value, idx); |
| | | } |
| | | }, |
| | | |
| | | createElement: function(element, node) { |
| | | // create option template |
| | | var generatedId; |
| | | if (idGeneration) { |
| | | generatedId = generateElementId(prefix); |
| | | } |
| | | |
| | | var selectBox = getSelectBox(node, id); |
| | | var template = domify(createOption(generatedId)); |
| | | |
| | | // add new empty option as last child element |
| | | selectBox.appendChild(template); |
| | | |
| | | // select last child element |
| | | selectBox.lastChild.selected = 'selected'; |
| | | selectionChanged(element, node); |
| | | |
| | | // update select box size |
| | | initSelectionSize(selectBox, selectBox.options.length); |
| | | |
| | | this.__action = { |
| | | id: CREATE_EXTENSION_ELEMENT_ACTION, |
| | | value: generatedId |
| | | }; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | removeElement: function(element, node) { |
| | | var selection = getSelected(node, id); |
| | | |
| | | var selectBox = getSelectBox(node, id); |
| | | selectBox.removeChild(selectBox.options[selection.idx]); |
| | | |
| | | // update select box size |
| | | initSelectionSize(selectBox, selectBox.options.length); |
| | | |
| | | this.__action = { |
| | | id: REMOVE_EXTENSION_ELEMENT_ACTION, |
| | | value: selection.value, |
| | | idx: selection.idx |
| | | }; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | hideElements: function(element, entryNode, node, scopeNode) { |
| | | return !hideElements(element, entryNode, node, scopeNode); |
| | | }, |
| | | |
| | | disableRemove: function(element, entryNode, node, scopeNode) { |
| | | return (getSelected(entryNode, id) || {}).idx < 0; |
| | | }, |
| | | |
| | | selectElement: selectionChanged |
| | | }; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getImplementationType = options.getImplementationType, |
| | | getBusinessObject = options.getBusinessObject; |
| | | |
| | | function isExternal(element) { |
| | | return getImplementationType(element) === 'external'; |
| | | } |
| | | |
| | | var topicEntry = entryFactory.textField({ |
| | | id: 'externalTopic', |
| | | label: translate('Topic'), |
| | | modelProperty: 'externalTopic', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { externalTopic: bo.get('activiti:topic') }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:topic': values.externalTopic |
| | | }); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | return isExternal(element) && !values.externalTopic ? { externalTopic: translate('Must provide a value') } : {}; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isExternal(element); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ topicEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var externalTaskPriorityEntry = entryFactory.textField({ |
| | | id: 'externalTaskPriority', |
| | | label: translate('Task Priority'), |
| | | modelProperty: 'taskPriority', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { |
| | | taskPriority: bo.get('activiti:taskPriority') |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:taskPriority': values.taskPriority || undefined |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ externalTaskPriorityEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), |
| | | elementHelper = require('../../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var utils = require('../../../../Utils'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var extensionElementsEntry = require('./ExtensionElements'); |
| | | |
| | | var ModelUtil = require('bpmn-js/lib/util/ModelUtil'), |
| | | getBusinessObject = ModelUtil.getBusinessObject; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | |
| | | var DEFAULT_PROPS = { |
| | | 'stringValue': undefined, |
| | | 'string': undefined, |
| | | 'expression': undefined |
| | | }; |
| | | |
| | | var ACTIVITI_FIELD_EXTENSION_ELEMENT = 'activiti:Field'; |
| | | |
| | | module.exports = function(element, bpmnFactory, translate, options) { |
| | | |
| | | options = options || {}; |
| | | |
| | | var insideListener = !!options.insideListener, |
| | | idPrefix = options.idPrefix || '', |
| | | getSelectedListener = options.getSelectedListener, |
| | | businessObject = options.businessObject || getBusinessObject(element); |
| | | |
| | | var entries = []; |
| | | |
| | | var isSelected = function(element, node) { |
| | | return getSelectedField(element, node); |
| | | }; |
| | | |
| | | function getSelectedField(element, node) { |
| | | var selected = fieldEntry.getSelected(element, node.parentNode); |
| | | |
| | | if (selected.idx === -1) { |
| | | return; |
| | | } |
| | | |
| | | var fields = getActivitiFields(element, node); |
| | | |
| | | return fields[selected.idx]; |
| | | } |
| | | |
| | | function getActivitiFields(element, node) { |
| | | if (!insideListener) { |
| | | return ( |
| | | businessObject && |
| | | extensionElementsHelper.getExtensionElements(businessObject, ACTIVITI_FIELD_EXTENSION_ELEMENT) |
| | | ) || []; |
| | | } |
| | | return getActivitiListenerFields(element, node); |
| | | } |
| | | |
| | | function getActivitiListenerFields(element, node) { |
| | | var selectedListener = getSelectedListener(element, node); |
| | | return selectedListener && selectedListener.fields || []; |
| | | } |
| | | |
| | | function getFieldType(bo) { |
| | | var fieldType = 'string'; |
| | | |
| | | var expressionValue = bo && bo.expression; |
| | | var stringValue = bo && (bo.string || bo.stringValue); |
| | | |
| | | if (typeof stringValue !== 'undefined') { |
| | | fieldType = 'string'; |
| | | } else if (typeof expressionValue !== 'undefined') { |
| | | fieldType = 'expression'; |
| | | } |
| | | |
| | | return fieldType; |
| | | } |
| | | |
| | | var setOptionLabelValue = function() { |
| | | return function(element, node, option, property, value, idx) { |
| | | var activitiFields = getActivitiFields(element, node); |
| | | var field = activitiFields[idx]; |
| | | |
| | | value = (field.name) ? field.name : '<empty>'; |
| | | |
| | | var label = idx + ' : ' + value; |
| | | |
| | | option.text = label; |
| | | }; |
| | | }; |
| | | |
| | | var newElement = function() { |
| | | return function(element, extensionElements, value, node) { |
| | | |
| | | var props = { |
| | | name: '', |
| | | string: '' |
| | | }; |
| | | |
| | | var newFieldElem; |
| | | |
| | | if (!insideListener) { |
| | | |
| | | newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, extensionElements, bpmnFactory); |
| | | return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newFieldElem ]); |
| | | |
| | | } else { |
| | | |
| | | var selectedListener = getSelectedListener(element, node); |
| | | newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, selectedListener, bpmnFactory); |
| | | return cmdHelper.addElementsTolist(element, selectedListener, 'fields', [ newFieldElem ]); |
| | | |
| | | } |
| | | |
| | | }; |
| | | }; |
| | | |
| | | var removeElement = function() { |
| | | return function(element, extensionElements, value, idx, node) { |
| | | var activitiFields= getActivitiFields(element, node); |
| | | var field = activitiFields[idx]; |
| | | if (field) { |
| | | if (!insideListener) { |
| | | return extensionElementsHelper.removeEntry(businessObject, element, field); |
| | | } |
| | | var selectedListener = getSelectedListener(element, node); |
| | | return cmdHelper.removeElementsFromList(element, selectedListener, 'fields', null, [ field ]); |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | |
| | | var fieldEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id : idPrefix + 'fields', |
| | | label : translate('Fields'), |
| | | modelProperty: 'fieldName', |
| | | idGeneration: 'false', |
| | | |
| | | businessObject: businessObject, |
| | | |
| | | createExtensionElement: newElement(), |
| | | removeExtensionElement: removeElement(), |
| | | |
| | | getExtensionElements: function(element, node) { |
| | | return getActivitiFields(element, node); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue() |
| | | |
| | | }); |
| | | entries.push(fieldEntry); |
| | | |
| | | |
| | | entries.push(entryFactory.validationAwareTextField({ |
| | | id: idPrefix + 'field-name', |
| | | label: translate('Name'), |
| | | modelProperty: 'fieldName', |
| | | |
| | | getProperty: function(element, node) { |
| | | return (getSelectedField(element, node) || {}).name; |
| | | }, |
| | | |
| | | setProperty: function(element, values, node) { |
| | | var selectedField = getSelectedField(element, node); |
| | | return cmdHelper.updateBusinessObject(element, selectedField, { name : values.fieldName }); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var bo = getSelectedField(element, node); |
| | | |
| | | var validation = {}; |
| | | if (bo) { |
| | | var nameValue = values.fieldName; |
| | | |
| | | if (nameValue) { |
| | | if (utils.containsSpace(nameValue)) { |
| | | validation.fieldName = translate('Name must not contain spaces'); |
| | | } |
| | | } else { |
| | | validation.fieldName = translate('Parameter must have a name'); |
| | | } |
| | | } |
| | | |
| | | return validation; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | var fieldTypeOptions = [ |
| | | { |
| | | name: translate('String'), |
| | | value: 'string' |
| | | }, |
| | | { |
| | | name: translate('Expression'), |
| | | value: 'expression' |
| | | } |
| | | ]; |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id: idPrefix + 'field-type', |
| | | label: translate('Type'), |
| | | selectOptions: fieldTypeOptions, |
| | | modelProperty: 'fieldType', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getSelectedField(element, node); |
| | | |
| | | var fieldType = getFieldType(bo); |
| | | |
| | | return { |
| | | fieldType: fieldType |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var props = assign({}, DEFAULT_PROPS); |
| | | |
| | | var fieldType = values.fieldType; |
| | | |
| | | if (fieldType === 'string') { |
| | | props.string = ''; |
| | | } |
| | | else if (fieldType === 'expression') { |
| | | props.expression = ''; |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, getSelectedField(element, node), props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | entries.push(entryFactory.textBox({ |
| | | id: idPrefix + 'field-value', |
| | | label: translate('Value'), |
| | | modelProperty: 'fieldValue', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getSelectedField(element, node); |
| | | var fieldType = getFieldType(bo); |
| | | |
| | | var fieldValue; |
| | | |
| | | if (fieldType === 'string') { |
| | | fieldValue = bo && (bo.string || bo.stringValue); |
| | | } |
| | | else if (fieldType === 'expression') { |
| | | fieldValue = bo && bo.expression; |
| | | } |
| | | |
| | | return { |
| | | fieldValue: fieldValue |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getSelectedField(element, node); |
| | | var fieldType = getFieldType(bo); |
| | | |
| | | var props = assign({}, DEFAULT_PROPS); |
| | | |
| | | var fieldValue = values.fieldValue || undefined; |
| | | |
| | | if (fieldType === 'string') { |
| | | props.string = fieldValue; |
| | | } |
| | | else if (fieldType === 'expression') { |
| | | props.expression = fieldValue; |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, bo, props); |
| | | |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var bo = getSelectedField(element, node); |
| | | |
| | | var validation = {}; |
| | | if (bo) { |
| | | if (!values.fieldValue) { |
| | | validation.fieldValue = translate('Must provide a value'); |
| | | } |
| | | } |
| | | |
| | | return validation; |
| | | }, |
| | | |
| | | show: function(element, node) { |
| | | return isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | return entries; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var historyTimeToLiveEntry = entryFactory.textField({ |
| | | id: 'historyTimeToLive', |
| | | label: translate('History Time To Live'), |
| | | modelProperty: 'historyTimeToLive', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var historyTimeToLive = bo.get('activiti:historyTimeToLive'); |
| | | |
| | | return { |
| | | historyTimeToLive: historyTimeToLive ? historyTimeToLive : '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:historyTimeToLive': values.historyTimeToLive || undefined |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ historyTimeToLiveEntry ]; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), |
| | | elementHelper = require('../../../../helper/ElementHelper'); |
| | | |
| | | var assign = require('lodash/assign'); |
| | | var map = require('lodash/map'); |
| | | |
| | | var DEFAULT_DELEGATE_PROPS = [ 'class', 'expression', 'delegateExpression' ]; |
| | | |
| | | var DELEGATE_PROPS = { |
| | | 'activiti:class': undefined, |
| | | 'activiti:expression': undefined, |
| | | 'activiti:delegateExpression': undefined, |
| | | 'activiti:resultVariable': undefined |
| | | }; |
| | | |
| | | var DMN_CAPABLE_PROPS = { |
| | | 'activiti:decisionRef': undefined, |
| | | 'activiti:decisionRefBinding': 'latest', |
| | | 'activiti:decisionRefVersion': undefined, |
| | | 'activiti:mapDecisionResult': 'resultList', |
| | | 'activiti:decisionRefTenantId': undefined |
| | | }; |
| | | |
| | | |
| | | var EXTERNAL_CAPABLE_PROPS = { |
| | | 'activiti:type': undefined, |
| | | 'activiti:topic': undefined |
| | | }; |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var DEFAULT_OPTIONS = [ |
| | | { value: 'class', name: translate('Java Class') }, |
| | | { value: 'expression', name: translate('Expression') }, |
| | | { value: 'delegateExpression', name: translate('Delegate Expression') } |
| | | ]; |
| | | |
| | | var DMN_OPTION = [ |
| | | { value: 'dmn', name: translate('DMN') } |
| | | ]; |
| | | |
| | | var EXTERNAL_OPTION = [ |
| | | { value: 'external', name: translate('External') } |
| | | ]; |
| | | |
| | | var CONNECTOR_OPTION = [ |
| | | { value: 'connector', name: translate('Connector') } |
| | | ]; |
| | | |
| | | var SCRIPT_OPTION = [ |
| | | { value: 'script', name: translate('Script') } |
| | | ]; |
| | | |
| | | var getType = options.getImplementationType, |
| | | getBusinessObject = options.getBusinessObject; |
| | | |
| | | var hasDmnSupport = options.hasDmnSupport, |
| | | hasExternalSupport = options.hasExternalSupport, |
| | | hasServiceTaskLikeSupport = options.hasServiceTaskLikeSupport, |
| | | hasScriptSupport = options.hasScriptSupport; |
| | | |
| | | var entries = []; |
| | | |
| | | var selectOptions = DEFAULT_OPTIONS.concat([]); |
| | | |
| | | if (hasDmnSupport) { |
| | | selectOptions = selectOptions.concat(DMN_OPTION); |
| | | } |
| | | |
| | | if (hasExternalSupport) { |
| | | selectOptions = selectOptions.concat(EXTERNAL_OPTION); |
| | | } |
| | | |
| | | if (hasServiceTaskLikeSupport) { |
| | | selectOptions = selectOptions.concat(CONNECTOR_OPTION); |
| | | } |
| | | |
| | | if (hasScriptSupport) { |
| | | selectOptions = selectOptions.concat(SCRIPT_OPTION); |
| | | } |
| | | |
| | | selectOptions.push({ value: '' }); |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id : 'implementation', |
| | | label: translate('Implementation'), |
| | | selectOptions: selectOptions, |
| | | modelProperty: 'implType', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | implType: getType(element) || '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element); |
| | | var oldType = getType(element); |
| | | var newType = values.implType; |
| | | |
| | | var props = assign({}, DELEGATE_PROPS); |
| | | |
| | | if (DEFAULT_DELEGATE_PROPS.indexOf(newType) !== -1) { |
| | | |
| | | var newValue = ''; |
| | | if (DEFAULT_DELEGATE_PROPS.indexOf(oldType) !== -1) { |
| | | newValue = bo.get('activiti:' + oldType); |
| | | } |
| | | props['activiti:' + newType] = newValue; |
| | | } |
| | | |
| | | if (hasDmnSupport) { |
| | | props = assign(props, DMN_CAPABLE_PROPS); |
| | | if (newType === 'dmn') { |
| | | props['activiti:decisionRef'] = ''; |
| | | } |
| | | } |
| | | |
| | | if (hasExternalSupport) { |
| | | props = assign(props, EXTERNAL_CAPABLE_PROPS); |
| | | if (newType === 'external') { |
| | | props['activiti:type'] = 'external'; |
| | | props['activiti:topic'] = ''; |
| | | } |
| | | } |
| | | |
| | | if (hasScriptSupport) { |
| | | props['activiti:script'] = undefined; |
| | | |
| | | if (newType === 'script') { |
| | | props['activiti:script'] = elementHelper.createElement('activiti:Script', {}, bo, bpmnFactory); |
| | | } |
| | | } |
| | | |
| | | var commands = []; |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, props)); |
| | | |
| | | if (hasServiceTaskLikeSupport) { |
| | | var connectors = extensionElementsHelper.getExtensionElements(bo, 'activiti:Connector'); |
| | | commands.push(map(connectors, function(connector) { |
| | | return extensionElementsHelper.removeEntry(bo, element, connector); |
| | | })); |
| | | |
| | | if (newType === 'connector') { |
| | | var extensionElements = bo.get('extensionElements'); |
| | | if (!extensionElements) { |
| | | extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory); |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements })); |
| | | } |
| | | var connector = elementHelper.createElement('activiti:Connector', {}, extensionElements, bpmnFactory); |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | 'extensionElements', |
| | | [ connector ], |
| | | [] |
| | | )); |
| | | } |
| | | } |
| | | |
| | | return commands; |
| | | |
| | | } |
| | | })); |
| | | |
| | | return entries; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), |
| | | inputOutputHelper = require('../../../../helper/InputOutputHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var extensionElementsEntry = require('./ExtensionElements'); |
| | | |
| | | |
| | | function getInputOutput(element, insideConnector) { |
| | | return inputOutputHelper.getInputOutput(element, insideConnector); |
| | | } |
| | | |
| | | function getConnector(element) { |
| | | return inputOutputHelper.getConnector(element); |
| | | } |
| | | |
| | | function getInputParameters(element, insideConnector) { |
| | | return inputOutputHelper.getInputParameters(element, insideConnector); |
| | | } |
| | | |
| | | function getOutputParameters(element, insideConnector) { |
| | | return inputOutputHelper.getOutputParameters(element, insideConnector); |
| | | } |
| | | |
| | | function getInputParameter(element, insideConnector, idx) { |
| | | return inputOutputHelper.getInputParameter(element, insideConnector, idx); |
| | | } |
| | | |
| | | function getOutputParameter(element, insideConnector, idx) { |
| | | return inputOutputHelper.getOutputParameter(element, insideConnector, idx); |
| | | } |
| | | |
| | | |
| | | function createElement(type, parent, factory, properties) { |
| | | return elementHelper.createElement(type, properties, parent, factory); |
| | | } |
| | | |
| | | function createInputOutput(parent, bpmnFactory, properties) { |
| | | return createElement('activiti:InputOutput', parent, bpmnFactory, properties); |
| | | } |
| | | |
| | | function createParameter(type, parent, bpmnFactory, properties) { |
| | | return createElement(type, parent, bpmnFactory, properties); |
| | | } |
| | | |
| | | |
| | | function ensureInputOutputSupported(element, insideConnector) { |
| | | return inputOutputHelper.isInputOutputSupported(element, insideConnector); |
| | | } |
| | | |
| | | function ensureOutparameterSupported(element, insideConnector) { |
| | | return inputOutputHelper.areOutputParametersSupported(element, insideConnector); |
| | | } |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var TYPE_LABEL = { |
| | | 'activiti:Map': translate('Map'), |
| | | 'activiti:List': translate('List'), |
| | | 'activiti:Script': translate('Script') |
| | | }; |
| | | |
| | | options = options || {}; |
| | | |
| | | var insideConnector = !!options.insideConnector, |
| | | idPrefix = options.idPrefix || ''; |
| | | |
| | | var getSelected = function(element, node) { |
| | | var selection = (inputEntry && inputEntry.getSelected(element, node)) || { idx: -1 }; |
| | | |
| | | var parameter = getInputParameter(element, insideConnector, selection.idx); |
| | | if (!parameter && outputEntry) { |
| | | selection = outputEntry.getSelected(element, node); |
| | | parameter = getOutputParameter(element, insideConnector, selection.idx); |
| | | } |
| | | return parameter; |
| | | }; |
| | | |
| | | var result = { |
| | | getSelectedParameter: getSelected |
| | | }; |
| | | |
| | | var entries = result.entries = []; |
| | | |
| | | if (!ensureInputOutputSupported(element)) { |
| | | return result; |
| | | } |
| | | |
| | | var newElement = function(type, prop, factory) { |
| | | |
| | | return function(element, extensionElements, value) { |
| | | var commands = []; |
| | | |
| | | var inputOutput = getInputOutput(element, insideConnector); |
| | | if (!inputOutput) { |
| | | var parent = !insideConnector ? extensionElements : getConnector(element); |
| | | inputOutput = createInputOutput(parent, bpmnFactory, { |
| | | inputParameters: [], |
| | | outputParameters: [] |
| | | }); |
| | | |
| | | if (!insideConnector) { |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | 'extensionElements', |
| | | [ inputOutput ], |
| | | [] |
| | | )); |
| | | } else { |
| | | commands.push(cmdHelper.updateBusinessObject(element, parent, { inputOutput: inputOutput })); |
| | | } |
| | | } |
| | | |
| | | var newElem = createParameter(type, inputOutput, bpmnFactory, { name: value }); |
| | | commands.push(cmdHelper.addElementsTolist(element, inputOutput, prop, [ newElem ])); |
| | | |
| | | return commands; |
| | | }; |
| | | }; |
| | | |
| | | var removeElement = function(getter, prop, otherProp) { |
| | | return function(element, extensionElements, value, idx) { |
| | | var inputOutput = getInputOutput(element, insideConnector); |
| | | var parameter = getter(element, insideConnector, idx); |
| | | |
| | | var commands = []; |
| | | commands.push(cmdHelper.removeElementsFromList(element, inputOutput, prop, null, [ parameter ])); |
| | | |
| | | var firstLength = inputOutput.get(prop).length-1; |
| | | var secondLength = (inputOutput.get(otherProp) || []).length; |
| | | |
| | | if (!firstLength && !secondLength) { |
| | | |
| | | if (!insideConnector) { |
| | | commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, inputOutput)); |
| | | } else { |
| | | var connector = getConnector(element); |
| | | commands.push(cmdHelper.updateBusinessObject(element, connector, { inputOutput: undefined })); |
| | | } |
| | | |
| | | } |
| | | |
| | | return commands; |
| | | }; |
| | | }; |
| | | |
| | | var setOptionLabelValue = function(getter) { |
| | | return function(element, node, option, property, value, idx) { |
| | | var parameter = getter(element, insideConnector, idx); |
| | | |
| | | var suffix = 'Text'; |
| | | |
| | | var definition = parameter.get('definition'); |
| | | if (typeof definition !== 'undefined') { |
| | | var type = definition.$type; |
| | | suffix = TYPE_LABEL[type]; |
| | | } |
| | | |
| | | option.text = (value || '') + ' : ' + suffix; |
| | | }; |
| | | }; |
| | | |
| | | |
| | | // input parameters /////////////////////////////////////////////////////////////// |
| | | |
| | | var inputEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id: idPrefix + 'inputs', |
| | | label: translate('Input Parameters'), |
| | | modelProperty: 'name', |
| | | prefix: 'Input', |
| | | resizable: true, |
| | | |
| | | createExtensionElement: newElement('activiti:InputParameter', 'inputParameters'), |
| | | removeExtensionElement: removeElement(getInputParameter, 'inputParameters', 'outputParameters'), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getInputParameters(element, insideConnector); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | outputEntry && outputEntry.deselect(element, node); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(getInputParameter) |
| | | |
| | | }); |
| | | entries.push(inputEntry); |
| | | |
| | | |
| | | // output parameters /////////////////////////////////////////////////////// |
| | | |
| | | if (ensureOutparameterSupported(element, insideConnector)) { |
| | | var outputEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id: idPrefix + 'outputs', |
| | | label: translate('Output Parameters'), |
| | | modelProperty: 'name', |
| | | prefix: 'Output', |
| | | resizable: true, |
| | | |
| | | createExtensionElement: newElement('activiti:OutputParameter', 'outputParameters'), |
| | | removeExtensionElement: removeElement(getOutputParameter, 'outputParameters', 'inputParameters'), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getOutputParameters(element, insideConnector); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | inputEntry.deselect(element, node); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(getOutputParameter) |
| | | |
| | | }); |
| | | entries.push(outputEntry); |
| | | } |
| | | |
| | | return result; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | inputOutputHelper = require('../../../../helper/InputOutputHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | utils = require('../../../../Utils'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | scriptImplementation = require('./Script'); |
| | | |
| | | |
| | | function createElement(type, parent, factory, properties) { |
| | | return elementHelper.createElement(type, properties, parent, factory); |
| | | } |
| | | |
| | | function isScript(elem) { |
| | | return is(elem, 'activiti:Script'); |
| | | } |
| | | |
| | | function isList(elem) { |
| | | return is(elem, 'activiti:List'); |
| | | } |
| | | |
| | | function isMap(elem) { |
| | | return is(elem, 'activiti:Map'); |
| | | } |
| | | |
| | | function ensureInputOutputSupported(element, insideConnector) { |
| | | return inputOutputHelper.isInputOutputSupported(element, insideConnector); |
| | | } |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var typeInfo = { |
| | | 'activiti:Map': { |
| | | value: 'map', |
| | | label: translate('Map') |
| | | }, |
| | | 'activiti:List': { |
| | | value: 'list', |
| | | label: translate('List') |
| | | }, |
| | | 'activiti:Script': { |
| | | value: 'script', |
| | | label: translate('Script') |
| | | } |
| | | }; |
| | | |
| | | options = options || {}; |
| | | |
| | | var insideConnector = !!options.insideConnector, |
| | | idPrefix = options.idPrefix || ''; |
| | | |
| | | var getSelected = options.getSelectedParameter; |
| | | |
| | | if (!ensureInputOutputSupported(element, insideConnector)) { |
| | | return []; |
| | | } |
| | | |
| | | var entries = []; |
| | | |
| | | var isSelected = function(element, node) { |
| | | return getSelected(element, node); |
| | | }; |
| | | |
| | | |
| | | // parameter name //////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.validationAwareTextField({ |
| | | id: idPrefix + 'parameterName', |
| | | label: translate('Name'), |
| | | modelProperty: 'name', |
| | | |
| | | getProperty: function(element, node) { |
| | | return (getSelected(element, node) || {}).name; |
| | | }, |
| | | |
| | | setProperty: function(element, values, node) { |
| | | var param = getSelected(element, node); |
| | | return cmdHelper.updateBusinessObject(element, param, values); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var bo = getSelected(element, node); |
| | | |
| | | var validation = {}; |
| | | if (bo) { |
| | | var nameValue = values.name; |
| | | |
| | | if (nameValue) { |
| | | if (utils.containsSpace(nameValue)) { |
| | | validation.name = translate('Name must not contain spaces'); |
| | | } |
| | | } else { |
| | | validation.name = translate('Parameter must have a name'); |
| | | } |
| | | } |
| | | |
| | | return validation; |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !isSelected(element, node); |
| | | } |
| | | })); |
| | | |
| | | |
| | | // parameter type ////////////////////////////////////////////////////// |
| | | |
| | | var selectOptions = [ |
| | | { value: 'text', name: translate('Text') }, |
| | | { value: 'script', name: translate('Script') }, |
| | | { value: 'list', name: translate('List') }, |
| | | { value: 'map', name: translate('Map') } |
| | | ]; |
| | | |
| | | entries.push(entryFactory.selectBox({ |
| | | id : idPrefix + 'parameterType', |
| | | label: translate('Type'), |
| | | selectOptions: selectOptions, |
| | | modelProperty: 'parameterType', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | |
| | | var parameterType = 'text'; |
| | | |
| | | if (typeof bo !== 'undefined') { |
| | | var definition = bo.get('definition'); |
| | | if (typeof definition !== 'undefined') { |
| | | var type = definition.$type; |
| | | parameterType = typeInfo[type].value; |
| | | } |
| | | } |
| | | |
| | | return { |
| | | parameterType: parameterType |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getSelected(element, node); |
| | | |
| | | var properties = { |
| | | value: undefined, |
| | | definition: undefined |
| | | }; |
| | | |
| | | var createParameterTypeElem = function(type) { |
| | | return createElement(type, bo, bpmnFactory); |
| | | }; |
| | | |
| | | var parameterType = values.parameterType; |
| | | |
| | | if (parameterType === 'script') { |
| | | properties.definition = createParameterTypeElem('activiti:Script'); |
| | | } |
| | | else if (parameterType === 'list') { |
| | | properties.definition = createParameterTypeElem('activiti:List'); |
| | | } |
| | | else if (parameterType === 'map') { |
| | | properties.definition = createParameterTypeElem('activiti:Map'); |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, bo, properties); |
| | | }, |
| | | |
| | | show: function(element, node) { |
| | | return isSelected(element, node); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | // parameter value (type = text) /////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.textBox({ |
| | | id : idPrefix + 'parameterType-text', |
| | | label : translate('Value'), |
| | | modelProperty: 'value', |
| | | get: function(element, node) { |
| | | return { |
| | | value: (getSelected(element, node) || {}).value |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var param = getSelected(element, node); |
| | | values.value = values.value || undefined; |
| | | return cmdHelper.updateBusinessObject(element, param, values); |
| | | }, |
| | | |
| | | show: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && !bo.definition; |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | // parameter value (type = script) /////////////////////////////////////////////////////// |
| | | var script = scriptImplementation('scriptFormat', 'value', true, translate); |
| | | entries.push({ |
| | | id: idPrefix + 'parameterType-script', |
| | | html: '<div data-show="isScript">' + |
| | | script.template + |
| | | '</div>', |
| | | get: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && isScript(bo.definition) ? script.get(element, bo.definition) : {}; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getSelected(element, node); |
| | | var update = script.set(element, values); |
| | | return cmdHelper.updateBusinessObject(element, bo.definition, update); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && isScript(bo.definition) ? script.validate(element, bo.definition) : {}; |
| | | }, |
| | | |
| | | isScript: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && isScript(bo.definition); |
| | | }, |
| | | |
| | | script: script |
| | | |
| | | }); |
| | | |
| | | |
| | | // parameter value (type = list) /////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.table({ |
| | | id: idPrefix + 'parameterType-list', |
| | | modelProperties: [ 'value' ], |
| | | labels: [ translate('Value') ], |
| | | addLabel: translate('Add Value'), |
| | | |
| | | getElements: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | |
| | | if (bo && isList(bo.definition)) { |
| | | return bo.definition.items; |
| | | } |
| | | |
| | | return []; |
| | | }, |
| | | |
| | | updateElement: function(element, values, node, idx) { |
| | | var bo = getSelected(element, node); |
| | | var item = bo.definition.items[idx]; |
| | | return cmdHelper.updateBusinessObject(element, item, values); |
| | | }, |
| | | |
| | | addElement: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | var newValue = createElement('activiti:Value', bo.definition, bpmnFactory, { value: undefined }); |
| | | return cmdHelper.addElementsTolist(element, bo.definition, 'items', [ newValue ]); |
| | | }, |
| | | |
| | | removeElement: function(element, node, idx) { |
| | | var bo = getSelected(element, node); |
| | | return cmdHelper.removeElementsFromList(element, bo.definition, 'items', null, [ bo.definition.items[idx] ]); |
| | | }, |
| | | |
| | | editable: function(element, node, prop, idx) { |
| | | var bo = getSelected(element, node); |
| | | var item = bo.definition.items[idx]; |
| | | return !isMap(item) && !isList(item) && !isScript(item); |
| | | }, |
| | | |
| | | setControlValue: function(element, node, input, prop, value, idx) { |
| | | var bo = getSelected(element, node); |
| | | var item = bo.definition.items[idx]; |
| | | |
| | | if (!isMap(item) && !isList(item) && !isScript(item)) { |
| | | input.value = value; |
| | | } else { |
| | | input.value = typeInfo[item.$type].label; |
| | | } |
| | | }, |
| | | |
| | | show: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && bo.definition && isList(bo.definition); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | // parameter value (type = map) /////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.table({ |
| | | id: idPrefix + 'parameterType-map', |
| | | modelProperties: [ 'key', 'value' ], |
| | | labels: [ translate('Key'), translate('Value') ], |
| | | addLabel: translate('Add Entry'), |
| | | |
| | | getElements: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | |
| | | if (bo && isMap(bo.definition)) { |
| | | return bo.definition.entries; |
| | | } |
| | | |
| | | return []; |
| | | }, |
| | | |
| | | updateElement: function(element, values, node, idx) { |
| | | var bo = getSelected(element, node); |
| | | var entry = bo.definition.entries[idx]; |
| | | |
| | | if (isMap(entry.definition) || isList(entry.definition) || isScript(entry.definition)) { |
| | | values = { |
| | | key: values.key |
| | | }; |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, entry, values); |
| | | }, |
| | | |
| | | addElement: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | var newEntry = createElement('activiti:Entry', bo.definition, bpmnFactory, { key: undefined, value: undefined }); |
| | | return cmdHelper.addElementsTolist(element, bo.definition, 'entries', [ newEntry ]); |
| | | }, |
| | | |
| | | removeElement: function(element, node, idx) { |
| | | var bo = getSelected(element, node); |
| | | return cmdHelper.removeElementsFromList(element, bo.definition, 'entries', null, [ bo.definition.entries[idx] ]); |
| | | }, |
| | | |
| | | editable: function(element, node, prop, idx) { |
| | | var bo = getSelected(element, node); |
| | | var entry = bo.definition.entries[idx]; |
| | | return prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition)); |
| | | }, |
| | | |
| | | setControlValue: function(element, node, input, prop, value, idx) { |
| | | var bo = getSelected(element, node); |
| | | var entry = bo.definition.entries[idx]; |
| | | |
| | | if (prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition))) { |
| | | input.value = value; |
| | | } else { |
| | | input.value = typeInfo[entry.definition.$type].label; |
| | | } |
| | | }, |
| | | |
| | | show: function(element, node) { |
| | | var bo = getSelected(element, node); |
| | | return bo && bo.definition && isMap(bo.definition); |
| | | } |
| | | |
| | | })); |
| | | |
| | | return entries; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var jobPriorityEntry = entryFactory.textField({ |
| | | id: 'jobPriority', |
| | | label: translate('Job Priority'), |
| | | modelProperty: 'jobPriority', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { |
| | | jobPriority: bo.get('activiti:jobPriority') |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:jobPriority': values.jobPriority || undefined |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ jobPriorityEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var asyncCapableHelper = require('../../../../helper/AsyncCapableHelper'); |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | function isAsyncBefore(bo) { |
| | | return asyncCapableHelper.isAsyncBefore(bo); |
| | | } |
| | | |
| | | function isAsyncAfter(bo) { |
| | | return asyncCapableHelper.isAsyncAfter(bo); |
| | | } |
| | | |
| | | function getFailedJobRetryTimeCycle(bo) { |
| | | return asyncCapableHelper.getFailedJobRetryTimeCycle(bo); |
| | | } |
| | | |
| | | function removeFailedJobRetryTimeCycle(bo, element) { |
| | | return asyncCapableHelper.removeFailedJobRetryTimeCycle(bo, element); |
| | | } |
| | | |
| | | function createExtensionElements(parent, bpmnFactory) { |
| | | return elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, parent, bpmnFactory); |
| | | } |
| | | |
| | | function createFailedJobRetryTimeCycle(parent, bpmnFactory, cycle) { |
| | | return elementHelper.createElement('activiti:FailedJobRetryTimeCycle', { body: cycle }, parent, bpmnFactory); |
| | | } |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var idPrefix = options.idPrefix || '', |
| | | labelPrefix = options.labelPrefix || ''; |
| | | |
| | | var retryTimeCycleEntry = entryFactory.textField({ |
| | | id: idPrefix + 'retryTimeCycle', |
| | | label: labelPrefix + translate('Retry Time Cycle'), |
| | | modelProperty: 'cycle', |
| | | |
| | | get: function(element, node) { |
| | | var retryTimeCycle = getFailedJobRetryTimeCycle(getBusinessObject(element)); |
| | | var value = retryTimeCycle && retryTimeCycle.get('body'); |
| | | return { |
| | | cycle: value |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var newCycle = values.cycle; |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (newCycle === '' || typeof newCycle === 'undefined') { |
| | | // remove retry time cycle element(s) |
| | | return removeFailedJobRetryTimeCycle(bo, element); |
| | | } |
| | | |
| | | var retryTimeCycle = getFailedJobRetryTimeCycle(bo); |
| | | |
| | | if (!retryTimeCycle) { |
| | | // add new retry time cycle element |
| | | var commands = []; |
| | | |
| | | var extensionElements = bo.get('extensionElements'); |
| | | if (!extensionElements) { |
| | | extensionElements = createExtensionElements(bo, bpmnFactory); |
| | | commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements })); |
| | | } |
| | | |
| | | retryTimeCycle = createFailedJobRetryTimeCycle(extensionElements, bpmnFactory, newCycle); |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | extensionElements, |
| | | 'values', |
| | | 'extensionElements', |
| | | [ retryTimeCycle ], |
| | | [] |
| | | )); |
| | | |
| | | return commands; |
| | | } |
| | | |
| | | // update existing retry time cycle element |
| | | return cmdHelper.updateBusinessObject(element, retryTimeCycle, { body: newCycle }); |
| | | }, |
| | | |
| | | hidden: function(element) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (bo && (isAsyncBefore(bo) || isAsyncAfter(bo))) { |
| | | return false; |
| | | } |
| | | |
| | | if (is(element, 'bpmn:Event')) { |
| | | return !eventDefinitionHelper.getTimerEventDefinition(element); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ retryTimeCycleEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var extensionElementsEntry = require('./ExtensionElements'), |
| | | extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | elementHelper = require('../../../../helper/ElementHelper'), |
| | | ImplementationTypeHelper = require('../../../../helper/ImplementationTypeHelper'); |
| | | |
| | | |
| | | function getListeners(bo, type) { |
| | | return bo && extensionElementsHelper.getExtensionElements(bo, type) || []; |
| | | } |
| | | |
| | | var ACTIVITI_EXECUTION_LISTENER_ELEMENT = 'activiti:ExecutionListener'; |
| | | var ACTIVITI_TASK_LISTENER_ELEMENT = 'activiti:TaskListener'; |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var LISTENER_TYPE_LABEL = { |
| | | class: translate('Java Class'), |
| | | expression: translate('Expression'), |
| | | delegateExpression: translate('Delegate Expression'), |
| | | script: translate('Script') |
| | | }; |
| | | |
| | | var bo; |
| | | |
| | | var result = { |
| | | getSelectedListener: getSelectedListener |
| | | }; |
| | | |
| | | var entries = result.entries = []; |
| | | |
| | | var isSequenceFlow = ImplementationTypeHelper.isSequenceFlow(element); |
| | | |
| | | function getSelectedListener(element, node) { |
| | | var selection = (executionListenerEntry && executionListenerEntry.getSelected(element, node)) || { idx: -1 }; |
| | | |
| | | var listener = getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT)[selection.idx]; |
| | | if (!listener && taskListenerEntry) { |
| | | selection = taskListenerEntry.getSelected(element, node); |
| | | listener = getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT)[selection.idx]; |
| | | } |
| | | return listener; |
| | | } |
| | | |
| | | var setOptionLabelValue = function(type) { |
| | | return function(element, node, option, property, value, idx) { |
| | | var listeners = getListeners(bo, type); |
| | | var listener = listeners[idx]; |
| | | var listenerType = ImplementationTypeHelper.getImplementationType(listener); |
| | | |
| | | var event = (listener.get('event')) ? listener.get('event') : '<empty>'; |
| | | |
| | | var label = (event || '*') + ' : ' + (LISTENER_TYPE_LABEL[listenerType] || ''); |
| | | |
| | | option.text = label; |
| | | }; |
| | | }; |
| | | |
| | | var newElement = function(element, type, initialEvent) { |
| | | return function(element, extensionElements, value) { |
| | | var props = { |
| | | event: initialEvent, |
| | | class: '' |
| | | }; |
| | | |
| | | var newElem = elementHelper.createElement(type, props, extensionElements, bpmnFactory); |
| | | |
| | | return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]); |
| | | }; |
| | | }; |
| | | |
| | | var removeElement = function(element, type) { |
| | | return function(element, extensionElements, value, idx) { |
| | | var listeners = getListeners(bo, type); |
| | | var listener = listeners[idx]; |
| | | if (listener) { |
| | | return extensionElementsHelper.removeEntry(bo, element, listener); |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | |
| | | // Execution Listener |
| | | |
| | | if (is(element, 'bpmn:FlowElement') || is(element, 'bpmn:Process') || is(element, 'bpmn:Participant')) { |
| | | bo = getBusinessObject(element); |
| | | if (is(element, 'bpmn:Participant')) { |
| | | element = element.processRef; |
| | | bo = bo.get('processRef'); |
| | | } |
| | | |
| | | if (bo) { |
| | | |
| | | var executionListenerEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id : 'executionListeners', |
| | | label : translate('Execution Listener'), |
| | | modelProperty: 'name', |
| | | idGeneration: 'false', |
| | | reference: 'processRef', |
| | | |
| | | createExtensionElement: newElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT, (isSequenceFlow) ? 'take' : 'start'), |
| | | removeExtensionElement: removeElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | taskListenerEntry && taskListenerEntry.deselect(element, node); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(ACTIVITI_EXECUTION_LISTENER_ELEMENT) |
| | | |
| | | }); |
| | | entries.push(executionListenerEntry); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | // Task Listener |
| | | |
| | | if (is(element, 'bpmn:UserTask')) { |
| | | bo = getBusinessObject(element); |
| | | |
| | | var taskListenerEntry = extensionElementsEntry(element, bpmnFactory, { |
| | | id : 'taskListeners', |
| | | label : translate('Task Listener'), |
| | | modelProperty: 'name', |
| | | idGeneration: 'false', |
| | | |
| | | createExtensionElement: newElement(element, ACTIVITI_TASK_LISTENER_ELEMENT, 'create'), |
| | | removeExtensionElement: removeElement(element, ACTIVITI_TASK_LISTENER_ELEMENT), |
| | | |
| | | getExtensionElements: function(element) { |
| | | return getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT); |
| | | }, |
| | | |
| | | onSelectionChange: function(element, node, event, scope) { |
| | | executionListenerEntry.deselect(element, node); |
| | | }, |
| | | |
| | | setOptionLabelValue: setOptionLabelValue(ACTIVITI_TASK_LISTENER_ELEMENT) |
| | | |
| | | }); |
| | | entries.push(taskListenerEntry); |
| | | } |
| | | |
| | | return result; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | escapeHTML = require('../../../../Utils').escapeHTML; |
| | | |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var domClasses = require('min-dom').classes; |
| | | |
| | | /** |
| | | * Get a property value of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {string} propertyName |
| | | * |
| | | * @return {any} the property value |
| | | */ |
| | | function getProperty(element, propertyName) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | return loopCharacteristics && loopCharacteristics.get(propertyName); |
| | | } |
| | | |
| | | /** |
| | | * Get the body of a given expression. |
| | | * |
| | | * @param {ModdleElement<bpmn:FormalExpression>} expression |
| | | * |
| | | * @return {string} the body (value) of the expression |
| | | */ |
| | | function getBody(expression) { |
| | | return expression && expression.get('body'); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get the loop characteristics of an element. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement<bpmn:MultiInstanceLoopCharacteristics>} the loop characteristics |
| | | */ |
| | | function getLoopCharacteristics(element) { |
| | | var bo = getBusinessObject(element); |
| | | return bo.loopCharacteristics; |
| | | } |
| | | |
| | | /** |
| | | * Get the loop cardinality of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the loop cardinality |
| | | */ |
| | | function getLoopCardinality(element) { |
| | | return getProperty(element, 'loopCardinality'); |
| | | } |
| | | |
| | | /** |
| | | * Get the loop cardinality value of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {string} the loop cardinality value |
| | | */ |
| | | function getLoopCardinalityValue(element) { |
| | | var loopCardinality = getLoopCardinality(element); |
| | | return getBody(loopCardinality); |
| | | } |
| | | |
| | | /** |
| | | * Get the completion condition of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the completion condition |
| | | */ |
| | | function getCompletionCondition(element) { |
| | | return getProperty(element, 'completionCondition'); |
| | | } |
| | | |
| | | /** |
| | | * Get the completion condition value of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {string} the completion condition value |
| | | */ |
| | | function getCompletionConditionValue(element) { |
| | | var completionCondition = getCompletionCondition(element); |
| | | return getBody(completionCondition); |
| | | } |
| | | |
| | | /** |
| | | * Get the 'activiti:collection' attribute value of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {string} the 'activiti:collection' value |
| | | */ |
| | | function getCollection(element) { |
| | | return getProperty(element, 'activiti:collection'); |
| | | } |
| | | |
| | | /** |
| | | * Get the 'activiti:elementVariable' attribute value of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * |
| | | * @return {string} the 'activiti:elementVariable' value |
| | | */ |
| | | function getElementVariable(element) { |
| | | return getProperty(element, 'activiti:elementVariable'); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Creates 'bpmn:FormalExpression' element. |
| | | * |
| | | * @param {ModdleElement} parent |
| | | * @param {string} body |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @result {ModdleElement<bpmn:FormalExpression>} a formal expression |
| | | */ |
| | | function createFormalExpression(parent, body, bpmnFactory) { |
| | | return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory); |
| | | } |
| | | |
| | | /** |
| | | * Updates a specific formal expression of the loop characteristics. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {string} propertyName |
| | | * @param {string} newValue |
| | | * @param {BpmnFactory} bpmnFactory |
| | | */ |
| | | function updateFormalExpression(element, propertyName, newValue, bpmnFactory) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | |
| | | var expressionProps = {}; |
| | | |
| | | if (!newValue) { |
| | | // remove formal expression |
| | | expressionProps[propertyName] = undefined; |
| | | return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps); |
| | | } |
| | | |
| | | var existingExpression = loopCharacteristics.get(propertyName); |
| | | |
| | | if (!existingExpression) { |
| | | // add formal expression |
| | | expressionProps[propertyName] = createFormalExpression(loopCharacteristics, newValue, bpmnFactory); |
| | | return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps); |
| | | } |
| | | |
| | | // edit existing formal expression |
| | | return cmdHelper.updateBusinessObject(element, existingExpression, { |
| | | body: newValue |
| | | }); |
| | | } |
| | | |
| | | |
| | | module.exports = function(element, bpmnFactory, translate) { |
| | | |
| | | var entries = []; |
| | | |
| | | // error message ///////////////////////////////////////////////////////////////// |
| | | |
| | | entries.push({ |
| | | id: 'multiInstance-errorMessage', |
| | | html: '<div data-show="isValid">' + |
| | | '<span class="bpp-icon-warning"></span> ' + |
| | | escapeHTML(translate('Must provide either loop cardinality or collection')) + |
| | | '</div>', |
| | | |
| | | isValid: function(element, node, notification, scope) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | |
| | | var isValid = true; |
| | | if (loopCharacteristics) { |
| | | var loopCardinality = getLoopCardinalityValue(element); |
| | | var collection = getCollection(element); |
| | | |
| | | isValid = !loopCardinality && !collection; |
| | | } |
| | | |
| | | domClasses(node).toggle('bpp-hidden', !isValid); |
| | | domClasses(notification).toggle('bpp-error-message', isValid); |
| | | |
| | | return isValid; |
| | | } |
| | | }); |
| | | |
| | | // loop cardinality ////////////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'multiInstance-loopCardinality', |
| | | label: translate('Loop Cardinality'), |
| | | modelProperty: 'loopCardinality', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | loopCardinality: getLoopCardinalityValue(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | return updateFormalExpression(element, 'loopCardinality', values.loopCardinality, bpmnFactory); |
| | | } |
| | | })); |
| | | |
| | | |
| | | // collection ////////////////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'multiInstance-collection', |
| | | label: translate('Collection'), |
| | | modelProperty: 'collection', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | collection: getCollection(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | return cmdHelper.updateBusinessObject(element, loopCharacteristics, { |
| | | 'activiti:collection': values.collection || undefined |
| | | }); |
| | | }, |
| | | |
| | | validate: function(element, values, node) { |
| | | var collection = getCollection(element); |
| | | var elementVariable = getElementVariable(element); |
| | | |
| | | if (!collection && elementVariable) { |
| | | return { collection : 'Must provide a value' }; |
| | | } |
| | | } |
| | | })); |
| | | |
| | | |
| | | // element variable //////////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'multiInstance-elementVariable', |
| | | label: translate('Element Variable'), |
| | | modelProperty: 'elementVariable', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | elementVariable: getElementVariable(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var loopCharacteristics = getLoopCharacteristics(element); |
| | | return cmdHelper.updateBusinessObject(element, loopCharacteristics, { |
| | | 'activiti:elementVariable': values.elementVariable || undefined |
| | | }); |
| | | } |
| | | })); |
| | | |
| | | |
| | | // Completion Condition ////////////////////////////////////////////////////// |
| | | |
| | | entries.push(entryFactory.textField({ |
| | | id: 'multiInstance-completionCondition', |
| | | label: translate('Completion Condition'), |
| | | modelProperty: 'completionCondition', |
| | | |
| | | get: function(element) { |
| | | return { |
| | | completionCondition: getCompletionConditionValue(element) |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | return updateFormalExpression(element, 'completionCondition', values.completionCondition, bpmnFactory); |
| | | } |
| | | })); |
| | | |
| | | return entries; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var factory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'), |
| | | utils = require('../../../../Utils'); |
| | | |
| | | var assign = require('lodash/assign'), |
| | | forEach = require('lodash/forEach'), |
| | | find = require('lodash/find'); |
| | | |
| | | function generatePropertyId() { |
| | | return utils.nextId('Property_'); |
| | | } |
| | | |
| | | /** |
| | | * Get all activiti:property objects for a specific business object |
| | | * |
| | | * @param {ModdleElement} parent |
| | | * |
| | | * @return {Array<ModdleElement>} a list of activiti:property objects |
| | | */ |
| | | function getPropertyValues(parent) { |
| | | var properties = parent && getPropertiesElement(parent); |
| | | if (properties && properties.values) { |
| | | return properties.values; |
| | | } |
| | | return []; |
| | | } |
| | | |
| | | /** |
| | | * Get all activiti:Properties object for a specific business object |
| | | * |
| | | * @param {ModdleElement} parent |
| | | * |
| | | * @return {ModdleElement} a activiti:Properties object |
| | | */ |
| | | function getPropertiesElement(element) { |
| | | if (!isExtensionElements(element)) { |
| | | return element.properties; |
| | | } else { |
| | | return getPropertiesElementInsideExtensionElements(element); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Get first activiti:Properties object for a specific bpmn:ExtensionElements |
| | | * business object. |
| | | * |
| | | * @param {ModdleElement} extensionElements |
| | | * |
| | | * @return {ModdleElement} a activiti:Properties object |
| | | */ |
| | | function getPropertiesElementInsideExtensionElements(extensionElements) { |
| | | return find(extensionElements.values, function(elem) { |
| | | return is(elem, 'activiti:Properties'); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Returns true, if the given business object is a bpmn:ExtensionElements. |
| | | * |
| | | * @param {ModdleElement} element |
| | | * |
| | | * @return {boolean} a boolean value |
| | | */ |
| | | function isExtensionElements(element) { |
| | | return is(element, 'bpmn:ExtensionElements'); |
| | | } |
| | | |
| | | /** |
| | | * Create a activiti:property entry using tableEntryFactory |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * @param {Object} options |
| | | * @param {string} options.id |
| | | * @param {Array<string>} options.modelProperties |
| | | * @param {Array<string>} options.labels |
| | | * @param {function} options.getParent Gets the parent business object |
| | | * @param {function} options.show Indicate when the entry will be shown, should return boolean |
| | | */ |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getParent = options.getParent; |
| | | |
| | | var modelProperties = options.modelProperties, |
| | | createParent = options.createParent; |
| | | |
| | | var bo = getBusinessObject(element); |
| | | if (is(element, 'bpmn:Participant')) { |
| | | bo = bo.get('processRef'); |
| | | } |
| | | |
| | | // build properties group only when the participant have a processRef |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | assign(options, { |
| | | addLabel: translate('Add Property'), |
| | | getElements: function(element, node) { |
| | | var parent = getParent(element, node, bo); |
| | | return getPropertyValues(parent); |
| | | }, |
| | | addElement: function(element, node) { |
| | | var commands = [], |
| | | parent = getParent(element, node, bo); |
| | | |
| | | if (!parent && typeof createParent === 'function') { |
| | | var result = createParent(element, bo); |
| | | parent = result.parent; |
| | | commands.push(result.cmd); |
| | | } |
| | | |
| | | var properties = getPropertiesElement(parent); |
| | | if (!properties) { |
| | | properties = elementHelper.createElement('activiti:Properties', {}, parent, bpmnFactory); |
| | | |
| | | if (!isExtensionElements(parent)) { |
| | | commands.push(cmdHelper.updateBusinessObject(element, parent, { 'properties': properties })); |
| | | } else { |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList( |
| | | element, |
| | | parent, |
| | | 'values', |
| | | 'extensionElements', |
| | | [ properties ], |
| | | [] |
| | | )); |
| | | } |
| | | } |
| | | |
| | | var propertyProps = {}; |
| | | forEach(modelProperties, function(prop) { |
| | | propertyProps[prop] = undefined; |
| | | }); |
| | | |
| | | // create id if necessary |
| | | if (modelProperties.indexOf('id') >= 0) { |
| | | propertyProps.id = generatePropertyId(); |
| | | } |
| | | |
| | | var property = elementHelper.createElement('activiti:Property', propertyProps, properties, bpmnFactory); |
| | | commands.push(cmdHelper.addElementsTolist(element, properties, 'values', [ property ])); |
| | | |
| | | return commands; |
| | | }, |
| | | updateElement: function(element, value, node, idx) { |
| | | var parent = getParent(element, node, bo), |
| | | property = getPropertyValues(parent)[idx]; |
| | | |
| | | forEach(modelProperties, function(prop) { |
| | | value[prop] = value[prop] || undefined; |
| | | }); |
| | | |
| | | return cmdHelper.updateBusinessObject(element, property, value); |
| | | }, |
| | | validate: function(element, value, node, idx) { |
| | | // validate id if necessary |
| | | if (modelProperties.indexOf('id') >= 0) { |
| | | |
| | | var parent = getParent(element, node, bo), |
| | | properties = getPropertyValues(parent), |
| | | property = properties[idx]; |
| | | |
| | | if (property) { |
| | | // check if id is valid |
| | | var validationError = utils.isIdValid(property, value.id, translate); |
| | | |
| | | if (validationError) { |
| | | return { id: validationError }; |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | removeElement: function(element, node, idx) { |
| | | var commands = [], |
| | | parent = getParent(element, node, bo), |
| | | properties = getPropertiesElement(parent), |
| | | propertyValues = getPropertyValues(parent), |
| | | currentProperty = propertyValues[idx]; |
| | | |
| | | commands.push(cmdHelper.removeElementsFromList(element, properties, 'values', null, [ currentProperty ])); |
| | | |
| | | if (propertyValues.length === 1) { |
| | | // remove activiti:properties if the last existing property has been removed |
| | | if (!isExtensionElements(parent)) { |
| | | commands.push(cmdHelper.updateBusinessObject(element, parent, { properties: undefined })); |
| | | } else { |
| | | forEach(parent.values, function(value) { |
| | | if (is(value, 'activiti:Properties')) { |
| | | commands.push(extensionElementsHelper.removeEntry(bo, element, value)); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | return commands; |
| | | } |
| | | }); |
| | | |
| | | return factory.table(options); |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var assign = require('lodash/assign'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject, |
| | | hideResultVariable = options.hideResultVariable, |
| | | id = options.id || 'resultVariable'; |
| | | |
| | | |
| | | var resultVariableEntry = entryFactory.textField({ |
| | | id: id, |
| | | label: translate('Result Variable'), |
| | | modelProperty: 'resultVariable', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | return { resultVariable: bo.get('activiti:resultVariable') }; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var resultVariable = values.resultVariable || undefined; |
| | | |
| | | var props = { |
| | | 'activiti:resultVariable': resultVariable |
| | | }; |
| | | |
| | | if (is(bo, 'activiti:DmnCapable') && !resultVariable) { |
| | | props = assign({ 'activiti:mapDecisionResult': 'resultList' }, props); |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, bo, props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | if (typeof hideResultVariable === 'function') { |
| | | return hideResultVariable.apply(resultVariableEntry, arguments); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ resultVariableEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | escapeHTML = require('../../../../Utils').escapeHTML, |
| | | utils = require('../../../../Utils'); |
| | | |
| | | |
| | | function getScriptType(node) { |
| | | return utils.selectedType('select[name=scriptType]', node.parentElement); |
| | | } |
| | | |
| | | |
| | | module.exports = function(scriptLanguagePropName, scriptValuePropName, isFormatRequired, translate) { |
| | | |
| | | return { |
| | | template: |
| | | '<div class="bpp-row bpp-textfield">' + |
| | | '<label for="cam-script-format">' + escapeHTML(translate('Script Format')) + '</label>' + |
| | | '<div class="bpp-field-wrapper">' + |
| | | '<input id="cam-script-format" type="text" name="scriptFormat" />' + |
| | | '<button class="clear" data-action="script.clearScriptFormat" data-show="script.canClearScriptFormat">' + |
| | | '<span>X</span>' + |
| | | '</button>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | |
| | | '<div class="bpp-row">' + |
| | | '<label for="cam-script-type">' + escapeHTML(translate('Script Type')) + '</label>' + |
| | | '<div class="bpp-field-wrapper">' + |
| | | '<select id="cam-script-type" name="scriptType" data-value>' + |
| | | '<option value="script" selected>' + escapeHTML(translate('Inline Script')) + '</option>' + |
| | | '<option value="scriptResource">' + escapeHTML(translate('External Resource')) + '</option>' + |
| | | '</select>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | |
| | | '<div class="bpp-row bpp-textfield">' + |
| | | '<label for="cam-script-resource-val" data-show="script.isScriptResource">' + escapeHTML(translate('Resource')) + '</label>' + |
| | | '<div class="bpp-field-wrapper" data-show="script.isScriptResource">' + |
| | | '<input id="cam-script-resource-val" type="text" name="scriptResourceValue" />' + |
| | | '<button class="clear" data-action="script.clearScriptResource" data-show="script.canClearScriptResource">' + |
| | | '<span>X</span>' + |
| | | '</button>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | |
| | | '<div class="bpp-row">' + |
| | | '<label for="cam-script-val" data-show="script.isScript">' + escapeHTML(translate('Script')) + '</label>' + |
| | | '<div class="bpp-field-wrapper" data-show="script.isScript">' + |
| | | '<textarea id="cam-script-val" type="text" name="scriptValue"></textarea>' + |
| | | '</div>'+ |
| | | '</div>', |
| | | |
| | | get: function(element, bo) { |
| | | var values = {}; |
| | | |
| | | // read values from xml: |
| | | var boScriptResource = bo.get('activiti:resource'), |
| | | boScript = bo.get(scriptValuePropName), |
| | | boScriptFormat = bo.get(scriptLanguagePropName); |
| | | |
| | | if (typeof boScriptResource !== 'undefined') { |
| | | values.scriptResourceValue = boScriptResource; |
| | | values.scriptType = 'scriptResource'; |
| | | } else { |
| | | values.scriptValue = boScript; |
| | | values.scriptType = 'script'; |
| | | } |
| | | |
| | | values.scriptFormat = boScriptFormat; |
| | | |
| | | return values; |
| | | }, |
| | | |
| | | set: function(element, values, containerElement) { |
| | | var scriptFormat = values.scriptFormat, |
| | | scriptType = values.scriptType, |
| | | scriptResourceValue = values.scriptResourceValue, |
| | | scriptValue = values.scriptValue; |
| | | |
| | | // init update |
| | | var update = { |
| | | 'activiti:resource': undefined |
| | | }; |
| | | update[scriptValuePropName] = undefined; |
| | | update[scriptLanguagePropName] = undefined; |
| | | |
| | | if (isFormatRequired) { |
| | | // always set language |
| | | update[scriptLanguagePropName] = scriptFormat || ''; |
| | | } else |
| | | // set language only when scriptFormat has a value |
| | | if (scriptFormat !== '') { |
| | | update[scriptLanguagePropName] = scriptFormat; |
| | | } |
| | | |
| | | // set either inline script or resource |
| | | if ('scriptResource' === scriptType) { |
| | | update['activiti:resource'] = scriptResourceValue || ''; |
| | | } else { |
| | | update[scriptValuePropName] = scriptValue || ''; |
| | | } |
| | | |
| | | return update; |
| | | }, |
| | | |
| | | validate: function(element, values) { |
| | | var validationResult = {}; |
| | | |
| | | if (values.scriptType === 'script' && !values.scriptValue) { |
| | | validationResult.scriptValue = translate('Must provide a value'); |
| | | } |
| | | |
| | | if (values.scriptType === 'scriptResource' && !values.scriptResourceValue) { |
| | | validationResult.scriptResourceValue = translate('Must provide a value'); |
| | | } |
| | | |
| | | if (isFormatRequired && (!values.scriptFormat || values.scriptFormat.length === 0)) { |
| | | validationResult.scriptFormat = translate('Must provide a value'); |
| | | } |
| | | |
| | | return validationResult; |
| | | }, |
| | | |
| | | clearScriptFormat: function(element, inputNode, btnNode, scopeNode) { |
| | | domQuery('input[name=scriptFormat]', scopeNode).value=''; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | canClearScriptFormat: function(element, inputNode, btnNode, scopeNode) { |
| | | var input = domQuery('input[name=scriptFormat]', scopeNode); |
| | | |
| | | return input.value !== ''; |
| | | }, |
| | | |
| | | clearScriptResource: function(element, inputNode, btnNode, scopeNode) { |
| | | domQuery('input[name=scriptResourceValue]', scopeNode).value=''; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | canClearScriptResource: function(element, inputNode, btnNode, scopeNode) { |
| | | var input = domQuery('input[name=scriptResourceValue]', scopeNode); |
| | | |
| | | return input.value !== ''; |
| | | }, |
| | | |
| | | clearScript: function(element, inputNode, btnNode, scopeNode) { |
| | | domQuery('textarea[name=scriptValue]', scopeNode).value=''; |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | canClearScript: function(element, inputNode, btnNode, scopeNode) { |
| | | var input = domQuery('textarea[name=scriptValue]', scopeNode); |
| | | |
| | | return input.value !== ''; |
| | | }, |
| | | |
| | | isScriptResource: function(element, inputNode, btnNode, scopeNode) { |
| | | var scriptType = getScriptType(scopeNode); |
| | | return scriptType === 'scriptResource'; |
| | | }, |
| | | |
| | | isScript: function(element, inputNode, btnNode, scopeNode) { |
| | | var scriptType = getScriptType(scopeNode); |
| | | return scriptType === 'script'; |
| | | } |
| | | |
| | | }; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(element, bpmnFactory, options, translate) { |
| | | |
| | | var getBusinessObject = options.getBusinessObject; |
| | | |
| | | var isStartableInTasklistEntry = entryFactory.checkbox({ |
| | | id: 'isStartableInTasklist', |
| | | label: translate('Startable'), |
| | | modelProperty: 'isStartableInTasklist', |
| | | |
| | | get: function(element, node) { |
| | | var bo = getBusinessObject(element); |
| | | var isStartableInTasklist = bo.get('activiti:isStartableInTasklist'); |
| | | |
| | | return { |
| | | isStartableInTasklist: isStartableInTasklist ? isStartableInTasklist : '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var bo = getBusinessObject(element); |
| | | return cmdHelper.updateBusinessObject(element, bo, { |
| | | 'activiti:isStartableInTasklist': !!values.isStartableInTasklist |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return [ |
| | | isStartableInTasklistEntry |
| | | ]; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | |
| | | var inherits = require('inherits'); |
| | | |
| | | var PropertiesActivator = require('../../PropertiesActivator'); |
| | | |
| | | var processProps = require('./parts/ProcessProps'), |
| | | eventProps = require('./parts/EventProps'), |
| | | linkProps = require('./parts/LinkProps'), |
| | | documentationProps = require('./parts/DocumentationProps'), |
| | | idProps = require('./parts/IdProps'), |
| | | nameProps = require('./parts/NameProps'), |
| | | executableProps = require('./parts/ExecutableProps'); |
| | | |
| | | function createGeneralTabGroups( |
| | | element, canvas, bpmnFactory, |
| | | elementRegistry, translate) { |
| | | |
| | | var generalGroup = { |
| | | id: 'general', |
| | | label: translate('General'), |
| | | entries: [] |
| | | }; |
| | | idProps(generalGroup, element, translate); |
| | | nameProps(generalGroup, element, bpmnFactory, canvas, translate); |
| | | processProps(generalGroup, element, translate); |
| | | executableProps(generalGroup, element, translate); |
| | | |
| | | var detailsGroup = { |
| | | id: 'details', |
| | | label: translate('Details'), |
| | | entries: [] |
| | | }; |
| | | linkProps(detailsGroup, element, translate); |
| | | eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate); |
| | | |
| | | var documentationGroup = { |
| | | id: 'documentation', |
| | | label: translate('Documentation'), |
| | | entries: [] |
| | | }; |
| | | |
| | | documentationProps(documentationGroup, element, bpmnFactory, translate); |
| | | |
| | | return [ |
| | | generalGroup, |
| | | detailsGroup, |
| | | documentationGroup |
| | | ]; |
| | | |
| | | } |
| | | |
| | | function BpmnPropertiesProvider( |
| | | eventBus, canvas, bpmnFactory, elementRegistry, translate) { |
| | | |
| | | PropertiesActivator.call(this, eventBus); |
| | | |
| | | this.getTabs = function(element) { |
| | | |
| | | var generalTab = { |
| | | id: 'general', |
| | | label: translate('General'), |
| | | groups: createGeneralTabGroups( |
| | | element, canvas, bpmnFactory, elementRegistry, translate) |
| | | }; |
| | | |
| | | return [ |
| | | generalTab |
| | | ]; |
| | | }; |
| | | } |
| | | |
| | | BpmnPropertiesProvider.$inject = [ |
| | | 'eventBus', |
| | | 'canvas', |
| | | 'bpmnFactory', |
| | | 'elementRegistry', |
| | | 'translate' |
| | | ]; |
| | | |
| | | inherits(BpmnPropertiesProvider, PropertiesActivator); |
| | | |
| | | module.exports = BpmnPropertiesProvider; |
New file |
| | |
| | | module.exports = { |
| | | __init__: [ 'propertiesProvider' ], |
| | | propertiesProvider: [ 'type', require('./BpmnPropertiesProvider') ] |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | var ModelUtil = require('bpmn-js/lib/util/ModelUtil'), |
| | | is = ModelUtil.is, |
| | | getBusinessObject = ModelUtil.getBusinessObject; |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, translate) { |
| | | |
| | | var getValue = function(businessObject) { |
| | | return function(element) { |
| | | var documentations = businessObject && businessObject.get('documentation'), |
| | | text = (documentations && documentations.length > 0) ? documentations[0].text : ''; |
| | | |
| | | return { documentation: text }; |
| | | }; |
| | | }; |
| | | |
| | | var setValue = function(businessObject) { |
| | | return function(element, values) { |
| | | var newObjectList = []; |
| | | |
| | | if (typeof values.documentation !== 'undefined' && values.documentation !== '') { |
| | | newObjectList.push(bpmnFactory.create('bpmn:Documentation', { |
| | | text: values.documentation |
| | | })); |
| | | } |
| | | |
| | | return cmdHelper.setList(element, businessObject, 'documentation', newObjectList); |
| | | }; |
| | | }; |
| | | |
| | | // Element Documentation |
| | | var elementDocuEntry = entryFactory.textBox({ |
| | | id: 'documentation', |
| | | label: translate('Element Documentation'), |
| | | modelProperty: 'documentation' |
| | | }); |
| | | |
| | | elementDocuEntry.set = setValue(getBusinessObject(element)); |
| | | |
| | | elementDocuEntry.get = getValue(getBusinessObject(element)); |
| | | |
| | | group.entries.push(elementDocuEntry); |
| | | |
| | | |
| | | var processRef; |
| | | |
| | | // Process Documentation when having a Collaboration Diagram |
| | | if (is(element, 'bpmn:Participant')) { |
| | | |
| | | processRef = getBusinessObject(element).processRef; |
| | | |
| | | // do not show for collapsed Pools/Participants |
| | | if (processRef) { |
| | | var processDocuEntry = entryFactory.textBox({ |
| | | id: 'process-documentation', |
| | | label: translate('Process Documentation'), |
| | | modelProperty: 'documentation' |
| | | }); |
| | | |
| | | processDocuEntry.set = setValue(processRef); |
| | | |
| | | processDocuEntry.get = getValue(processRef); |
| | | |
| | | group.entries.push(processDocuEntry); |
| | | } |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'); |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | var message = require('./implementation/MessageEventDefinition'), |
| | | signal = require('./implementation/SignalEventDefinition'), |
| | | error = require('./implementation/ErrorEventDefinition'), |
| | | escalation = require('./implementation/EscalationEventDefinition'), |
| | | timer = require('./implementation/TimerEventDefinition'), |
| | | compensation = require('./implementation/CompensateEventDefinition'), |
| | | condition = require('./implementation/ConditionalEventDefinition'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, elementRegistry, translate) { |
| | | var events = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:EndEvent', |
| | | 'bpmn:IntermediateThrowEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:IntermediateCatchEvent' |
| | | ]; |
| | | |
| | | // Message and Signal Event Definition |
| | | forEach(events, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | var messageEventDefinition = eventDefinitionHelper.getMessageEventDefinition(element), |
| | | signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element); |
| | | |
| | | if (messageEventDefinition) { |
| | | message(group, element, bpmnFactory, messageEventDefinition, translate); |
| | | } |
| | | |
| | | if (signalEventDefinition) { |
| | | signal(group, element, bpmnFactory, signalEventDefinition, translate); |
| | | } |
| | | |
| | | } |
| | | }); |
| | | |
| | | // Special Case: Receive Task |
| | | if (is(element, 'bpmn:ReceiveTask')) { |
| | | message(group, element, bpmnFactory, getBusinessObject(element), translate); |
| | | } |
| | | |
| | | // Error Event Definition |
| | | var errorEvents = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:EndEvent' |
| | | ]; |
| | | |
| | | forEach(errorEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | var errorEventDefinition = eventDefinitionHelper.getErrorEventDefinition(element); |
| | | |
| | | if (errorEventDefinition) { |
| | | |
| | | error(group, element, bpmnFactory, errorEventDefinition, translate); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | // Escalation Event Definition |
| | | var escalationEvents = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:IntermediateThrowEvent', |
| | | 'bpmn:EndEvent' |
| | | ]; |
| | | |
| | | forEach(escalationEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | var showEscalationCodeVariable = is(element, 'bpmn:StartEvent') || is(element, 'bpmn:BoundaryEvent'); |
| | | |
| | | // get business object |
| | | var escalationEventDefinition = eventDefinitionHelper.getEscalationEventDefinition(element); |
| | | |
| | | if (escalationEventDefinition) { |
| | | escalation(group, element, bpmnFactory, escalationEventDefinition, showEscalationCodeVariable, |
| | | translate); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | |
| | | // Timer Event Definition |
| | | var timerEvents = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:IntermediateCatchEvent' |
| | | ]; |
| | | |
| | | forEach(timerEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | // get business object |
| | | var timerEventDefinition = eventDefinitionHelper.getTimerEventDefinition(element); |
| | | |
| | | if (timerEventDefinition) { |
| | | timer(group, element, bpmnFactory, timerEventDefinition, translate); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | // Compensate Event Definition |
| | | var compensationEvents = [ |
| | | 'bpmn:EndEvent', |
| | | 'bpmn:IntermediateThrowEvent' |
| | | ]; |
| | | |
| | | forEach(compensationEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | // get business object |
| | | var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(element); |
| | | |
| | | if (compensateEventDefinition) { |
| | | compensation(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | |
| | | // Conditional Event Definition |
| | | var conditionalEvents = [ |
| | | 'bpmn:StartEvent', |
| | | 'bpmn:BoundaryEvent', |
| | | 'bpmn:IntermediateThrowEvent', |
| | | 'bpmn:IntermediateCatchEvent' |
| | | ]; |
| | | |
| | | if (isAny(element, conditionalEvents)) { |
| | | |
| | | // get business object |
| | | var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element); |
| | | |
| | | if (conditionalEventDefinition) { |
| | | condition(group, element, bpmnFactory, conditionalEventDefinition, elementRegistry, translate); |
| | | } |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'); |
| | | |
| | | var participantHelper = require('../../../helper/ParticipantHelper'); |
| | | |
| | | module.exports = function(group, element, translate) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | if (!bo) { |
| | | return; |
| | | } |
| | | |
| | | if (is(element, 'bpmn:Process') || (is(element, 'bpmn:Participant') && bo.get('processRef'))) { |
| | | |
| | | var executableEntry = entryFactory.checkbox({ |
| | | id: 'process-is-executable', |
| | | label: translate('Executable'), |
| | | modelProperty: 'isExecutable' |
| | | }); |
| | | |
| | | // in participants we have to change the default behavior of set and get |
| | | if (is(element, 'bpmn:Participant')) { |
| | | executableEntry.get = function(element) { |
| | | return participantHelper.getProcessBusinessObject(element, 'isExecutable'); |
| | | }; |
| | | |
| | | executableEntry.set = function(element, values) { |
| | | return participantHelper.modifyProcessBusinessObject(element, 'isExecutable', values); |
| | | }; |
| | | } |
| | | |
| | | group.entries.push(executableEntry); |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../factory/EntryFactory'), |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | utils = require('../../../Utils'), |
| | | cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | module.exports = function(group, element, translate, options) { |
| | | |
| | | var description = options && options.description; |
| | | |
| | | // Id |
| | | group.entries.push(entryFactory.validationAwareTextField({ |
| | | id: 'id', |
| | | label: translate('Id'), |
| | | description: description && translate(description), |
| | | modelProperty: 'id', |
| | | getProperty: function(element) { |
| | | return getBusinessObject(element).id; |
| | | }, |
| | | setProperty: function(element, properties) { |
| | | |
| | | element = element.labelTarget || element; |
| | | |
| | | return cmdHelper.updateProperties(element, properties); |
| | | }, |
| | | validate: function(element, values) { |
| | | var idValue = values.id; |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var idError = utils.isIdValid(bo, idValue, translate); |
| | | |
| | | return idError ? { id: idError } : {}; |
| | | } |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | entryFactory = require('../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../helper/CmdHelper'); |
| | | |
| | | var forEach = require('lodash/forEach'); |
| | | |
| | | function getLinkEventDefinition(element) { |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var linkEventDefinition = null; |
| | | if (bo.eventDefinitions) { |
| | | forEach(bo.eventDefinitions, function(eventDefinition) { |
| | | if (is(eventDefinition, 'bpmn:LinkEventDefinition')) { |
| | | linkEventDefinition = eventDefinition; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return linkEventDefinition; |
| | | } |
| | | |
| | | module.exports = function(group, element, translate) { |
| | | var linkEvents = [ 'bpmn:IntermediateThrowEvent', 'bpmn:IntermediateCatchEvent' ]; |
| | | |
| | | forEach(linkEvents, function(event) { |
| | | if (is(element, event)) { |
| | | |
| | | var linkEventDefinition = getLinkEventDefinition(element); |
| | | |
| | | if (linkEventDefinition) { |
| | | var entry = entryFactory.textField({ |
| | | id: 'link-event', |
| | | label: translate('Link Name'), |
| | | modelProperty: 'link-name' |
| | | }); |
| | | |
| | | entry.get = function() { |
| | | return { 'link-name': linkEventDefinition.get('name') }; |
| | | }; |
| | | |
| | | entry.set = function(element, values) { |
| | | var newProperties = { |
| | | name: values['link-name'] |
| | | }; |
| | | return cmdHelper.updateBusinessObject(element, linkEventDefinition, newProperties); |
| | | }; |
| | | |
| | | group.entries.push(entry); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var nameEntryFactory = require('./implementation/Name'), |
| | | createCategoryValue = require('../../../helper/CategoryHelper').createCategoryValue, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject; |
| | | |
| | | module.exports = function(group, element, bpmnFactory, canvas, translate) { |
| | | |
| | | function initializeCategory(semantic) { |
| | | var rootElement = canvas.getRootElement(), |
| | | definitions = getBusinessObject(rootElement).$parent, |
| | | categoryValue = createCategoryValue(definitions, bpmnFactory); |
| | | |
| | | semantic.categoryValueRef = categoryValue; |
| | | |
| | | } |
| | | |
| | | function setGroupName(element, values) { |
| | | var bo = getBusinessObject(element), |
| | | categoryValueRef = bo.categoryValueRef; |
| | | |
| | | if (!categoryValueRef) { |
| | | initializeCategory(bo); |
| | | } |
| | | |
| | | // needs direct call to update categoryValue properly |
| | | return { |
| | | cmd: 'element.updateLabel', |
| | | context: { |
| | | element: element, |
| | | newLabel: values.categoryValue |
| | | } |
| | | }; |
| | | } |
| | | |
| | | function getGroupName(element) { |
| | | var bo = getBusinessObject(element), |
| | | value = (bo.categoryValueRef || {}).value; |
| | | |
| | | return { categoryValue: value }; |
| | | } |
| | | |
| | | if (!is(element, 'bpmn:Collaboration')) { |
| | | |
| | | var options; |
| | | if (is(element, 'bpmn:TextAnnotation')) { |
| | | options = { modelProperty: 'text', label: translate('Text') }; |
| | | } else if (is(element, 'bpmn:Group')) { |
| | | options = { |
| | | modelProperty: 'categoryValue', |
| | | label: translate('Category Value'), |
| | | get: getGroupName, |
| | | set: setGroupName |
| | | }; |
| | | } |
| | | |
| | | // name |
| | | group.entries = group.entries.concat(nameEntryFactory(element, options, translate)); |
| | | |
| | | } |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | entryFactory = require('../../../factory/EntryFactory'), |
| | | participantHelper = require('../../../helper/ParticipantHelper'), |
| | | getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | nameEntryFactory = require('./implementation/Name'), |
| | | utils = require('../../../Utils'); |
| | | |
| | | module.exports = function(group, element, translate, options) { |
| | | var businessObject = getBusinessObject(element); |
| | | |
| | | var processIdDescription = options && options.processIdDescription; |
| | | |
| | | if (is(element, 'bpmn:Process') || (is(element, 'bpmn:Participant') && businessObject.get('processRef'))) { |
| | | |
| | | /** |
| | | * processId |
| | | */ |
| | | if (is(element, 'bpmn:Participant')) { |
| | | var idEntry = entryFactory.validationAwareTextField({ |
| | | id: 'process-id', |
| | | label: translate('Process Id'), |
| | | description: processIdDescription && translate(processIdDescription), |
| | | modelProperty: 'processId' |
| | | }); |
| | | |
| | | // in participants we have to change the default behavior of set and get |
| | | idEntry.get = function(element) { |
| | | var properties = participantHelper.getProcessBusinessObject(element, 'id'); |
| | | return { processId: properties.id }; |
| | | }; |
| | | |
| | | idEntry.set = function(element, values) { |
| | | return participantHelper.modifyProcessBusinessObject(element, 'id', { id: values.processId }); |
| | | }; |
| | | |
| | | idEntry.validate = function(element, values) { |
| | | var idValue = values.processId; |
| | | |
| | | var bo = getBusinessObject(element); |
| | | |
| | | var processIdError = utils.isIdValid(bo.processRef, idValue, translate); |
| | | |
| | | return processIdError ? { processId: processIdError } : {}; |
| | | }; |
| | | |
| | | group.entries.push(idEntry); |
| | | |
| | | |
| | | /** |
| | | * process name |
| | | */ |
| | | var processNameEntry = nameEntryFactory(element, { |
| | | id: 'process-name', |
| | | label: translate('Process Name') |
| | | })[0]; |
| | | |
| | | // in participants we have to change the default behavior of set and get |
| | | processNameEntry.get = function(element) { |
| | | return participantHelper.getProcessBusinessObject(element, 'name'); |
| | | }; |
| | | |
| | | processNameEntry.set = function(element, values) { |
| | | return participantHelper.modifyProcessBusinessObject(element, 'name', values); |
| | | }; |
| | | |
| | | group.entries.push(processNameEntry); |
| | | } |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'), |
| | | eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'), |
| | | utils = require('../../../../Utils'); |
| | | |
| | | var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject, |
| | | is = require('bpmn-js/lib/util/ModelUtil').is; |
| | | |
| | | var forEach = require('lodash/forEach'), |
| | | find = require('lodash/find'), |
| | | filter = require('lodash/filter'); |
| | | |
| | | |
| | | function getContainedActivities(element) { |
| | | return getFlowElements(element, 'bpmn:Activity'); |
| | | } |
| | | |
| | | function getContainedBoundaryEvents(element) { |
| | | return getFlowElements(element, 'bpmn:BoundaryEvent'); |
| | | } |
| | | |
| | | function getFlowElements(element, type) { |
| | | return utils.filterElementsByType(element.flowElements, type); |
| | | } |
| | | |
| | | function isCompensationEventAttachedToActivity(activity, boundaryEvents) { |
| | | var activityId = activity.id; |
| | | var boundaryEvent = find(boundaryEvents, function(boundaryEvent) { |
| | | var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(boundaryEvent); |
| | | var attachedToRef = boundaryEvent.attachedToRef; |
| | | return compensateEventDefinition && attachedToRef && attachedToRef.id === activityId; |
| | | }); |
| | | return !!boundaryEvent; |
| | | } |
| | | |
| | | // subprocess: only when it is not triggeredByEvent |
| | | // activity: only when it attach a compensation boundary event |
| | | // callActivity: no limitation |
| | | function canActivityBeCompensated(activity, boundaryEvents) { |
| | | return (is(activity, 'bpmn:SubProcess') && !activity.triggeredByEvent) || |
| | | is(activity, 'bpmn:CallActivity') || |
| | | isCompensationEventAttachedToActivity(activity, boundaryEvents); |
| | | } |
| | | |
| | | function getActivitiesForCompensation(element) { |
| | | var boundaryEvents = getContainedBoundaryEvents(element); |
| | | return filter(getContainedActivities(element), function(activity) { |
| | | return canActivityBeCompensated(activity, boundaryEvents); |
| | | }); |
| | | } |
| | | |
| | | function getActivitiesForActivityRef(element) { |
| | | var bo = getBusinessObject(element); |
| | | var parent = bo.$parent; |
| | | |
| | | var activitiesForActivityRef = getActivitiesForCompensation(parent); |
| | | |
| | | // if throwing compensation event is in an event sub process: |
| | | // get also all activities outside of the event sub process |
| | | if (is(parent, 'bpmn:SubProcess') && parent.triggeredByEvent) { |
| | | parent = parent.$parent; |
| | | if (parent) { |
| | | activitiesForActivityRef = activitiesForActivityRef.concat(getActivitiesForCompensation(parent)); |
| | | } |
| | | |
| | | } |
| | | |
| | | return activitiesForActivityRef; |
| | | } |
| | | |
| | | function createActivityRefOptions(element) { |
| | | var options = [ { value: '' } ]; |
| | | |
| | | var activities = getActivitiesForActivityRef(element); |
| | | forEach(activities, function(activity) { |
| | | var activityId = activity.id; |
| | | var name = (activity.name ? (activity.name + ' ') : '') + '(id=' + activityId + ')'; |
| | | options.push({ value: activityId, name: name }); |
| | | }); |
| | | |
| | | return options; |
| | | } |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate) { |
| | | |
| | | group.entries.push(entryFactory.checkbox({ |
| | | id: 'wait-for-completion', |
| | | label: translate('Wait for Completion'), |
| | | modelProperty: 'waitForCompletion', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | waitForCompletion: compensateEventDefinition.waitForCompletion |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | values.waitForCompletion = values.waitForCompletion || false; |
| | | return cmdHelper.updateBusinessObject(element, compensateEventDefinition, values); |
| | | } |
| | | })); |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'activity-ref', |
| | | label: translate('Activity Ref'), |
| | | selectOptions: createActivityRefOptions(element), |
| | | modelProperty: 'activityRef', |
| | | |
| | | get: function(element, node) { |
| | | var activityRef = compensateEventDefinition.activityRef; |
| | | activityRef = activityRef && activityRef.id; |
| | | return { |
| | | activityRef: activityRef || '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var activityRef = values.activityRef || undefined; |
| | | activityRef = activityRef && getBusinessObject(elementRegistry.get(activityRef)); |
| | | return cmdHelper.updateBusinessObject(element, compensateEventDefinition, { |
| | | activityRef: activityRef |
| | | }); |
| | | } |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var is = require('bpmn-js/lib/util/ModelUtil').is, |
| | | isEventSubProcess = require('bpmn-js/lib/util/DiUtil').isEventSubProcess; |
| | | |
| | | module.exports = function(group, element, bpmnFactory, conditionalEventDefinition, elementRegistry, translate) { |
| | | |
| | | var getValue = function(modelProperty) { |
| | | return function(element) { |
| | | var modelPropertyValue = conditionalEventDefinition.get('camunda:' + modelProperty); |
| | | var value = {}; |
| | | |
| | | value[modelProperty] = modelPropertyValue; |
| | | return value; |
| | | }; |
| | | }; |
| | | |
| | | var setValue = function(modelProperty) { |
| | | return function(element, values) { |
| | | var props = {}; |
| | | |
| | | props['camunda:' + modelProperty] = values[modelProperty] || undefined; |
| | | |
| | | return cmdHelper.updateBusinessObject(element, conditionalEventDefinition, props); |
| | | }; |
| | | }; |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'variableName', |
| | | label: translate('Variable Name'), |
| | | modelProperty : 'variableName', |
| | | |
| | | get: getValue('variableName'), |
| | | set: setValue('variableName') |
| | | })); |
| | | |
| | | var isConditionalStartEvent = |
| | | is(element, 'bpmn:StartEvent') && !isEventSubProcess(element.parent); |
| | | |
| | | if (!isConditionalStartEvent) { |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'variableEvent', |
| | | label: translate('Variable Event'), |
| | | description: translate('Specify more than one variable change event as a comma separated list.'), |
| | | modelProperty : 'variableEvent', |
| | | |
| | | get: getValue('variableEvent'), |
| | | set: setValue('variableEvent') |
| | | })); |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | /** |
| | | * Create an entry to modify a property of an element which |
| | | * is referenced by a event definition. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {ModdleElement} definition |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * @param {Object} options |
| | | * @param {string} options.id the id of the entry |
| | | * @param {string} options.label the label of the entry |
| | | * @param {string} options.referenceProperty the name of referencing property |
| | | * @param {string} options.modelProperty the name of property to modify |
| | | * @param {string} options.shouldValidate a flag indicate whether to validate or not |
| | | * |
| | | * @return {Array<Object>} return an array containing the entries |
| | | */ |
| | | module.exports = function(element, definition, bpmnFactory, options) { |
| | | |
| | | var id = options.id || 'element-property'; |
| | | var label = options.label; |
| | | var referenceProperty = options.referenceProperty; |
| | | var modelProperty = options.modelProperty || 'name'; |
| | | var shouldValidate = options.shouldValidate || false; |
| | | |
| | | var entry = entryFactory.textField({ |
| | | id: id, |
| | | label: label, |
| | | modelProperty: modelProperty, |
| | | |
| | | get: function(element, node) { |
| | | var reference = definition.get(referenceProperty); |
| | | var props = {}; |
| | | props[modelProperty] = reference && reference.get(modelProperty); |
| | | return props; |
| | | }, |
| | | |
| | | set: function(element, values, node) { |
| | | var reference = definition.get(referenceProperty); |
| | | var props = {}; |
| | | props[modelProperty] = values[modelProperty] || undefined; |
| | | return cmdHelper.updateBusinessObject(element, reference, props); |
| | | }, |
| | | |
| | | hidden: function(element, node) { |
| | | return !definition.get(referenceProperty); |
| | | } |
| | | }); |
| | | |
| | | if (shouldValidate) { |
| | | entry.validate = function(element, values, node) { |
| | | var reference = definition.get(referenceProperty); |
| | | if (reference && !values[modelProperty]) { |
| | | var validationErrors = {}; |
| | | validationErrors[modelProperty] = 'Must provide a value'; |
| | | return validationErrors; |
| | | } |
| | | }; |
| | | } |
| | | |
| | | return [ entry ]; |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var eventDefinitionReference = require('./EventDefinitionReference'), |
| | | elementReferenceProperty = require('./ElementReferenceProperty'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, errorEventDefinition, translate) { |
| | | |
| | | |
| | | group.entries = group.entries.concat(eventDefinitionReference(element, errorEventDefinition, bpmnFactory, { |
| | | label: translate('Error'), |
| | | elementName: 'error', |
| | | elementType: 'bpmn:Error', |
| | | referenceProperty: 'errorRef', |
| | | newElementIdPrefix: 'Error_' |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, errorEventDefinition, bpmnFactory, { |
| | | id: 'error-element-name', |
| | | label: translate('Error Name'), |
| | | referenceProperty: 'errorRef', |
| | | modelProperty: 'name', |
| | | shouldValidate: true |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, errorEventDefinition, bpmnFactory, { |
| | | id: 'error-element-code', |
| | | label: translate('Error Code'), |
| | | referenceProperty: 'errorRef', |
| | | modelProperty: 'errorCode' |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var eventDefinitionReference = require('./EventDefinitionReference'), |
| | | elementReferenceProperty = require('./ElementReferenceProperty'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, escalationEventDefinition, showEscalationCodeVariable, translate) { |
| | | |
| | | group.entries = group.entries.concat(eventDefinitionReference(element, escalationEventDefinition, bpmnFactory, { |
| | | label: translate('Escalation'), |
| | | elementName: 'escalation', |
| | | elementType: 'bpmn:Escalation', |
| | | referenceProperty: 'escalationRef', |
| | | newElementIdPrefix: 'Escalation_' |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, escalationEventDefinition, bpmnFactory, { |
| | | id: 'escalation-element-name', |
| | | label: translate('Escalation Name'), |
| | | referenceProperty: 'escalationRef', |
| | | modelProperty: 'name', |
| | | shouldValidate: true |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, escalationEventDefinition, bpmnFactory, { |
| | | id: 'escalation-element-code', |
| | | label: translate('Escalation Code'), |
| | | referenceProperty: 'escalationRef', |
| | | modelProperty: 'escalationCode' |
| | | })); |
| | | |
| | | |
| | | if (showEscalationCodeVariable) { |
| | | group.entries.push(entryFactory.textField({ |
| | | id : 'escalationCodeVariable', |
| | | label : translate('Escalation Code Variable'), |
| | | modelProperty : 'escalationCodeVariable', |
| | | |
| | | get: function(element) { |
| | | var codeVariable = escalationEventDefinition.get('camunda:escalationCodeVariable'); |
| | | return { |
| | | escalationCodeVariable: codeVariable |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | return cmdHelper.updateBusinessObject(element, escalationEventDefinition, { |
| | | 'camunda:escalationCodeVariable': values.escalationCodeVariable || undefined |
| | | }); |
| | | } |
| | | })); |
| | | } |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var domQuery = require('min-dom').query, |
| | | domify = require('min-dom').domify, |
| | | domAttr = require('min-dom').attr; |
| | | |
| | | var forEach = require('lodash/forEach'), |
| | | find = require('lodash/find'); |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'); |
| | | var utils = require('../../../../Utils'), |
| | | escapeHTML = utils.escapeHTML; |
| | | |
| | | var selector = 'select[name=selectedElement]'; |
| | | |
| | | /** |
| | | * Get select box containing all elements. |
| | | * |
| | | * @param {DOMElement} node |
| | | * |
| | | * @return {DOMElement} the select box |
| | | */ |
| | | function getSelectBox(node) { |
| | | return domQuery(selector, node.parentElement); |
| | | } |
| | | |
| | | /** |
| | | * Find element by given id. |
| | | * |
| | | * @param {ModdleElement} eventDefinition |
| | | * |
| | | * @return {ModdleElement} an element |
| | | */ |
| | | function findElementById(eventDefinition, type, id) { |
| | | var elements = utils.findRootElementsByType(eventDefinition, type); |
| | | return find(elements, function(element) { |
| | | return element.id === id; |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Create an entry to modify the reference to an element from an |
| | | * event definition. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {ModdleElement} definition |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * @param {Object} options |
| | | * @param {string} options.label the label of the entry |
| | | * @param {string} options.description the description of the entry |
| | | * @param {string} options.elementName the name of the element |
| | | * @param {string} options.elementType the type of the element |
| | | * @param {string} options.referenceProperty the name of referencing property |
| | | * @param {string} options.newElementIdPrefix the prefix of a new created element |
| | | * |
| | | * @return {Array<Object>} return an array containing the entries |
| | | */ |
| | | module.exports = function(element, definition, bpmnFactory, options) { |
| | | |
| | | var elementName = options.elementName || '', |
| | | elementType = options.elementType, |
| | | referenceProperty = options.referenceProperty; |
| | | |
| | | var newElementIdPrefix = options.newElementIdPrefix || 'elem_'; |
| | | |
| | | var label = options.label || '', |
| | | description = options.description || ''; |
| | | |
| | | var entries = []; |
| | | |
| | | entries.push({ |
| | | |
| | | id: 'event-definitions-' + elementName, |
| | | description: description, |
| | | html: '<div class="bpp-row bpp-select">' + |
| | | '<label for="camunda-' + escapeHTML(elementName) + '">' + escapeHTML(label) + '</label>' + |
| | | '<div class="bpp-field-wrapper">' + |
| | | '<select id="camunda-' + escapeHTML(elementName) + '" name="selectedElement" data-value>' + |
| | | '</select>' + |
| | | '<button class="add" id="addElement" data-action="addElement"><span>+</span></button>' + |
| | | '</div>' + |
| | | '</div>', |
| | | |
| | | get: function(element, entryNode) { |
| | | utils.updateOptionsDropDown(selector, definition, elementType, entryNode); |
| | | var reference = definition.get(referenceProperty); |
| | | return { |
| | | selectedElement: (reference && reference.id) || '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var selection = values.selectedElement; |
| | | |
| | | var props = {}; |
| | | |
| | | if (!selection || typeof selection === 'undefined') { |
| | | // remove reference to element |
| | | props[referenceProperty] = undefined; |
| | | return cmdHelper.updateBusinessObject(element, definition, props); |
| | | } |
| | | |
| | | var commands = []; |
| | | |
| | | var selectedElement = findElementById(definition, elementType, selection); |
| | | if (!selectedElement) { |
| | | var root = utils.getRoot(definition); |
| | | |
| | | // create a new element |
| | | selectedElement = elementHelper.createElement(elementType, { name: selection }, root, bpmnFactory); |
| | | commands.push(cmdHelper.addAndRemoveElementsFromList(element, root, 'rootElements', null, [ selectedElement ])); |
| | | } |
| | | |
| | | // update reference to element |
| | | props[referenceProperty] = selectedElement; |
| | | commands.push(cmdHelper.updateBusinessObject(element, definition, props)); |
| | | |
| | | return commands; |
| | | }, |
| | | |
| | | addElement: function(element, inputNode) { |
| | | // note: this generated id will be used as name |
| | | // of the element and not as id |
| | | var id = utils.nextId(newElementIdPrefix); |
| | | |
| | | var optionTemplate = domify('<option value="' + escapeHTML(id) + '"> (id='+escapeHTML(id)+')' + '</option>'); |
| | | |
| | | // add new option |
| | | var selectBox = getSelectBox(inputNode); |
| | | selectBox.insertBefore(optionTemplate, selectBox.firstChild); |
| | | |
| | | // select new element in the select box |
| | | forEach(selectBox, function(option) { |
| | | if (option.value === id) { |
| | | domAttr(option, 'selected', 'selected'); |
| | | } else { |
| | | domAttr(option, 'selected', null); |
| | | } |
| | | }); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | }); |
| | | |
| | | return entries; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var eventDefinitionReference = require('./EventDefinitionReference'), |
| | | elementReferenceProperty = require('./ElementReferenceProperty'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, messageEventDefinition, translate) { |
| | | |
| | | group.entries = group.entries.concat(eventDefinitionReference(element, messageEventDefinition, bpmnFactory, { |
| | | label: translate('Message'), |
| | | elementName: 'message', |
| | | elementType: 'bpmn:Message', |
| | | referenceProperty: 'messageRef', |
| | | newElementIdPrefix: 'Message_' |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, messageEventDefinition, bpmnFactory, { |
| | | id: 'message-element-name', |
| | | label: translate('Message Name'), |
| | | referenceProperty: 'messageRef', |
| | | modelProperty: 'name', |
| | | shouldValidate: true |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | /** |
| | | * Create an entry to modify the name of an an element. |
| | | * |
| | | * @param {djs.model.Base} element |
| | | * @param {Object} options |
| | | * @param {string} options.id the id of the entry |
| | | * @param {string} options.label the label of the entry |
| | | * |
| | | * @return {Array<Object>} return an array containing |
| | | * the entry to modify the name |
| | | */ |
| | | module.exports = function(element, options, translate) { |
| | | |
| | | options = options || {}; |
| | | var id = options.id || 'name', |
| | | label = options.label || translate('Name'), |
| | | modelProperty = options.modelProperty || 'name'; |
| | | |
| | | var nameEntry = entryFactory.textBox({ |
| | | id: id, |
| | | label: label, |
| | | modelProperty: modelProperty, |
| | | get: options.get, |
| | | set: options.set |
| | | }); |
| | | |
| | | return [ nameEntry ]; |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var eventDefinitionReference = require('./EventDefinitionReference'), |
| | | elementReferenceProperty = require('./ElementReferenceProperty'); |
| | | |
| | | |
| | | module.exports = function(group, element, bpmnFactory, signalEventDefinition, translate) { |
| | | |
| | | group.entries = group.entries.concat(eventDefinitionReference(element, signalEventDefinition, bpmnFactory, { |
| | | label: translate('Signal'), |
| | | elementName: 'signal', |
| | | elementType: 'bpmn:Signal', |
| | | referenceProperty: 'signalRef', |
| | | newElementIdPrefix: 'Signal_' |
| | | })); |
| | | |
| | | |
| | | group.entries = group.entries.concat(elementReferenceProperty(element, signalEventDefinition, bpmnFactory, { |
| | | id: 'signal-element-name', |
| | | label: translate('Signal Name'), |
| | | referenceProperty: 'signalRef', |
| | | modelProperty: 'name', |
| | | shouldValidate: true |
| | | })); |
| | | |
| | | }; |
New file |
| | |
| | | 'use strict'; |
| | | |
| | | var elementHelper = require('../../../../helper/ElementHelper'), |
| | | cmdHelper = require('../../../../helper/CmdHelper'); |
| | | |
| | | var entryFactory = require('../../../../factory/EntryFactory'); |
| | | |
| | | /** |
| | | * Get the timer definition type for a given timer event definition. |
| | | * |
| | | * @param {ModdleElement<bpmn:TimerEventDefinition>} timer |
| | | * |
| | | * @return {string|undefined} the timer definition type |
| | | */ |
| | | function getTimerDefinitionType(timer) { |
| | | var timeDate = timer.get('timeDate'); |
| | | if (typeof timeDate !== 'undefined') { |
| | | return 'timeDate'; |
| | | } |
| | | |
| | | var timeCycle = timer.get('timeCycle'); |
| | | if (typeof timeCycle !== 'undefined') { |
| | | return 'timeCycle'; |
| | | } |
| | | |
| | | var timeDuration = timer.get('timeDuration'); |
| | | if (typeof timeDuration !== 'undefined') { |
| | | return 'timeDuration'; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Creates 'bpmn:FormalExpression' element. |
| | | * |
| | | * @param {ModdleElement} parent |
| | | * @param {string} body |
| | | * @param {BpmnFactory} bpmnFactory |
| | | * |
| | | * @return {ModdleElement<bpmn:FormalExpression>} a formal expression |
| | | */ |
| | | function createFormalExpression(parent, body, bpmnFactory) { |
| | | body = body || undefined; |
| | | return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory); |
| | | } |
| | | |
| | | function TimerEventDefinition(group, element, bpmnFactory, timerEventDefinition, translate) { |
| | | |
| | | var selectOptions = [ |
| | | { value: 'timeDate', name: translate('Date') }, |
| | | { value: 'timeDuration', name: translate('Duration') }, |
| | | { value: 'timeCycle', name: translate('Cycle') } |
| | | ]; |
| | | |
| | | group.entries.push(entryFactory.selectBox({ |
| | | id: 'timer-event-definition-type', |
| | | label: translate('Timer Definition Type'), |
| | | selectOptions: selectOptions, |
| | | emptyParameter: true, |
| | | modelProperty: 'timerDefinitionType', |
| | | |
| | | get: function(element, node) { |
| | | return { |
| | | timerDefinitionType: getTimerDefinitionType(timerEventDefinition) || '' |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var props = { |
| | | timeDuration: undefined, |
| | | timeDate: undefined, |
| | | timeCycle: undefined |
| | | }; |
| | | |
| | | var newType = values.timerDefinitionType; |
| | | if (values.timerDefinitionType) { |
| | | var oldType = getTimerDefinitionType(timerEventDefinition); |
| | | |
| | | var value; |
| | | if (oldType) { |
| | | var definition = timerEventDefinition.get(oldType); |
| | | value = definition.get('body'); |
| | | } |
| | | |
| | | props[newType] = createFormalExpression(timerEventDefinition, value, bpmnFactory); |
| | | } |
| | | |
| | | return cmdHelper.updateBusinessObject(element, timerEventDefinition, props); |
| | | } |
| | | |
| | | })); |
| | | |
| | | |
| | | group.entries.push(entryFactory.textField({ |
| | | id: 'timer-event-definition', |
| | | label: translate('Timer Definition'), |
| | | modelProperty: 'timerDefinition', |
| | | |
| | | get: function(element, node) { |
| | | var type = getTimerDefinitionType(timerEventDefinition); |
| | | var definition = type && timerEventDefinition.get(type); |
| | | var value = definition && definition.get('body'); |
| | | return { |
| | | timerDefinition: value |
| | | }; |
| | | }, |
| | | |
| | | set: function(element, values) { |
| | | var type = getTimerDefinitionType(timerEventDefinition); |
| | | var definition = type && timerEventDefinition.get(type); |
| | | |
| | | if (definition) { |
| | | return cmdHelper.updateBusinessObject(element, definition, { |
| | | body: values.timerDefinition || undefined |
| | | }); |
| | | } |
| | | }, |
| | | |
| | | validate: function(element) { |
| | | var type = getTimerDefinitionType(timerEventDefinition); |
| | | var definition = type && timerEventDefinition.get(type); |
| | | if (definition) { |
| | | var value = definition.get('body'); |
| | | if (!value) { |
| | | return { |
| | | timerDefinition: translate('Must provide a value') |
| | | }; |
| | | } |
| | | } |
| | | }, |
| | | |
| | | hidden: function(element) { |
| | | return !getTimerDefinitionType(timerEventDefinition); |
| | | } |
| | | |
| | | })); |
| | | |
| | | } |
| | | |
| | | module.exports = TimerEventDefinition; |
New file |
| | |
| | | /** |
| | | * @description 全局功能封装 |
| | | * @author zr |
| | | * @type {{registerFileDrop(*, *): void, saveBpmn(Object): void, handleDragOver(*): void, setColor(Object): void, downLoad(Object): void, upload(Object, Object, Object): void, handleFileSelect(*): void, setEncoded(Object, string, string): void, openFromUrl(Object, Object, Object, string): void, createDiagram(string, Object, Object): Promise<void>, getUrlParam: tools.getUrlParam}} |
| | | */ |
| | | |
| | | import $ from 'jquery'; |
| | | const proHost = window.location.protocol + "//" + window.location.host; |
| | | const href = window.location.href.split("bpmnjs")[0]; |
| | | const key = href.split(window.location.host)[1]; |
| | | const publicurl = proHost + key; |
| | | const tools = { |
| | | registerFileDrop(container, callback) { |
| | | container.get(0).addEventListener('dragover', tools.handleDragOver, false); |
| | | container.get(0).addEventListener('drop', tools.handleFileSelect, false); |
| | | }, |
| | | /** |
| | | * 获取地址栏参数 |
| | | * @param {string} value |
| | | */ |
| | | getUrlParam: function (url) { |
| | | var object = {}; |
| | | if (url.indexOf("?") != -1) { |
| | | var str = url.split("?")[1]; |
| | | var strs = str.split("&"); |
| | | for (var i = 0; i < strs.length; i++) { |
| | | object[strs[i].split("=")[0]] = strs[i].split("=")[1] |
| | | } |
| | | return object |
| | | } |
| | | return object[url]; |
| | | }, |
| | | /** |
| | | * 通过xml创建bpmn |
| | | * @param {string} xml 创建bpms xml |
| | | * @param {object} bpmnModeler bpmn对象 |
| | | * @param {object} container 容器对象 |
| | | */ |
| | | async createDiagram(xml, bpmnModeler, container) { |
| | | try { |
| | | await bpmnModeler.importXML(xml); |
| | | container.removeClass('with-error').addClass('with-diagram'); |
| | | } catch (err) { |
| | | container.removeClass('with-diagram').addClass('with-error'); |
| | | container.find('.error pre').text(err.message); |
| | | console.error(err); |
| | | } |
| | | }, |
| | | /** |
| | | * 通过Json设置颜色 |
| | | * @param {object} json json 字符串 |
| | | */ |
| | | setColor(json,bpmnModeler) { |
| | | var modeling = bpmnModeler.get('modeling'); |
| | | var elementRegistry = bpmnModeler.get('elementRegistry') |
| | | var elementToColor = elementRegistry.get(json.name); |
| | | if(elementToColor){ |
| | | modeling.setColor([elementToColor], { |
| | | stroke: json.stroke, |
| | | fill: json.fill |
| | | }); |
| | | } |
| | | }, |
| | | /** |
| | | * 保存bpmn对象 |
| | | * @param {object} bpmnModeler bpmn对象 |
| | | */ |
| | | saveBpmn(bpmnModeler) { |
| | | bpmnModeler.saveXML({ format: true }, function (err, xml) { |
| | | if (err) { |
| | | return console.error('保存失败,请重试', err); |
| | | } |
| | | console.log(xml) |
| | | var param={ |
| | | "stringBPMN":xml |
| | | } |
| | | $.ajax({ |
| | | url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/addDeploymentByString', |
| | | type: 'POST', |
| | | dataType:"json", |
| | | data: param, |
| | | //headers:{'Content-Type':'application/json;charset=utf8'}, |
| | | success: function (result) { |
| | | if(result.code===200){ |
| | | tools.syhide('alert') |
| | | }else{ |
| | | alert(result.msg) |
| | | } |
| | | }, |
| | | error: function (err) { |
| | | console.log(err) |
| | | } |
| | | }); |
| | | }); |
| | | }, |
| | | /** |
| | | * 下载bpmn |
| | | * @param {object} bpmnModeler bpmn对象 |
| | | */ |
| | | downLoad(bpmnModeler) { |
| | | var downloadLink = $("#downloadBpmn") |
| | | bpmnModeler.saveXML({ format: true }, function (err, xml) { |
| | | if (err) { |
| | | return console.error('could not save BPMN 2.0 diagram', err); |
| | | } |
| | | tools.setEncoded(downloadLink, 'diagram.bpmn', err ? null : xml); |
| | | }); |
| | | }, |
| | | /** |
| | | * 转码xml并下载 |
| | | * @param {object} link 按钮 |
| | | * @param {string} name 下载名称 |
| | | * @param {string} data base64XML |
| | | */ |
| | | setEncoded(link, name, data) { |
| | | var encodedData = encodeURIComponent(data); |
| | | if (data) { |
| | | link.addClass('active').attr({ |
| | | 'href': 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData, |
| | | 'download': name |
| | | }); |
| | | } else { |
| | | link.removeClass('active'); |
| | | } |
| | | }, |
| | | /** |
| | | * 上传bpmn |
| | | * @param {object} bpmnModeler bpmn对象 |
| | | * @param {object} container 容器对象 |
| | | */ |
| | | upload(bpmnModeler, container) { |
| | | var FileUpload = document.myForm.uploadFile.files[0]; |
| | | var fm = new FormData(); |
| | | fm.append('processFile', FileUpload); |
| | | $.ajax({ |
| | | url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/upload', |
| | | // url: 'http://localhost:8080/processDefinition/upload', |
| | | type: 'POST', |
| | | data: fm, |
| | | async: false, |
| | | contentType: false, //禁止设置请求类型 |
| | | processData: false, //禁止jquery对DAta数据的处理,默认会处理 |
| | | success: function (result) { |
| | | var url = result.data.substr(0,4)=="http"?result.data:localStorage.getItem("VUE_APP_BASE_API")+ result.data |
| | | tools.openFromUrl(bpmnModeler, container, url) |
| | | }, |
| | | error: function (err) { |
| | | console.log(err) |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 打开xml Url 地址 |
| | | * @param {object} bpmnModeler bpmn对象 |
| | | * @param {object} container 容器对象 |
| | | * @param {string} url url地址 |
| | | */ |
| | | openFromUrl(bpmnModeler, container, url) { |
| | | $.ajax(url, { dataType: 'text' }).done(async function (xml) { |
| | | try { |
| | | await bpmnModeler.importXML(xml); |
| | | container.removeClass('with-error').addClass('with-diagram'); |
| | | } catch (err) { |
| | | console.error(err); |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 打开弹出框 |
| | | * @param id |
| | | */ |
| | | syopen(id) { |
| | | var dom = $("#" + id); |
| | | this.sycenter(dom); |
| | | dom.addClass(name); |
| | | dom.show(); |
| | | var that = this; |
| | | $(".sy-mask").fadeIn(300) |
| | | setTimeout(function() { |
| | | dom.removeClass(name) |
| | | }, 300); |
| | | |
| | | }, |
| | | /** |
| | | * 隐藏弹出框 |
| | | * @param id |
| | | */ |
| | | syhide(id) { |
| | | if (typeof id == "undefined") { |
| | | var dom = $(".sy-alert") |
| | | } else { |
| | | var dom = $("#" + id) |
| | | } |
| | | var name = dom.attr("sy-leave"); |
| | | dom.addClass(name); |
| | | $(".sy-mask").fadeOut(300); |
| | | setTimeout(function() { |
| | | dom.hide(); |
| | | dom.removeClass(name); |
| | | }, 300) |
| | | }, |
| | | /** |
| | | * 弹出框居中 |
| | | * @param dom |
| | | */ |
| | | sycenter(dom) { |
| | | var mgtop = parseFloat(dom.height() / 2); |
| | | dom.css({ |
| | | "top": "50%", |
| | | "margin-top": "-" + mgtop + "px" |
| | | }) |
| | | }, |
| | | /** |
| | | * 判断是否是数组 |
| | | * @param value |
| | | * @returns {arg is Array<any>|boolean} |
| | | */ |
| | | isArrayFn(value){ |
| | | if (typeof Array.isArray === "function") { |
| | | return Array.isArray(value); |
| | | }else{ |
| | | return Object.prototype.toString.call(value) === "[object Array]"; |
| | | } |
| | | }, |
| | | /** |
| | | * 根据数据设置颜色 |
| | | * @param data |
| | | * @returns {Array} |
| | | */ |
| | | getByColor(data){ |
| | | |
| | | var ColorJson=[] |
| | | for(var k in data['highLine']){ |
| | | var par={ |
| | | "name": data['highLine'][k], |
| | | "stroke":"green", |
| | | "fill":"green" |
| | | } |
| | | ColorJson.push(par) |
| | | } |
| | | for(var k in data['highPoint']){ |
| | | var par={ |
| | | "name": data['highPoint'][k], |
| | | "stroke":"gray", |
| | | "fill":"#eae9e9" |
| | | |
| | | } |
| | | ColorJson.push(par) |
| | | } |
| | | for(var k in data['iDo']){ |
| | | var par={ |
| | | "name": data['iDo'][k], |
| | | "stroke":"green", |
| | | "fill":"#a3d68e" |
| | | } |
| | | ColorJson.push(par) |
| | | } |
| | | for(var k in data['waitingToDo']){ |
| | | var par={ |
| | | "name": data['waitingToDo'][k], |
| | | "stroke":"green", |
| | | "fill":"yellow" |
| | | } |
| | | ColorJson.push(par) |
| | | } |
| | | return ColorJson |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | export default tools |
New file |
| | |
| | | @import "bpmn-js-properties-panel/styles/properties"; |
| | | |
| | | * { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | body, |
| | | html { |
| | | |
| | | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; |
| | | |
| | | font-size: 12px; |
| | | |
| | | height: 100%; |
| | | max-height: 100%; |
| | | padding: 0; |
| | | margin: 0; |
| | | } |
| | | |
| | | a:link { |
| | | text-decoration: none; |
| | | } |
| | | |
| | | .content { |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100%; |
| | | |
| | | > .message { |
| | | width: 100%; |
| | | height: 100%; |
| | | text-align: center; |
| | | display: table; |
| | | |
| | | font-size: 16px; |
| | | color: #111; |
| | | |
| | | .note { |
| | | vertical-align: middle; |
| | | text-align: center; |
| | | display: table-cell; |
| | | } |
| | | |
| | | &.error { |
| | | .details { |
| | | max-width: 500px; |
| | | font-size: 12px; |
| | | margin: 20px auto; |
| | | text-align: left; |
| | | color: #BD2828; |
| | | } |
| | | |
| | | pre { |
| | | border: solid 1px #BD2828; |
| | | background: #fefafa; |
| | | padding: 10px; |
| | | color: #BD2828; |
| | | } |
| | | } |
| | | } |
| | | &:not(.with-error) .error, |
| | | &.with-error .intro, |
| | | &.with-diagram .intro { |
| | | display: none; |
| | | } |
| | | |
| | | .canvas { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | } |
| | | |
| | | .canvas, |
| | | .properties-panel-parent { |
| | | display: none; |
| | | } |
| | | |
| | | &.with-diagram { |
| | | .canvas, |
| | | .properties-panel-parent { |
| | | display: block; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | .buttons { |
| | | position: fixed; |
| | | bottom: 20px; |
| | | left: 20px; |
| | | |
| | | padding: 0; |
| | | margin: 0; |
| | | list-style: none; |
| | | |
| | | > li { |
| | | display: inline-block; |
| | | margin-right: 10px; |
| | | |
| | | > a { |
| | | background: #DDD; |
| | | border: solid 1px #666; |
| | | display: inline-block; |
| | | padding: 5px; |
| | | } |
| | | } |
| | | |
| | | a { |
| | | opacity: 0.3; |
| | | } |
| | | |
| | | a.active { |
| | | opacity: 1.0; |
| | | } |
| | | } |
| | | |
| | | .properties-panel-parent { |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | | right: 0; |
| | | width: 260px; |
| | | z-index: 10; |
| | | border-left: 1px solid #ccc; |
| | | overflow: auto; |
| | | &:empty { |
| | | display: none; |
| | | } |
| | | > .djs-properties-panel { |
| | | padding-bottom: 70px; |
| | | min-height:100%; |
| | | } |
| | | } |
New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 查询modeler列表 |
| | | export function listDefinition(query) { |
| | | return request({ |
| | | url: '/wf/definition/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 查询请假详细 |
| | | export function getDefinitionsByInstanceId(instanceId) { |
| | | return request({ |
| | | url: '/wf/definition/info/' + instanceId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // 挂起激活转换 |
| | | export function suspendOrActiveApply(data) { |
| | | return request({ |
| | | url: '/wf/definition/suspendOrActiveApply', |
| | | method: 'post', |
| | | data:data |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 删除Modeler |
| | | export function delDefinition(id) { |
| | | return request({ |
| | | url: '/wf/definition/remove/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | |
New file |
| | |
| | | import request from '@/utils/request' |
| | | // 查询请假详细 |
| | | export function historyFromData(instanceId) { |
| | | return request({ |
| | | url: '/historyFromData/ByInstanceId/' + instanceId, |
| | | method: 'get' |
| | | }) |
| | | } |
New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 查询task列表 |
| | | export function listTask(query) { |
| | | return request({ |
| | | url: '/task/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 查询表单 |
| | | export function formDataShow(taskID) { |
| | | return request({ |
| | | url: '/task/formDataShow/'+taskID, |
| | | method: 'get', |
| | | }) |
| | | } |
| | | |
| | | // 查询表单 |
| | | export function formDataSave(taskID,data) { |
| | | return request({ |
| | | url: '/task/formDataSave/'+taskID, |
| | | method: 'post', |
| | | data:data |
| | | }) |
| | | } |
| | | |
| | | |
| | | |
| | | |
New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 查询请假列表 |
| | | export function listLeave(query) { |
| | | return request({ |
| | | url: '/workflow/leave/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | // 查询请假列表 |
| | | export function listLeaveAll(query) { |
| | | return request({ |
| | | url: '/workflow/leave/listAll', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 查询请假详细 |
| | | export function getLeave(id) { |
| | | return request({ |
| | | url: '/workflow/leave/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 新增请假 |
| | | export function addLeave(data) { |
| | | return request({ |
| | | url: '/workflow/leave', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 修改请假 |
| | | export function updateLeave(data) { |
| | | return request({ |
| | | url: '/workflow/leave', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 删除请假 |
| | | export function delLeave(id) { |
| | | return request({ |
| | | url: '/workflow/leave/' + id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // 导出请假 |
| | | export function exportLeave(query) { |
| | | return request({ |
| | | url: '/workflow/leave/export', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
New file |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="88px"> |
| | | <el-form-item label="流程KEY" prop="key"> |
| | | <el-input |
| | | v-model="queryParams.key" |
| | | placeholder="请输入流程KEY" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="名称" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请输入名称" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="OnlineDrawingProcess" |
| | | v-hasPermi="['activiti:modeler']" |
| | | >在线绘制流程 |
| | | </el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="handleImport" |
| | | v-hasPermi="['activiti:modeler']" |
| | | >部署流程 |
| | | </el-button> |
| | | </el-col> |
| | | |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | |
| | | |
| | | <el-table v-loading="loading" :data="Modeler"> |
| | | <el-table-column label="流程ID" align="center" prop="id"/> |
| | | <el-table-column label="流程KEY" align="center" prop="key"/> |
| | | <el-table-column label="流程名称" align="center" prop="name"/> |
| | | <el-table-column label="版本" align="center" prop="version"/> |
| | | <el-table-column label="部署时间" align="center" prop="deploymentTime"/> |
| | | <el-table-column label="部署ID" align="center" prop="deploymentId"/> |
| | | |
| | | <el-table-column label="状态" align="center" prop="suspendState"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.suspendState!=1?'挂起':'激活'}}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="OnlineModificationProcess(scope.row)" |
| | | v-hasPermi="['activiti:modeler']" |
| | | >查看 |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="suspendOrActiveApply(scope.row)" |
| | | v-hasPermi="['activiti:modeler']" |
| | | >{{scope.row.suspendState==1?'挂起':'激活'}} |
| | | </el-button> |
| | | |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['activiti:modeler']" |
| | | >删除 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total>0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | <!--bpmnjs在线流程设计器--> |
| | | <el-dialog |
| | | :visible.sync="modelVisible" |
| | | title="流程图" |
| | | width="1680px" |
| | | @close="modelCancel" |
| | | append-to-body |
| | | > |
| | | <div style="position:relative;height: 100%;"> |
| | | <iframe |
| | | id="iframe" |
| | | :src="modelerUrl" |
| | | frameborder="0" |
| | | width="100%" |
| | | height="720px" |
| | | scrolling="auto" |
| | | ></iframe> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | |
| | | <!-- 用户导入对话框 --> |
| | | <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body> |
| | | <el-upload ref="upload" :limit="1" accept=".bpmn, .bar, .zip" :headers="upload.headers" :action="upload.url" |
| | | :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" |
| | | :auto-upload="false" drag> |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text"> |
| | | 将文件拖到此处,或 |
| | | <em>点击上传</em> |
| | | </div> |
| | | <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“bpmn”、“bar”或“zip”格式文件!</div> |
| | | </el-upload> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">确 定</el-button> |
| | | <el-button @click="upload.open = false">取 消</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import {listDefinition, delDefinition, suspendOrActiveApply} from "@/api/activiti/definition"; |
| | | import {getToken} from "@/utils/auth"; |
| | | |
| | | export default { |
| | | name: "ActIdGroup", |
| | | data() { |
| | | return { |
| | | modelerUrl: "", |
| | | modelVisible: false, |
| | | // 遮罩层 |
| | | loading: true, |
| | | // 非单个禁用 |
| | | single: true, |
| | | // 非多个禁用 |
| | | multiple: true, |
| | | // 显示搜索条件 |
| | | showSearch: true, |
| | | // 总条数 |
| | | total: 0, |
| | | // VIEW表格数据 |
| | | Modeler: [], |
| | | // 弹出层标题 |
| | | title: "", |
| | | // 是否显示弹出层 |
| | | open: false, |
| | | src: "", |
| | | // 查询参数 |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | id: null, |
| | | rev: null, |
| | | name: null, |
| | | type: null |
| | | }, |
| | | upload: { |
| | | // 是否显示弹出层(用户导入) |
| | | open: false, |
| | | // 弹出层标题(用户导入) |
| | | title: "", |
| | | // 是否禁用上传 |
| | | isUploading: false, |
| | | // 设置上传的请求头部 |
| | | headers: {Authorization: "Bearer " + getToken()}, |
| | | // 上传的地址 |
| | | url: globalConf.baseUrl + "/wf/definition/uploadStreamAndDeployment", |
| | | }, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | }, |
| | | methods: { |
| | | /** 查询Definition列表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | listDefinition(this.queryParams).then(response => { |
| | | this.Modeler = response.data; |
| | | this.total = response.total; |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | /** 搜索按钮操作 */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** 重置按钮操作 */ |
| | | resetQuery() { |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | |
| | | suspendOrActiveApply(row) { |
| | | var suspendOrActive = row.suspendState === '2' ? '激活' : '挂起'; |
| | | this.$confirm('确认要' + suspendOrActive + '流程定义吗?', "警告", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }).then(function () { |
| | | var data = {"id": row.id, "suspendState": row.suspendState}; |
| | | return suspendOrActiveApply(data); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.msgSuccess("转换成功"); |
| | | }).catch(function () { |
| | | }); |
| | | }, |
| | | |
| | | handleImport() { |
| | | this.upload.title = "上传模型图"; |
| | | this.upload.open = true; |
| | | }, |
| | | OnlineDrawingProcess() { |
| | | this.modelVisible = true; |
| | | // localStorage.setItem("VUE_APP_BASE_API", process.env.VUE_APP_BASE_API) |
| | | localStorage.setItem("VUE_APP_BASE_API", globalConf.baseUrl); |
| | | localStorage.setItem("Authorization", getToken()); |
| | | this.modelerUrl = "/bpmnjs/index.html?type=addBpmn"; |
| | | }, |
| | | OnlineModificationProcess(data) { |
| | | this.modelVisible = true; |
| | | localStorage.setItem("VUE_APP_BASE_API", globalConf.baseUrl); |
| | | localStorage.setItem("Authorization", getToken()); |
| | | this.modelerUrl = '/bpmnjs/index.html?type=lookBpmn&deploymentFileUUID=' + data.deploymentId + '&deploymentName=' + encodeURI(data.resourceName); |
| | | }, |
| | | |
| | | // 提交上传文件 |
| | | submitFileForm() { |
| | | this.$refs.upload.submit(); |
| | | }, |
| | | |
| | | // 文件上传中处理 |
| | | handleFileUploadProgress(event, file, fileList) { |
| | | this.upload.isUploading = true; |
| | | }, |
| | | // 文件上传成功处理 |
| | | handleFileSuccess(response, file, fileList) { |
| | | this.upload.open = false; |
| | | this.upload.isUploading = false; |
| | | this.$refs.upload.clearFiles(); |
| | | this.$alert(response.msg, "导入结果", {dangerouslyUseHTMLString: true}); |
| | | this.getList(); |
| | | }, |
| | | /** 删除按钮操作 */ |
| | | handleDelete(row) { |
| | | this.$confirm('是否确认删除编号为"' + row.key + '"的数据项?', "警告", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }).then(function () { |
| | | return delDefinition(row.deploymentId); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.msgSuccess("删除成功"); |
| | | }).catch(function () { |
| | | }); |
| | | }, |
| | | modelCancel() { |
| | | this.getList(); |
| | | } |
| | | |
| | | } |
| | | }; |
| | | </script> |
src/views/activiti/task/index.vue
src/views/system/user/index.vue
src/views/workflow/leave/index.vue
src/views/workflow/leave/leaveAll.vue
src/views/workflow/leave/leaveHistoryForm.vue |