class JsonFormSaver {
EVENTS = {
ON_CHANGE: 'onChange'
};
options = {
jsonObject: null,
/** @type {JsonObjectToComponentsDataBinder} */
componentsDataBinder: null,
symfonyFormDataBuilder: null,
url: null,
csrfToken: null,
saveOnChanges: false,
};
constructor(options = null) {
this.options = { ...this.options, ...options };
this.eventDispatcher = new EventDispatcher();
}
init() {
const componentsBinder = this.options.componentsDataBinder;
const formBuilder = this.options.symfonyFormDataBuilder;
const saveDebounced = (new Debouncer2()).debounce(() => {
if (this.options.saveOnChanges) {
this.save();
}
}, 3000);
const handler = () => {
const json = this.options.jsonObject;
Object.keys(json).forEach((key) => {
const value = json[key];
if (Array.isArray(value)) {
formBuilder.setTextArrayField(key, value);
} else if (typeof value === 'string') {
formBuilder.setField(key, value);
} else if (typeof value === 'number') {
formBuilder.setField(key, String(value));
} else if (typeof value === 'boolean') {
if (value) {
formBuilder.setField(key, "1");
} else {
formBuilder.removeField(key);
}
} else if (value === null || typeof value === 'undefined') {
formBuilder.setField(key, '');
} else if (typeof value === 'object') {
try {
formBuilder.setField(key, JSON.stringify(value));
} catch (e) {
formBuilder.setField(key, '');
}
} else {
formBuilder.setField(key, String(value));
}
});
if (this.options.csrfToken) {
formBuilder.setField('_token', this.options.csrfToken);
}
saveDebounced();
};
componentsBinder.eventDispatcher.on(componentsBinder.EVENTS.ON_CHANGE, handler);
}
save() {
const formBuilder = this.options.symfonyFormDataBuilder;
const formData = formBuilder.getFormData();
const url = this.options.url;
(async () => {
try {
const response = await fetch(url, {
method: 'POST',
body: formData,
credentials: 'same-origin'
});
if (!response.ok) {
const text = await response.text();
console.error('Ошибка при сохранении данных:', response.status, text);
}
const contentType = response.headers.get('content-type') || '';
if (contentType.includes('application/json')) {
const data = await response.json();
console.log('Response JSON:', data);
if (data.redirect) {
window.location = data.redirect;
}
}
} catch (e) {
console.error(e);
}
})();
}
}