save(cb, silent) {
		this.checkDepends();

		return this.parse()
			.then(cb)
			.then(this.data.save.bind(this.data))
			.then(this.load.bind(this))
			.catch((e) =>  {
				if (!silent) {
					ui.showModal(_('Save error'), [
						E('p', {}, [ _('An error occurred while saving the form:') ]),
						E('p', {}, [ E('em', { 'style': 'white-space:pre-wrap' }, [ e.message ]) ]),
						E('div', { 'class': 'right' }, [
							E('button', { 'class': 'cbi-button', 'click': ui.hideModal }, [ _('Dismiss') ])
						])
					]);
				}

				return Promise.reject(e);
			}).then(this.renderContents.bind(this));
	}
Save the form input values.

This function parses the current form, saves the resulting UCI changes,
reloads the UCI configuration data and redraws the form elements.

@param {function} [cb]
An optional callback function that is invoked after the form is parsed
but before the changed UCI data is saved. This is useful to perform
additional data manipulation steps before saving the changes.

@param {boolean} [silent=false]
If set to `true`, trigger an alert message to the user in case saving
the form data fails. Otherwise fail silently.

@returns {Promise<void>}
Returns a promise resolving once the entire save operation is complete.
The returned promise is rejected if any step of the save operation
failed.