Add missing `smarty` language indication in migration/wsc53/javascript
[GitHub/WoltLab/woltlab.github.io.git] / docs / migration / wsc53 / javascript.md
1 # Migrating from WSC 5.3 - JavaScript
2
3 ## `WCF_CLICK_EVENT`
4
5 For event listeners on click events, `WCF_CLICK_EVENT` is deprecated and should no longer be used.
6 Instead, use `click` directly:
7
8 ```javascript
9 // before
10 element.addEventListener(WCF_CLICK_EVENT, this._click.bind(this));
11
12 // after
13 element.addEventListener('click', (ev) => this._click(ev));
14 ```
15
16 ## `WCF.Action.Delete` and `WCF.Action.Toggle`
17
18 `WCF.Action.Delete` and `WCF.Action.Toggle` were used for buttons to delete or enable/disable objects via JavaScript.
19 In each template, `WCF.Action.Delete` or `WCF.Action.Toggle` instances had to be manually created for each object listing.
20
21 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.
22 Additionally, we have added a new `{objectAction}` template plugin, which generates these buttons reducing the amount of boilerplate template code.
23
24 The required base HTML structure is as follows:
25
26 1. A `.jsObjectActionContainer` element with a `data-object-action-class-name` attribute that contains the name of PHP class that executes the actions.
27 2. `.jsObjectActionObject` elements within `.jsObjectActionContainer` that represent the objects for which actions can be executed.
28 Each `.jsObjectActionObject` element must have a `data-object-id` attribute with the id of the object.
29 3. `.jsObjectAction` elements within `.jsObjectActionObject` for each action with a `data-object-action` attribute with the name of the action.
30 These elements can be generated with the `{objectAction}` template plugin for the `delete` and `toggle` action.
31
32 Example:
33
34 ```smarty
35 <table class="table jsObjectActionContainer" {*
36 *}data-object-action-class-name="wcf\data\foo\FooAction">
37 <thead>
38 <tr>
39 {* … *}
40 </tr>
41 </thead>
42
43 <tbody>
44 {foreach from=$objects item=foo}
45 <tr class="jsObjectActionObject" data-object-id="{@$foo->getObjectID()}">
46 <td class="columnIcon">
47 {objectAction action="toggle" isDisabled=$foo->isDisabled}
48 {objectAction action="delete" objectTitle=$foo->getTitle()}
49 {* … *}
50 </td>
51 {* … *}
52 </tr>
53 {/foreach}
54 </tbody>
55 </table>
56 ```
57
58 Please refer to the documentation in [`ObjectActionFunctionTemplatePlugin`](https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/template/plugin/ObjectActionFunctionTemplatePlugin.class.php) for details and examples on how to use this template plugin.
59
60 The relevant TypeScript module registering the event listeners on the object action buttons is [`Ui/Object/Action`](https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action.ts).
61 When an action button is clicked, an AJAX request is sent using the PHP class name and action name.
62 After the successful execution of the action, the page is either reloaded if the action button has a `data-object-action-success="reload"` attribute or an event using the `EventHandler` module is fired using `WoltLabSuite/Core/Ui/Object/Action` as the identifier and the object action name.
63 [`Ui/Object/Action/Delete`](https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action/Delete.ts) and [`Ui/Object/Action/Toggle`](https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Ui/Object/Action/Toggle.ts) listen to these events and update the user interface depending on the execute action by removing the object or updating the toggle button, respectively.
64
65 Converting from `WCF.Action.*` to the new approach requires minimal changes per template, as shown in the relevant pull request [#4080](https://github.com/WoltLab/WCF/pull/4080).
66
67
68 ## `WCF.Table.EmptyTableHandler`
69
70 When all objects in a table or list are deleted via their delete button or clipboard actions, an empty table or list can remain.
71 Previously, `WCF.Table.EmptyTableHandler` had to be explicitly used in each template for these tables and lists to reload the page.
72 As a TypeScript-based replacement for `WCF.Table.EmptyTableHandler` that is only initialized once globally, `WoltLabSuite/Core/Ui/Empty` was added.
73 To use this new module, you only have to add the CSS class `jsReloadPageWhenEmpty` to the relevant HTML element.
74 Once this HTML element no longer has child elements, the page is reloaded.
75 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 `data-reload-page-when-empty="ignore"` can be set for these elements.
76
77 Examples:
78
79 ```smarty
80 <table class="table">
81 <thead>
82 <tr>
83 {* … *}
84 </tr>
85 </thead>
86
87 <tbody class="jsReloadPageWhenEmpty">
88 {foreach from=$objects item=object}
89 <tr>
90 {* … *}
91 </tr>
92 {/foreach}
93 </tbody>
94 </table>
95 ```
96
97 ```smarty
98 <div class="section tabularBox messageGroupList">
99 <ol class="tabularList jsReloadPageWhenEmpty">
100 <li class="tabularListRow tabularListRowHead" data-reload-page-when-empty="ignore">
101 {* … *}
102 </li>
103
104 {foreach from=$objects item=object}
105 <li>
106 {* … *}
107 </li>
108 {/foreach}
109 </ol>
110 </div>
111 ```