Skip to content

Commit fcf08ed

Browse files
committed
Use JSON.parse() instead of eval().
1 parent 4929119 commit fcf08ed

File tree

15 files changed

+83
-46
lines changed

15 files changed

+83
-46
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{foreach name=radioButtons from=$selectOptions key=key item=selectOption}
2-
<label><input {if $tpl.foreach.radioButtons.first}id="{$option->optionName}" {/if}type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {@$disableOptions[$key]}]" data-enable-options="[ {@$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
2+
<label><input {if $tpl.foreach.radioButtons.first}id="{$option->optionName}" {/if}type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {$disableOptions[$key]}]" data-enable-options="[ {$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
33
{/foreach}

com.woltlab.wcf/templates/selectOptionType.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<select id="{$option->optionName}" name="values[{$option->optionName}]"{if $option->required} required{/if}{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}>
1+
<select id="{$option->optionName}" name="values[{$option->optionName}]"{if $option->required} required{/if}{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}>
22
{if !$allowEmptyValue|empty}<option value="">{lang}wcf.global.noSelection{/lang}</option>{/if}
33
{foreach from=$selectOptions key=key item=selectOption}
44
<option value="{$key}"{if $value == $key} selected{/if}>{lang}{@$selectOption}{/lang}</option>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<ol class="flexibleButtonGroup optionTypeBoolean">
22
<li>
3-
<input type="radio" id="{$option->optionName}"{if $value == 1} checked{/if} name="values[{$option->optionName}]" value="1"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}>
3+
<input type="radio" id="{$option->optionName}"{if $value == 1} checked{/if} name="values[{$option->optionName}]" value="1"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}>
44
<label for="{$option->optionName}" class="green">{icon name='check'} {lang}wcf.acp.option.type.boolean.yes{/lang}</label>
55
</li>
66
<li>
7-
<input type="radio" id="{$option->optionName}_no"{if $value == 0} checked{/if} name="values[{$option->optionName}]" value="0"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}>
7+
<input type="radio" id="{$option->optionName}_no"{if $value == 0} checked{/if} name="values[{$option->optionName}]" value="0"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}>
88
<label for="{$option->optionName}_no" class="red">{icon name='xmark'} {lang}wcf.acp.option.type.boolean.no{/lang}</label>
99
</li>
1010
</ol>

