Wiki source code of Schulungsvideos


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