Wiki-Quellcode von FORMCYCLE Hilfe


Zeige letzte Bearbeiter
1 {{info type="info"}}
2 Hinweis zur Sicherheitslücke [[CVE-2022-42889>>https://nvd.nist.gov/vuln/detail/CVE-2022-42889]] in der Komponente Apache Commons Text: Die innerhalb der Bibliothek betroffene Funktionalität wird aktuell in {{formcycle/}} an keiner Stelle verwendet, weshalb {{formcycle/}} nicht von diesem Problem betroffen ist. Ab {{formcycle/}} Version 7.2.1 wird eine fehlerfreie Version der Bibliothek verwendet.
3
4 ==
5
6 Weitere Informationen über die Sicherheitslücke [[CVE-2022-22965>>https://tanzu.vmware.com/security/cve-2022-22965]] im Spring Framework und deren Einfluss auf {{formcycle/}}-Versionen 7.0.0 bis 7.0.11 finden sich auf der Seite zu den [[Allgemeinen Sicherheitsempfehlungen>>doc:Formcycle.SystemSettings.Sicherheit.WebHome]]. Version 7.0.12 von {{formcycle/}} mit einer aktualisierten Version des Spring Frameworks steht [[steht zum Download bereit>>doc:Blog.WebHome]].
7
8 ==
9
10 Weitere Informationen über die Sicherheitslücken [[CVE-2021-44228>>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228]], [[CVE-2021-45046>>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046]], [[CVE-2021-45105>>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45105]], and [[CVE-2021-44832>>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44832]] in Log4J und deren Einfluss auf {{formcycle/}}-Versionen 7.0.0 bis 7.0.9 finden sich auf der Seite zu den [[Allgemeinen Sicherheitsempfehlungen>>doc:Formcycle.SystemSettings.Sicherheit.WebHome]]. Version 7.0.10 von {{formcycle/}} mit einer aktualisierten Version von Log4J [[steht zum Download bereit>>doc:Blog.WebHome]].
11 {{/info}}
12
13 {{info type="info"}}
14 Die Hilfe zur neuen {{formcycle/}} Version 8 befindet sich unter: https://help8.formcycle.eu
15 {{/info}}
16
17 {{warning}}
18 Die Downloadplatform https://customer.formcycle.eu wurde abgeschaltet. Falls Sie eine alte {{formcycle/}}-, Plugin- oder Print-Server-Version benötigen, melden Sie sich bitte im Support oder bei Ihrem Ansprechpartner und wir stellen die von Ihnen benötigte Software dann auf diesem Weg bereit.
19
20 Die neueste Veröffentlichung der {{formcycle/}} Version 7 können Sie auf der folgenden Seite herunterladen: https://help8.formcycle.eu/de/support/solutions/articles/103000357020-7-4-7
21 {{/warning}}
22
23
24 {{velocity}}
25 #set ($mainCards = [{
26 'iconfc': 'square-edit-outline',
27 'title': 'Formulardesigner',
28 'description': 'Formulare erstellen und bearbeiten',
29 'documentation': "Formcycle.Designer",
30 'bgcolor': '#617496',
31 'color': '#fff',
32 'colordesc': '#e1e2e4'
33 }, {
34 'iconfc': 'workflow-fill',
35 'title': 'Workflowdesigner',
36 'description': 'Formulardaten verarbeiten',
37 'documentation': 'Formcycle.Designer.Workflow',
38 'bgcolor': '#617496',
39 'color': '#fff',
40 'colordesc': '#e1e2e4'
41 }, {
42 'iconfc': 'wrench',
43 'title': 'Verwaltung',
44 'description': 'Benutzerverwaltung, LDAP, Datenbanken, Dateien, Templates und vieles mehr',
45 'documentation': 'Formcycle.UserInterface',
46 'bgcolor': '#b6c2d2',
47 'color': '#2b3649',
48 'colordesc': '#617496'
49 }, {
50 'iconfc': 'inbox',
51 'title': 'Posteingang',
52 'description': 'Formulardaten organisieren',
53 'documentation': 'Formcycle.Inbox',
54 'bgcolor': '#ffab70',
55 'color': '#fff',
56 'colordesc': '#fff'
57 }, {
58 'icon': 'fa fa-download',
59 'title': 'Installation',
60 'description': 'FORMCYCLE installieren oder aktualisieren',
61 'documentation': 'Formcycle.Installation',
62 'bgcolor': '#b6c2d2',
63 'color': '#2b3649',
64 'colordesc': '#617496'
65 }, {
66 'iconfc': 'form',
67 'title': 'Beispiele',
68 'description': 'Beispiele für Formulareinbindungen und Formulare',
69 'documentation': 'doc:Examples.WebHome',
70 'bgcolor': '#cae7df',
71 'color': '#2b3649',
72 'colordesc': '#617496'
73 }, {
74 'icon': 'fa fa-play-circle',
75 'title': 'Schulungsvideos und Anwendungsfälle',
76 'description': 'Kurze Videos zu den verschiedensten Themen',
77 'documentation': 'doc:Schulung.WebHome'
78 }])
79
80 ##}, {
81 ## 'iconfc': 'puzzle',
82 ## 'title': 'Anwendungsfälle',
83 ## 'description': 'Formulardaten verarbeiten',
84 ## 'documentation': 'doc:Anwendungsfälle.WebHome'
85 ##}, {
86
87 #set ($smallCards = [{
88 'iconfc': 'information-outline',
89 'title': 'Workshops',
90 'description': 'Workshops zu verschiedenen Themen rund um FORMCYCLE',
91 'documentation': 'doc:Workshops.WebHome',
92 'bgcolor': '#b6c2d2',
93 'color': '#2b3649'
94 }, {
95 'icon': 'fa fa-cloud',
96 'title': 'FORM.​CLOUD',
97 'description': 'Informationen zur XIMA FORM.CLOUD',
98 'documentation': 'doc:FORMCLOUD.WebHome',
99 'bgcolor': '#b6c2d2',
100 'color': '#2b3649'
101 }, {
102 'iconfc': 'action-change-status',
103 'title': 'Einbindung externer Systeme',
104 'description': 'Einbindung von FORMCYCLE in CMS/DMS-Systeme',
105 'documentation': 'Formcycle.CMSExtension',
106 'bgcolor': '#b6c2d2',
107 'color': '#2b3649'
108 }, {
109 'iconfc': 'puzzle',
110 'title': 'Plugin-Dokumen­tation',
111 'description': 'Dokumentation der für FORMCYCLE verfügbaren Plugins',
112 'documentation': 'Formcycle.PluginDocumentation',
113 'bgcolor': '#b6c2d2',
114 'color': '#2b3649'
115 }, {
116 'icon': 'fa fa-list',
117 'title': 'Release Notes',
118 'description': 'Release Notes und Download der aktuellen Version',
119 'documentation': 'doc:Blog.WebHome',
120 'bgcolor': '#b6c2d2',
121 'color': '#2b3649'
122 }, {
123 'iconfc': 'comment-faq-outline',
124 'title': 'Häufig gestellte Fragen',
125 'description': 'Häufig gestellte Fragen',
126 'documentation': "https://faq.formcycle.eu/",
127 'bgcolor': '#b6c2d2',
128 'color': '#2b3649'
129 }])
130
131 ## 'icon': 'fa fa-share-square',
132 ## 'title': 'Daten extern weiterverarbeiten',
133 ## 'description': 'Mit FORMCYCLE erfasste Daten an andere Systeme weiterleiten',
134 ## 'documentation': 'Formcycle.UserInterface.MyForms.WorkflowProcessing'
135 ##}, {
136
137
138
139 {{html}}
140 ##$jsontool.serialize(${mainCards})<br>
141 ##$jsontool.serialize($mainCards)<br>
142 {{/html}}
143
144 {{MainMenuTiles cards='$jsontool.serialize($mainCards)' /}}
145
146
147
148 {{/velocity}}
149
150 {{MainMenuTiles cards="[{~"iconfc~":~"information-outline~",~"title~":~"Workshops~",~"description~":~"Workshops zu verschiedenen Themen rund um FORMCYCLE~",~"documentation~":~"doc:Workshops.WebHome~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"},{~"icon~":~"fa fa-cloud~",~"title~":~"FORM.​CLOUD~",~"description~":~"Informationen zur XIMA FORM.CLOUD~",~"documentation~":~"doc:FORMCLOUD.WebHome~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"},{~"iconfc~":~"action-change-status~",~"title~":~"Einbindung externer Systeme~",~"description~":~"Einbindung von FORMCYCLE in CMS/DMS-Systeme~",~"documentation~":~"Formcycle.CMSExtension~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"},{~"iconfc~":~"puzzle~",~"title~":~"Plugin-Dokumen­tation~",~"description~":~"Dokumentation der für FORMCYCLE verfügbaren Plugins~",~"documentation~":~"Formcycle.PluginDocumentation~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"},{~"icon~":~"fa fa-list~",~"title~":~"Release Notes~",~"description~":~"Release Notes und Download der aktuellen Version~",~"documentation~":~"doc:Blog.WebHome~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"},{~"iconfc~":~"comment-faq-outline~",~"title~":~"Häufig gestellte Fragen~",~"description~":~"Häufig gestellte Fragen~",~"documentation~":~"https://faq.formcycle.eu/~",~"bgcolor~":~"#b6c2d2~",~"color~":~"#2b3649~"}]" type="small"/}}
151
152 {{velocity}}
153 {{html wiki="false" clean="false"}}
154
155 <style>
156 .jqcloud{font:10px Helvetica,Arial,sans-serif;line-height:normal;overflow:hidden;position:relative}.jqcloud-word{margin:0;padding:0}.jqcloud-word.w1{color:#aab5f0;font-size:100%}.jqcloud-word.w2{color:#9ce;font-size:150%}.jqcloud-word.w3{color:#a0ddff;font-size:200%}.jqcloud-word.w4{color:#90c5f0;font-size:250%}.jqcloud-word.w5{color:#90a0dd;font-size:300%}.jqcloud-word.w6{color:#90c5f0;font-size:350%}.jqcloud-word.w7{color:#39d;font-size:400%}.jqcloud-word.w8{color:#0cf;font-size:450%}.jqcloud-word.w9{color:#0cf;font-size:500%}.jqcloud-word.w10{color:#0cf;font-size:550%}.jqcloud-word a{color:inherit;font-size:inherit;text-decoration:none}.jqcloud-word a:hover{color:#0cf}
157 .jqcloud span {
158 -moz-user-select: -moz-none;
159 -khtml-user-select: none;
160 -webkit-user-select: none;
161 -ms-user-select: none;
162 user-select: none;
163 background-color: #eaeaef;
164 border-radius: 10px;
165 padding: 0px 4px 0px 4px;
166 }
167 .jqcloud span.jqHighlight {
168 color: #0cf !important;
169 }
170 .jQButton {
171 color: #fff;
172 background-color: #3480AD;/*#f0f0f3*/
173 text-align: center;
174 display: inline-block;
175 border-radius: 4px;
176 padding: 4px 10px 4px 22px;
177 font-size: 15px
178 margin: auto;
179 margin-bottom: 5px;
180 -moz-user-select: -moz-none;
181 -khtml-user-select: none;
182 -webkit-user-select: none;
183 -ms-user-select: none;
184 user-select: none;
185 }
186 .jQButton[active=false] {
187 background-color: #a7a7a7;
188 }
189 .jQButton:hover {
190 background-color: #0cf;
191 }
192 .jQButton[active=false]:hover {
193 background-color: #676767;
194 }
195 .jQButton .jQButton-icon::before {
196 font-family: "FontAwesome";
197 font-size: 14px;
198 font-weight: 400;
199 content: "\f046";
200 }
201 .jQButton[active=false] .jQButton-icon::before {
202 content: "\f096";
203 }
204 .jQButton-icon {
205 position: absolute;
206 margin-left: -11px;
207 }
208 </style>
209
210 <script>
211 require(['jquery'],function(XjQ) {
212 'use strict';
213
214 /*
215 * Plugin class
216 */
217 var jQCloud = function(element, word_array, options) {
218 this.Xelement = XjQ(element);
219
220 this.word_array = word_array || [];
221 this.options = options;
222
223 this.sizeGenerator = null;
224 this.colorGenerator = null;
225
226 // Data used internally
227 this.data = {
228 placed_words: [],
229 timeouts: {},
230 namespace: null,
231 step: null,
232 angle: null,
233 aspect_ratio: null,
234 max_weight: null,
235 min_weight: null,
236 sizes: [],
237 colors: []
238 };
239
240 this.initialize();
241 };
242
243 jQCloud.DEFAULTS = {
244 width: 100,
245 height: 100,
246 center: { x: 0.5, y: 0.5 },
247 steps: 10,
248 delay: null,
249 shape: 'elliptic',
250 classPattern: 'w{n}',
251 encodeURI: true,
252 removeOverflowing: true,
253 afterCloudRender: null,
254 autoResize: false,
255 colors: null,
256 fontSize: null,
257 template: null
258 };
259
260 jQCloud.prototype = {
261 initialize: function() {
262 // Set/Get dimensions
263 if (this.options.width) {
264 this.Xelement.width(this.options.width);
265 }
266 else {
267 this.options.width = this.Xelement.width();
268 }
269 if (this.options.height) {
270 this.Xelement.height(this.options.height);
271 }
272 else {
273 this.options.height = this.Xelement.height();
274 }
275
276 // Default options value
277 this.options = XjQ.extend(true, {}, jQCloud.DEFAULTS, this.options);
278
279 // Ensure delay
280 if (this.options.delay === null) {
281 this.options.delay = this.word_array.length > 50 ? 10 : 0;
282 }
283
284 // Backward compatibility
285 if (this.options.center.x > 1) {
286 this.options.center.x = this.options.center.x / this.options.width;
287 this.options.center.y = this.options.center.y / this.options.height;
288 }
289
290 // Create colorGenerator function from options
291 // Direct function
292 if (typeof this.options.colors == 'function') {
293 this.colorGenerator = this.options.colors;
294 }
295 // Array of sizes
296 else if (XjQ.isArray(this.options.colors)) {
297 var cl = this.options.colors.length;
298 if (cl > 0) {
299 // Fill the sizes array to X items
300 if (cl < this.options.steps) {
301 for (var i = cl; i < this.options.steps; i++) {
302 this.options.colors[i] = this.options.colors[cl - 1];
303 }
304 }
305
306 this.colorGenerator = function(weight) {
307 return this.options.colors[this.options.steps - weight];
308 };
309 }
310 }
311
312 // Create sizeGenerator function from options
313 // Direct function
314 if (typeof this.options.fontSize == 'function') {
315 this.sizeGenerator = this.options.fontSize;
316 }
317 // Object with 'from' and 'to'
318 else if (XjQ.isPlainObject(this.options.fontSize)) {
319 this.sizeGenerator = function(width, height, weight) {
320 var max = width * this.options.fontSize.from,
321 min = width * this.options.fontSize.to;
322 return Math.round(min + (max - min) * 1.0 / (this.options.steps - 1) * (weight - 1)) + 'px';
323 };
324 }
325 // Array of sizes
326 else if (XjQ.isArray(this.options.fontSize)) {
327 var sl = this.options.fontSize.length;
328 if (sl > 0) {
329 // Fill the sizes array to X items
330 if (sl < this.options.steps) {
331 for (var j = sl; j < this.options.steps; j++) {
332 this.options.fontSize[j] = this.options.fontSize[sl - 1];
333 }
334 }
335
336 this.sizeGenerator = function(width, height, weight) {
337 return this.options.fontSize[this.options.steps - weight];
338 };
339 }
340 }
341
342 this.data.angle = Math.random() * 6.28;
343 this.data.step = (this.options.shape === 'rectangular') ? 18.0 : 2.0;
344 this.data.aspect_ratio = this.options.width / this.options.height;
345 this.clearTimeouts();
346
347 // Namespace word ids to avoid collisions between multiple clouds
348 this.data.namespace = (this.Xelement.attr('id') || Math.floor((Math.random() * 1000000)).toString(36)) + '_word_';
349
350 this.Xelement.addClass('jqcloud');
351
352 // Container's CSS position cannot be 'static'
353 if (this.Xelement.css('position') === 'static') {
354 this.Xelement.css('position', 'relative');
355 }
356
357 // Delay execution so that the browser can render the page before the computatively intensive word cloud drawing
358 this.createTimeout(XjQ.proxy(this.drawWordCloud, this), 10);
359
360 // Attach window resize event
361 if (this.options.autoResize) {
362 XjQ(window).on('resize.' + this.data.namespace, throttle(this.resize, 50, this));
363 }
364 },
365
366 // Helper function to keep track of timeouts so they can be destroyed
367 createTimeout: function(callback, time) {
368 var timeout = setTimeout(XjQ.proxy(function() {
369 delete this.data.timeouts[timeout];
370 callback();
371 }, this), time);
372 this.data.timeouts[timeout] = true;
373 },
374
375 // Destroy all timeouts
376 clearTimeouts: function() {
377 XjQ.each(this.data.timeouts, function(key) {
378 clearTimeout(key);
379 });
380 this.data.timeouts = {};
381 },
382
383 // Pairwise overlap detection
384 overlapping: function(a, b) {
385 if (Math.abs(2.0 * a.left + a.width - 2.0 * b.left - b.width) < a.width + b.width) {
386 if (Math.abs(2.0 * a.top + a.height - 2.0 * b.top - b.height) < a.height + b.height) {
387 return true;
388 }
389 }
390 return false;
391 },
392
393 // Helper function to test if an element overlaps others
394 hitTest: function(elem) {
395 // Check elements for overlap one by one, stop and return false as soon as an overlap is found
396 for (var i = 0, l = this.data.placed_words.length; i < l; i++) {
397 if (this.overlapping(elem, this.data.placed_words[i])) {
398 return true;
399 }
400 }
401 return false;
402 },
403
404 // Initialize the drawing of the whole cloud
405 drawWordCloud: function() {
406 var i, l;
407
408 this.Xelement.children('[id^="' + this.data.namespace + '"]').remove();
409
410 if (this.word_array.length === 0) {
411 return;
412 }
413
414 // Make sure every weight is a number before sorting
415 for (i = 0, l = this.word_array.length; i < l; i++) {
416 this.word_array[i].weight = parseFloat(this.word_array[i].weight, 10);
417 }
418
419 // Sort word_array from the word with the highest weight to the one with the lowest
420 this.word_array.sort(function(a, b) {
421 return b.weight - a.weight;
422 });
423
424 // Kepp trace of bounds
425 this.data.max_weight = this.word_array[0].weight;
426 this.data.min_weight = this.word_array[this.word_array.length - 1].weight;
427
428 // Generate colors
429 this.data.colors = [];
430 if (this.colorGenerator) {
431 for (i = 0; i < this.options.steps; i++) {
432 this.data.colors.push(this.colorGenerator(i + 1));
433 }
434 }
435
436 // Generate font sizes
437 this.data.sizes = [];
438 if (this.sizeGenerator) {
439 for (i = 0; i < this.options.steps; i++) {
440 this.data.sizes.push(this.sizeGenerator(this.options.width, this.options.height, i + 1));
441 }
442 }
443
444 // Iterate drawOneWord on every word, immediately or with delay
445 if (this.options.delay > 0) {
446 this.drawOneWordDelayed();
447 }
448 else {
449 for (i = 0, l = this.word_array.length; i < l; i++) {
450 this.drawOneWord(i, this.word_array[i]);
451 }
452
453 if (typeof this.options.afterCloudRender === 'function') {
454 this.options.afterCloudRender.call(this.Xelement);
455 }
456 }
457 },
458
459 // Function to draw a word, by moving it in spiral until it finds a suitable empty place
460 drawOneWord: function(index, word) {
461 var word_id = this.data.namespace + index,
462 word_selector = '#' + word_id,
463
464 // option.shape == 'elliptic'
465 angle = this.data.angle,
466 radius = 0.0,
467
468 // option.shape == 'rectangular'
469 steps_in_direction = 0.0,
470 quarter_turns = 0.0,
471
472 weight = Math.floor(this.options.steps / 2),
473 word_span,
474 word_size,
475 word_style;
476
477 // Create word attr object
478 //word.attr = XjQ.extend({}, word.html, { id: word_id });
479 word.attr = XjQ.extend({}, word.html, { id: word_id, group: (word.group ? word.group : "") });
480
481 // Linearly map the original weight to a discrete scale from 1 to 10
482 // Only if weights are different
483 if (this.data.max_weight != this.data.min_weight) {
484 weight = Math.round((word.weight - this.data.min_weight) * 1.0 * (this.options.steps - 1) / (this.data.max_weight - this.data.min_weight)) + 1;
485 }
486 word_span = XjQ('<span>').attr(word.attr);
487
488 word_span.addClass('jqcloud-word');
489
490 // Apply class
491 if (this.options.classPattern) {
492 word_span.addClass(this.options.classPattern.replace('{n}', weight));
493 }
494
495 // Apply color
496 if (this.data.colors.length) {
497 word_span.css('color', this.data.colors[weight - 1]);
498 }
499
500 // Apply color from word property
501 if (word.color) {
502 word_span.css('color', word.color);
503 }
504
505 // Apply size
506 if (this.data.sizes.length) {
507 word_span.css('font-size', this.data.sizes[weight - 1]);
508 }
509
510 //Render using template function if provided.
511 if (this.options.template) {
512 word_span.html(this.options.template(word));
513 } else if (word.link) {
514 // Append link if word.link attribute was set
515 // If link is a string, then use it as the link href
516 if (typeof word.link === 'string') {
517 word.link = { href: word.link };
518 }
519
520 if (this.options.encodeURI) {
521 word.link.href = encodeURI(word.link.href).replace(/'/g, '%27');
522 }
523
524 word_span.append(XjQ('<a>').attr(word.link).text(word.text));
525 }
526 else {
527 word_span.text(word.text);
528 }
529
530 // Bind handlers to words
531 if (word.handlers) {
532 word_span.on(word.handlers);
533 }
534
535 this.Xelement.append(word_span);
536
537 word_size = {
538 width: word_span.outerWidth(),
539 height: word_span.outerHeight()
540 };
541 word_size.left = this.options.center.x * this.options.width - word_size.width / 2.0;
542 word_size.top = this.options.center.y * this.options.height - word_size.height / 2.0;
543
544 // Save a reference to the style property, for better performance
545 word_style = word_span[0].style;
546 word_style.position = 'absolute';
547 word_style.left = word_size.left + 'px';
548 word_style.top = word_size.top + 'px';
549
550 while (this.hitTest(word_size)) {
551 // option shape is 'rectangular' so move the word in a rectangular spiral
552 if (this.options.shape === 'rectangular') {
553 steps_in_direction++;
554
555 if (steps_in_direction * this.data.step > (1 + Math.floor(quarter_turns / 2.0)) * this.data.step * ((quarter_turns % 4 % 2) === 0 ? 1 : this.data.aspect_ratio)) {
556 steps_in_direction = 0.0;
557 quarter_turns++;
558 }
559
560 switch (quarter_turns % 4) {
561 case 1:
562 word_size.left += this.data.step * this.data.aspect_ratio + Math.random() * 2.0;
563 break;
564 case 2:
565 word_size.top -= this.data.step + Math.random() * 2.0;
566 break;
567 case 3:
568 word_size.left -= this.data.step * this.data.aspect_ratio + Math.random() * 2.0;
569 break;
570 case 0:
571 word_size.top += this.data.step + Math.random() * 2.0;
572 break;
573 }
574 }
575 // Default settings: elliptic spiral shape
576 else {
577 radius += this.data.step;
578 angle += (index % 2 === 0 ? 1 : -1) * this.data.step;
579
580 word_size.left = this.options.center.x * this.options.width - (word_size.width / 2.0) + (radius * Math.cos(angle)) * this.data.aspect_ratio;
581 word_size.top = this.options.center.y * this.options.height + radius * Math.sin(angle) - (word_size.height / 2.0);
582 }
583 word_style.left = word_size.left + 'px';
584 word_style.top = word_size.top + 'px';
585 }
586
587 // Don't render word if part of it would be outside the container
588 if (this.options.removeOverflowing && (
589 word_size.left < 0 || word_size.top < 0 ||
590 (word_size.left + word_size.width) > this.options.width ||
591 (word_size.top + word_size.height) > this.options.height
592 )
593 ) {
594 word_span.remove();
595 return;
596 }
597
598 // Save position for further usage
599 this.data.placed_words.push(word_size);
600
601 if (typeof word.afterWordRender === 'function') {
602 word.afterWordRender.call(word_span);
603 }
604 },
605
606 // Draw one word then recall the function after a delay
607 drawOneWordDelayed: function(index) {
608 index = index || 0;
609
610 // if not visible then do not attempt to draw
611 if (!this.Xelement.is(':visible')) {
612 this.createTimeout(XjQ.proxy(function() {
613 this.drawOneWordDelayed(index);
614 }, this), 10);
615
616 return;
617 }
618
619 if (index < this.word_array.length) {
620 this.drawOneWord(index, this.word_array[index]);
621
622 this.createTimeout(XjQ.proxy(function() {
623 this.drawOneWordDelayed(index + 1);
624 }, this), this.options.delay);
625 }
626 else {
627 if (typeof this.options.afterCloudRender == 'function') {
628 this.options.afterCloudRender.call(this.Xelement);
629 }
630 }
631 },
632
633 // Destroy any data and objects added by the plugin
634 destroy: function() {
635 if (this.options.autoResize) {
636 XjQ(window).off('resize.' + this.data.namespace);
637 }
638
639 this.clearTimeouts();
640 this.Xelement.removeClass('jqcloud');
641 this.Xelement.removeData('jqcloud');
642 this.Xelement.children('[id^="' + this.data.namespace + '"]').remove();
643 },
644
645 // Update the list of words
646 update: function(word_array) {
647 this.word_array = word_array;
648 this.data.placed_words = [];
649
650 this.clearTimeouts();
651 this.drawWordCloud();
652 },
653
654 resize: function() {
655 var new_size = {
656 width: this.Xelement.width(),
657 height: this.Xelement.height()
658 };
659
660 if (new_size.width != this.options.width || new_size.height != this.options.height) {
661 this.options.width = new_size.width;
662 this.options.height = new_size.height;
663 this.data.aspect_ratio = this.options.width / this.options.height;
664
665 this.update(this.word_array);
666 }
667 },
668 };
669
670 /*
671 * Apply throttling to a callback
672 * @param callback {function}
673 * @param delay {int} milliseconds
674 * @param context {object|null}
675 * @return {function}
676 */
677 function throttle(callback, delay, context) {
678 var state = {
679 pid: null,
680 last: 0
681 };
682
683 return function() {
684 var elapsed = new Date().getTime() - state.last,
685 args = arguments,
686 that = this;
687
688 function exec() {
689 state.last = new Date().getTime();
690 return callback.apply(context || that, Array.prototype.slice.call(args));
691 }
692
693 if (elapsed > delay) {
694 return exec();
695 }
696 else {
697 clearTimeout(state.pid);
698 state.pid = setTimeout(exec, delay - elapsed);
699 }
700 };
701 }
702
703 /*
704 * jQuery plugin
705 */
706 XjQ.fn.jQCloud = function(word_array, option) {
707 var args = arguments;
708
709 return this.each(function() {
710 var Xthis = XjQ(this),
711 data = Xthis.data('jqcloud');
712
713 if (!data && word_array === 'destroy') {
714 // Don't even try to initialize when called with 'destroy'
715 return;
716 }
717 if (!data) {
718 var options = typeof option === 'object' ? option : {};
719 Xthis.data('jqcloud', (data = new jQCloud(this, word_array, options)));
720 }
721 else if (typeof word_array === 'string') {
722 data[word_array].apply(data, Array.prototype.slice.call(args, 1));
723 }
724 });
725 };
726
727 XjQ.fn.jQCloud.defaults = {
728 set: function(options) {
729 XjQ.extend(true, jQCloud.DEFAULTS, options);
730 },
731 get: function(key) {
732 var options = jQCloud.DEFAULTS;
733 if (key) {
734 options = options[key];
735 }
736 return XjQ.extend(true, {}, options);
737 }
738 };
739
740 var jQwords = [
741 {text: "Druckvorschau", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
742 {text: "Link im Formular", weight: 6, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
743 {text: "Kalenderwidget anpassen", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
744 {text: "Optionale Daten einer Auswahl mitspeichern (col Attribute)", weight: 4, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
745 {text: "Aktion vor Absenden ausführen", weight: 5, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
746 {text: "Absenden ohne Speichern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
747 {text: "Eigene Formularfeld-Validatoren (Regex)", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
748 {text: "Wiederholende Felder (dynamic) im JS adressieren", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
749 {text: "Events an dynamic Felder anhängen", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
750 {text: "[Richtext-Editor (Ticket #4227)]", weight: 3, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
751 {text: "Vorbelegung von Daten im Formular (extern)", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
752 {text: "intiale Vorbelegung von Daten in Feldern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
753 {text: "Formularfelder mit LDAP-Daten vorbelegen (Ticket 3701)", weight: 3, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
754 {text: "Formulareingaben zurücksetzen", weight: 7, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
755 {text: "Formulardaten lokal speichern und später wieder laden (Ticket #3964)", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
756 {text: "Formular zwischenspeichern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
757 {text: "Labeltext zur Laufzeit manipulieren (Ticket #3493)", weight: 5, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
758 {text: "Mehrfachbedingungen im Designer", weight: 7, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
759 {text: "zusätzliches JS und CSS in allen Formularen", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
760 {text: "mehrseitige Formulare", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
761 {text: "responive / mobile Ansicht", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
762 {text: "andere Schriftart einbinden / Design ändern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
763 {text: "Java-Script API", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
764
765 {text: "Datenquellen für Auswahllisten hinterlegen", weight: 8, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
766 {text: "Datenquellen in Auswahllisten anhand von Parametern hinterlegen", weight: 6, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
767 {text: "Leerer erster Eintrag bei SQL-Datenquelle (Ticket #4068)", weight: 5, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
768
769 {text: "Mehrfachbedingungen im Workflow", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
770 {text: "Automatisiertes Löschen nach bestimmten Zeitraum", weight: 9, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
771 {text: "Exportmöglichkeiten von Daten", weight: 6, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
772 {text: "E-Mail Aktionen abhängig von Eingaben (Bedingungen) durchführen", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
773 {text: "Bedingtes Einblenden von Elementen", weight: 7, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
774 {text: "Mehrstufigen Workflow (Beispiel)", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
775 {text: "Statuswechsel", weight: 10, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
776 {text: "Vorgangs-ID im Druck (Word-Fill) anzeigen (Ticket #3813)", weight: 5, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
777 {text: "iCal Datei erzeugen", weight: 3, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
778 {text: "aktuelles Datum in der Verarbeitung", weight: 6, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
779 {text: "Laufende Nummer aus Nummernkreis erzeugen (Ticket #3249)", weight: 3, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
780 {text: "E-Mail-Versand", weight: 10, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
781
782 {text: "Migrationsmöglichkeiten in Webseite", weight: 6, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
783 {text: "Abschlussseite in Webseite anzeigen (inline)", weight: 5, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
784 {text: "Generierte Dateien auf Abschlussseite anzeigen", weight: 7, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
785 {text: "Benutzerdefinierte Abschlussseite", weight: 9, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
786 {text: "Referenznummer (Ticket #3866)", weight: 5, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
787
788 {text: "Vorgänge löschen", weight: 9, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
789 {text: "Filtermöglichkeiten", weight: 8, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
790 {text: "Stauswechsel im Postfach ermöglichen (notwendige Einstellungen)", weight: 6.5, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
791 {text: "Postfach exportieren", weight: 7, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
792 {text: "Berechtigungen/Sichtbarkeiten für Benutzer festlegen", weight: 6, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
793
794 {text: "Update FORMCYCLE", weight: 4, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
795 {text: "Zugriffseinschränkung - Möglichkeiten", weight: 3, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
796 {text: "I-Frame automatisch Höhe anpassen", weight: 5, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
797 {text: "Daten aus Formular werden nicht gespeichert (Disablede Felder)", weight: 6, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
798 {text: "Double Opt-In", weight: 7, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/UserInterface/MyForms/DoubleOptIn/'},
799 {text: "[Übersicht von Lösungen bei Problemen mit z.B. DB (Ticket #3714, #3057)]", weight: 6, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
800 {text: "[Tomcat Zugriff HTTPS - Zertifikat-Einrichtung (Ticket #3295)]", weight: 5, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
801 {text: "Beispiele für Print CSS / Erläuterung was das PDF Print Plugin macht", weight: 7, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
802 ];
803 ##http://mistic100.github.io/jQCloud/demo.html#handlers
804 /*XjQ('#jQArea').jQCloud(jQwords, {
805 classPattern: null,
806 colors: ["#176694", "#3480AD", "#5398c1", "#76b2d6", "#7ca2b9", "#889fad", "#8e979c", "#929596", "#babbbb"],
807 fontSize: ['16px','15px','15px','14px','14px','13px','13px','12px','12px'],
808 //width: 500,
809 height: 500
810 });*/
811
812 var jQButtons = XjQ('.jQButton');
813
814 jQButtons.click(function() {
815 if (XjQ(this).attr('active') == 'true') {
816 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagInvisible);
817 XjQ(this).attr('active', 'false');
818 } else {
819 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagVisible);
820 XjQ(this).attr('active', 'true');
821 }
822 });
823 function jQTagVisible() {
824 XjQ(this).css('display', 'block');
825 }
826 function jQTagInvisible() {
827 XjQ(this).css('display', 'none');
828 }
829
830 jQButtons.hover(function() {
831 console.log("hover",XjQ(this));
832 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagHighlighted);
833 }, function() {
834 console.log("unhover",XjQ(this));
835 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagNotHighlighted);
836 });
837 function jQTagHighlighted() {
838 XjQ(this).addClass('jqHighlight');
839 }
840 function jQTagNotHighlighted() {
841 XjQ(this).removeClass('jqHighlight');
842 }
843 });
844 </script>
845 <!--
846 <div class="row">
847 <div class="d-none d-md-block col-lg-12 card-main">
848 <div class="well" >
849 <div id="jQButtons">
850 <div id="jQBtn1" class="jQButton" group="Designer" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Designer</div>
851 <div id="jQBtn1" class="jQButton" group="Datenquellen" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Datenquellen</div>
852 <div id="jQBtn1" class="jQButton" group="Statusverarbeitung" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Statusverarbeitung</div>
853 <div id="jQBtn1" class="jQButton" group="Abschlusseite" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Abschlusseite</div>
854 <div id="jQBtn1" class="jQButton" group="Posteingang" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Posteingang</div>
855 <div id="jQBtn1" class="jQButton" group="Anderes" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Anderes</div>
856 </div>
857 <div id="jQArea">
858 </div>
859 </div>
860 </div>
861 </div>
862 -->
863 {{/html}}
864 {{/velocity}}
865
866 {{velocity}}
867 {{html wiki="false" clean="false"}}
868 <style>
869 /* Overlay background */
870 #overlayv8 {
871 position: fixed;
872 top: 0;
873 left: 0;
874 width: 100%;
875 height: 100%;
876 background-color: rgba(0, 0, 0, 0.5); /* 50% transparent black */
877 display: flex;
878 justify-content: center;
879 align-items: center;
880 z-index: 1000;
881 }
882
883 /* Dialog box */
884 #dialogv8 {
885 user-select: none;
886 background-color: white;
887 padding: 20px;
888 border-radius: 25px;
889 max-width: 90%;
890 width: 400px;
891 box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
892 text-align: center;
893 font-family: "Corporate S W01","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","HelveticaNeue-Roman","Helvetica Neue Roman",'TeXGyreHerosRegular',"Helvetica","Tahoma","Geneva","Arial",sans-serif !important;
894 font-weight: 400;
895 }
896
897 #dialogv8 h2, #dialogv8 label {
898 margin-top: 0;
899 font-size: 15px;
900 font-family: "Corporate S W01","HelveticaNeue","Helvetica Neue","HelveticaNeueRoman","HelveticaNeue-Roman","Helvetica Neue Roman",'TeXGyreHerosRegular',"Helvetica","Tahoma","Geneva","Arial",sans-serif !important;
901 font-weight: 400;
902 border-bottom: none;
903 }
904
905 .dialogv8-buttons {
906 margin-top: 10px;
907 padding-top: 10px;
908 display: flex;
909 justify-content: space-around;
910 flex-wrap: wrap;
911 gap: 10px;
912 border-top: 1px solid black;
913 }
914
915 .dialogv8-buttons DIV {
916 padding: 7px 9px;
917 font-size: 15px;
918 border: none;
919 border-radius: 15px;
920 cursor: pointer;
921 }
922 .dialogv8-buttons DIV:hover {
923 opacity: 0.8;
924 cursor: pointer;
925 }
926
927 .continue-button {
928 background-color: #617496;
929 color: white;
930 }
931
932 .abort-button {
933 background-color: #efefef;
934 color: black;
935 }
936
937 /* Responsive adjustments */
938 @media (max-width: 480px) {
939 #dialogv8 {
940 width: 95%;
941 padding: 15px;
942 }
943
944 .dialogv8-buttons {
945 flex-direction: column;
946 }
947
948 .dialogv8-buttons DIV {
949 width: 100%;
950 }
951 }
952 </style>
953
954 <div id="overlayv8" style="display: none;">
955 <div id="dialogv8">
956 <h2>Die aktuelle formcycle Version ist die Version 8. Möchten Sie zur Hilfe für diese Version wechseln?</h2>
957 <div>
958 <input type="checkbox" id="dialogv8cb" name="dialogv8cb" value="true">
959 <label for="dialogv8cb" style="margin-top: 3px;">Diese Entscheidung merken</label><br>
960 </div>
961 <div class="dialogv8-buttons">
962 <div class="continue-button" id="continueBtn">Zur V8 Hilfe wechseln</div>
963 <div class="abort-button" id="abortBtn">In der V7 Hilfe bleiben</div>
964 </div>
965 </div>
966 </div>
967
968 <script>
969 function setCookie(cname, cvalue, exdays) {
970 const d = new Date();
971 d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
972 let expires = "expires="+d.toUTCString();
973 console.log("make cookie:",cname + "=" + cvalue + ";" + expires + ";path=/");
974 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
975 }
976
977 function getCookie(cname) {
978 let name = cname + "=";
979 let ca = document.cookie.split(';');
980 for(let i = 0; i < ca.length; i++) {
981 let c = ca[i];
982 while (c.charAt(0) == ' ') {
983 c = c.substring(1);
984 }
985 if (c.indexOf(name) == 0) {
986 return c.substring(name.length, c.length);
987 }
988 }
989 return "";
990 }
991
992 function checkCookie() {
993 let dialogv8 = getCookie("dialogv8");
994 console.log("cookie got",dialogv8);
995 if (dialogv8 != "") {
996 console.log("Cookie found " + dialogv8);
997 if (dialogv8 == "true") {
998 return true;
999 } else {
1000 return false;
1001 }
1002 }
1003 return null;
1004 }
1005
1006 // Show the overlay dialog when the page loads
1007 window.onload = function() {
1008 let cookieValue = checkCookie();
1009 console.log("checkCookie",cookieValue);
1010 if (cookieValue == null) {
1011 document.getElementById("overlayv8").style.display = "flex";
1012 } else if (cookieValue == true) {
1013 window.location.href = "https://help8.formcycle.eu/support/home";
1014 }
1015 };
1016
1017 // Redirect on continue
1018 document.getElementById("continueBtn").onclick = function() {
1019 window.location.href = "https://help8.formcycle.eu/support/home";
1020 if (document.querySelector('INPUT[name="dialogv8cb"]').checked) {
1021 setCookie("dialogv8", "true", 90);
1022 }
1023 };
1024
1025 // Close overlay on abort
1026 document.getElementById("abortBtn").onclick = function() {
1027 document.getElementById("overlayv8").style.display = "none";
1028 if (document.querySelector('INPUT[name="dialogv8cb"]').checked) {
1029 setCookie("dialogv8", "false", 90);
1030 }
1031 };
1032 </script>
1033 {{/html}}
1034 {{/velocity}}