Przeglądaj źródła

Refactor JS (#3508)

* Refactor email input sync JS

* Bump npm packages

* Refactor New IP List JS
Alec Rust 2 lat temu
rodzic
commit
efff604a50

+ 3 - 3
package.json

@@ -20,7 +20,7 @@
 	"packageManager": "yarn@3.5.0",
 	"dependencies": {
 		"@fortawesome/fontawesome-free": "^6.4.0",
-		"chart.js": "^4.2.1",
+		"chart.js": "^4.3.0",
 		"check-password-strength": "^2.0.7",
 		"nanoid": "^4.0.2",
 		"normalize.css": "^8.0.1"
@@ -36,8 +36,8 @@
 		"eslint-plugin-editorconfig": "^4.0.2",
 		"eslint-plugin-import": "^2.27.5",
 		"husky": "^8.0.3",
-		"lint-staged": "^13.2.1",
-		"markdownlint-cli2": "^0.7.0",
+		"lint-staged": "^13.2.2",
+		"markdownlint-cli2": "^0.7.1",
 		"postcss": "^8.4.23",
 		"postcss-import": "^15.1.0",
 		"postcss-path-replace": "^1.0.4",

Plik diff jest za duży
+ 0 - 0
web/js/dist/chart.js-auto.min.js


Plik diff jest za duży
+ 0 - 0
web/js/dist/main.min.js


Plik diff jest za duży
+ 0 - 1
web/js/dist/main.min.js.map


+ 0 - 14
web/js/pages/add_user.js

@@ -1,14 +0,0 @@
-$(function () {
-	$('#v_email').change(function () {
-		if ($('#v_email_notify').prop('checked')) {
-			document.getElementById('v_notify').value = document.getElementById('v_email').value;
-		}
-	});
-	$('#v_email_notify').change(function () {
-		if ($('#v_email_notify').prop('checked')) {
-			document.getElementById('v_notify').value = document.getElementById('v_email').value;
-		} else {
-			document.getElementById('v_notify').value = '';
-		}
-	});
-});

+ 2 - 5
web/js/pages/add_web.js

@@ -10,7 +10,7 @@ App.Actions.WEB.update_ftp_username_hint = function (elm, hint) {
 
 	hint = hint.replace(/[^\w\d]/gi, '');
 
-	$(elm).parent().find('.v-ftp-user').val(hint);
+	$(elm).parent().find('.js-ftp-user').val(hint);
 	$(elm)
 		.parent()
 		.find('.hint')
@@ -18,7 +18,7 @@ App.Actions.WEB.update_ftp_username_hint = function (elm, hint) {
 };
 
 App.Listeners.WEB.keypress_ftp_username = function () {
-	var ftp_user_inputs = $('.v-ftp-user');
+	var ftp_user_inputs = $('.js-ftp-user');
 	$.each(ftp_user_inputs, function (i, ref) {
 		var $ref = $(ref);
 		var current_val = $ref.val();
@@ -40,9 +40,6 @@ App.Listeners.WEB.keypress_domain_name = function () {
 	$('#v_domain').bind('keypress input', function () {
 		clearTimeout(window.frp_usr_tmt);
 		window.frp_usr_tmt = setTimeout(function () {
-			// var domain = $('.js-ftp-path-prefix').text(
-			// 	Alpine.store('globals').FTP_USER_PREPATH + '/' + $('#v_domain').val()
-			// );
 			$('#v-custom-doc-domain-main').text($('#v_domain').val());
 			$('#v-custom-doc-domain-main').val($('#v_domain').val());
 			App.Actions.WEB.update_custom_doc_root(13, 12);

+ 15 - 20
web/js/pages/edit_web.js

@@ -44,7 +44,7 @@ App.Actions.WEB.update_ftp_username_hint = function (elm, hint) {
 
 	hint = hint.replace(/[^\w\d]/gi, '');
 
-	$(elm).parent().find('.v-ftp-user').val(hint);
+	$(elm).parent().find('.js-ftp-user').val(hint);
 	$(elm)
 		.parent()
 		.find('.hint')
@@ -52,7 +52,7 @@ App.Actions.WEB.update_ftp_username_hint = function (elm, hint) {
 };
 
 App.Listeners.WEB.keypress_ftp_username = function () {
-	var ftp_user_inputs = $('.v-ftp-user');
+	var ftp_user_inputs = $('.js-ftp-user');
 	$.each(ftp_user_inputs, function (i, ref) {
 		var $ref = $(ref);
 		var current_val = $ref.val();
@@ -132,11 +132,11 @@ App.Actions.WEB.add_ftp_user_form = function () {
 			$elm.attr('for', forAttr.replace('%INDEX%', newIndex));
 		});
 
-	template.find('.ftp-user-number').text(newIndex);
+	template.find('.js-ftp-user-number').text(newIndex);
 	$('#ftp_users').append(template);
 
 	let counter = 1;
-	$('.form-container .ftp-user-number:visible').each((_, o) => {
+	$('.form-container .js-ftp-user-number:visible').each((_, o) => {
 		$(o).text(counter);
 		counter += 1;
 	});
@@ -144,8 +144,8 @@ App.Actions.WEB.add_ftp_user_form = function () {
 
 App.Actions.WEB.remove_ftp_user = function (elm) {
 	var ref = $(elm).parents('.js-ftp-account');
-	ref.find('.v-ftp-user-deleted').val('1');
-	if (ref.find('.v-ftp-user-is-new').val() == 1) {
+	ref.find('.js-ftp-user-deleted').val('1');
+	if (ref.find('.js-ftp-user-is-new').val() == 1) {
 		ref.remove();
 		return true;
 	}
@@ -153,7 +153,7 @@ App.Actions.WEB.remove_ftp_user = function (elm) {
 	ref.hide();
 
 	var index = 1;
-	$('.form-container .ftp-user-number:visible').each(function (i, o) {
+	$('.form-container .js-ftp-user-number:visible').each(function (i, o) {
 		$(o).text(index);
 		index += 1;
 	});
@@ -168,17 +168,17 @@ App.Actions.WEB.toggle_additional_ftp_accounts = function (elm) {
 	if ($(elm).prop('checked')) {
 		$('.js-ftp-account-nrm, .v-add-new-user, .js-add-new-ftp-user-button').show();
 		$('.js-ftp-account-nrm').each(function (i, elm) {
-			var login = $(elm).find('.v-ftp-user');
+			var login = $(elm).find('.js-ftp-user');
 			if (login.val().trim() != '') {
-				$(elm).find('.v-ftp-user-deleted').val(0);
+				$(elm).find('.js-ftp-user-deleted').val(0);
 			}
 		});
 	} else {
 		$('.js-ftp-account-nrm, .v-add-new-user, .js-add-new-ftp-user-button').hide();
 		$('.js-ftp-account-nrm').each(function (i, elm) {
-			var login = $(elm).find('.v-ftp-user');
+			var login = $(elm).find('.js-ftp-user');
 			if (login.val().trim() != '') {
-				$(elm).find('.v-ftp-user-deleted').val(1);
+				$(elm).find('.js-ftp-user-deleted').val(1);
 			}
 		});
 	}
@@ -191,7 +191,7 @@ App.Actions.WEB.randomPasswordGenerated = function (elm) {
 App.Actions.WEB.passwordChanged = function (elm) {
 	var ref = $(elm).parents('.js-ftp-account');
 	if (ref.find('.js-email-alert-on-psw').length == 0) {
-		var inp_name = ref.find('.v-ftp-user-is-new').prop('name');
+		var inp_name = ref.find('.js-ftp-user-is-new').prop('name');
 		inp_name = inp_name.replace('is_new', 'v_ftp_email');
 		ref.find('div:last').after(
 			`<div class="u-pl30 u-mb10">
@@ -211,7 +211,7 @@ App.Listeners.WEB.keypress_ftp_username();
 App.Listeners.WEB.keypress_ftp_path();
 
 $(function () {
-	$('.v-ftp-user-psw').on('keypress', function (evt) {
+	$('.js-ftp-user-psw').on('keypress', function (evt) {
 		var elm = $(evt.target);
 		App.Actions.WEB.passwordChanged(elm);
 	});
@@ -262,18 +262,13 @@ $(function () {
 	});
 });
 
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-function WEBrandom() {
-	document.v_edit_web.v_stats_password.value = Hestia.helpers.randomPassword();
-}
-
 // eslint-disable-next-line @typescript-eslint/no-unused-vars
 function FTPrandom(elm) {
-	$(elm).parents('.js-ftp-account').find('.v-ftp-user-psw').val(Hestia.helpers.randomPassword());
+	$(elm).parents('.js-ftp-account').find('.js-ftp-user-psw').val(Hestia.helpers.randomPassword());
 	App.Actions.WEB.randomPasswordGenerated && App.Actions.WEB.randomPasswordGenerated(elm);
 }
 
-$('.v-redirect-custom-value').change(function () {
+$('.js-redirect-custom-value').change(function () {
 	if (this.value == 'custom') {
 		$('#custom_redirect').show();
 	} else {

+ 37 - 0
web/js/src/ipListDataSource.js

@@ -0,0 +1,37 @@
+// Populates the "Data Source" select with various IP lists on the New IP List page
+export default function handleIpListDataSource() {
+	const dataSourceSelect = document.querySelector('.js-datasource-select');
+
+	if (!dataSourceSelect) return;
+
+	// Parse IP lists from HTML and sort them alphabetically
+	const countryIplists = parseAndSortIplists(dataSourceSelect.dataset.countryIplists);
+	const blacklistIplists = parseAndSortIplists(dataSourceSelect.dataset.blacklistIplists);
+
+	// Add IP lists to the "Data Source" select
+	addIPListsToSelect(dataSourceSelect, Alpine.store('globals').BLACKLIST, blacklistIplists);
+	addIPListsToSelect(dataSourceSelect, Alpine.store('globals').IPVERSE, countryIplists);
+}
+
+function parseAndSortIplists(iplistsData) {
+	const iplists = JSON.parse(iplistsData || '[]');
+	return iplists.sort((a, b) => a.name.localeCompare(b.name));
+}
+
+function addIPListsToSelect(dataSourceSelect, label, iplists) {
+	// Add a disabled option as a label
+	addOption(dataSourceSelect, label, '', true);
+
+	// Add IP lists to the select element
+	iplists.forEach((iplist) => {
+		addOption(dataSourceSelect, iplist.name, iplist.source, false);
+	});
+}
+
+function addOption(element, text, value, disabled) {
+	const option = document.createElement('option');
+	option.text = text;
+	option.value = value;
+	if (disabled) option.disabled = true;
+	element.appendChild(option);
+}

+ 4 - 0
web/js/src/main.js

@@ -6,12 +6,14 @@ import handleCronGenerator from './cronGenerator';
 import handleDiscardAllMail from './discardAllMail';
 import handleErrorMessage from './errorHandler';
 import handleFormSubmit from './formSubmit';
+import handleIpListDataSource from './ipListDataSource';
 import handleListSelectAll from './listSelectAll';
 import handleListSorting from './listSorting';
 import handleNameServerInput from './nameServerInput';
 import handlePasswordInput from './passwordInput';
 import handleShortcuts from './shortcuts';
 import handleStickyToolbar from './stickyToolbar';
+import handleSyncEmailValues from './syncEmailValues';
 import handleTabPanels from './tabPanels';
 import handleToggleAdvanced from './toggleAdvanced';
 import handleUnlimitedInput from './unlimitedInput';
@@ -33,6 +35,7 @@ function initListeners() {
 	handleNameServerInput();
 	handlePasswordInput();
 	handleStickyToolbar();
+	handleSyncEmailValues();
 	handleTabPanels();
 	handleToggleAdvanced();
 }
@@ -40,6 +43,7 @@ function initListeners() {
 document.addEventListener('alpine:init', () => {
 	alpineInit();
 	handleErrorMessage();
+	handleIpListDataSource();
 	handleShortcuts();
 	handleUnlimitedInput();
 });

+ 22 - 0
web/js/src/syncEmailValues.js

@@ -0,0 +1,22 @@
+// Synchronizes the "Email" input value with "Email login credentials to" input value
+// based on the "Send welcome email" checkbox state on Add User page
+export default function handleSyncEmailValues() {
+	const emailInput = document.querySelector('.js-sync-email-input');
+	const sendWelcomeEmailCheckbox = document.querySelector('.js-sync-email-checkbox');
+	const emailCredentialsToInput = document.querySelector('.js-sync-email-output');
+
+	if (!emailInput || !sendWelcomeEmailCheckbox || !emailCredentialsToInput) {
+		return;
+	}
+
+	function syncEmailValues() {
+		if (sendWelcomeEmailCheckbox.checked) {
+			emailCredentialsToInput.value = emailInput.value;
+		} else {
+			emailCredentialsToInput.value = '';
+		}
+	}
+
+	emailInput.addEventListener('input', syncEmailValues);
+	sendWelcomeEmailCheckbox.addEventListener('change', syncEmailValues);
+}

+ 3 - 1
web/templates/includes/js.php

@@ -30,7 +30,9 @@
 			NOTIFICATIONS_EMPTY: '<?= _("no notifications") ?>',
 			NOTIFICATIONS_DELETE_ALL: '<?= _("Delete all notifications") ?>',
 			CONFIRM_LEAVE_PAGE: '<?= _("LEAVE_PAGE_CONFIRMATION") ?>',
-			ERROR_MESSAGE: '<?= !empty($_SESSION['error_msg']) ? htmlentities($_SESSION['error_msg']) : '' ?>'
+			ERROR_MESSAGE: '<?= !empty($_SESSION['error_msg']) ? htmlentities($_SESSION['error_msg']) : '' ?>',
+			BLACKLIST: '<?= _("BLACKLIST") ?>',
+			IPVERSE: '<?= _("IPVERSE") ?>'
 		});
 	})
 </script>

+ 5 - 5
web/templates/pages/add_cron.php

@@ -79,7 +79,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -109,7 +109,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -178,7 +178,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -250,7 +250,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -362,7 +362,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>

+ 1 - 1
web/templates/pages/add_db.php

@@ -75,7 +75,7 @@
 				<div class="u-mb10">
 					<label for="v_password" class="form-label">
 						<?= _("Password") ?>
-						<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+						<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 							<i class="fas fa-arrows-rotate icon-green"></i>
 						</button>
 					</label>

+ 50 - 66
web/templates/pages/add_firewall_ipset.php

@@ -21,6 +21,49 @@
 		<input type="hidden" name="token" value="<?= $_SESSION["token"] ?>">
 		<input type="hidden" name="ok" value="Add">
 
+		<?php
+		$country = [
+			"br" => "Brazil",
+			"ca" => "Canada",
+			"cn" => "China",
+			"fr" => "French",
+			"de" => "Germany",
+			"in" => "India",
+			"id" => "Indonesia",
+			"nl" => "Netherlands",
+			"ro" => "Romania",
+			"ru" => "Russia",
+			"es" => "Spain",
+			"ch" => "Switzerland",
+			"tr" => "Turkey",
+			"ua" => "Ukraine",
+			"gb" => "United Kingdom",
+			"us" => "United States",
+		];
+
+		function generate_iplist($country, $type) {
+			$iplist = [];
+			$lowercaseType = strtolower($type);
+			foreach ($country as $iso => $name) {
+				$iplist[] = [
+					"name" => "[$type] " . _("Country") . " - $name",
+					"source" => "https://raw.githubusercontent.com/ipverse/rir-ip/master/country/$iso/$lowercaseType-aggregated.txt",
+				];
+			}
+			return $iplist;
+		}
+
+		$country_iplists = generate_iplist($country, "IPv4");
+		// Uncomment below for IPv6
+		// $country_ipv6lists = generate_iplist($country, 'IPv6');
+
+		$blacklist_iplists = [
+			["name" => "[IPv4] Block Malicious IPs", "source" => "script:/usr/local/hestia/install/common/firewall/ipset/blacklist.sh"],
+			// Uncomment below for IPv6
+			// array('name' => "[IPv6] Block Malicious IPs", 'source' => "script:/usr/local/hestia/install/common/firewall/ipset/blacklist.ipv6.sh"),
+		];
+		?>
+
 		<div class="form-container">
 			<h1 class="form-title"><?= _("Adding Firewall Ipset List") ?></h1>
 			<?php show_alert_message($_SESSION); ?>
@@ -33,7 +76,13 @@
 					<?= _("Data Source") ?> <span class="optional">(<?= _("url, script or file") ?>)</span>
 				</label>
 				<div class="u-pos-relative">
-					<select class="form-select" tabindex="-1" id="datasource_list" onchange="this.nextElementSibling.value=this.value">
+					<select
+						class="form-select js-datasource-select"
+						tabindex="-1"
+						onchange="this.nextElementSibling.value=this.value"
+						data-country-iplists="<?= htmlspecialchars(json_encode($country_iplists), ENT_QUOTES, 'UTF-8') ?>"
+						data-blacklist-iplists="<?= htmlspecialchars(json_encode($blacklist_iplists), ENT_QUOTES, 'UTF-8') ?>"
+					>
 						<option value=""><?= _("Clear") ?></option>
 					</select>
 					<input type="text" class="form-control list-editor" name="v_datasource" id="v_datasource" maxlength="255" value="<?= htmlentities(trim($v_datasource, "'")) ?>">
@@ -58,68 +107,3 @@
 	</form>
 
 </div>
-
-<script>
-	var country_iplists = [
-		<?php
-			$country = array('br' => 'Brazil', 'ca' => 'Canada', 'cn' => 'China', 'fr' => 'French', 'de' => 'Germany', 'in' => 'India', 'id' => 'Indonesia', 'nl' => 'Netherlands', 'ro' => 'Romania', 'ru' => 'Russia', 'es' => 'Spain', 'ch' => 'Switzerland', 'tr' => 'Turkey', 'ua' => 'Ukraine', 'gb' => 'United Kingdom', 'us' => 'United States');
-			foreach($country as $iso => $name){
-				echo '{name: "[IPv4] ' . _("Country") . ' - ' . $name . '", source: "https://raw.githubusercontent.com/ipverse/rir-ip/master/country/' . $iso . '/ipv4-aggregated.txt"},' . "\n";
-			}
-		?>
-		// Define IPv6 country lists
-		/*
-		<?php
-			foreach($country as $iso => $name){
-				echo '{name: "[IPv6] ' . _("Country") . ' - ' . $name . '", source: "https://raw.githubusercontent.com/ipverse/rir-ip/master/country/' . $iso . '/ipv6-aggregated.txt"},' . "\n";
-			}
-		?>
-		*/
-	];
-
-	var blacklist_iplists = [
-		{name: "[IPv4] Block Malicious IPs", source: "script:/usr/local/hestia/install/common/firewall/ipset/blacklist.sh"},
-		/*
-		{name: "[IPv6] Block Malicious IPs", source: "script:/usr/local/hestia/install/common/firewall/ipset/blacklist.ipv6.sh"},
-		*/
-	];
-
-	country_iplists.sort(function (a, b) {
-		return a.name > b.name;
-	});
-
-	blacklist_iplists.sort(function (a, b) {
-		return a.name > b.name;
-	});
-	window.addEventListener("load", () => {
-		$(function () {
-			var targetElement = document.getElementById('datasource_list');
-
-			// Blacklist
-			var newEl = document.createElement("option");
-			newEl.text = "<?= _("BLACKLIST") ?>";
-			newEl.disabled = true;
-			targetElement.appendChild(newEl);
-
-			blacklist_iplists.forEach(iplist => {
-				var newEl = document.createElement("option");
-				newEl.text = iplist.name;
-				newEl.value = iplist.source;
-				targetElement.appendChild(newEl);
-			});
-
-			// IPVERSE
-			var newEl = document.createElement("option");
-			newEl.text = "<?= _("IPVERSE") ?>";
-			newEl.disabled = true;
-			targetElement.appendChild(newEl);
-
-			country_iplists.forEach(iplist => {
-				var newEl = document.createElement("option");
-				newEl.text = iplist.name;
-				newEl.value = iplist.source;
-				targetElement.appendChild(newEl);
-			});
-		});
-	});
-</script>

+ 1 - 1
web/templates/pages/add_mail_acc.php

@@ -45,7 +45,7 @@
 					<div class="u-mb10">
 						<label for="v_password" class="form-label">
 							<?= _("Password") ?>
-							<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+							<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 								<i class="fas fa-arrows-rotate icon-green"></i>
 							</button>
 						</label>

+ 4 - 4
web/templates/pages/add_user.php

@@ -41,12 +41,12 @@
 			</div>
 			<div class="u-mb10">
 				<label for="v_email" class="form-label"><?= _("Email") ?></label>
-				<input type="email" class="form-control" name="v_email" id="v_email" value="<?= htmlentities(trim($v_email, "'")) ?>" tabindex="3" required>
+				<input type="email" class="form-control js-sync-email-input" name="v_email" id="v_email" value="<?= htmlentities(trim($v_email, "'")) ?>" tabindex="3" required>
 			</div>
 			<div class="u-mb10">
 				<label for="v_password" class="form-label">
 					<?= _("Password") ?>
-					<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+					<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 						<i class="fas fa-arrows-rotate icon-green"></i>
 					</button>
 				</label>
@@ -71,7 +71,7 @@
 			</div>
 			<div x-cloak x-show="!loginDisabled" id="send-welcome">
 				<div class="form-check u-mb10">
-					<input class="form-check-input" type="checkbox" name="v_email_notice" id="v_email_notify" tabindex="5">
+					<input class="form-check-input js-sync-email-checkbox" type="checkbox" name="v_email_notice" id="v_email_notify" tabindex="5">
 					<label for="v_email_notify">
 						<?= _("Send welcome email") ?>
 					</label>
@@ -126,7 +126,7 @@
 				<label for="v_notify" class="form-label">
 					<?= _("Send login credentials to email address") ?>
 				</label>
-				<input type="email" class="form-control" name="v_notify" id="v_notify" value="<?= htmlentities(trim($v_notify, "'")) ?>" tabindex="8">
+				<input type="email" class="form-control js-sync-email-output" name="v_notify" id="v_notify" value="<?= htmlentities(trim($v_notify, "'")) ?>" tabindex="8">
 			</div>
 		</div>
 

+ 5 - 5
web/templates/pages/edit_cron.php

@@ -79,7 +79,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -109,7 +109,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -178,7 +178,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -250,7 +250,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>
@@ -362,7 +362,7 @@
 								</div>
 								<div class="u-pt10">
 									<button type="button" class="button button-secondary js-generate-cron">
-										<?= _("generate") ?>
+										<?= _("Generate") ?>
 									</button>
 								</div>
 							</fieldset>

+ 1 - 1
web/templates/pages/edit_db.php

@@ -40,7 +40,7 @@
 			<div class="u-mb10">
 				<label for="v_password" class="form-label">
 					<?= _("Password") ?>
-					<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+					<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 						<i class="fas fa-arrows-rotate icon-green"></i>
 					</button>
 				</label>

+ 1 - 1
web/templates/pages/edit_mail_acc.php

@@ -43,7 +43,7 @@
 					<div class="u-mb10">
 						<label for="v_password" class="form-label">
 							<?= _("Password") ?>
-							<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+							<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 								<i class="fas fa-arrows-rotate icon-green"></i>
 							</button>
 						</label>

+ 1 - 1
web/templates/pages/edit_user.php

@@ -82,7 +82,7 @@
 			<div class="u-mb10">
 				<label for="v_password" class="form-label">
 					<?= _("Password") ?>
-					<button type="button" title="<?= _("generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+					<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
 						<i class="fas fa-arrows-rotate icon-green"></i>
 					</button>
 				</label>

+ 21 - 18
web/templates/pages/edit_web.php

@@ -110,7 +110,10 @@
 						</div>
 						<div class="u-mb20">
 							<label for="v_password" class="form-label">
-								<?= _("Password") ?> / <a href="javascript:WEBrandom();" class="form-link"><?= _("generate") ?></a>
+								<?= _("Password") ?>
+								<button type="button" title="<?= _("Generate") ?>" class="u-unstyled-button u-ml5 js-generate-password">
+									<i class="fas fa-arrows-rotate icon-green"></i>
+								</button>
 							</label>
 							<div class="u-pos-relative">
 								<input type="text" class="form-control js-password-input" name="v_stats_password" id="v_password" value="<?= trim($v_stats_password, "'") ?>">
@@ -127,19 +130,19 @@
 			</div>
 			<div x-cloak x-show="redirectEnabled" id="v_redirect" class="u-pl30 u-mb10">
 				<div class="form-check">
-					<input class="form-check-input v-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-1" value="<?='www.'.htmlentities($v_domain);?>" <?php if ($v_redirect == "www.".$v_domain) echo 'checked'; ?>>
+					<input class="form-check-input js-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-1" value="<?='www.'.htmlentities($v_domain);?>" <?php if ($v_redirect == "www.".$v_domain) echo 'checked'; ?>>
 					<label for="v-redirect-radio-1">
 						<?= sprintf(_("Redirect visitors to %s"), "www." . htmlentities($v_domain)) ?>
 					</label>
 				</div>
 				<div class="form-check">
-					<input class="form-check-input v-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-2" value="<?=htmlentities($v_domain);?>" <?php if( $v_redirect == $v_domain) echo 'checked';?> >
+					<input class="form-check-input js-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-2" value="<?=htmlentities($v_domain);?>" <?php if( $v_redirect == $v_domain) echo 'checked';?> >
 					<label for="v-redirect-radio-2">
 						<?= sprintf(_("Redirect visitors to %s"), htmlentities($v_domain)) ?>
 					</label>
 				</div>
 				<div class="form-check">
-					<input class="form-check-input v-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-3" value="custom" <?php if( !empty($v_redirect_custom)) echo 'checked';?>>
+					<input class="form-check-input js-redirect-custom-value" type="radio" name="v-redirect" id="v-redirect-radio-3" value="custom" <?php if( !empty($v_redirect_custom)) echo 'checked';?>>
 					<label for="v-redirect-radio-3">
 						<?= _("Redirect visitors to a custom domain or web address") ?>
 					</label>
@@ -395,33 +398,33 @@
 						?>
 						<div class="js-ftp-account js-ftp-account-nrm" name="v_add_domain_ftp" style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;">
 							<div class="u-mb10">
-								<?= _("FTP") ?> #<span class="ftp-user-number"><?=$i + 1; ?></span>
+								<?= _("FTP") ?> #<span class="js-ftp-user-number"><?=$i + 1; ?></span>
 								<button type="button" class="form-link form-link-danger" onclick="App.Actions.WEB.remove_ftp_user(this)"><?= _("delete") ?></button>
-								<input type="hidden" class="v-ftp-user-deleted" name="v_ftp_user[<?=$i ?>][delete]" value="0">
-								<input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[<?=$i ?>][is_new]" value="<?=htmlentities($ftp_user['is_new']) ?>">
+								<input type="hidden" class="js-ftp-user-deleted" name="v_ftp_user[<?=$i ?>][delete]" value="0">
+								<input type="hidden" class="js-ftp-user-is-new" name="v_ftp_user[<?=$i ?>][is_new]" value="<?=htmlentities($ftp_user['is_new']) ?>">
 							</div>
 							<div class="u-pl30 u-mb10">
 								<label for="v_ftp_user[<?=$i ?>][v_ftp_user]" class="form-label">
 									<?= _("Username") ?><br>
 									<span style="color:#777;"><?=sprintf(_('Prefix %s will be added to username automatically'),$user_plain."_");?></span>
 								</label>
-								<input type="text" class="form-control v-ftp-user" <?=$ftp_user['is_new'] != 1 ? 'disabled="disabled"' : '' ?>
+								<input type="text" class="form-control js-ftp-user" <?=$ftp_user['is_new'] != 1 ? 'disabled="disabled"' : '' ?>
 								name="v_ftp_user[<?=$i ?>][v_ftp_user]" id="v_ftp_user[<?=$i ?>][v_ftp_user]" value="<?=htmlentities(trim($v_ftp_user, "'"))?>">
 								<input type="hidden" name="v_record_id" value="<?=htmlentities(trim($v_record_id, "'"))?>">
 								<small class="hint"></small>
 							</div>
 							<div class="u-pl30 u-mb10">
 								<label for="v_ftp_user[<?=$i ?>][v_ftp_password]" class="form-label">
-									<?= _("Password") ?> / <a href="javascript:void(0);" onclick="FTPrandom(this)" ; class="form-link"><?= _("generate") ?></a>
+									<?= _("Password") ?> / <a href="javascript:void(0);" onclick="FTPrandom(this)" ; class="form-link"><?= _("Generate") ?></a>
 								</label>
-								<input type="text" class="form-control v-ftp-user-psw" name="v_ftp_user[<?=$i ?>][v_ftp_password]" id="v_ftp_user[<?=$i ?>][v_ftp_password]" value="<?=htmlentities(trim($v_ftp_password, "'"))?>">
+								<input type="text" class="form-control js-ftp-user-psw" name="v_ftp_user[<?=$i ?>][v_ftp_password]" id="v_ftp_user[<?=$i ?>][v_ftp_password]" value="<?=htmlentities(trim($v_ftp_password, "'"))?>">
 							</div>
 							<div class="u-pl30 u-mb10">
 								<label for="v_ftp_user[<?=$i ?>][v_ftp_path]" class="form-label"><?= _("Path") ?></label>
 								<input type="hidden" name="v_ftp_pre_path" value="<?=!empty($v_ftp_pre_path) ? htmlentities(trim($v_ftp_pre_path, "'")) : '/'; ?>">
 								<input type="hidden" name="v_ftp_user[<?=$i ?>][v_ftp_path_prev]" value="<?php if (!empty($v_ftp_path)) echo ($v_ftp_path[0] != '/' ? '/' : '').htmlentities(trim($v_ftp_path, "'")) ?>">
 								<input type="text" class="form-control js-ftp-path" name="v_ftp_user[<?=$i ?>][v_ftp_path]" id="v_ftp_user[<?=$i ?>][v_ftp_path]" value="<?php if (!empty($v_ftp_path)) echo ($v_ftp_path[0] != '/' ? '/' : '').htmlentities(trim($v_ftp_path, "'")) ?>">
-								<span class="hint-prefix js-ftp-path-prefix"><?=htmlentities(trim($v_ftp_pre_path, "'"))?></span><span class="hint js-ftp-path-hint"></span>
+								<span class="hint-prefix"><?=htmlentities(trim($v_ftp_pre_path, "'"))?></span><span class="hint js-ftp-path-hint"></span>
 							</div>
 							<?php if ($ftp_user['is_new'] == 1): ?>
 								<div class="u-pl30 u-mb10">
@@ -449,30 +452,30 @@
 <div id="templates" class="u-hidden">
 	<div class="js-ftp-account js-ftp-account-nrm" name="v_add_domain_ftp">
 		<div class="u-mb10">
-			<?= _("FTP") ?> #<span class="ftp-user-number"></span>
+			<?= _("FTP") ?> #<span class="js-ftp-user-number"></span>
 			<a class="form-link form-link-danger" onclick="App.Actions.WEB.remove_ftp_user(this)"><?= _("delete") ?></a>
-			<input type="hidden" class="v-ftp-user-deleted" name="v_ftp_user[%INDEX%][delete]" value="0">
-			<input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[%INDEX%][is_new]" value="1">
+			<input type="hidden" class="js-ftp-user-deleted" name="v_ftp_user[%INDEX%][delete]" value="0">
+			<input type="hidden" class="js-ftp-user-is-new" name="v_ftp_user[%INDEX%][is_new]" value="1">
 		</div>
 		<div class="u-pl30 u-mb10">
 			<label for="v_ftp_user[%INDEX%][v_ftp_user]" class="form-label">
 				<?= _("Username") ?><br>
 				<span style="color:#777;"><?= sprintf(_("Prefix %s will be added to username automatically"), $user_plain . "_") ?></span>
 			</label>
-			<input type="text" class="form-control v-ftp-user" name="v_ftp_user[%INDEX%][v_ftp_user]" id="v_ftp_user[%INDEX%][v_ftp_user]" value="">
+			<input type="text" class="form-control js-ftp-user" name="v_ftp_user[%INDEX%][v_ftp_user]" id="v_ftp_user[%INDEX%][v_ftp_user]" value="">
 			<small class="hint"></small>
 		</div>
 		<div class="u-pl30 u-mb10">
 			<label for="v_ftp_user[%INDEX%][v_ftp_password]" class="form-label">
-				<?= _("Password") ?> / <a href="javascript:void(0);" onclick="FTPrandom(this)" ; class="form-link"><?= _("generate") ?></a>
+				<?= _("Password") ?> / <a href="javascript:void(0);" onclick="FTPrandom(this)" ; class="form-link"><?= _("Generate") ?></a>
 			</label>
-			<input type="text" class="form-control v-ftp-user-psw" name="v_ftp_user[%INDEX%][v_ftp_password]" id="v_ftp_user[%INDEX%][v_ftp_password]">
+			<input type="text" class="form-control js-ftp-user-psw" name="v_ftp_user[%INDEX%][v_ftp_password]" id="v_ftp_user[%INDEX%][v_ftp_password]">
 		</div>
 		<div class="u-pl30 u-mb10">
 			<label for="v_ftp_user[%INDEX%][v_ftp_path]" class="form-label"><?= _("Path") ?></label>
 			<input type="hidden" name="v_ftp_pre_path" value="">
 			<input type="text" class="form-control js-ftp-path" name="v_ftp_user[%INDEX%][v_ftp_path]" id="v_ftp_user[%INDEX%][v_ftp_path]" value="">
-			<span class="hint-prefix js-ftp-path-prefix"><?= htmlentities(trim($v_ftp_pre_path_new_user, "'")) ?></span><span class="hint js-ftp-path-hint"></span>
+			<span class="hint-prefix"><?= htmlentities(trim($v_ftp_pre_path_new_user, "'")) ?></span><span class="hint js-ftp-path-hint"></span>
 		</div>
 		<div class="u-pl30 u-mb10">
 			<label for="v_ftp_user[%INDEX%][v_ftp_email]" class="form-label"><?= _("Send FTP credentials to email") ?></label>

+ 1 - 1
web/templates/pages/setup_webapp.php

@@ -73,7 +73,7 @@
 											class="form-link"
 											type="button"
 										>
-											<?= _("generate") ?>
+											<?= _("Generate") ?>
 									</button>
 									<?php } ?>
 								</label>

+ 77 - 77
yarn.lock

@@ -5,31 +5,31 @@ __metadata:
   version: 6
   cacheKey: 8
 
-"@algolia/autocomplete-core@npm:1.7.4":
-  version: 1.7.4
-  resolution: "@algolia/autocomplete-core@npm:1.7.4"
+"@algolia/autocomplete-core@npm:1.8.2":
+  version: 1.8.2
+  resolution: "@algolia/autocomplete-core@npm:1.8.2"
   dependencies:
-    "@algolia/autocomplete-shared": 1.7.4
-  checksum: cd7c0badec2dd7f32eb1c567e740473df41d0b5cfdc009efc2b44d2c72e30d90a05882ca0616d6dc29326177d5183a7fd9c6189e5eab3abe26936e232ac5f43a
+    "@algolia/autocomplete-shared": 1.8.2
+  checksum: 03c164d8ce685e8b690734364a2e8653a7ebaf9b49ccbea5f94236b1231d66ed6771010406a0b00a2ce884b767712d71903a7d124ec11f35a87006d1456da762
   languageName: node
   linkType: hard
 
-"@algolia/autocomplete-preset-algolia@npm:1.7.4":
-  version: 1.7.4
-  resolution: "@algolia/autocomplete-preset-algolia@npm:1.7.4"
+"@algolia/autocomplete-preset-algolia@npm:1.8.2":
+  version: 1.8.2
+  resolution: "@algolia/autocomplete-preset-algolia@npm:1.8.2"
   dependencies:
-    "@algolia/autocomplete-shared": 1.7.4
+    "@algolia/autocomplete-shared": 1.8.2
   peerDependencies:
     "@algolia/client-search": ">= 4.9.1 < 6"
     algoliasearch: ">= 4.9.1 < 6"
-  checksum: 4ea134757d611d1b7489f34b4366d103fb981dde3f75f39762fb71142f23bd024825f7541ab756ead9c87e223184616fd74b7762982054c96927fecd5a6e6e3e
+  checksum: f968b0f9d0ad9e75d3e1cfe35a02816ed01d83eb3d702bb8d4297bb9abf542991659c4a16c6ea323eea9268f189e85f58fcb109de76e6c4a9f58a0d63812c92e
   languageName: node
   linkType: hard
 
-"@algolia/autocomplete-shared@npm:1.7.4":
-  version: 1.7.4
-  resolution: "@algolia/autocomplete-shared@npm:1.7.4"
-  checksum: d304b1e3523ccf36a4a21ef9c116c83360fc1bffc595e888f05c35ab00de293104184dafebd9b9ed8ac5ffa5c416ddd4b1139e9794a253f52863c1ae544c2c9c
+"@algolia/autocomplete-shared@npm:1.8.2":
+  version: 1.8.2
+  resolution: "@algolia/autocomplete-shared@npm:1.8.2"
+  checksum: 1ec17deb594c41e983643cfd888e3590963aa7207ef6a67859c49a8f4835340493ba3b025b8b617b488365730ba9817ad58ee44a610c172332446e560fb68780
   languageName: node
   linkType: hard
 
@@ -559,30 +559,30 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@docsearch/css@npm:3.3.3, @docsearch/css@npm:^3.3.3":
-  version: 3.3.3
-  resolution: "@docsearch/css@npm:3.3.3"
-  checksum: c3e678dd5e05a962d3e29b4c953632a013af3a352ad99d0e630546409e665684e122265034bca1619d9bd659e42d35c7cc90ee373836fcfb2614aae2057c5dc1
+"@docsearch/css@npm:3.3.4, @docsearch/css@npm:^3.3.3":
+  version: 3.3.4
+  resolution: "@docsearch/css@npm:3.3.4"
+  checksum: 56e3ae677423fa4cf508ffb964d0616862a4af22affad308f47edf5c1ad097a2b21187c53d240f83463c4e7add3cd60e3630022a68e2089bb3066bfbaded64a0
   languageName: node
   linkType: hard
 
 "@docsearch/js@npm:^3.3.3":
-  version: 3.3.3
-  resolution: "@docsearch/js@npm:3.3.3"
+  version: 3.3.4
+  resolution: "@docsearch/js@npm:3.3.4"
   dependencies:
-    "@docsearch/react": 3.3.3
+    "@docsearch/react": 3.3.4
     preact: ^10.0.0
-  checksum: 445bb7f66f9ca4b385a28fd78bcbac048acd20d925978a1c23cc1ef74022ec4e3ff93d58819eae9a721dc1ac6eed17e40de536ec67ab99b87fff6e4db6b78a96
+  checksum: 4a865e6fede00b5d7d957d1e640d0114235b0217cfb21d6d6de02ede11bc6081ddf82fb5a96284bc1f47642eea35211a7ba0cf7541e8d356913c56f8b1408cf5
   languageName: node
   linkType: hard
 
-"@docsearch/react@npm:3.3.3":
-  version: 3.3.3
-  resolution: "@docsearch/react@npm:3.3.3"
+"@docsearch/react@npm:3.3.4":
+  version: 3.3.4
+  resolution: "@docsearch/react@npm:3.3.4"
   dependencies:
-    "@algolia/autocomplete-core": 1.7.4
-    "@algolia/autocomplete-preset-algolia": 1.7.4
-    "@docsearch/css": 3.3.3
+    "@algolia/autocomplete-core": 1.8.2
+    "@algolia/autocomplete-preset-algolia": 1.8.2
+    "@docsearch/css": 3.3.4
     algoliasearch: ^4.0.0
   peerDependencies:
     "@types/react": ">= 16.8.0 < 19.0.0"
@@ -595,7 +595,7 @@ __metadata:
       optional: true
     react-dom:
       optional: true
-  checksum: 8a31c175853b61ee80748abc0cebdc33d247483643c4151a430e05d37f159bf59ea08cb69f878cff7787d3ca122b664701575543914d3c3692b448b63d3ad716
+  checksum: 50f122f08c543711fffe8ba3b507311a01defef6db5d47401bd2b5c7759512357fa26d2a88a68b50916b9084fd922f7340ad03e479b4d60ac2e22b4a198dc06d
   languageName: node
   linkType: hard
 
@@ -1093,12 +1093,12 @@ __metadata:
   linkType: hard
 
 "@vitejs/plugin-vue@npm:^4.1.0":
-  version: 4.2.0
-  resolution: "@vitejs/plugin-vue@npm:4.2.0"
+  version: 4.2.1
+  resolution: "@vitejs/plugin-vue@npm:4.2.1"
   peerDependencies:
     vite: ^4.0.0
     vue: ^3.2.25
-  checksum: 210dad859d996a9b0fa00f7806de282d6a04581ced1792dd902d3f28c46cde33f8db03b164bed3b066c5602f2b962a00473b7dfbe234f0a276eb61cc9cc96669
+  checksum: a7266a45378d5fd7813699cf97dfac0e313dc63bd245a1c932848b2b5dc58aede922231d5a534baeeb7e2842c7172f17194a4833bd6a7a6ed61dc0a31d60c7c9
   languageName: node
   linkType: hard
 
@@ -1707,12 +1707,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chart.js@npm:^4.2.1":
-  version: 4.2.1
-  resolution: "chart.js@npm:4.2.1"
+"chart.js@npm:^4.3.0":
+  version: 4.3.0
+  resolution: "chart.js@npm:4.3.0"
   dependencies:
     "@kurkle/color": ^0.3.0
-  checksum: 7319fdfd1e29812e87bbc07737e8c9072ff659bbc09ade8dd262f83424cd7e48f89afe5220e11e002c9f236883fae3f3adb8adc16acb4682b0ddcc0b661c3af9
+  checksum: 157ceaa3815665163cb30ccc221a5af40834dca940faa6ec02cb95406bf3e83c15c5f36ad950a1716c9d199e87f7b9be953227c4d9d445d593536175b47bbab8
   languageName: node
   linkType: hard
 
@@ -2230,9 +2230,9 @@ __metadata:
   linkType: hard
 
 "electron-to-chromium@npm:^1.4.284":
-  version: 1.4.372
-  resolution: "electron-to-chromium@npm:1.4.372"
-  checksum: 946c50f1ec5df2408fc90164ab3814081dacd20cad7c440b829da391f864fefcda202e9e5a7016ce9d06d3c8746a505ffad820dfc51aa269dd13a6fdbf71d15d
+  version: 1.4.376
+  resolution: "electron-to-chromium@npm:1.4.376"
+  checksum: 881351d25e0e983432c10844540bb664ee4c54f781b81b7247c36d6e617dc85305fd87ffb5de6d9630c6a54f4432afd8e97565a11c62bb77b63051e43cb8a942
   languageName: node
   linkType: hard
 
@@ -3152,7 +3152,7 @@ __metadata:
     "@prettier/plugin-php": ^0.19.4
     "@typescript-eslint/eslint-plugin": ^5.59.1
     "@typescript-eslint/parser": ^5.59.1
-    chart.js: ^4.2.1
+    chart.js: ^4.3.0
     check-password-strength: ^2.0.7
     cssnano: ^6.0.0
     esbuild: ^0.17.18
@@ -3161,8 +3161,8 @@ __metadata:
     eslint-plugin-editorconfig: ^4.0.2
     eslint-plugin-import: ^2.27.5
     husky: ^8.0.3
-    lint-staged: ^13.2.1
-    markdownlint-cli2: ^0.7.0
+    lint-staged: ^13.2.2
+    markdownlint-cli2: ^0.7.1
     nanoid: ^4.0.2
     normalize.css: ^8.0.1
     postcss: ^8.4.23
@@ -3720,9 +3720,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lint-staged@npm:^13.2.1":
-  version: 13.2.1
-  resolution: "lint-staged@npm:13.2.1"
+"lint-staged@npm:^13.2.2":
+  version: 13.2.2
+  resolution: "lint-staged@npm:13.2.2"
   dependencies:
     chalk: 5.2.0
     cli-truncate: ^3.1.0
@@ -3736,10 +3736,10 @@ __metadata:
     object-inspect: ^1.12.3
     pidtree: ^0.6.0
     string-argv: ^0.3.1
-    yaml: ^2.2.1
+    yaml: ^2.2.2
   bin:
     lint-staged: bin/lint-staged.js
-  checksum: 5788d3fe38e69b7f7b7f700284d4e10738978a0916bc77d3f6253c43a030fc4f01f89c09da349fb658f929f3393d8b1e3eaabaac5b604416ebc33476640b51ce
+  checksum: f34f6e2e85e827364658ab8717bf8b35239473c2d4959d746b053a4cf158ac657348444c755820a8ef3eac2d4753a37c52e9db3e201ee20b085f26d2f2fbc9ed
   languageName: node
   linkType: hard
 
@@ -3935,21 +3935,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"markdownlint-cli2@npm:^0.7.0":
-  version: 0.7.0
-  resolution: "markdownlint-cli2@npm:0.7.0"
+"markdownlint-cli2@npm:^0.7.1":
+  version: 0.7.1
+  resolution: "markdownlint-cli2@npm:0.7.1"
   dependencies:
     globby: 13.1.4
-    markdownlint: 0.28.1
+    markdownlint: 0.28.2
     markdownlint-cli2-formatter-default: 0.0.4
     micromatch: 4.0.5
     strip-json-comments: 5.0.0
-    yaml: 2.2.1
+    yaml: 2.2.2
   bin:
     markdownlint-cli2: markdownlint-cli2.js
     markdownlint-cli2-config: markdownlint-cli2-config.js
     markdownlint-cli2-fix: markdownlint-cli2-fix.js
-  checksum: be0d937be2a6f620a85a420cce9a070c7e9e6eb669fa338837339eb8b2b1cff93acd5fcc5038a348d408f31439c95db0daf60b53d9fc38c0a2261a7823c3f73b
+  checksum: 665dc5cf66bade88f802bac0938a9dc828517d8362ce65f98ab0ca1abf81d3a92fcf280ad4c0990949cbab02c858b325f35ec836e0075fa2704a82e38333bf46
   languageName: node
   linkType: hard
 
@@ -3960,13 +3960,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"markdownlint@npm:0.28.1":
-  version: 0.28.1
-  resolution: "markdownlint@npm:0.28.1"
+"markdownlint@npm:0.28.2":
+  version: 0.28.2
+  resolution: "markdownlint@npm:0.28.2"
   dependencies:
     markdown-it: 13.0.1
     markdownlint-micromark: 0.1.2
-  checksum: d606e3f069d9b261b9c4ed0533f035420f38a4a19d73b238b35ff51a854be72a38e87d80eb15432aace34837a45b7da12bfbccaea4f70792d1e66ee771ded6d5
+  checksum: 2b83ff8223d7002ebcc8228abfd34c1f85f6c9b14e591a162498140dfa6d89b5083bbc45b097e279e5ae9a2e54b8603807634eb5141f575fce601ad781ce77aa
   languageName: node
   linkType: hard
 
@@ -5402,7 +5402,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss@npm:^8.1.10, postcss@npm:^8.4.21, postcss@npm:^8.4.22, postcss@npm:^8.4.23":
+"postcss@npm:^8.1.10, postcss@npm:^8.4.22, postcss@npm:^8.4.23":
   version: 8.4.23
   resolution: "postcss@npm:8.4.23"
   dependencies:
@@ -5715,11 +5715,11 @@ __metadata:
   linkType: hard
 
 "rxjs@npm:^7.8.0":
-  version: 7.8.0
-  resolution: "rxjs@npm:7.8.0"
+  version: 7.8.1
+  resolution: "rxjs@npm:7.8.1"
   dependencies:
     tslib: ^2.1.0
-  checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2
+  checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119
   languageName: node
   linkType: hard
 
@@ -5846,6 +5846,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"signal-exit@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "signal-exit@npm:4.0.1"
+  checksum: 832043367dca23e61ab6033e8b41c595fc805119bfe4fee63dea201cdc809a8b086bc54597bbbc1b2cde1a63c7dd554d1295ed2cca92db598233834a0b59b281
+  languageName: node
+  linkType: hard
+
 "slash@npm:^3.0.0":
   version: 3.0.0
   resolution: "slash@npm:3.0.0"
@@ -6552,12 +6559,12 @@ __metadata:
   linkType: hard
 
 "vite@npm:^4.3.1":
-  version: 4.3.2
-  resolution: "vite@npm:4.3.2"
+  version: 4.3.3
+  resolution: "vite@npm:4.3.3"
   dependencies:
     esbuild: ^0.17.5
     fsevents: ~2.3.2
-    postcss: ^8.4.21
+    postcss: ^8.4.23
     rollup: ^3.21.0
   peerDependencies:
     "@types/node": ">= 14"
@@ -6584,7 +6591,7 @@ __metadata:
       optional: true
   bin:
     vite: bin/vite.js
-  checksum: 0194c06c44efa6fc2f81389d16d90cc3da8e7a58d071fe80e787053d604e0ea653e367fc6eb0528058d255c1ae72625396128561301add48b8e480c45343d11c
+  checksum: 99970cb1fed3330458e60f8341ec73c4260c82d815e51c95295321ab496e4c8cb447bc942daf4d94f78bbc8b2bed36cbc237f43fdc1cede19250fac737e5a0fc
   languageName: node
   linkType: hard
 
@@ -6747,12 +6754,12 @@ __metadata:
   linkType: hard
 
 "write-file-atomic@npm:^5.0.0":
-  version: 5.0.0
-  resolution: "write-file-atomic@npm:5.0.0"
+  version: 5.0.1
+  resolution: "write-file-atomic@npm:5.0.1"
   dependencies:
     imurmurhash: ^0.1.4
-    signal-exit: ^3.0.7
-  checksum: 6ee16b195572386cb1c905f9d29808f77f4de2fd063d74a6f1ab6b566363832d8906a493b764ee715e57ab497271d5fc91642a913724960e8e845adf504a9837
+    signal-exit: ^4.0.1
+  checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9
   languageName: node
   linkType: hard
 
@@ -6770,14 +6777,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yaml@npm:2.2.1":
-  version: 2.2.1
-  resolution: "yaml@npm:2.2.1"
-  checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23
-  languageName: node
-  linkType: hard
-
-"yaml@npm:^2.2.1":
+"yaml@npm:2.2.2, yaml@npm:^2.2.2":
   version: 2.2.2
   resolution: "yaml@npm:2.2.2"
   checksum: d90c235e099e30094dcff61ba3350437aef53325db4a6bcd04ca96e1bfe7e348b191f6a7a52b5211e2dbc4eeedb22a00b291527da030de7c189728ef3f2b4eb3

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików