workflow-editor 0.9.84-dw-tmp2 → 0.9.84-dw-tmp3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/package.json +2 -2
  2. package/packages/index.js +34 -0
  3. package/packages/plugins/formValidatorUtil.js +528 -0
  4. package/packages/plugins/index.js +8 -0
  5. package/packages/workflow-editor/index.js +14 -0
  6. package/packages/workflow-editor/src/api.js +7 -0
  7. package/packages/workflow-editor/src/assets/wf-editor-icons.js +2 -0
  8. package/packages/workflow-editor/src/constant.js +8 -0
  9. package/packages/workflow-editor/src/json-object-templates/copy-task.js +67 -0
  10. package/packages/workflow-editor/src/json-object-templates/decision.js +11 -0
  11. package/packages/workflow-editor/src/json-object-templates/end.js +14 -0
  12. package/packages/workflow-editor/src/json-object-templates/fork.js +10 -0
  13. package/packages/workflow-editor/src/json-object-templates/human-decision.js +9 -0
  14. package/packages/workflow-editor/src/json-object-templates/human-task.js +199 -0
  15. package/packages/workflow-editor/src/json-object-templates/join.js +10 -0
  16. package/packages/workflow-editor/src/json-object-templates/process.js +98 -0
  17. package/packages/workflow-editor/src/json-object-templates/start.js +13 -0
  18. package/packages/workflow-editor/src/json-object-templates/subprocess.js +30 -0
  19. package/packages/workflow-editor/src/json-object-templates/transition.js +26 -0
  20. package/packages/workflow-editor/src/main/admin-save-dialog.vue +66 -0
  21. package/packages/workflow-editor/src/main/canvas.vue +479 -0
  22. package/packages/workflow-editor/src/main/context-menu.vue +132 -0
  23. package/packages/workflow-editor/src/main/icon-svg.vue +32 -0
  24. package/packages/workflow-editor/src/main/selection-region.vue +66 -0
  25. package/packages/workflow-editor/src/main/tache-history-tooltip.vue +38 -0
  26. package/packages/workflow-editor/src/main/tache-name-input.vue +19 -0
  27. package/packages/workflow-editor/src/main/tache-subprocess-history-dialog.vue +35 -0
  28. package/packages/workflow-editor/src/main/toolbox.vue +60 -0
  29. package/packages/workflow-editor/src/main/wf-history-canvas.vue +302 -0
  30. package/packages/workflow-editor/src/process-json.js +622 -0
  31. package/packages/workflow-editor/src/process-service.js +31 -0
  32. package/packages/workflow-editor/src/properties-editors/common/additional-condition-utils.js +522 -0
  33. package/packages/workflow-editor/src/properties-editors/common/additional-condition.vue +276 -0
  34. package/packages/workflow-editor/src/properties-editors/common/auto-filled-fields-utils.js +34 -0
  35. package/packages/workflow-editor/src/properties-editors/common/auto-filled-fields.vue +239 -0
  36. package/packages/workflow-editor/src/properties-editors/common/common-notice-tool.vue +47 -0
  37. package/packages/workflow-editor/src/properties-editors/common/common-user-condition.vue +241 -0
  38. package/packages/workflow-editor/src/properties-editors/common/form-fields-utils.js +23 -0
  39. package/packages/workflow-editor/src/properties-editors/common/form-fields.vue +116 -0
  40. package/packages/workflow-editor/src/properties-editors/common/i18n-input.vue +75 -0
  41. package/packages/workflow-editor/src/properties-editors/common/i18n-set-dialog.vue +125 -0
  42. package/packages/workflow-editor/src/properties-editors/common/notice.vue +98 -0
  43. package/packages/workflow-editor/src/properties-editors/common/reminder.vue +179 -0
  44. package/packages/workflow-editor/src/properties-editors/common/select-mail-template.vue +83 -0
  45. package/packages/workflow-editor/src/properties-editors/common/standard-fields.vue +65 -0
  46. package/packages/workflow-editor/src/properties-editors/common/system-role-tree-inline.vue +355 -0
  47. package/packages/workflow-editor/src/properties-editors/common/system-role-tree.vue +63 -0
  48. package/packages/workflow-editor/src/properties-editors/common/task-title.vue +148 -0
  49. package/packages/workflow-editor/src/properties-editors/common/transactor-settings.vue +220 -0
  50. package/packages/workflow-editor/src/properties-editors/common/user-selection.vue +386 -0
  51. package/packages/workflow-editor/src/properties-editors/common/value-selection-dialog.vue +209 -0
  52. package/packages/workflow-editor/src/properties-editors/common/variables.vue +135 -0
  53. package/packages/workflow-editor/src/properties-editors/copy-task/basic-properties.vue +90 -0
  54. package/packages/workflow-editor/src/properties-editors/copy-task/permission-settings.vue +155 -0
  55. package/packages/workflow-editor/src/properties-editors/copy-task.vue +80 -0
  56. package/packages/workflow-editor/src/properties-editors/decision.vue +90 -0
  57. package/packages/workflow-editor/src/properties-editors/fork.vue +72 -0
  58. package/packages/workflow-editor/src/properties-editors/human-decision.vue +44 -0
  59. package/packages/workflow-editor/src/properties-editors/human-task/additional-condition-dialog.vue +60 -0
  60. package/packages/workflow-editor/src/properties-editors/human-task/basic-properties.vue +156 -0
  61. package/packages/workflow-editor/src/properties-editors/human-task/componentsConfigUtil.js +291 -0
  62. package/packages/workflow-editor/src/properties-editors/human-task/custom-actions.vue +249 -0
  63. package/packages/workflow-editor/src/properties-editors/human-task/editable-child-field-setting.vue +392 -0
  64. package/packages/workflow-editor/src/properties-editors/human-task/editable-child-fields.vue +241 -0
  65. package/packages/workflow-editor/src/properties-editors/human-task/editable-field-selection.vue +220 -0
  66. package/packages/workflow-editor/src/properties-editors/human-task/editable-fields.vue +204 -0
  67. package/packages/workflow-editor/src/properties-editors/human-task/events.vue +59 -0
  68. package/packages/workflow-editor/src/properties-editors/human-task/permission-settings.vue +207 -0
  69. package/packages/workflow-editor/src/properties-editors/human-task/selection-conditions.vue +390 -0
  70. package/packages/workflow-editor/src/properties-editors/human-task.vue +103 -0
  71. package/packages/workflow-editor/src/properties-editors/join.vue +44 -0
  72. package/packages/workflow-editor/src/properties-editors/process/basic-properties.vue +273 -0
  73. package/packages/workflow-editor/src/properties-editors/process/events.vue +76 -0
  74. package/packages/workflow-editor/src/properties-editors/process/notice-settings.vue +60 -0
  75. package/packages/workflow-editor/src/properties-editors/process/parameter-settings.vue +95 -0
  76. package/packages/workflow-editor/src/properties-editors/process/permission-settings.vue +28 -0
  77. package/packages/workflow-editor/src/properties-editors/process/selectPage.vue +81 -0
  78. package/packages/workflow-editor/src/properties-editors/process.vue +109 -0
  79. package/packages/workflow-editor/src/properties-editors/subprocess/basic-properties.vue +176 -0
  80. package/packages/workflow-editor/src/properties-editors/subprocess/events.vue +26 -0
  81. package/packages/workflow-editor/src/properties-editors/subprocess/field-mappings.vue +206 -0
  82. package/packages/workflow-editor/src/properties-editors/subprocess/transactor-settings.vue +64 -0
  83. package/packages/workflow-editor/src/properties-editors/subprocess.vue +79 -0
  84. package/packages/workflow-editor/src/properties-editors/transition/basic-properties.vue +53 -0
  85. package/packages/workflow-editor/src/properties-editors/transition.vue +74 -0
  86. package/packages/workflow-editor/src/properties-editors/user-condition.js +177 -0
  87. package/packages/workflow-editor/src/store/getters.js +27 -0
  88. package/packages/workflow-editor/src/store/workflow-editor.js +125 -0
  89. package/packages/workflow-editor/src/taches/common-methods.js +21 -0
  90. package/packages/workflow-editor/src/taches/copy-task.vue +99 -0
  91. package/packages/workflow-editor/src/taches/custom-task.vue +88 -0
  92. package/packages/workflow-editor/src/taches/decision.vue +102 -0
  93. package/packages/workflow-editor/src/taches/end.vue +76 -0
  94. package/packages/workflow-editor/src/taches/fork.vue +102 -0
  95. package/packages/workflow-editor/src/taches/human-decision.vue +102 -0
  96. package/packages/workflow-editor/src/taches/human-task.vue +113 -0
  97. package/packages/workflow-editor/src/taches/join.vue +91 -0
  98. package/packages/workflow-editor/src/taches/joint.vue +177 -0
  99. package/packages/workflow-editor/src/taches/start.vue +76 -0
  100. package/packages/workflow-editor/src/taches/subprocess.vue +99 -0
  101. package/packages/workflow-editor/src/taches/tache-resizer.vue +80 -0
  102. package/packages/workflow-editor/src/transitions/broken-line.vue +91 -0
  103. package/packages/workflow-editor/src/transitions/curve-line.vue +91 -0
  104. package/packages/workflow-editor/src/transitions/straight-line.vue +26 -0
  105. package/packages/workflow-editor/src/transitions/transition.vue +212 -0
  106. package/packages/workflow-editor/src/transitions/virtual-transition.vue +43 -0
  107. package/packages/workflow-editor/src/util.js +493 -0
  108. package/packages/workflow-editor/src/workflow-editor.vue +605 -0
  109. package/packages/workflow-editor/src/workflow-history.vue +153 -0
  110. package/src/index.js +28 -0
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <div class="tooltip">
3
+ <!--使用v-html是为了实现</br>换行-->
4
+ <div v-html="content" />
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+ export default {
10
+ name: 'TacheHistoryTooltip',
11
+ props: {
12
+ content: {
13
+ type: String,
14
+ default: ''
15
+ }
16
+ },
17
+ methods: {
18
+ }
19
+ }
20
+ </script>
21
+
22
+ <style lang="scss" scoped>
23
+ .tooltip{
24
+ position: absolute;
25
+ background: #fff;
26
+ min-width: 150px;
27
+ border-radius: 4px;
28
+ border: 1px solid #ebeef5;
29
+ padding: 12px;
30
+ z-index: 2000;
31
+ color: #606266;
32
+ line-height: 1.4;
33
+ text-align: justify;
34
+ font-size: 14px;
35
+ box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
36
+ word-break: break-all;
37
+ }
38
+ </style>
@@ -0,0 +1,19 @@
1
+ <template>
2
+ <div v-if="area" :style="'position:absolute;x:{{area.x}};y:{{area.y}};width:{{area.width}};height:{{area.height}}'">
3
+ <textarea />
4
+ </div>
5
+ </template>
6
+ <script>
7
+ export default {
8
+ name: 'TacheNameInput',
9
+ props: {
10
+ area: {
11
+ type: Object,
12
+ default: null
13
+ }
14
+ },
15
+ data() {
16
+ return {}
17
+ }
18
+ }
19
+ </script>
@@ -0,0 +1,35 @@
1
+ <template>
2
+ <el-dialog
3
+ visible
4
+ :title="$t('workflowEditorPublicModel.subprocessTitle')"
5
+ :close-on-click-modal="false"
6
+ append-to-body
7
+ width="90%"
8
+ top="5vh"
9
+ @open="$emit('open')"
10
+ @opend="$emit('opend')"
11
+ @close="$emit('close')"
12
+ @closed="$emit('closed')"
13
+ >
14
+ <iframe id="_subprocess-content" :src="'#/show-sub-wf-history?workflowId='+workflowId" name="_subprocess-content" title="Subprocess Content" frameborder="0" />
15
+ </el-dialog>
16
+ </template>
17
+
18
+ <script>
19
+ export default {
20
+ name: 'TacheSubprocessHistoryDialog',
21
+ props: {
22
+ // 当前子流程最新流程实例id
23
+ workflowId: {
24
+ type: Number,
25
+ default: null
26
+ }
27
+ }
28
+ }
29
+ </script>
30
+ <style lang="scss" scoped>
31
+ #_subprocess-content{
32
+ width: 100%;
33
+ height: calc(100vh - 200px);
34
+ }
35
+ </style>
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <div>
3
+ <h3>{{ $t('workflowEditor.main.tacheType') }}</h3>
4
+ <el-button
5
+ v-for="component in componentList"
6
+ :key="component.name"
7
+ :type="component.type"
8
+ size="medium"
9
+ :round="component.round"
10
+ @mousedown.native="select(component.name)"
11
+ >
12
+ <icon-svg :icon="component.icon" />
13
+ {{ component.label }}
14
+ </el-button>
15
+ </div>
16
+ </template>
17
+ <script>
18
+ import { mapGetters, mapMutations } from 'vuex'
19
+ import IconSvg from './icon-svg'
20
+ import { getComponentList } from '../util.js'
21
+ export default {
22
+ name: 'Toolbox',
23
+ components: {
24
+ IconSvg
25
+ },
26
+ data() {
27
+ return {
28
+ componentList: getComponentList()
29
+ }
30
+ },
31
+ computed: {
32
+ ...mapGetters('wfEditor', ['componentToDraw'])
33
+ },
34
+ methods: {
35
+ ...mapMutations('wfEditor', [
36
+ 'setComponentToDraw'
37
+ ]),
38
+ select(name) {
39
+ this.setComponentToDraw(name)
40
+ }
41
+ }
42
+ }
43
+ </script>
44
+ <style lang="scss" scoped>
45
+ h3{
46
+ color: #999999;
47
+ margin:0;
48
+ padding:0;
49
+ font-weight:bold;
50
+ font-size:18px
51
+ }
52
+ .el-button{
53
+ margin: 6px 0;
54
+ min-width: 110px;
55
+ padding:9px 15px;
56
+ i{
57
+ padding-right: 4px;
58
+ }
59
+ }
60
+ </style>
@@ -0,0 +1,302 @@
1
+ <template>
2
+ <div ref="svgContainer" style="position:relative">
3
+ <svg
4
+ id="svg"
5
+ width="2000"
6
+ height="2000"
7
+ @mousedown="mousedown"
8
+ @mousemove="mousemove"
9
+ @mouseup="mouseup"
10
+ @mouseleave="mouseleave"
11
+ >
12
+ <defs>
13
+ <marker id="arrow" markerWidth="10" markerHeight="10" refX="6" refY="2" orient="auto" markerUnits="strokeWidth">
14
+ <path d="M0,0 L0,4 L6,2 z" fill="#666" />
15
+ </marker>
16
+ </defs>
17
+ <component
18
+ :is="tache.type"
19
+ v-for="tache in taches"
20
+ :key="tache.id"
21
+ :model="tache"
22
+ :class="[getTacheClass(tache)]"
23
+ :display-mode="tache.displayMode"
24
+ @mouseenter.native="showTacheHistoryTooltip(tache,$event)"
25
+ @mouseleave.native="hideTacheHistoryTooltip(tache)"
26
+ @mousemove.native="updateTacheHistoryTooltipPosition"
27
+ @click.native="showSubprocessHistory(tache)"
28
+ />
29
+ <transition
30
+ v-for="transition in transitions"
31
+ :key="transition.id"
32
+ :model="transition"
33
+ />
34
+ </svg>
35
+ <tache-history-tooltip v-if="showHistory&&tacheHistoryInfo" :style="tooltipPosition" :content="tacheHistoryInfo" />
36
+ <tache-subprocess-history-dialog v-if="showSubprocessDialog" :workflow-id="subWorkflowId" @close="closeSubprocessHistory" />
37
+ </div>
38
+ </template>
39
+
40
+ <script>
41
+ import Start from '../taches/start'
42
+ import End from '../taches/end'
43
+ import HumanTask from '../taches/human-task'
44
+ import Decision from '../taches/decision'
45
+ import Subprocess from '../taches/subprocess'
46
+ import CustomTask from '../taches/custom-task'
47
+ import Fork from '../taches/fork'
48
+ import Join from '../taches/join'
49
+ import HumanDecision from '../taches/human-decision'
50
+ import CopyTask from '../taches/copy-task'
51
+ import Transition from '../transitions/transition'
52
+ import TacheHistoryTooltip from './tache-history-tooltip'
53
+ import { mapGetters } from 'vuex'
54
+ import { getMousePosition } from '../util'
55
+ import { i18nOperation } from 'imatrix-ui/src/utils/workflow-util'
56
+ import { getLanguageWithLocale } from 'imatrix-ui/src/utils/util'
57
+ import TacheSubprocessHistoryDialog from './tache-subprocess-history-dialog'
58
+
59
+ export default {
60
+ name: 'WfHistoryCanvas',
61
+ components: {
62
+ Start,
63
+ End,
64
+ HumanTask,
65
+ Decision,
66
+ Subprocess,
67
+ CustomTask,
68
+ Fork,
69
+ Join,
70
+ HumanDecision,
71
+ CopyTask,
72
+ Transition,
73
+ TacheHistoryTooltip,
74
+ TacheSubprocessHistoryDialog
75
+ },
76
+ props: {
77
+ process: {
78
+ type: Object,
79
+ default: null
80
+ },
81
+ histories: {
82
+ type: Array,
83
+ default: null
84
+ },
85
+ currentTasks: {
86
+ type: Array,
87
+ default: null
88
+ },
89
+ // 主子流程的国际化配置
90
+ allProcessI18n: {
91
+ type: Object,
92
+ default: null
93
+ }
94
+ },
95
+ data: function() {
96
+ return {
97
+ showHistory: false,
98
+ tooltipPosition: null,
99
+ tacheHistoryInfo: null,
100
+ showSubprocessDialog: false,
101
+ subWorkflowId: null // 子流程最新实例
102
+ }
103
+ },
104
+ computed: {
105
+ ...mapGetters('wfEditor', [
106
+ 'taches',
107
+ 'transitions',
108
+ 'processI18n'
109
+ ])
110
+ // classifiedTaches() {
111
+ // this.taches.map(tache => {
112
+ // this.tagPassedTache(tache)
113
+ // this.tagCurrentTache(tache)
114
+ // })
115
+ // return this.taches
116
+ // }
117
+
118
+ },
119
+ mounted: function() {
120
+
121
+ },
122
+ methods: {
123
+ getTacheClass(tache) {
124
+ // 先判断是否为当前节点 (流程中一个节点可能走多次,这个节点会同时出现在当前和历史节点中)
125
+ if (this.getCurrentTache(tache)) {
126
+ return 'current-tache'
127
+ } else {
128
+ const passTache = this.getPassedTache(tache)
129
+ if (passTache && passTache.current) {
130
+ // 子流程时会进入该判断
131
+ return 'current-tache'
132
+ } else if (passTache) {
133
+ return 'passed-tache'
134
+ } else {
135
+ return ''
136
+ }
137
+ }
138
+ },
139
+ getPassedTache(tache) {
140
+ let result = null
141
+ for (const item of this.histories) {
142
+ if ((item.historyType === 'PROCESS_START' && tache.ref.attr.id && tache.ref.attr.id === 'start') ||
143
+ (item.historyType === 'PROCESS_END' && tache.ref.attr.id && tache.ref.attr.id === 'end') ||
144
+ (tache.ref.attr.name && item.taskName && item.taskName === tache.ref.attr.name)) {
145
+ result = item
146
+ break
147
+ }
148
+ }
149
+ return result
150
+ },
151
+ // 获得当前环节的流转历史信息,多条件流转历史记录之间换行显示。因为一个环节可能会走多次
152
+ getPassedTacheHistories(tache) {
153
+ const result = []
154
+ for (const item of this.histories) {
155
+ if ((item.historyType === 'PROCESS_START' && tache.ref.attr.id && tache.ref.attr.id === 'start') ||
156
+ (item.historyType === 'PROCESS_END' && tache.ref.attr.id && tache.ref.attr.id === 'end') ||
157
+ (tache.ref.attr.name && item.taskName && item.taskName === tache.ref.attr.name)) {
158
+ result.push(this.i18nOperation(item))
159
+ }
160
+ }
161
+ return result
162
+ },
163
+ i18nOperation(item) {
164
+ let oneProcessI18n
165
+ let processNameI18n
166
+ const language = getLanguageWithLocale()
167
+ const bundleCode = item.bundleCode
168
+ if (bundleCode && bundleCode !== '' && this.processI18n) {
169
+ oneProcessI18n = this.processI18n[bundleCode]
170
+ }
171
+ if (oneProcessI18n && oneProcessI18n['processName']) {
172
+ processNameI18n = oneProcessI18n['processName'][language]
173
+ }
174
+ return i18nOperation(item, processNameI18n, oneProcessI18n, language)
175
+ },
176
+ getCurrentTache(tache) {
177
+ let result = null
178
+ for (const item of this.currentTasks) {
179
+ if (item.taskName === tache.ref.attr.name) {
180
+ result = item
181
+ break
182
+ }
183
+ }
184
+ return result
185
+ },
186
+ getTacheHistory(tache) {
187
+ let content = null
188
+ let historyText
189
+ const histories = this.getPassedTacheHistories(tache)
190
+ if (histories && histories.length > 0) {
191
+ historyText = histories.join('</br>')
192
+ }
193
+ const current = this.getCurrentTache(tache)
194
+ if (current) {
195
+ content = this.$t('workflowEditorMessage.currentHandlingPersonnel') + ': ' + current.transactionResult
196
+ if (historyText) {
197
+ content += '</br>' + historyText
198
+ }
199
+ } else {
200
+ content = historyText
201
+ }
202
+ return content
203
+ },
204
+ forbidSelection() {
205
+ return false
206
+ },
207
+ mousedown(event) {
208
+ console.log('mousedown')
209
+ },
210
+ mousemove(event) {
211
+ },
212
+ // 有些组件上的mouseup,会传播到canvas上来
213
+ mouseup(event) {
214
+
215
+ },
216
+ mouseleave(event) {
217
+
218
+ },
219
+
220
+ endDrag(event) {
221
+
222
+ },
223
+ showTacheHistoryTooltip(tache, event) {
224
+ this.tacheHistoryInfo = this.getTacheHistory(tache)
225
+ this.showHistory = true
226
+ },
227
+ hideTacheHistoryTooltip() {
228
+ // this.tacheHistoryInfo = null
229
+ this.showHistory = false
230
+ },
231
+ updateTacheHistoryTooltipPosition(event) {
232
+ const position = getMousePosition(event)
233
+ this.tooltipPosition = {
234
+ // 提示框的位置要偏离鼠标指针5px,防止提示框不停闪烁
235
+ left: position.x + 5 + 'px',
236
+ top: position.y + 5 + 'px'
237
+ }
238
+ },
239
+ // 查看子流程流转历史
240
+ showSubprocessHistory(tache) {
241
+ const history = this.getPassedTache(tache)
242
+ if (history && history.hasChildren !== undefined && history.hasChildren === true) {
243
+ if (history.children && history.children.length > 0) {
244
+ this.subWorkflowId = history.children[0].workflowId
245
+ }
246
+ this.showSubprocessDialog = true
247
+ }
248
+ },
249
+ closeSubprocessHistory() {
250
+ this.showSubprocessDialog = false
251
+ }
252
+ }
253
+ }
254
+ </script>
255
+ <style >
256
+ #svg{
257
+ /* border:1px solid red; */
258
+ background: white;
259
+ background-image:
260
+ linear-gradient(rgba(242,242,242,.7) 1px, transparent 0),
261
+ linear-gradient(90deg, rgba(242,242,242,.7) 1px, transparent 0),
262
+ linear-gradient(#e5e5e5 1px, transparent 0),
263
+ linear-gradient(90deg,#e5e5e5 1px, transparent 0);
264
+ background-size:
265
+ 15px 15px,
266
+ 15px 15px,
267
+ 75px 75px,
268
+ 75px 75px;
269
+ }
270
+ g{
271
+ font-size: 16px;
272
+ }
273
+ g text{
274
+ dominant-baseline: middle;
275
+ }
276
+ .selected{
277
+ fill: #fff;
278
+ stroke: #f00;
279
+ stroke-width: 2;
280
+ }
281
+ .task-tache{
282
+ fill: #fff;
283
+ stroke: #666;
284
+ stroke-width: 2;
285
+ }
286
+ .passed-tache .task-tache{
287
+ fill: green;
288
+ stroke: green;
289
+ stroke-width: 2;
290
+ }
291
+ .current-tache .task-tache{
292
+ fill: red;
293
+ stroke: red;
294
+ stroke-width: 2;
295
+ }
296
+ .passed-tache text{
297
+ fill:white;
298
+ }
299
+ .current-tache text{
300
+ fill: white
301
+ }
302
+ </style>