templates/js/library/json_form_saver/json_form_saver.js.twig line 1

Open in your IDE?
  1. class JsonFormSaver {
  2.     EVENTS = {
  3.         ON_CHANGE: 'onChange'
  4.     };
  5.     options = {
  6.         jsonObject: null,
  7.         /** @type {JsonObjectToComponentsDataBinder} */
  8.         componentsDataBinder: null,
  9.         symfonyFormDataBuilder: null,
  10.         url: null,
  11.         csrfToken: null,
  12.         saveOnChanges: false,
  13.     };
  14.     constructor(options = null) {
  15.         this.options = { ...this.options, ...options };
  16.         this.eventDispatcher = new EventDispatcher();
  17.     }
  18.     init() {
  19.         const componentsBinder = this.options.componentsDataBinder;
  20.         const formBuilder = this.options.symfonyFormDataBuilder;
  21.         const saveDebounced = (new Debouncer2()).debounce(() => {
  22.             if (this.options.saveOnChanges) {
  23.                 this.save();
  24.             }
  25.         }, 3000);
  26.         const handler = () => {
  27.             const json = this.options.jsonObject;
  28.             Object.keys(json).forEach((key) => {
  29.                 const value = json[key];
  30.                 if (Array.isArray(value)) {
  31.                     formBuilder.setTextArrayField(key, value);
  32.                 } else if (typeof value === 'string') {
  33.                     formBuilder.setField(key, value);
  34.                 } else if (typeof value === 'number') {
  35.                     formBuilder.setField(key, String(value));
  36.                 } else if (typeof value === 'boolean') {
  37.                     if (value) {
  38.                         formBuilder.setField(key, "1");
  39.                     } else {
  40.                         formBuilder.removeField(key);
  41.                     }
  42.                 } else if (value === null || typeof value === 'undefined') {
  43.                     formBuilder.setField(key, '');
  44.                 } else if (typeof value === 'object') {
  45.                     try {
  46.                         formBuilder.setField(key, JSON.stringify(value));
  47.                     } catch (e) {
  48.                         formBuilder.setField(key, '');
  49.                     }
  50.                 } else {
  51.                     formBuilder.setField(key, String(value));
  52.                 }
  53.             });
  54.             if (this.options.csrfToken) {
  55.                 formBuilder.setField('_token', this.options.csrfToken);
  56.             }
  57.             saveDebounced();
  58.         };
  59.         componentsBinder.eventDispatcher.on(componentsBinder.EVENTS.ON_CHANGE, handler);
  60.     }
  61.     save() {
  62.         const formBuilder = this.options.symfonyFormDataBuilder;
  63.         const formData = formBuilder.getFormData();
  64.         const url = this.options.url;
  65.         (async () => {
  66.             try {
  67.                 const response = await fetch(url, {
  68.                     method: 'POST',
  69.                     body: formData,
  70.                     credentials: 'same-origin'
  71.                 });
  72.                 if (!response.ok) {
  73.                     const text = await response.text();
  74.                     console.error('Ошибка при сохранении данных:', response.status, text);
  75.                 }
  76.                 const contentType = response.headers.get('content-type') || '';
  77.                 if (contentType.includes('application/json')) {
  78.                     const data = await response.json();
  79.                     console.log('Response JSON:', data);
  80.                     if (data.redirect) {
  81.                         window.location = data.redirect;
  82.                     }
  83.                 }
  84.             } catch (e) {
  85.                 console.error(e);
  86.             }
  87.         })();
  88.     }
  89. }