Wiki-Quellcode von Schulungsvideos


Zeige letzte Bearbeiter
1 In unseren Schulungsvideos begleiten wir Sie bei den ersten Schritten in FORMCYCLE. In vielen kurzen Videos lernen Sie unter anderem, wie Sie Formulare im Formulardesigner erstellen, oder Workflows konfigurieren. Dabei ist es egal, ob schon Erfahrungen in den Themen vorhanden sind, oder Sie neu einsteigen. Für jeden Kenntnisstand gibt es zahlreichen Videos.
2
3
4 === Wie funktioniert es? ===
5
6 Die Schulungsvideos sind in mehrere Blöcke aufgeteilt und am Ende jedes Blocks kann, wenn gewünscht, eine Übung durchgeführt werden. Welche Videos Sie innerhalb eines Blocks benötigen, um die Übung erfolgreich durchzuführen, liegt an Ihrem Vorwissen bzw. Kenntnisstand bei den entsprechenden Themen.
7
8
9 Wenn die Übungen aller Blöcke abgeschlossen wurden, **kann** das Ergebnis (Formular mit Workflow) eingereicht werden und Sie erhalten zwei kostenfreie Supportanfragen.
10
11
12 {{velocity}}
13 #set ($mainCards = [{
14 'iconfc': 'fa fa-play-circle',
15 'title': 'Formulardesigner',
16 'description': 'Formulare erstellen und bearbeiten',
17 'documentation': "Formcycle.Designer",
18 'bgcolor': '#617496',
19 'color': '#fff',
20 'colordesc': '#e1e2e4'
21 }, {
22 'iconfc': 'fas fa-play-circle',
23 'title': 'Workflowdesigner',
24 'description': 'Formulardaten verarbeiten',
25 'documentation': 'Formcycle.Designer.Workflow',
26 'bgcolor': '#617496',
27 'color': '#fff',
28 'colordesc': '#e1e2e4'
29 }, {
30 'iconfc': 'fa fa-play-circle',
31 'title': 'Verwaltung',
32 'description': 'Benutzerverwaltung, LDAP, Datenbanken, Dateien, Templates und vieles mehr',
33 'documentation': 'Formcycle.UserInterface',
34 'bgcolor': '#b6c2d2',
35 'color': '#2b3649',
36 'colordesc': '#617496'
37 }, {
38 'iconfc': 'fa fa-play-circle',
39 'title': 'Posteingang',
40 'description': 'Formulardaten organisieren',
41 'documentation': 'Formcycle.Inbox',
42 'bgcolor': '#ffab70',
43 'color': '#fff',
44 'colordesc': '#fff'
45 }])
46
47 ## 'icon': 'fa fa-play-circle',
48 ## 'title': 'Einführungsvideos',
49 ## 'description': 'Kurze Videos zum Vorstellen einzelner FORMCYCLE-Funktionen; ggf. Titel "Schnelleinstieg"',
50 ## 'documentation': 'https://formcycle.eu/de/features'
51 ##}, {
52 ## 'iconfc': 'puzzle',
53 ## 'title': 'Anwendungsfälle',
54 ## 'description': 'Formulardaten verarbeiten',
55 ## 'documentation': 'doc:Anwendungsfälle.WebHome'
56 ##}, {
57
58
59
60 ## 'icon': 'fa fa-share-square',
61 ## 'title': 'Daten extern weiterverarbeiten',
62 ## 'description': 'Mit FORMCYCLE erfasste Daten an andere Systeme weiterleiten',
63 ## 'documentation': 'Formcycle.UserInterface.MyForms.WorkflowProcessing'
64 ##}, {
65
66
67
68 {{html}}
69 ##$jsontool.serialize(${mainCards})<br>
70 ##$jsontool.serialize($mainCards)<br>
71 {{/html}}
72
73 {{MainMenuTiles cards='$jsontool.serialize($mainCards)' /}}
74
75 {{/velocity}}
76
77
78
79
80 {{velocity}}
81 {{html wiki="false" clean="false"}}
82
83 <style>
84 .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}
85 .jqcloud span {
86 -moz-user-select: -moz-none;
87 -khtml-user-select: none;
88 -webkit-user-select: none;
89 -ms-user-select: none;
90 user-select: none;
91 background-color: #eaeaef;
92 border-radius: 10px;
93 padding: 0px 4px 0px 4px;
94 }
95 .jqcloud span.jqHighlight {
96 color: #0cf !important;
97 }
98 .jQButton {
99 color: #fff;
100 background-color: #3480AD;/*#f0f0f3*/
101 text-align: center;
102 display: inline-block;
103 border-radius: 4px;
104 padding: 4px 10px 4px 22px;
105 font-size: 15px
106 margin: auto;
107 margin-bottom: 5px;
108 -moz-user-select: -moz-none;
109 -khtml-user-select: none;
110 -webkit-user-select: none;
111 -ms-user-select: none;
112 user-select: none;
113 }
114 .jQButton[active=false] {
115 background-color: #a7a7a7;
116 }
117 .jQButton:hover {
118 background-color: #0cf;
119 }
120 .jQButton[active=false]:hover {
121 background-color: #676767;
122 }
123 .jQButton .jQButton-icon::before {
124 font-family: "FontAwesome";
125 font-size: 14px;
126 font-weight: 400;
127 content: "\f046";
128 }
129 .jQButton[active=false] .jQButton-icon::before {
130 content: "\f096";
131 }
132 .jQButton-icon {
133 position: absolute;
134 margin-left: -11px;
135 }
136 </style>
137
138 <script>
139 require(['jquery'],function(XjQ) {
140 'use strict';
141
142 /*
143 * Plugin class
144 */
145 var jQCloud = function(element, word_array, options) {
146 this.Xelement = XjQ(element);
147
148 this.word_array = word_array || [];
149 this.options = options;
150
151 this.sizeGenerator = null;
152 this.colorGenerator = null;
153
154 // Data used internally
155 this.data = {
156 placed_words: [],
157 timeouts: {},
158 namespace: null,
159 step: null,
160 angle: null,
161 aspect_ratio: null,
162 max_weight: null,
163 min_weight: null,
164 sizes: [],
165 colors: []
166 };
167
168 this.initialize();
169 };
170
171 jQCloud.DEFAULTS = {
172 width: 100,
173 height: 100,
174 center: { x: 0.5, y: 0.5 },
175 steps: 10,
176 delay: null,
177 shape: 'elliptic',
178 classPattern: 'w{n}',
179 encodeURI: true,
180 removeOverflowing: true,
181 afterCloudRender: null,
182 autoResize: false,
183 colors: null,
184 fontSize: null,
185 template: null
186 };
187
188 jQCloud.prototype = {
189 initialize: function() {
190 // Set/Get dimensions
191 if (this.options.width) {
192 this.Xelement.width(this.options.width);
193 }
194 else {
195 this.options.width = this.Xelement.width();
196 }
197 if (this.options.height) {
198 this.Xelement.height(this.options.height);
199 }
200 else {
201 this.options.height = this.Xelement.height();
202 }
203
204 // Default options value
205 this.options = XjQ.extend(true, {}, jQCloud.DEFAULTS, this.options);
206
207 // Ensure delay
208 if (this.options.delay === null) {
209 this.options.delay = this.word_array.length > 50 ? 10 : 0;
210 }
211
212 // Backward compatibility
213 if (this.options.center.x > 1) {
214 this.options.center.x = this.options.center.x / this.options.width;
215 this.options.center.y = this.options.center.y / this.options.height;
216 }
217
218 // Create colorGenerator function from options
219 // Direct function
220 if (typeof this.options.colors == 'function') {
221 this.colorGenerator = this.options.colors;
222 }
223 // Array of sizes
224 else if (XjQ.isArray(this.options.colors)) {
225 var cl = this.options.colors.length;
226 if (cl > 0) {
227 // Fill the sizes array to X items
228 if (cl < this.options.steps) {
229 for (var i = cl; i < this.options.steps; i++) {
230 this.options.colors[i] = this.options.colors[cl - 1];
231 }
232 }
233
234 this.colorGenerator = function(weight) {
235 return this.options.colors[this.options.steps - weight];
236 };
237 }
238 }
239
240 // Create sizeGenerator function from options
241 // Direct function
242 if (typeof this.options.fontSize == 'function') {
243 this.sizeGenerator = this.options.fontSize;
244 }
245 // Object with 'from' and 'to'
246 else if (XjQ.isPlainObject(this.options.fontSize)) {
247 this.sizeGenerator = function(width, height, weight) {
248 var max = width * this.options.fontSize.from,
249 min = width * this.options.fontSize.to;
250 return Math.round(min + (max - min) * 1.0 / (this.options.steps - 1) * (weight - 1)) + 'px';
251 };
252 }
253 // Array of sizes
254 else if (XjQ.isArray(this.options.fontSize)) {
255 var sl = this.options.fontSize.length;
256 if (sl > 0) {
257 // Fill the sizes array to X items
258 if (sl < this.options.steps) {
259 for (var j = sl; j < this.options.steps; j++) {
260 this.options.fontSize[j] = this.options.fontSize[sl - 1];
261 }
262 }
263
264 this.sizeGenerator = function(width, height, weight) {
265 return this.options.fontSize[this.options.steps - weight];
266 };
267 }
268 }
269
270 this.data.angle = Math.random() * 6.28;
271 this.data.step = (this.options.shape === 'rectangular') ? 18.0 : 2.0;
272 this.data.aspect_ratio = this.options.width / this.options.height;
273 this.clearTimeouts();
274
275 // Namespace word ids to avoid collisions between multiple clouds
276 this.data.namespace = (this.Xelement.attr('id') || Math.floor((Math.random() * 1000000)).toString(36)) + '_word_';
277
278 this.Xelement.addClass('jqcloud');
279
280 // Container's CSS position cannot be 'static'
281 if (this.Xelement.css('position') === 'static') {
282 this.Xelement.css('position', 'relative');
283 }
284
285 // Delay execution so that the browser can render the page before the computatively intensive word cloud drawing
286 this.createTimeout(XjQ.proxy(this.drawWordCloud, this), 10);
287
288 // Attach window resize event
289 if (this.options.autoResize) {
290 XjQ(window).on('resize.' + this.data.namespace, throttle(this.resize, 50, this));
291 }
292 },
293
294 // Helper function to keep track of timeouts so they can be destroyed
295 createTimeout: function(callback, time) {
296 var timeout = setTimeout(XjQ.proxy(function() {
297 delete this.data.timeouts[timeout];
298 callback();
299 }, this), time);
300 this.data.timeouts[timeout] = true;
301 },
302
303 // Destroy all timeouts
304 clearTimeouts: function() {
305 XjQ.each(this.data.timeouts, function(key) {
306 clearTimeout(key);
307 });
308 this.data.timeouts = {};
309 },
310
311 // Pairwise overlap detection
312 overlapping: function(a, b) {
313 if (Math.abs(2.0 * a.left + a.width - 2.0 * b.left - b.width) < a.width + b.width) {
314 if (Math.abs(2.0 * a.top + a.height - 2.0 * b.top - b.height) < a.height + b.height) {
315 return true;
316 }
317 }
318 return false;
319 },
320
321 // Helper function to test if an element overlaps others
322 hitTest: function(elem) {
323 // Check elements for overlap one by one, stop and return false as soon as an overlap is found
324 for (var i = 0, l = this.data.placed_words.length; i < l; i++) {
325 if (this.overlapping(elem, this.data.placed_words[i])) {
326 return true;
327 }
328 }
329 return false;
330 },
331
332 // Initialize the drawing of the whole cloud
333 drawWordCloud: function() {
334 var i, l;
335
336 this.Xelement.children('[id^="' + this.data.namespace + '"]').remove();
337
338 if (this.word_array.length === 0) {
339 return;
340 }
341
342 // Make sure every weight is a number before sorting
343 for (i = 0, l = this.word_array.length; i < l; i++) {
344 this.word_array[i].weight = parseFloat(this.word_array[i].weight, 10);
345 }
346
347 // Sort word_array from the word with the highest weight to the one with the lowest
348 this.word_array.sort(function(a, b) {
349 return b.weight - a.weight;
350 });
351
352 // Kepp trace of bounds
353 this.data.max_weight = this.word_array[0].weight;
354 this.data.min_weight = this.word_array[this.word_array.length - 1].weight;
355
356 // Generate colors
357 this.data.colors = [];
358 if (this.colorGenerator) {
359 for (i = 0; i < this.options.steps; i++) {
360 this.data.colors.push(this.colorGenerator(i + 1));
361 }
362 }
363
364 // Generate font sizes
365 this.data.sizes = [];
366 if (this.sizeGenerator) {
367 for (i = 0; i < this.options.steps; i++) {
368 this.data.sizes.push(this.sizeGenerator(this.options.width, this.options.height, i + 1));
369 }
370 }
371
372 // Iterate drawOneWord on every word, immediately or with delay
373 if (this.options.delay > 0) {
374 this.drawOneWordDelayed();
375 }
376 else {
377 for (i = 0, l = this.word_array.length; i < l; i++) {
378 this.drawOneWord(i, this.word_array[i]);
379 }
380
381 if (typeof this.options.afterCloudRender === 'function') {
382 this.options.afterCloudRender.call(this.Xelement);
383 }
384 }
385 },
386
387 // Function to draw a word, by moving it in spiral until it finds a suitable empty place
388 drawOneWord: function(index, word) {
389 var word_id = this.data.namespace + index,
390 word_selector = '#' + word_id,
391
392 // option.shape == 'elliptic'
393 angle = this.data.angle,
394 radius = 0.0,
395
396 // option.shape == 'rectangular'
397 steps_in_direction = 0.0,
398 quarter_turns = 0.0,
399
400 weight = Math.floor(this.options.steps / 2),
401 word_span,
402 word_size,
403 word_style;
404
405 // Create word attr object
406 //word.attr = XjQ.extend({}, word.html, { id: word_id });
407 word.attr = XjQ.extend({}, word.html, { id: word_id, group: (word.group ? word.group : "") });
408
409 // Linearly map the original weight to a discrete scale from 1 to 10
410 // Only if weights are different
411 if (this.data.max_weight != this.data.min_weight) {
412 weight = Math.round((word.weight - this.data.min_weight) * 1.0 * (this.options.steps - 1) / (this.data.max_weight - this.data.min_weight)) + 1;
413 }
414 word_span = XjQ('<span>').attr(word.attr);
415
416 word_span.addClass('jqcloud-word');
417
418 // Apply class
419 if (this.options.classPattern) {
420 word_span.addClass(this.options.classPattern.replace('{n}', weight));
421 }
422
423 // Apply color
424 if (this.data.colors.length) {
425 word_span.css('color', this.data.colors[weight - 1]);
426 }
427
428 // Apply color from word property
429 if (word.color) {
430 word_span.css('color', word.color);
431 }
432
433 // Apply size
434 if (this.data.sizes.length) {
435 word_span.css('font-size', this.data.sizes[weight - 1]);
436 }
437
438 //Render using template function if provided.
439 if (this.options.template) {
440 word_span.html(this.options.template(word));
441 } else if (word.link) {
442 // Append link if word.link attribute was set
443 // If link is a string, then use it as the link href
444 if (typeof word.link === 'string') {
445 word.link = { href: word.link };
446 }
447
448 if (this.options.encodeURI) {
449 word.link.href = encodeURI(word.link.href).replace(/'/g, '%27');
450 }
451
452 word_span.append(XjQ('<a>').attr(word.link).text(word.text));
453 }
454 else {
455 word_span.text(word.text);
456 }
457
458 // Bind handlers to words
459 if (word.handlers) {
460 word_span.on(word.handlers);
461 }
462
463 this.Xelement.append(word_span);
464
465 word_size = {
466 width: word_span.outerWidth(),
467 height: word_span.outerHeight()
468 };
469 word_size.left = this.options.center.x * this.options.width - word_size.width / 2.0;
470 word_size.top = this.options.center.y * this.options.height - word_size.height / 2.0;
471
472 // Save a reference to the style property, for better performance
473 word_style = word_span[0].style;
474 word_style.position = 'absolute';
475 word_style.left = word_size.left + 'px';
476 word_style.top = word_size.top + 'px';
477
478 while (this.hitTest(word_size)) {
479 // option shape is 'rectangular' so move the word in a rectangular spiral
480 if (this.options.shape === 'rectangular') {
481 steps_in_direction++;
482
483 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)) {
484 steps_in_direction = 0.0;
485 quarter_turns++;
486 }
487
488 switch (quarter_turns % 4) {
489 case 1:
490 word_size.left += this.data.step * this.data.aspect_ratio + Math.random() * 2.0;
491 break;
492 case 2:
493 word_size.top -= this.data.step + Math.random() * 2.0;
494 break;
495 case 3:
496 word_size.left -= this.data.step * this.data.aspect_ratio + Math.random() * 2.0;
497 break;
498 case 0:
499 word_size.top += this.data.step + Math.random() * 2.0;
500 break;
501 }
502 }
503 // Default settings: elliptic spiral shape
504 else {
505 radius += this.data.step;
506 angle += (index % 2 === 0 ? 1 : -1) * this.data.step;
507
508 word_size.left = this.options.center.x * this.options.width - (word_size.width / 2.0) + (radius * Math.cos(angle)) * this.data.aspect_ratio;
509 word_size.top = this.options.center.y * this.options.height + radius * Math.sin(angle) - (word_size.height / 2.0);
510 }
511 word_style.left = word_size.left + 'px';
512 word_style.top = word_size.top + 'px';
513 }
514
515 // Don't render word if part of it would be outside the container
516 if (this.options.removeOverflowing && (
517 word_size.left < 0 || word_size.top < 0 ||
518 (word_size.left + word_size.width) > this.options.width ||
519 (word_size.top + word_size.height) > this.options.height
520 )
521 ) {
522 word_span.remove();
523 return;
524 }
525
526 // Save position for further usage
527 this.data.placed_words.push(word_size);
528
529 if (typeof word.afterWordRender === 'function') {
530 word.afterWordRender.call(word_span);
531 }
532 },
533
534 // Draw one word then recall the function after a delay
535 drawOneWordDelayed: function(index) {
536 index = index || 0;
537
538 // if not visible then do not attempt to draw
539 if (!this.Xelement.is(':visible')) {
540 this.createTimeout(XjQ.proxy(function() {
541 this.drawOneWordDelayed(index);
542 }, this), 10);
543
544 return;
545 }
546
547 if (index < this.word_array.length) {
548 this.drawOneWord(index, this.word_array[index]);
549
550 this.createTimeout(XjQ.proxy(function() {
551 this.drawOneWordDelayed(index + 1);
552 }, this), this.options.delay);
553 }
554 else {
555 if (typeof this.options.afterCloudRender == 'function') {
556 this.options.afterCloudRender.call(this.Xelement);
557 }
558 }
559 },
560
561 // Destroy any data and objects added by the plugin
562 destroy: function() {
563 if (this.options.autoResize) {
564 XjQ(window).off('resize.' + this.data.namespace);
565 }
566
567 this.clearTimeouts();
568 this.Xelement.removeClass('jqcloud');
569 this.Xelement.removeData('jqcloud');
570 this.Xelement.children('[id^="' + this.data.namespace + '"]').remove();
571 },
572
573 // Update the list of words
574 update: function(word_array) {
575 this.word_array = word_array;
576 this.data.placed_words = [];
577
578 this.clearTimeouts();
579 this.drawWordCloud();
580 },
581
582 resize: function() {
583 var new_size = {
584 width: this.Xelement.width(),
585 height: this.Xelement.height()
586 };
587
588 if (new_size.width != this.options.width || new_size.height != this.options.height) {
589 this.options.width = new_size.width;
590 this.options.height = new_size.height;
591 this.data.aspect_ratio = this.options.width / this.options.height;
592
593 this.update(this.word_array);
594 }
595 },
596 };
597
598 /*
599 * Apply throttling to a callback
600 * @param callback {function}
601 * @param delay {int} milliseconds
602 * @param context {object|null}
603 * @return {function}
604 */
605 function throttle(callback, delay, context) {
606 var state = {
607 pid: null,
608 last: 0
609 };
610
611 return function() {
612 var elapsed = new Date().getTime() - state.last,
613 args = arguments,
614 that = this;
615
616 function exec() {
617 state.last = new Date().getTime();
618 return callback.apply(context || that, Array.prototype.slice.call(args));
619 }
620
621 if (elapsed > delay) {
622 return exec();
623 }
624 else {
625 clearTimeout(state.pid);
626 state.pid = setTimeout(exec, delay - elapsed);
627 }
628 };
629 }
630
631 /*
632 * jQuery plugin
633 */
634 XjQ.fn.jQCloud = function(word_array, option) {
635 var args = arguments;
636
637 return this.each(function() {
638 var Xthis = XjQ(this),
639 data = Xthis.data('jqcloud');
640
641 if (!data && word_array === 'destroy') {
642 // Don't even try to initialize when called with 'destroy'
643 return;
644 }
645 if (!data) {
646 var options = typeof option === 'object' ? option : {};
647 Xthis.data('jqcloud', (data = new jQCloud(this, word_array, options)));
648 }
649 else if (typeof word_array === 'string') {
650 data[word_array].apply(data, Array.prototype.slice.call(args, 1));
651 }
652 });
653 };
654
655 XjQ.fn.jQCloud.defaults = {
656 set: function(options) {
657 XjQ.extend(true, jQCloud.DEFAULTS, options);
658 },
659 get: function(key) {
660 var options = jQCloud.DEFAULTS;
661 if (key) {
662 options = options[key];
663 }
664 return XjQ.extend(true, {}, options);
665 }
666 };
667
668 var jQwords = [
669 {text: "Druckvorschau", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
670 {text: "Link im Formular", weight: 6, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
671 {text: "Kalenderwidget anpassen", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
672 {text: "Optionale Daten einer Auswahl mitspeichern (col Attribute)", weight: 4, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
673 {text: "Aktion vor Absenden ausführen", weight: 5, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
674 {text: "Absenden ohne Speichern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
675 {text: "Eigene Formularfeld-Validatoren (Regex)", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
676 {text: "Wiederholende Felder (dynamic) im JS adressieren", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
677 {text: "Events an dynamic Felder anhängen", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
678 {text: "[Richtext-Editor (Ticket #4227)]", weight: 3, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
679 {text: "Vorbelegung von Daten im Formular (extern)", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
680 {text: "intiale Vorbelegung von Daten in Feldern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
681 {text: "Formularfelder mit LDAP-Daten vorbelegen (Ticket 3701)", weight: 3, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
682 {text: "Formulareingaben zurücksetzen", weight: 7, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
683 {text: "Formulardaten lokal speichern und später wieder laden (Ticket #3964)", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
684 {text: "Formular zwischenspeichern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
685 {text: "Labeltext zur Laufzeit manipulieren (Ticket #3493)", weight: 5, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
686 {text: "Mehrfachbedingungen im Designer", weight: 7, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
687 {text: "zusätzliches JS und CSS in allen Formularen", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
688 {text: "mehrseitige Formulare", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
689 {text: "responive / mobile Ansicht", weight: 10, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
690 {text: "andere Schriftart einbinden / Design ändern", weight: 9, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
691 {text: "Java-Script API", weight: 8, group: 'Designer', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
692
693 {text: "Datenquellen für Auswahllisten hinterlegen", weight: 8, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
694 {text: "Datenquellen in Auswahllisten anhand von Parametern hinterlegen", weight: 6, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
695 {text: "Leerer erster Eintrag bei SQL-Datenquelle (Ticket #4068)", weight: 5, group: 'Datenquellen', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
696
697 {text: "Mehrfachbedingungen im Workflow", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
698 {text: "Automatisiertes Löschen nach bestimmten Zeitraum", weight: 9, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
699 {text: "Exportmöglichkeiten von Daten", weight: 6, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
700 {text: "E-Mail Aktionen abhängig von Eingaben (Bedingungen) durchführen", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
701 {text: "Bedingtes Einblenden von Elementen", weight: 7, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
702 {text: "Mehrstufigen Workflow (Beispiel)", weight: 8, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
703 {text: "Statuswechsel", weight: 10, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
704 {text: "Vorgangs-ID im Druck (Word-Fill) anzeigen (Ticket #3813)", weight: 5, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
705 {text: "iCal Datei erzeugen", weight: 3, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
706 {text: "aktuelles Datum in der Verarbeitung", weight: 6, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
707 {text: "Laufende Nummer aus Nummernkreis erzeugen (Ticket #3249)", weight: 3, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
708 {text: "E-Mail-Versand", weight: 10, group: 'Statusverarbeitung', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
709
710 {text: "Migrationsmöglichkeiten in Webseite", weight: 6, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
711 {text: "Abschlussseite in Webseite anzeigen (inline)", weight: 5, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
712 {text: "Generierte Dateien auf Abschlussseite anzeigen", weight: 7, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
713 {text: "Benutzerdefinierte Abschlussseite", weight: 9, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
714 {text: "Referenznummer (Ticket #3866)", weight: 5, group: 'Abschlusseite', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
715
716 {text: "Vorgänge löschen", weight: 9, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
717 {text: "Filtermöglichkeiten", weight: 8, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
718 {text: "Stauswechsel im Postfach ermöglichen (notwendige Einstellungen)", weight: 6.5, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
719 {text: "Postfach exportieren", weight: 7, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
720 {text: "Berechtigungen/Sichtbarkeiten für Benutzer festlegen", weight: 6, group: 'Posteingang', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
721
722 {text: "Update FORMCYCLE", weight: 4, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
723 {text: "Zugriffseinschränkung - Möglichkeiten", weight: 3, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
724 {text: "I-Frame automatisch Höhe anpassen", weight: 5, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
725 {text: "Daten aus Formular werden nicht gespeichert (Disablede Felder)", weight: 6, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
726 {text: "Double Opt-In", weight: 7, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/UserInterface/MyForms/DoubleOptIn/'},
727 {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/'},
728 {text: "[Tomcat Zugriff HTTPS - Zertifikat-Einrichtung (Ticket #3295)]", weight: 5, group: 'Anderes', link: 'https://help.formcycle.eu/xwiki/bin/view/Formcycle/'},
729 {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/'},
730 ];
731 ##http://mistic100.github.io/jQCloud/demo.html#handlers
732 /*XjQ('#jQArea').jQCloud(jQwords, {
733 classPattern: null,
734 colors: ["#176694", "#3480AD", "#5398c1", "#76b2d6", "#7ca2b9", "#889fad", "#8e979c", "#929596", "#babbbb"],
735 fontSize: ['16px','15px','15px','14px','14px','13px','13px','12px','12px'],
736 //width: 500,
737 height: 500
738 });*/
739
740 var jQButtons = XjQ('.jQButton');
741
742 jQButtons.click(function() {
743 if (XjQ(this).attr('active') == 'true') {
744 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagInvisible);
745 XjQ(this).attr('active', 'false');
746 } else {
747 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagVisible);
748 XjQ(this).attr('active', 'true');
749 }
750 });
751 function jQTagVisible() {
752 XjQ(this).css('display', 'block');
753 }
754 function jQTagInvisible() {
755 XjQ(this).css('display', 'none');
756 }
757
758 jQButtons.hover(function() {
759 console.log("hover",XjQ(this));
760 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagHighlighted);
761 }, function() {
762 console.log("unhover",XjQ(this));
763 XjQ('#jQArea').children('span[group="'+XjQ(this).attr('group')+'"]').each(jQTagNotHighlighted);
764 });
765 function jQTagHighlighted() {
766 XjQ(this).addClass('jqHighlight');
767 }
768 function jQTagNotHighlighted() {
769 XjQ(this).removeClass('jqHighlight');
770 }
771 });
772 </script>
773 <!--
774 <div class="row">
775 <div class="d-none d-md-block col-lg-12 card-main">
776 <div class="well" >
777 <div id="jQButtons">
778 <div id="jQBtn1" class="jQButton" group="Designer" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Designer</div>
779 <div id="jQBtn1" class="jQButton" group="Datenquellen" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Datenquellen</div>
780 <div id="jQBtn1" class="jQButton" group="Statusverarbeitung" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Statusverarbeitung</div>
781 <div id="jQBtn1" class="jQButton" group="Abschlusseite" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Abschlusseite</div>
782 <div id="jQBtn1" class="jQButton" group="Posteingang" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Posteingang</div>
783 <div id="jQBtn1" class="jQButton" group="Anderes" active="true"><span class="jQButton-icon"></span>&nbsp;&nbsp;Anderes</div>
784 </div>
785 <div id="jQArea">
786 </div>
787 </div>
788 </div>
789 </div>
790 -->
791 {{/html}}
792 {{/velocity}}
793
794
795 === Kleine FAQ ===
796
797 Muss man die Übungen machen?
798 //Nein. Sie können sich die Videos auch so ansehen und keine Übungen machen. Die Übungen stellen aber sicher, dass die in den Videos behandelten Themen auch verstanden wurden.//
799
800
801 Ist es immer die gleiche Übung?
802 //Nein. Für die Übungen müssen Sie sich vorher hier anmelden. Sie erhalten dann eine entsprechende Übungsaufgabe.//
803
804
805 Wie lange habe ich für die Übungen Zeit?
806 //10 Tage//
807
808
809 Was kostet die Übung?
810 //Nichts!//
811
812
813 Kann man auch durchfallen?
814 //Ja. Um die kostenfreien Support-Tickets zu erhalten möchten wir sicherstellen, dass Sie die Grundlagen beherrschen.//
815
816
817 Die Schulungsvideos sind gut, aber bieten Sie aber trotzdem noch aufbauende Schulungen/Workshops an?
818
819 //Ja. Kontaktieren Sie uns. //