-
+ onSavingStateChange(k, changed, invalid)">
({{ i18n.ts.optional }})
{{ v.description }}
-
+ onSavingStateChange(k, changed, invalid)">
({{ i18n.ts.optional }})
{{ v.description }}
-
+ onSavingStateChange(k, changed, invalid)">
({{ i18n.ts.optional }})
{{ v.description }}
@@ -49,6 +49,7 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/components/MkTextarea.vue b/packages/frontend/src/components/MkTextarea.vue
index d53d4ec018..fe4f7b7aaf 100644
--- a/packages/frontend/src/components/MkTextarea.vue
+++ b/packages/frontend/src/components/MkTextarea.vue
@@ -67,6 +67,7 @@ const emit = defineEmits<{
(ev: 'keydown', _ev: KeyboardEvent): void;
(ev: 'enter'): void;
(ev: 'update:modelValue', value: string): void;
+ (ev: 'savingStateChange', saved: boolean, invalid: boolean): void;
}>();
const { modelValue, autofocus } = toRefs(props);
@@ -131,6 +132,10 @@ watch(v, () => {
invalid.value = inputEl.value?.validity.badInput ?? true;
});
+watch([changed, invalid], ([newChanged, newInvalid]) => {
+ emit('savingStateChange', newChanged, newInvalid);
+}, { immediate: true });
+
onMounted(() => {
nextTick(() => {
if (autofocus.value) {
diff --git a/packages/frontend/src/components/MkWidgetSettingsDialog.vue b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
index 63f294770c..41fec2a9e0 100644
--- a/packages/frontend/src/components/MkWidgetSettingsDialog.vue
+++ b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
@@ -10,6 +10,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:height="600"
:scroll="false"
:withOkButton="true"
+ :okButtonDisabled="!canSave"
@close="cancel()"
@ok="save()"
@closed="emit('closed')"
@@ -38,7 +39,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
@@ -46,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only