3 <html lang=
"en" class=
"no-js">
7 <meta name=
"viewport" content=
"width=device-width,initial-scale=1">
12 <link rel=
"icon" href=
"../../../assets/default.favicon.ico">
13 <meta name=
"generator" content=
"mkdocs-1.1.2, mkdocs-material-7.1.0">
17 <title>TypeScript and JavaScript - WoltLab Suite Documentation
</title>
21 <link rel=
"stylesheet" href=
"../../../assets/stylesheets/main.33e2939f.min.css">
24 <link rel=
"stylesheet" href=
"../../../assets/stylesheets/palette.ef6f36e2.min.css">
28 <meta name=
"theme-color" content=
"#009485">
38 <link rel=
"stylesheet" href=
"../../../stylesheets/extra.css">
52 <body dir=
"ltr" data-md-color-scheme=
"" data-md-color-primary=
"teal" data-md-color-accent=
"">
55 <script>function __prefix(e){return new URL(
"../../..",location).pathname+
"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}
</script>
57 <input class=
"md-toggle" data-md-toggle=
"drawer" type=
"checkbox" id=
"__drawer" autocomplete=
"off">
58 <input class=
"md-toggle" data-md-toggle=
"search" type=
"checkbox" id=
"__search" autocomplete=
"off">
59 <label class=
"md-overlay" for=
"__drawer"></label>
60 <div data-md-component=
"skip">
63 <a href=
"#migrating-from-wsc-53-typescript-and-javascript" class=
"md-skip">
68 <div data-md-component=
"announce">
70 <aside class=
"md-announce">
71 <div class=
"md-announce__inner md-grid md-typeset">
73 <a href=
"https://www.woltlab.com">Back to
<strong>woltlab.com
</strong></a>
80 <header class=
"md-header" data-md-component=
"header">
81 <nav class=
"md-header__inner md-grid" aria-label=
"Header">
82 <a href=
"../../.." title=
"WoltLab Suite Documentation" class=
"md-header__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
84 <img src=
"../../../assets/logo.png" alt=
"logo">
87 <label class=
"md-header__button md-icon" for=
"__drawer">
88 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
90 <div class=
"md-header__title" data-md-component=
"header-title">
91 <div class=
"md-header__ellipsis">
92 <div class=
"md-header__topic">
93 <span class=
"md-ellipsis">
94 WoltLab Suite Documentation
97 <div class=
"md-header__topic" data-md-component=
"header-topic">
98 <span class=
"md-ellipsis">
100 TypeScript and JavaScript
109 <label class=
"md-header__button md-icon" for=
"__search">
110 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
113 <div class=
"md-search" data-md-component=
"search" role=
"dialog">
114 <label class=
"md-search__overlay" for=
"__search"></label>
115 <div class=
"md-search__inner" role=
"search">
116 <form class=
"md-search__form" name=
"search">
117 <input type=
"text" class=
"md-search__input" name=
"query" aria-label=
"Search" placeholder=
"Search" autocapitalize=
"off" autocorrect=
"off" autocomplete=
"off" spellcheck=
"false" data-md-component=
"search-query" data-md-state=
"active" required
>
118 <label class=
"md-search__icon md-icon" for=
"__search">
119 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
120 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
122 <button type=
"reset" class=
"md-search__icon md-icon" aria-label=
"Clear" tabindex=
"-1">
123 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
126 <div class=
"md-search__output">
127 <div class=
"md-search__scrollwrap" data-md-scrollfix
>
128 <div class=
"md-search-result" data-md-component=
"search-result">
129 <div class=
"md-search-result__meta">
132 <ol class=
"md-search-result__list"></ol>
140 <div class=
"md-header__source">
142 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
143 <div class=
"md-source__icon md-icon">
145 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
147 <div class=
"md-source__repository">
156 <div class=
"md-container" data-md-component=
"container">
161 <main class=
"md-main" data-md-component=
"main">
162 <div class=
"md-main__inner md-grid">
166 <div class=
"md-sidebar md-sidebar--primary" data-md-component=
"sidebar" data-md-type=
"navigation" >
167 <div class=
"md-sidebar__scrollwrap">
168 <div class=
"md-sidebar__inner">
172 <nav class=
"md-nav md-nav--primary" aria-label=
"Navigation" data-md-level=
"0">
173 <label class=
"md-nav__title" for=
"__drawer">
174 <a href=
"../../.." title=
"WoltLab Suite Documentation" class=
"md-nav__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
176 <img src=
"../../../assets/logo.png" alt=
"logo">
179 WoltLab Suite Documentation
182 <div class=
"md-nav__source">
184 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
185 <div class=
"md-source__icon md-icon">
187 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
189 <div class=
"md-source__repository">
195 <ul class=
"md-nav__list" data-md-scrollfix
>
204 <li class=
"md-nav__item">
205 <a href=
"../../../getting-started/" class=
"md-nav__link">
220 <li class=
"md-nav__item md-nav__item--nested">
223 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2" type=
"checkbox" id=
"__nav_2" >
225 <label class=
"md-nav__link" for=
"__nav_2">
227 <span class=
"md-nav__icon md-icon"></span>
229 <nav class=
"md-nav" aria-label=
"PHP API" data-md-level=
"1">
230 <label class=
"md-nav__title" for=
"__nav_2">
231 <span class=
"md-nav__icon md-icon"></span>
234 <ul class=
"md-nav__list" data-md-scrollfix
>
240 <li class=
"md-nav__item">
241 <a href=
"../../../php/pages/" class=
"md-nav__link">
252 <li class=
"md-nav__item">
253 <a href=
"../../../php/database-objects/" class=
"md-nav__link">
264 <li class=
"md-nav__item">
265 <a href=
"../../../php/database-access/" class=
"md-nav__link">
276 <li class=
"md-nav__item">
277 <a href=
"../../../php/exceptions/" class=
"md-nav__link">
289 <li class=
"md-nav__item md-nav__item--nested">
292 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5" type=
"checkbox" id=
"__nav_2_5" >
294 <label class=
"md-nav__link" for=
"__nav_2_5">
296 <span class=
"md-nav__icon md-icon"></span>
298 <nav class=
"md-nav" aria-label=
"API" data-md-level=
"2">
299 <label class=
"md-nav__title" for=
"__nav_2_5">
300 <span class=
"md-nav__icon md-icon"></span>
303 <ul class=
"md-nav__list" data-md-scrollfix
>
310 <li class=
"md-nav__item md-nav__item--nested">
313 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5_1" type=
"checkbox" id=
"__nav_2_5_1" >
315 <label class=
"md-nav__link" for=
"__nav_2_5_1">
317 <span class=
"md-nav__icon md-icon"></span>
319 <nav class=
"md-nav" aria-label=
"Caches" data-md-level=
"3">
320 <label class=
"md-nav__title" for=
"__nav_2_5_1">
321 <span class=
"md-nav__icon md-icon"></span>
324 <ul class=
"md-nav__list" data-md-scrollfix
>
330 <li class=
"md-nav__item">
331 <a href=
"../../../php/api/caches/" class=
"md-nav__link">
342 <li class=
"md-nav__item">
343 <a href=
"../../../php/api/caches_persistent-caches/" class=
"md-nav__link">
354 <li class=
"md-nav__item">
355 <a href=
"../../../php/api/caches_runtime-caches/" class=
"md-nav__link">
372 <li class=
"md-nav__item">
373 <a href=
"../../../php/api/comments/" class=
"md-nav__link">
384 <li class=
"md-nav__item">
385 <a href=
"../../../php/api/cronjobs/" class=
"md-nav__link">
396 <li class=
"md-nav__item">
397 <a href=
"../../../php/api/events/" class=
"md-nav__link">
409 <li class=
"md-nav__item md-nav__item--nested">
412 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5_5" type=
"checkbox" id=
"__nav_2_5_5" >
414 <label class=
"md-nav__link" for=
"__nav_2_5_5">
416 <span class=
"md-nav__icon md-icon"></span>
418 <nav class=
"md-nav" aria-label=
"Form Builder" data-md-level=
"3">
419 <label class=
"md-nav__title" for=
"__nav_2_5_5">
420 <span class=
"md-nav__icon md-icon"></span>
423 <ul class=
"md-nav__list" data-md-scrollfix
>
429 <li class=
"md-nav__item">
430 <a href=
"../../../php/api/form_builder/overview/" class=
"md-nav__link">
441 <li class=
"md-nav__item">
442 <a href=
"../../../php/api/form_builder/structure/" class=
"md-nav__link">
453 <li class=
"md-nav__item">
454 <a href=
"../../../php/api/form_builder/form_fields/" class=
"md-nav__link">
465 <li class=
"md-nav__item">
466 <a href=
"../../../php/api/form_builder/validation_data/" class=
"md-nav__link">
477 <li class=
"md-nav__item">
478 <a href=
"../../../php/api/form_builder/dependencies/" class=
"md-nav__link">
495 <li class=
"md-nav__item">
496 <a href=
"../../../php/api/package_installation_plugins/" class=
"md-nav__link">
497 Package Installation Plugins
507 <li class=
"md-nav__item">
508 <a href=
"../../../php/api/user_activity_points/" class=
"md-nav__link">
519 <li class=
"md-nav__item">
520 <a href=
"../../../php/api/user_notifications/" class=
"md-nav__link">
531 <li class=
"md-nav__item">
532 <a href=
"../../../php/api/sitemaps/" class=
"md-nav__link">
549 <li class=
"md-nav__item">
550 <a href=
"../../../php/code-style/" class=
"md-nav__link">
561 <li class=
"md-nav__item">
562 <a href=
"../../../php/apps/" class=
"md-nav__link">
573 <li class=
"md-nav__item">
574 <a href=
"../../../php/gdpr/" class=
"md-nav__link">
595 <li class=
"md-nav__item md-nav__item--nested">
598 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_3" type=
"checkbox" id=
"__nav_3" >
600 <label class=
"md-nav__link" for=
"__nav_3">
601 Languages, Templates & CSS
602 <span class=
"md-nav__icon md-icon"></span>
604 <nav class=
"md-nav" aria-label=
"Languages, Templates & CSS" data-md-level=
"1">
605 <label class=
"md-nav__title" for=
"__nav_3">
606 <span class=
"md-nav__icon md-icon"></span>
607 Languages, Templates & CSS
609 <ul class=
"md-nav__list" data-md-scrollfix
>
615 <li class=
"md-nav__item">
616 <a href=
"../../../view/languages/" class=
"md-nav__link">
627 <li class=
"md-nav__item">
628 <a href=
"../../../view/templates/" class=
"md-nav__link">
639 <li class=
"md-nav__item">
640 <a href=
"../../../view/template-plugins/" class=
"md-nav__link">
651 <li class=
"md-nav__item">
652 <a href=
"../../../view/css/" class=
"md-nav__link">
673 <li class=
"md-nav__item md-nav__item--nested">
676 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4" type=
"checkbox" id=
"__nav_4" >
678 <label class=
"md-nav__link" for=
"__nav_4">
679 TypeScript and JavaScript API
680 <span class=
"md-nav__icon md-icon"></span>
682 <nav class=
"md-nav" aria-label=
"TypeScript and JavaScript API" data-md-level=
"1">
683 <label class=
"md-nav__title" for=
"__nav_4">
684 <span class=
"md-nav__icon md-icon"></span>
685 TypeScript and JavaScript API
687 <ul class=
"md-nav__list" data-md-scrollfix
>
693 <li class=
"md-nav__item">
694 <a href=
"../../../javascript/general-usage/" class=
"md-nav__link">
705 <li class=
"md-nav__item">
706 <a href=
"../../../javascript/typescript/" class=
"md-nav__link">
718 <li class=
"md-nav__item md-nav__item--nested">
721 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4_3" type=
"checkbox" id=
"__nav_4_3" >
723 <label class=
"md-nav__link" for=
"__nav_4_3">
725 <span class=
"md-nav__icon md-icon"></span>
727 <nav class=
"md-nav" aria-label=
"New API" data-md-level=
"2">
728 <label class=
"md-nav__title" for=
"__nav_4_3">
729 <span class=
"md-nav__icon md-icon"></span>
732 <ul class=
"md-nav__list" data-md-scrollfix
>
738 <li class=
"md-nav__item">
739 <a href=
"../../../javascript/new-api_writing-a-module/" class=
"md-nav__link">
750 <li class=
"md-nav__item">
751 <a href=
"../../../javascript/new-api_data-structures/" class=
"md-nav__link">
762 <li class=
"md-nav__item">
763 <a href=
"../../../javascript/new-api_core/" class=
"md-nav__link">
774 <li class=
"md-nav__item">
775 <a href=
"../../../javascript/new-api_dom/" class=
"md-nav__link">
786 <li class=
"md-nav__item">
787 <a href=
"../../../javascript/new-api_events/" class=
"md-nav__link">
798 <li class=
"md-nav__item">
799 <a href=
"../../../javascript/new-api_ajax/" class=
"md-nav__link">
810 <li class=
"md-nav__item">
811 <a href=
"../../../javascript/new-api_dialogs/" class=
"md-nav__link">
822 <li class=
"md-nav__item">
823 <a href=
"../../../javascript/new-api_browser/" class=
"md-nav__link">
824 Browser and Screen Sizes
834 <li class=
"md-nav__item">
835 <a href=
"../../../javascript/new-api_ui/" class=
"md-nav__link">
852 <li class=
"md-nav__item">
853 <a href=
"../../../javascript/legacy-api/" class=
"md-nav__link">
864 <li class=
"md-nav__item">
865 <a href=
"../../../javascript/helper-functions/" class=
"md-nav__link">
876 <li class=
"md-nav__item">
877 <a href=
"../../../javascript/code-snippets/" class=
"md-nav__link">
898 <li class=
"md-nav__item md-nav__item--nested">
901 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5" type=
"checkbox" id=
"__nav_5" >
903 <label class=
"md-nav__link" for=
"__nav_5">
905 <span class=
"md-nav__icon md-icon"></span>
907 <nav class=
"md-nav" aria-label=
"Package Components" data-md-level=
"1">
908 <label class=
"md-nav__title" for=
"__nav_5">
909 <span class=
"md-nav__icon md-icon"></span>
912 <ul class=
"md-nav__list" data-md-scrollfix
>
918 <li class=
"md-nav__item">
919 <a href=
"../../../package/package-xml/" class=
"md-nav__link">
931 <li class=
"md-nav__item md-nav__item--nested">
934 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5_2" type=
"checkbox" id=
"__nav_5_2" >
936 <label class=
"md-nav__link" for=
"__nav_5_2">
938 <span class=
"md-nav__icon md-icon"></span>
940 <nav class=
"md-nav" aria-label=
"PIPs" data-md-level=
"2">
941 <label class=
"md-nav__title" for=
"__nav_5_2">
942 <span class=
"md-nav__icon md-icon"></span>
945 <ul class=
"md-nav__list" data-md-scrollfix
>
951 <li class=
"md-nav__item">
952 <a href=
"../../../package/pip/" class=
"md-nav__link">
963 <li class=
"md-nav__item">
964 <a href=
"../../../package/pip/acl-option/" class=
"md-nav__link">
975 <li class=
"md-nav__item">
976 <a href=
"../../../package/pip/acp-menu/" class=
"md-nav__link">
987 <li class=
"md-nav__item">
988 <a href=
"../../../package/pip/acp-search-provider/" class=
"md-nav__link">
999 <li class=
"md-nav__item">
1000 <a href=
"../../../package/pip/acp-template/" class=
"md-nav__link">
1011 <li class=
"md-nav__item">
1012 <a href=
"../../../package/pip/bbcode/" class=
"md-nav__link">
1023 <li class=
"md-nav__item">
1024 <a href=
"../../../package/pip/box/" class=
"md-nav__link">
1035 <li class=
"md-nav__item">
1036 <a href=
"../../../package/pip/clipboard-action/" class=
"md-nav__link">
1047 <li class=
"md-nav__item">
1048 <a href=
"../../../package/pip/core-object/" class=
"md-nav__link">
1059 <li class=
"md-nav__item">
1060 <a href=
"../../../package/pip/cronjob/" class=
"md-nav__link">
1071 <li class=
"md-nav__item">
1072 <a href=
"../../../package/pip/database/" class=
"md-nav__link">
1083 <li class=
"md-nav__item">
1084 <a href=
"../../../package/pip/event-listener/" class=
"md-nav__link">
1095 <li class=
"md-nav__item">
1096 <a href=
"../../../package/pip/file/" class=
"md-nav__link">
1107 <li class=
"md-nav__item">
1108 <a href=
"../../../package/pip/language/" class=
"md-nav__link">
1119 <li class=
"md-nav__item">
1120 <a href=
"../../../package/pip/media-provider/" class=
"md-nav__link">
1131 <li class=
"md-nav__item">
1132 <a href=
"../../../package/pip/menu/" class=
"md-nav__link">
1143 <li class=
"md-nav__item">
1144 <a href=
"../../../package/pip/menu-item/" class=
"md-nav__link">
1155 <li class=
"md-nav__item">
1156 <a href=
"../../../package/pip/object-type/" class=
"md-nav__link">
1167 <li class=
"md-nav__item">
1168 <a href=
"../../../package/pip/object-type-definition/" class=
"md-nav__link">
1169 objectTypeDefinition
1179 <li class=
"md-nav__item">
1180 <a href=
"../../../package/pip/option/" class=
"md-nav__link">
1191 <li class=
"md-nav__item">
1192 <a href=
"../../../package/pip/page/" class=
"md-nav__link">
1203 <li class=
"md-nav__item">
1204 <a href=
"../../../package/pip/pip/" class=
"md-nav__link">
1215 <li class=
"md-nav__item">
1216 <a href=
"../../../package/pip/script/" class=
"md-nav__link">
1227 <li class=
"md-nav__item">
1228 <a href=
"../../../package/pip/smiley/" class=
"md-nav__link">
1239 <li class=
"md-nav__item">
1240 <a href=
"../../../package/pip/sql/" class=
"md-nav__link">
1251 <li class=
"md-nav__item">
1252 <a href=
"../../../package/pip/style/" class=
"md-nav__link">
1263 <li class=
"md-nav__item">
1264 <a href=
"../../../package/pip/template/" class=
"md-nav__link">
1275 <li class=
"md-nav__item">
1276 <a href=
"../../../package/pip/template-listener/" class=
"md-nav__link">
1287 <li class=
"md-nav__item">
1288 <a href=
"../../../package/pip/user-group-option/" class=
"md-nav__link">
1299 <li class=
"md-nav__item">
1300 <a href=
"../../../package/pip/user-menu/" class=
"md-nav__link">
1311 <li class=
"md-nav__item">
1312 <a href=
"../../../package/pip/user-notification-event/" class=
"md-nav__link">
1313 userNotificationEvent
1323 <li class=
"md-nav__item">
1324 <a href=
"../../../package/pip/user-option/" class=
"md-nav__link">
1335 <li class=
"md-nav__item">
1336 <a href=
"../../../package/pip/user-profile-menu/" class=
"md-nav__link">
1353 <li class=
"md-nav__item">
1354 <a href=
"../../../package/database-php-api/" class=
"md-nav__link">
1377 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
1380 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6" type=
"checkbox" id=
"__nav_6" checked
>
1382 <label class=
"md-nav__link" for=
"__nav_6">
1384 <span class=
"md-nav__icon md-icon"></span>
1386 <nav class=
"md-nav" aria-label=
"Migration" data-md-level=
"1">
1387 <label class=
"md-nav__title" for=
"__nav_6">
1388 <span class=
"md-nav__icon md-icon"></span>
1391 <ul class=
"md-nav__list" data-md-scrollfix
>
1400 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
1403 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_1" type=
"checkbox" id=
"__nav_6_1" checked
>
1405 <label class=
"md-nav__link" for=
"__nav_6_1">
1406 Migrating from WSC
5.3
1407 <span class=
"md-nav__icon md-icon"></span>
1409 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.3" data-md-level=
"2">
1410 <label class=
"md-nav__title" for=
"__nav_6_1">
1411 <span class=
"md-nav__icon md-icon"></span>
1412 Migrating from WSC
5.3
1414 <ul class=
"md-nav__list" data-md-scrollfix
>
1420 <li class=
"md-nav__item">
1421 <a href=
"../php/" class=
"md-nav__link">
1432 <li class=
"md-nav__item">
1433 <a href=
"../session/" class=
"md-nav__link">
1434 Session Handling and Authentication
1446 <li class=
"md-nav__item md-nav__item--active">
1448 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"toc" type=
"checkbox" id=
"__toc">
1453 <label class=
"md-nav__link md-nav__link--active" for=
"__toc">
1454 TypeScript and JavaScript
1455 <span class=
"md-nav__icon md-icon"></span>
1458 <a href=
"./" class=
"md-nav__link md-nav__link--active">
1459 TypeScript and JavaScript
1463 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
1469 <label class=
"md-nav__title" for=
"__toc">
1470 <span class=
"md-nav__icon md-icon"></span>
1473 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
1475 <li class=
"md-nav__item">
1476 <a href=
"#typescript" class=
"md-nav__link">
1482 <li class=
"md-nav__item">
1483 <a href=
"#wcf_click_event" class=
"md-nav__link">
1489 <li class=
"md-nav__item">
1490 <a href=
"#wcfactiondelete-and-wcfactiontoggle" class=
"md-nav__link">
1491 WCF.Action.Delete and WCF.Action.Toggle
1496 <li class=
"md-nav__item">
1497 <a href=
"#wcftableemptytablehandler" class=
"md-nav__link">
1498 WCF.Table.EmptyTableHandler
1515 <li class=
"md-nav__item">
1516 <a href=
"../templates/" class=
"md-nav__link">
1527 <li class=
"md-nav__item">
1528 <a href=
"../libraries/" class=
"md-nav__link">
1529 Third Party Libraries
1546 <li class=
"md-nav__item md-nav__item--nested">
1549 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_2" type=
"checkbox" id=
"__nav_6_2" >
1551 <label class=
"md-nav__link" for=
"__nav_6_2">
1552 Migrating from WSC
5.2
1553 <span class=
"md-nav__icon md-icon"></span>
1555 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.2" data-md-level=
"2">
1556 <label class=
"md-nav__title" for=
"__nav_6_2">
1557 <span class=
"md-nav__icon md-icon"></span>
1558 Migrating from WSC
5.2
1560 <ul class=
"md-nav__list" data-md-scrollfix
>
1566 <li class=
"md-nav__item">
1567 <a href=
"../../wsc52/php/" class=
"md-nav__link">
1578 <li class=
"md-nav__item">
1579 <a href=
"../../wsc52/templates/" class=
"md-nav__link">
1580 Templates and Languages
1590 <li class=
"md-nav__item">
1591 <a href=
"../../wsc52/libraries/" class=
"md-nav__link">
1592 Third Party Libraries
1609 <li class=
"md-nav__item md-nav__item--nested">
1612 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_3" type=
"checkbox" id=
"__nav_6_3" >
1614 <label class=
"md-nav__link" for=
"__nav_6_3">
1615 Migrating from WSC
3.1
1616 <span class=
"md-nav__icon md-icon"></span>
1618 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.1" data-md-level=
"2">
1619 <label class=
"md-nav__title" for=
"__nav_6_3">
1620 <span class=
"md-nav__icon md-icon"></span>
1621 Migrating from WSC
3.1
1623 <ul class=
"md-nav__list" data-md-scrollfix
>
1629 <li class=
"md-nav__item">
1630 <a href=
"../../wsc31/php/" class=
"md-nav__link">
1648 <li class=
"md-nav__item md-nav__item--nested">
1651 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_4" type=
"checkbox" id=
"__nav_6_4" >
1653 <label class=
"md-nav__link" for=
"__nav_6_4">
1654 Migrating from WSC
3.0
1655 <span class=
"md-nav__icon md-icon"></span>
1657 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.0" data-md-level=
"2">
1658 <label class=
"md-nav__title" for=
"__nav_6_4">
1659 <span class=
"md-nav__icon md-icon"></span>
1660 Migrating from WSC
3.0
1662 <ul class=
"md-nav__list" data-md-scrollfix
>
1668 <li class=
"md-nav__item">
1669 <a href=
"../../wsc30/php/" class=
"md-nav__link">
1680 <li class=
"md-nav__item">
1681 <a href=
"../../wsc30/javascript/" class=
"md-nav__link">
1692 <li class=
"md-nav__item">
1693 <a href=
"../../wsc30/templates/" class=
"md-nav__link">
1704 <li class=
"md-nav__item">
1705 <a href=
"../../wsc30/css/" class=
"md-nav__link">
1716 <li class=
"md-nav__item">
1717 <a href=
"../../wsc30/package/" class=
"md-nav__link">
1735 <li class=
"md-nav__item md-nav__item--nested">
1738 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_5" type=
"checkbox" id=
"__nav_6_5" >
1740 <label class=
"md-nav__link" for=
"__nav_6_5">
1741 Migrating from WCF
2.1
1742 <span class=
"md-nav__icon md-icon"></span>
1744 <nav class=
"md-nav" aria-label=
"Migrating from WCF 2.1" data-md-level=
"2">
1745 <label class=
"md-nav__title" for=
"__nav_6_5">
1746 <span class=
"md-nav__icon md-icon"></span>
1747 Migrating from WCF
2.1
1749 <ul class=
"md-nav__list" data-md-scrollfix
>
1755 <li class=
"md-nav__item">
1756 <a href=
"../../wcf21/php/" class=
"md-nav__link">
1767 <li class=
"md-nav__item">
1768 <a href=
"../../wcf21/templates/" class=
"md-nav__link">
1779 <li class=
"md-nav__item">
1780 <a href=
"../../wcf21/css/" class=
"md-nav__link">
1791 <li class=
"md-nav__item">
1792 <a href=
"../../wcf21/package/" class=
"md-nav__link">
1819 <li class=
"md-nav__item md-nav__item--nested">
1822 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7" type=
"checkbox" id=
"__nav_7" >
1824 <label class=
"md-nav__link" for=
"__nav_7">
1826 <span class=
"md-nav__icon md-icon"></span>
1828 <nav class=
"md-nav" aria-label=
"Tutorials" data-md-level=
"1">
1829 <label class=
"md-nav__title" for=
"__nav_7">
1830 <span class=
"md-nav__icon md-icon"></span>
1833 <ul class=
"md-nav__list" data-md-scrollfix
>
1840 <li class=
"md-nav__item md-nav__item--nested">
1843 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7_1" type=
"checkbox" id=
"__nav_7_1" >
1845 <label class=
"md-nav__link" for=
"__nav_7_1">
1847 <span class=
"md-nav__icon md-icon"></span>
1849 <nav class=
"md-nav" aria-label=
"Tutorial Series" data-md-level=
"2">
1850 <label class=
"md-nav__title" for=
"__nav_7_1">
1851 <span class=
"md-nav__icon md-icon"></span>
1854 <ul class=
"md-nav__list" data-md-scrollfix
>
1860 <li class=
"md-nav__item">
1861 <a href=
"../../../tutorial/series/overview/" class=
"md-nav__link">
1872 <li class=
"md-nav__item">
1873 <a href=
"../../../tutorial/series/part_1/" class=
"md-nav__link">
1884 <li class=
"md-nav__item">
1885 <a href=
"../../../tutorial/series/part_2/" class=
"md-nav__link">
1896 <li class=
"md-nav__item">
1897 <a href=
"../../../tutorial/series/part_3/" class=
"md-nav__link">
1924 <div class=
"md-sidebar md-sidebar--secondary" data-md-component=
"sidebar" data-md-type=
"toc" >
1925 <div class=
"md-sidebar__scrollwrap">
1926 <div class=
"md-sidebar__inner">
1928 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
1934 <label class=
"md-nav__title" for=
"__toc">
1935 <span class=
"md-nav__icon md-icon"></span>
1938 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
1940 <li class=
"md-nav__item">
1941 <a href=
"#typescript" class=
"md-nav__link">
1947 <li class=
"md-nav__item">
1948 <a href=
"#wcf_click_event" class=
"md-nav__link">
1954 <li class=
"md-nav__item">
1955 <a href=
"#wcfactiondelete-and-wcfactiontoggle" class=
"md-nav__link">
1956 WCF.Action.Delete and WCF.Action.Toggle
1961 <li class=
"md-nav__item">
1962 <a href=
"#wcftableemptytablehandler" class=
"md-nav__link">
1963 WCF.Table.EmptyTableHandler
1976 <div class=
"md-content" data-md-component=
"content">
1977 <article class=
"md-content__inner md-typeset">
1980 <a href=
"https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/migration/wsc53/javascript.md" title=
"Edit this page" class=
"md-content__button md-icon">
1981 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
1985 <h1 id=
"migrating-from-wsc-53-typescript-and-javascript">Migrating from WSC
5.3 - TypeScript and JavaScript
<a class=
"headerlink" href=
"#migrating-from-wsc-53-typescript-and-javascript" title=
"Permanent link">#
</a></h1>
1986 <h2 id=
"typescript">TypeScript
<a class=
"headerlink" href=
"#typescript" title=
"Permanent link">#
</a></h2>
1987 <p>WoltLab Suite
5.4 introduces TypeScript support.
1988 Learn about consuming WoltLab Suite’s types in
<a href=
"../../../javascript/typescript/">the TypeScript section
</a> of the JavaScript API documentation.
</p>
1989 <p>The JavaScript API documentation will be updated to properly take into account the changes that came with the new TypeScript support in the future.
1990 Existing AMD based modules have been migrated to TypeScript, but will expose the existing and known API.
</p>
1991 <p>It is recommended that you migrate your custom packages to make use of TypeScript.
1992 It will make consuming newly written modules that properly leverage TypeScript’s features much more pleasant and will also ease using existing modules due to proper autocompletion and type checking.
</p>
1993 <h2 id=
"wcf_click_event"><code>WCF_CLICK_EVENT
</code><a class=
"headerlink" href=
"#wcf_click_event" title=
"Permanent link">#
</a></h2>
1994 <p>For event listeners on click events,
<code>WCF_CLICK_EVENT
</code> is deprecated and should no longer be used.
1995 Instead, use
<code>click
</code> directly:
</p>
1996 <div class=
"highlight"><pre><span></span><code><span class=
"c1">// before
</span>
1997 <span class=
"nx">element
</span><span class=
"p">.
</span><span class=
"nx">addEventListener
</span><span class=
"p">(
</span><span class=
"nx">WCF_CLICK_EVENT
</span><span class=
"p">,
</span> <span class=
"k">this
</span><span class=
"p">.
</span><span class=
"nx">_click
</span><span class=
"p">.
</span><span class=
"nx">bind
</span><span class=
"p">(
</span><span class=
"k">this
</span><span class=
"p">));
</span>
1999 <span class=
"c1">// after
</span>
2000 <span class=
"nx">element
</span><span class=
"p">.
</span><span class=
"nx">addEventListener
</span><span class=
"p">(
</span><span class=
"s1">'click
'</span><span class=
"p">,
</span> <span class=
"p">(
</span><span class=
"nx">ev
</span><span class=
"p">)
</span> <span class=
"p">=
></span> <span class=
"k">this
</span><span class=
"p">.
</span><span class=
"nx">_click
</span><span class=
"p">(
</span><span class=
"nx">ev
</span><span class=
"p">));
</span>
2002 <h2 id=
"wcfactiondelete-and-wcfactiontoggle"><code>WCF.Action.Delete
</code> and
<code>WCF.Action.Toggle
</code><a class=
"headerlink" href=
"#wcfactiondelete-and-wcfactiontoggle" title=
"Permanent link">#
</a></h2>
2003 <p><code>WCF.Action.Delete
</code> and
<code>WCF.Action.Toggle
</code> were used for buttons to delete or enable/disable objects via JavaScript.
2004 In each template,
<code>WCF.Action.Delete
</code> or
<code>WCF.Action.Toggle
</code> instances had to be manually created for each object listing.
</p>
2005 <p>With version
5.4 of WoltLab Suite, we have added a CSS selector-based global TypeScript module that only requires specific CSS classes to be added to the HTML structure for these buttons to work.
2006 Additionally, we have added a new
<code>{objectAction}
</code> template plugin, which generates these buttons reducing the amount of boilerplate template code.
</p>
2007 <p>The required base HTML structure is as follows:
</p>
2009 <li>A
<code>.jsObjectActionContainer
</code> element with a
<code>data-object-action-class-name
</code> attribute that contains the name of PHP class that executes the actions.
</li>
2010 <li><code>.jsObjectActionObject
</code> elements within
<code>.jsObjectActionContainer
</code> that represent the objects for which actions can be executed.
2011 Each
<code>.jsObjectActionObject
</code> element must have a
<code>data-object-id
</code> attribute with the id of the object.
</li>
2012 <li><code>.jsObjectAction
</code> elements within
<code>.jsObjectActionObject
</code> for each action with a
<code>data-object-action
</code> attribute with the name of the action.
2013 These elements can be generated with the
<code>{objectAction}
</code> template plugin for the
<code>delete
</code> and
<code>toggle
</code> action.
</li>
2016 <div class=
"highlight"><pre><span></span><code><span class=
"x"><table class=
"table jsObjectActionContainer
" </span><span class=
"cp">{
</span><span class=
"c">*
</span>
2017 <span class=
"c"> *
</span><span class=
"cp">}
</span><span class=
"x">data-object-action-class-name=
"wcf\data\foo\FooAction
"></span>
2018 <span class=
"x"> <thead
></span>
2019 <span class=
"x"> <tr
></span>
2020 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2021 <span class=
"x"> </tr
></span>
2022 <span class=
"x"> </thead
></span>
2024 <span class=
"x"> <tbody
></span>
2025 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">foreach
</span> <span class=
"na">from
</span><span class=
"o">=
</span><span class=
"nv">$objects
</span> <span class=
"na">item
</span><span class=
"o">=
</span><span class=
"na">foo
</span><span class=
"cp">}
</span><span class=
"x"></span>
2026 <span class=
"x"> <tr class=
"jsObjectActionObject
" data-object-id=
"</span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$foo
</span><span class=
"o">-
></span><span class=
"na">getObjectID
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x">"></span>
2027 <span class=
"x"> <td class=
"columnIcon
"></span>
2028 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">objectAction
</span> <span class=
"na">action
</span><span class=
"o">=
</span><span class=
"s2">"toggle
"</span> <span class=
"na">isDisabled
</span><span class=
"o">=
</span><span class=
"nv">$foo
</span><span class=
"o">-
></span><span class=
"na">isDisabled
</span><span class=
"cp">}
</span><span class=
"x"></span>
2029 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">objectAction
</span> <span class=
"na">action
</span><span class=
"o">=
</span><span class=
"s2">"delete
"</span> <span class=
"na">objectTitle
</span><span class=
"o">=
</span><span class=
"nv">$foo
</span><span class=
"o">-
></span><span class=
"na">getTitle
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x"></span>
2030 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2031 <span class=
"x"> </td
></span>
2032 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2033 <span class=
"x"> </tr
></span>
2034 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/foreach
</span><span class=
"cp">}
</span><span class=
"x"></span>
2035 <span class=
"x"> </tbody
></span>
2036 <span class=
"x"></table
></span>
2038 <p>Please refer to the documentation in
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/template/plugin/ObjectActionFunctionTemplatePlugin.class.php"><code>ObjectActionFunctionTemplatePlugin
</code></a> for details and examples on how to use this template plugin.
</p>
2039 <p>The relevant TypeScript module registering the event listeners on the object action buttons is
<a href=
"https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action.ts"><code>Ui/Object/Action
</code></a>.
2040 When an action button is clicked, an AJAX request is sent using the PHP class name and action name.
2041 After the successful execution of the action, the page is either reloaded if the action button has a
<code>data-object-action-success=
"reload"</code> attribute or an event using the
<code>EventHandler
</code> module is fired using
<code>WoltLabSuite/Core/Ui/Object/Action
</code> as the identifier and the object action name.
2042 <a href=
"https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action/Delete.ts"><code>Ui/Object/Action/Delete
</code></a> and
<a href=
"https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action/Toggle.ts"><code>Ui/Object/Action/Toggle
</code></a> listen to these events and update the user interface depending on the execute action by removing the object or updating the toggle button, respectively.
</p>
2043 <p>Converting from
<code>WCF.Action.*
</code> to the new approach requires minimal changes per template, as shown in the relevant pull request
<a href=
"https://github.com/WoltLab/WCF/pull/4080">#
4080</a>.
</p>
2044 <h2 id=
"wcftableemptytablehandler"><code>WCF.Table.EmptyTableHandler
</code><a class=
"headerlink" href=
"#wcftableemptytablehandler" title=
"Permanent link">#
</a></h2>
2045 <p>When all objects in a table or list are deleted via their delete button or clipboard actions, an empty table or list can remain.
2046 Previously,
<code>WCF.Table.EmptyTableHandler
</code> had to be explicitly used in each template for these tables and lists to reload the page.
2047 As a TypeScript-based replacement for
<code>WCF.Table.EmptyTableHandler
</code> that is only initialized once globally,
<code>WoltLabSuite/Core/Ui/Empty
</code> was added.
2048 To use this new module, you only have to add the CSS class
<code>jsReloadPageWhenEmpty
</code> to the relevant HTML element.
2049 Once this HTML element no longer has child elements, the page is reloaded.
2050 To also cover scenarios in which there are fixed child elements that should not be considered when determining if there are no child elements, the
<code>data-reload-page-when-empty=
"ignore"</code> can be set for these elements.
</p>
2052 <div class=
"highlight"><pre><span></span><code><span class=
"x"><table class=
"table
"></span>
2053 <span class=
"x"> <thead
></span>
2054 <span class=
"x"> <tr
></span>
2055 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2056 <span class=
"x"> </tr
></span>
2057 <span class=
"x"> </thead
></span>
2059 <span class=
"x"> <tbody class=
"jsReloadPageWhenEmpty
"></span>
2060 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">foreach
</span> <span class=
"na">from
</span><span class=
"o">=
</span><span class=
"nv">$objects
</span> <span class=
"na">item
</span><span class=
"o">=
</span><span class=
"na">object
</span><span class=
"cp">}
</span><span class=
"x"></span>
2061 <span class=
"x"> <tr
></span>
2062 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2063 <span class=
"x"> </tr
></span>
2064 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/foreach
</span><span class=
"cp">}
</span><span class=
"x"></span>
2065 <span class=
"x"> </tbody
></span>
2066 <span class=
"x"></table
></span>
2068 <div class=
"highlight"><pre><span></span><code><span class=
"x"><div class=
"section tabularBox messageGroupList
"></span>
2069 <span class=
"x"> <ol class=
"tabularList jsReloadPageWhenEmpty
"></span>
2070 <span class=
"x"> <li class=
"tabularListRow tabularListRowHead
" data-reload-page-when-empty=
"ignore
"></span>
2071 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2072 <span class=
"x"> </li
></span>
2074 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">foreach
</span> <span class=
"na">from
</span><span class=
"o">=
</span><span class=
"nv">$objects
</span> <span class=
"na">item
</span><span class=
"o">=
</span><span class=
"na">object
</span><span class=
"cp">}
</span><span class=
"x"></span>
2075 <span class=
"x"> <li
></span>
2076 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2077 <span class=
"x"> </li
></span>
2078 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/foreach
</span><span class=
"cp">}
</span><span class=
"x"></span>
2079 <span class=
"x"> </ol
></span>
2080 <span class=
"x"></div
></span>
2087 <div class=
"md-source-date">
2090 Last update:
2021-
04-
13
2109 <footer class=
"md-footer">
2111 <nav class=
"md-footer__inner md-grid" aria-label=
"Footer">
2113 <a href=
"../session/" class=
"md-footer__link md-footer__link--prev" rel=
"prev">
2114 <div class=
"md-footer__button md-icon">
2115 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
2117 <div class=
"md-footer__title">
2118 <div class=
"md-ellipsis">
2119 <span class=
"md-footer__direction">
2122 Session Handling and Authentication
2128 <a href=
"../templates/" class=
"md-footer__link md-footer__link--next" rel=
"next">
2129 <div class=
"md-footer__title">
2130 <div class=
"md-ellipsis">
2131 <span class=
"md-footer__direction">
2137 <div class=
"md-footer__button md-icon">
2138 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
2144 <div class=
"md-footer-meta md-typeset">
2145 <div class=
"md-footer-meta__inner md-grid">
2146 <div class=
"md-footer-copyright">
2148 <div class=
"md-footer-copyright__highlight">
2149 Copyright ©
2020 WoltLab GmbH
2153 <a href=
"https://squidfunk.github.io/mkdocs-material/" target=
"_blank" rel=
"noopener">
2158 <div class=
"md-footer-copyright">
2159 <a href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a>
2160 <a href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>
2167 <div class=
"md-dialog" data-md-component=
"dialog">
2168 <div class=
"md-dialog__inner md-typeset"></div>
2170 <script id=
"__config" type=
"application/json">{
"base":
"../../..",
"features": [],
"translations": {
"clipboard.copy":
"Copy to clipboard",
"clipboard.copied":
"Copied to clipboard",
"search.config.lang":
"en",
"search.config.pipeline":
"trimmer, stopWordFilter",
"search.config.separator":
"[\\s\\-]+",
"search.placeholder":
"Search",
"search.result.placeholder":
"Type to start searching",
"search.result.none":
"No matching documents",
"search.result.one":
"1 matching document",
"search.result.other":
"# matching documents",
"search.result.more.one":
"1 more on this page",
"search.result.more.other":
"# more on this page",
"search.result.term.missing":
"Missing"},
"search":
"../../../assets/javascripts/workers/search.fe42c31b.min.js",
"version": {
"provider":
"mike"}}
</script>
2173 <script src=
"../../../assets/javascripts/bundle.d892486b.min.js"></script>