addFooter() {
			const footer = E([]);
			const vp = document.getElementById('view');
			let hasmap = false;
			let readonly = true;

			vp.querySelectorAll('.cbi-map').forEach(map => {
				const m = DOM.findClassInstance(map);
				if (m) {
					hasmap = true;

					if (!m.readonly)
						readonly = false;
				}
			});

			if (!hasmap)
				readonly = !LuCI.prototype.hasViewPermission();

			const saveApplyBtn = this.handleSaveApply ? new classes.ui.ComboButton('0', {
				0: [ _('Save & Apply') ],
				1: [ _('Apply unchecked') ]
			}, {
				classes: {
					0: 'btn cbi-button cbi-button-apply important',
					1: 'btn cbi-button cbi-button-negative important'
				},
				click: classes.ui.createHandlerFn(this, 'handleSaveApply'),
				disabled: readonly || null
			}).render() : E([]);

			if (this.handleSaveApply || this.handleSave || this.handleReset) {
				footer.appendChild(E('div', { 'class': 'cbi-page-actions' }, [
					saveApplyBtn, ' ',
					this.handleSave ? E('button', {
						'class': 'cbi-button cbi-button-save',
						'click': classes.ui.createHandlerFn(this, 'handleSave'),
						'disabled': readonly || null
					}, [ _('Save') ]) : '', ' ',
					this.handleReset ? E('button', {
						'class': 'cbi-button cbi-button-reset',
						'click': classes.ui.createHandlerFn(this, 'handleReset'),
						'disabled': readonly || null
					}, [ _('Reset') ]) : ''
				]));
			}

			return footer;
		}
Renders a standard page action footer if any of the
`handleSave()`, `handleSaveApply()` or `handleReset()`
functions are defined.

The default implementation should be sufficient for most
views - it will render a standard page footer with action
buttons labeled `Save`, `Save & Apply` and `Reset`
triggering the `handleSave()`, `handleSaveApply()` and
`handleReset()` functions respectively.

When any of these `handle*()` functions is overwritten
with `null` by a view extending this class, the
corresponding button will not be rendered.

@instance
@memberof LuCI.view
@returns {DocumentFragment}
Returns a `DocumentFragment` containing the footer bar
with buttons for each corresponding `handle*()` action
or an empty `DocumentFragment` if all three `handle*()`
methods are overwritten with `null`.