com.woltlab.wcf/templates/shared_booleanSearchableOptionType.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<label><input type="checkbox" id="search_{$option->optionName}" name="searchOptions[{$option->optionName}]"{if $searchOption} checked{/if}> {lang}wcf.user.option.searchBooleanOption{/lang}</label>
22
<ol class="flexibleButtonGroup optionTypeBoolean">
33
<li>
4-
<input type="radio" id="{$option->optionName}"{if $value == 1} checked{/if} name="values[{$option->optionName}]" value="1"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}{if !$searchOption} disabled{/if}>
4+
<input type="radio" id="{$option->optionName}"{if $value == 1} checked{/if} name="values[{$option->optionName}]" value="1"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}{if !$searchOption} disabled{/if}>
55
<label for="{$option->optionName}" class="green">{icon name='check'} {lang}wcf.acp.option.type.boolean.yes{/lang}</label>
66
</li>
77
<li>
8-
<input type="radio" id="{$option->optionName}_no"{if $value == 0} checked{/if} name="values[{$option->optionName}]" value="0"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}{if !$searchOption} disabled{/if}>
8+
<input type="radio" id="{$option->optionName}_no"{if $value == 0} checked{/if} name="values[{$option->optionName}]" value="0"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}{if !$searchOption} disabled{/if}>
99
<label for="{$option->optionName}_no" class="red">{icon name='xmark'} {lang}wcf.acp.option.type.boolean.no{/lang}</label>
1010
</li>
1111
</ol>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{foreach from=$selectOptions key=key item=selectOption}
2-
<label><input type="checkbox" name="values[{$option->optionName}][]" value="{$key}" {if $key|in_array:$value} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {@$disableOptions[$key]}]" data-enable-options="[ {@$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
2+
<label><input type="checkbox" name="values[{$option->optionName}][]" value="{$key}" {if $key|in_array:$value} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {$disableOptions[$key]}]" data-enable-options="[ {$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
33
{/foreach}

com.woltlab.wcf/templates/shared_radioButtonSearchableOptionType.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<label><input type="checkbox" id="search_{$option->optionName}" name="searchOptions[{$option->optionName}]"{if $searchOption} checked{/if}> {lang}wcf.user.option.searchRadioButtonOption{/lang}</label>
22
{foreach from=$selectOptions key=key item=selectOption}
3-
<label><input type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {@$disableOptions[$key]}]" data-enable-options="[ {@$enableOptions[$key]}]"{/if}{if !$searchOption} disabled{/if}> {lang}{@$selectOption}{/lang}</label>
3+
<label><input type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {$disableOptions[$key]}]" data-enable-options="[ {$enableOptions[$key]}]"{/if}{if !$searchOption} disabled{/if}> {lang}{@$selectOption}{/lang}</label>
44
{/foreach}
55

66
<script data-relocate="true">

ts/WoltLabSuite/Core/Component/Option/Enable.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99

1010
import { wheneverFirstSeen } from "WoltLabSuite/Core/Helper/Selector";
1111

12+
type SelectOption = {
13+
value: string;
14+
option: string;
15+
};
16+
1217
function change(option: HTMLInputElement | HTMLSelectElement) {
13-
const disableOptions = eval(option.dataset.disableOptions!);
14-
const enableOptions = eval(option.dataset.enableOptions!);
18+
const disableOptions = JSON.parse(option.dataset.disableOptions!);
19+
const enableOptions = JSON.parse(option.dataset.enableOptions!);
1520

1621
if (option instanceof HTMLInputElement) {
1722
switch (option.type) {
@@ -22,7 +27,7 @@ function change(option: HTMLInputElement | HTMLSelectElement) {
2227
case "radio":
2328
if (option.checked) {
2429
let isActive = true;
25-
if (option.dataset.isBoolean && option.value != "1") {
30+
if (option.dataset.isBoolean && option.value !== "1") {
2631
isActive = false;
2732
}
2833
showOptions(isActive, disableOptions, enableOptions);
@@ -31,13 +36,24 @@ function change(option: HTMLInputElement | HTMLSelectElement) {
3136
}
3237
} else if (option instanceof HTMLSelectElement) {
3338
const value = option.value;
34-
const relevantDisableOptions: string[] = disableOptions
35-
.filter((item) => item.value == value)
36-
.map((item) => item.option);
39+
const relevantDisableOptions: string[] = [];
40+
const relevantEnableOptions: string[] = [];
3741

38-
const relevantEnableOptions: string[] = enableOptions
39-
.filter((item) => item.value == value)
40-
.map((item) => item.option);
42+
for (const item of disableOptions as SelectOption[]) {
43+
if (item.value === value) {
44+
relevantDisableOptions.push(item.option);
45+
} else {
46+
relevantEnableOptions.push(item.option);
47+
}
48+
}
49+
50+
for (const item of enableOptions as SelectOption[]) {
51+
if (item.value === value) {
52+
relevantEnableOptions.push(item.option);
53+
} else {
54+
relevantDisableOptions.push(item.option);
55+
}
56+
}
4157

4258
showOptions(true, relevantDisableOptions, relevantEnableOptions);
4359
}
@@ -84,11 +100,16 @@ function enableOption(element: HTMLElement, enable: boolean) {
84100
noElement.disabled = !enable;
85101

86102
const neverElement = document.getElementById(elementId + "_never") as HTMLInputElement;
87-
neverElement.disabled = !enable;
103+
if (neverElement) {
104+
neverElement.disabled = !enable;
105+
}
88106
}
89107
} else {
90-
if (enable) element.removeAttribute("readonly");
91-
else element.setAttribute("readonly", "true");
108+
if (enable) {
109+
element.removeAttribute("readonly");
110+
} else {
111+
element.setAttribute("readonly", "true");
112+
}
92113
}
93114

94115
if (enable) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{foreach from=$selectOptions key=key item=selectOption}
2-
<label><input type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {@$disableOptions[$key]}]" data-enable-options="[ {@$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
2+
<label><input type="radio" name="values[{$option->optionName}]" value="{$key}" {if $value == $key} checked{/if} {if $disableOptions[$key]|isset || $enableOptions[$key]|isset}class="jsEnablesOptions" data-disable-options="[ {$disableOptions[$key]}]" data-enable-options="[ {$enableOptions[$key]}]"{/if}> {lang}{@$selectOption}{/lang}</label>
33
{/foreach}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<select id="{$option->optionName}" name="values[{$option->optionName}]"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {@$disableOptions}]" data-enable-options="[ {@$enableOptions}]"{/if}>
1+
<select id="{$option->optionName}" name="values[{$option->optionName}]"{if $disableOptions || $enableOptions} class="jsEnablesOptions" data-is-boolean="true" data-disable-options="[ {$disableOptions}]" data-enable-options="[ {$enableOptions}]"{/if}>
22
{if !$allowEmptyValue|empty}<option value="">{lang}wcf.global.noSelection{/lang}</option>{/if}
33
{foreach from=$selectOptions key=key item=selectOption}
44
<option value="{$key}"{if $value == $key} selected{/if}>{lang}{@$selectOption}{/lang}</option>
55
{/foreach}
6-
</select>
6+
</select>

wcfsetup/install/files/acp/templates/userEmailAddressExport.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
<dl>
3434
<dt><label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label></dt>
3535
<dd>
36-
<label><input type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked {/if}class="jsEnablesOptions" data-disable-options="[ ]" data-enable-options="[ 'separatorDiv', 'textSeparatorDiv' ]"> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label>
37-
<label><input type="radio" class="jsEnablesOptions" name="fileType" value="xml" {if $fileType == 'xml'}checked {/if}data-disable-options="[ 'separatorDiv', 'textSeparatorDiv' ]" data-enable-options="[ ]"> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label>
36+
<label><input type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked {/if}class="jsEnablesOptions" data-disable-options="[ ]" data-enable-options='[ "separator", "textSeparator" ]'> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label>
37+
<label><input type="radio" class="jsEnablesOptions" name="fileType" value="xml" {if $fileType == 'xml'}checked {/if}data-disable-options='[ "separator", "textSeparator" ]' data-enable-options="[ ]"> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label>
3838
</dd>
3939
</dl>
4040

0 commit comments

Comments
 (0)