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