UNPKG

apostrophe

Version:

The Apostrophe Content Management System.

92 lines (85 loc) 2.87 kB
apos.define('apostrophe-widgets-editor', { extend: 'apostrophe-modal', source: 'modal', transition: 'slide', construct: function(self, options) { self.schema = self.options.schema; self.data = options.data || {}; self.errorPath = options.data._errorPath; self.error = options.data._error; if (!self.data._id) { self.data._id = apos.utils.generateId(); } self.saveContent = function(callback) { return async.series({ convert: function(callback) { return apos.schemas.convert(self.$el, self.schema, self.data, function(err) { if (err) { return callback(err); } _.each(self.schema, function(field) { if ((field.type === 'area') || (field.type === 'singleton')) { if (!_.has(self.data, field.name)) { // Even if these are contextual, we still need them to exist self.data[field.name] = { type: 'area', items: [] }; } // If we created the widget that contains an area, we can // also edit the area (just a hint to the UI, the server // handles enforcement for the whole doc) self.data[field.name]._edit = true; } }); return callback(null); }); }, beforeSave: function(callback) { return self.beforeSave(callback); }, save: function(callback) { return options.save(self.getData(), callback); } }, callback); }; self.beforeSave = function(callback) { return setImmediate(callback); }; self.beforeShow = function(callback) { self.$form = self.$el.find('[data-apos-form]'); self.$form.on('change', self.onChange); return async.series({ populate: function(callback) { return apos.schemas.populate(self.$el, self.schema, self.data, callback); } }, callback); }; // Wait for afterShow to do things that might pop more modals self.afterShow = function() { return async.series({ errorPath: function(callback) { if (self.errorPath && self.errorPath.length) { return apos.schemas.returnToError(self.$el, self.schema, self.errorPath, self.error, callback); } else { return callback(null); } }, clearError: function(callback) { self.error = null; self.errorPath = null; return callback(null); } }, function(err) { if (err) { return apos.utils.warn(err); } }); }; self.getData = function() { return self.data; }; self.onChange = function(e) { if (!self.unsavedChanges) { self.unsavedChanges = true; } }; } });