# easy-invoice/2.3.2/assets/js/builder-ux.js

Easy Invoice – Invoice Generator, PDF Quotes &amp; Payments, version 2.3.2. 115 lines.

- Page: https://pluginprobe.com/plugins/easy-invoice/2.3.2/code/assets/js/builder-ux.js
- Raw: https://pluginprobe.com/plugins/easy-invoice/2.3.2/raw/assets/js/builder-ux.js
- Modified: 2026-04-11T13:58:14+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/easy-invoice/2.3.2/code/assets/js/builder-ux.js#L10-L20`.

```javascript
/**
 * Builder UX: unsaved-changes guard, mobile shell hint, header title sync with document title field.
 */
(function ($) {
	'use strict';

	var HINT_KEY = 'ei_builder_shell_hint_v1';

	function getI18n(key, fallback) {
		if (window.easyInvoice && easyInvoice.i18n && easyInvoice.i18n[key]) {
			return easyInvoice.i18n[key];
		}
		return fallback;
	}

	function setupDirtyGuard() {
		var $forms = $('#invoice-form, #quote-form');
		if (!$forms.length) {
			return;
		}

		window.eiBuilderDirty = false;

		function markDirty() {
			window.eiBuilderDirty = true;
		}

		$(document).on('input change', '#invoice-form :input, #quote-form :input', function () {
			markDirty();
		});

		$(document).on('easy-invoice-saved', function (e, response) {
			if (response && response.success) {
				window.eiBuilderDirty = false;
			}
		});
		$(document).on('easy-quote-saved', function (e, response) {
			if (response && response.success) {
				window.eiBuilderDirty = false;
			}
		});

		$(window).on('beforeunload', function (e) {
			if (!window.eiBuilderDirty) {
				return;
			}
			e.preventDefault();
			e.returnValue = getI18n(
				'builder_unsaved_warning',
				'You have unsaved changes. If you leave this page, your changes may be lost.'
			);
			return e.returnValue;
		});
	}

	function setupShellHint() {
		var $box = $('#ei-builder-shell-hint');
		if (!$box.length) {
			return;
		}

		function dismissed() {
			try {
				return window.localStorage.getItem(HINT_KEY) === '1';
			} catch (err) {
				return false;
			}
		}

		function isLarge() {
			return window.matchMedia && window.matchMedia('(min-width: 1024px)').matches;
		}

		function apply() {
			if (dismissed() || isLarge()) {
				$box.addClass('hidden').attr('hidden', 'hidden');
				return;
			}
			$box.removeClass('hidden').removeAttr('hidden');
		}

		apply();
		$(window).on('resize', apply);

		$(document).on('click', '#ei-builder-shell-hint-dismiss', function () {
			try {
				window.localStorage.setItem(HINT_KEY, '1');
			} catch (err) {}
			$box.addClass('hidden').attr('hidden', 'hidden');
		});
	}

	function setupHeaderTitleSync() {
		var $h = $('#ei-builder-header-title');
		var $inp = $('#invoice-form input[name="title"], #quote-form input[name="title"]').first();
		if (!$h.length || !$inp.length) {
			return;
		}
		var def = $h.attr('data-ei-default') || '';

		function apply() {
			var v = ($inp.val() || '').trim();
			$h.text(v || def);
		}

		$inp.on('input', apply);
	}

	$(function () {
		setupDirtyGuard();
		setupShellHint();
		setupHeaderTitleSync();
	});
})(jQuery);

```
