diff --git a/lnbits/static/js/components.js b/lnbits/static/js/components.js
index fcbcf95a3..08057a36e 100644
--- a/lnbits/static/js/components.js
+++ b/lnbits/static/js/components.js
@@ -586,3 +586,75 @@ Vue.component('lnbits-notifications-btn', {
}
}
})
+
+Vue.component('lnbits-dynamic-fields', {
+ mixins: [windowMixin],
+ props: ['options', 'value'],
+ data() {
+ return {
+ formData: null
+ }
+ },
+
+ template: `
+
+
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ methods: {
+ buildData(options, data = {}) {
+ return options.reduce((d, option) => {
+ if (option.options?.length) {
+ d[option.name] = this.buildData(option.options, data[option.name])
+ } else {
+ d[option.name] = data[option.name] ?? option.default
+ }
+ return d
+ }, {})
+ },
+ handleValueChanged() {
+ this.$emit('input', this.formData)
+ }
+ },
+ created: function () {
+ this.formData = this.buildData(this.options, this.value)
+ }
+})