diff --git a/apps/client/src/widgets/bulk_actions/label/update_label_value.ts b/apps/client/src/widgets/bulk_actions/label/update_label_value.ts
deleted file mode 100644
index d32e21c7e..000000000
--- a/apps/client/src/widgets/bulk_actions/label/update_label_value.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { t } from "../../../services/i18n.js";
-import SpacedUpdate from "../../../services/spaced_update.js";
-import AbstractBulkAction from "../abstract_bulk_action.js";
-
-const TPL = /*html*/`
-
-
-
- ${t("update_label_value.update_label_value")}
-
-
-
- ${t("update_label_value.to_value")}
-
-
-
- |
-
-
-
-
-
-
-
- |
-
`;
-
-export default class UpdateLabelValueBulkAction extends AbstractBulkAction {
- static get actionName() {
- return "updateLabelValue";
- }
- static get actionTitle() {
- return t("update_label_value.update_label_value");
- }
-
- doRender() {
- const $action = $(TPL);
-
- const $labelName = $action.find(".label-name");
- $labelName.val(this.actionDef.labelName || "");
-
- const $labelValue = $action.find(".label-value");
- $labelValue.val(this.actionDef.labelValue || "");
-
- const spacedUpdate = new SpacedUpdate(async () => {
- await this.saveAction({
- labelName: $labelName.val(),
- labelValue: $labelValue.val()
- });
- }, 1000);
-
- $labelName.on("input", () => spacedUpdate.scheduleUpdate());
- $labelValue.on("input", () => spacedUpdate.scheduleUpdate());
-
- return $action;
- }
-}
diff --git a/apps/client/src/widgets/bulk_actions/label/update_label_value.tsx b/apps/client/src/widgets/bulk_actions/label/update_label_value.tsx
new file mode 100644
index 000000000..25beafc3e
--- /dev/null
+++ b/apps/client/src/widgets/bulk_actions/label/update_label_value.tsx
@@ -0,0 +1,49 @@
+import { t } from "../../../services/i18n.js";
+import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
+import FormTextBox from "../../react/FormTextBox.jsx";
+import BulkAction, { BulkActionText } from "../BulkAction.jsx";
+import { useSpacedUpdate } from "../../react/hooks.jsx";
+import { useEffect, useState } from "preact/hooks";
+
+function UpdateLabelValueComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition}) {
+ const [ labelName, setLabelName ] = useState(actionDef.labelName ?? "");
+ const [ labelValue, setLabelValue ] = useState(actionDef.labelValue ?? "");
+ const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ labelName, labelValue }));
+ useEffect(() => spacedUpdate.scheduleUpdate(), [labelName, labelValue]);
+
+ return (
+
+ ${t("update_label_value.help_text")}
+
+ ${t("update_label_value.help_text_note")}
+ >}
+ >
+
+
+
+
+ )
+}
+
+export default class UpdateLabelValueBulkAction extends AbstractBulkAction {
+ static get actionName() {
+ return "updateLabelValue";
+ }
+ static get actionTitle() {
+ return t("update_label_value.update_label_value");
+ }
+
+ doRender() {
+ return ;
+ }
+}