var tc = new Intl.NumberFormat('pl-PL', { style: "currency", currency: "PLN" }).format(total_costs);
tc: 2 136 703,77 zł
var bilans = new Intl.NumberFormat('pl-PL').format(bilans);
bilans: 7 324 432,32
var tc = new Intl.NumberFormat('pl-PL', { style: "currency", currency: "PLN" }).format(total_costs);
tc: 2 136 703,77 zł
var bilans = new Intl.NumberFormat('pl-PL').format(bilans);
bilans: 7 324 432,32
Obiekt iterujemy jak tablicę
function delay(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); }
await delay(3000);
Przy wpisywaniu nazwy podczas wyszukiwania – opóźniamy wysłanie zapytania do momentu zakończenia wprowadzania tekstu – zwykle 400ms.
Definicja funkcji debounce w pliku – /js/common.js
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) function debounce(func, timeout = 400){ let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, timeout); }; }
Użycie debounce w kodzie js
// Zmieniono domyślne opóźnienie 400 na 500ms const debounceName = debounce((str) => liveSearchCompanyByName(str), 500); $("#fullname").on('keyup', function(){ var name_str = $(this).val().trim(); var name_len = name_str.length; if( name_len >= 3 ) { debounceName(name_str); } else{ clearNameResults(); } });
Obsługa wyszukiwania / filtrowania (url.searchParams)
// Uruchomienie debouncera z timeoutem 600ms // Jeśli jest fraza ustaw searchParam, jeśli nie usuń const debounceNumber = debounce( (s_number) => { if(s_number) { url.searchParams.delete('page'); url.searchParams.set('s_number', s_number); } else { url.searchParams.delete('s_number'); } location.href = url.toString(); }, 600); // wpisywanie w pole wyszukiwania (s_number) $("#s_number").on('keyup', function(){ debounceNumber( $(this).val() ); });
Javascript – parseFloat nie akceptuje przecinka ’,’
netto = parseFloat( ($(this).val()).replace(',', '.') ); $("#netto").val( netto.toFixed(2) )
Filtrowanie wierszy tabeli – dopasowanie do 2 kolumn
Wyszukiwanie projektów po numerze (ciąg znaków) Ajax Czytaj dalej Ajax – cakephp4 – onKeyUp – wyszukiwanie projektów po nazwie
Znacznik czasu:
var start_date = $('#start-date').val(); // 2023-02-19 var end_date = $('#end-date').val(); // 2023-02-20 const start_tz = Date.parse(start_date); // const end_tz = Date.parse(end_date); // if(end_tz < start_tz) { alert('Błędna data zakończenia. Popraw !!!'); $('#end-date').val(''); }
Plugin jquery-ui wybierający miesiące/lata
const VALID_EMAIL_REGEX = new RegExp('^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$')
if( VALID_EMAIL_REGEX.test(email) ) { ... }
Usuwanie slash’y, query string, wszystkie małe litery
const path = req.url.replace(/\/?(?:\?.*)?$/, '').toLowerCase()
W filtrowaniu treści – wybieramy z listy opcję – wybrane ID, nazwy przekazujemy jako parametery query string. Pozwala to na filtrowanie po wielu parametrach niezależnie.
let url = new URL(location.href); let onChangePostion = function(){ url.searchParams.delete('page'); // 1 strona var position_name = $(this).find(':selected').text().trim(); // Nazwa var position_id = $(this).val(); // id if(position_id) { url.searchParams.set('position_id', position_id); } else { url.searchParams.delete('position_id'); } location.href = url.toString(); return false; }; $("#filter-position").on('change', onChangePostion);
Czytaj dalej Przełączanie URL – query string – filtrowanie po wielu parametrach
Konwertuje wielkość pliku w bajtach na wielokrotność i dodaje przyrostek
let nBytes = 3838383838388394994; // wielkość w bajtach let sOutput = ""; const aMultiples = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; for (nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) { sOutput = nApprox.toFixed(3) + " " + aMultiples[nMultiple] + " (" + nBytes + " bytes)"; }
Obrazki można pobrać i przesłać dalej lub przetworzyć np. wyświetlić ikonkę
FormData() – zestaw par key/value – typ danych może być file, blog lub string.
Obsługa przeciągnij i upuść
https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications
Przelicza bajty na wielokrotności
let nBytes = 22323848499494949494; let sOutput = nBytes + " bytes"; const aMultiples = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; for (nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) { sOutput = nApprox.toFixed(3) + " " + aMultiples[nMultiple] + " (" + nBytes + " bytes)"; }
Szyfrowanie z poziomu Javascript
Obrazki wstawiane są z względnymi ścieżkami do dokumentów. Jest to problem podczas generowania PDF który pobierze obrazek tylko jeśli src zawiera pełny adres URL. W takim przypadku należy dodać linie:
relative_urls : false,
remove_script_host: false,
convert_urls : true,
pierwsza linia powinna wystarczyć.
To może być problemem w przypadku zmiany domeny (przenoszenia serwisu) – obrazki wciąż będą wskazywały na stary URL.
Realizacja paralaksy za pomocą pluginu JS (rellax.min.js)
Integracja z zapleczem cakephp w celu dołączania obrazków
https://xdsoft.net/jqplugins/datetimepicker/ – pobrać nowe
Wgranie plików na serwer:
/webroot/css/jquery.datetimepicker.css /webroot/lib/jquery.datetimepicker.full.min.js
templates/layout/default.ctp
head <link rel="stylesheet" href="/css/jquery.datetimepicker.css"> footer <?= $this->Html->script('/lib/jquery.datetimepicker.full.min.js') ?>
dołączyć plik inicjalizujący np. common.js
jQuery.datetimepicker.setLocale('pl'); jQuery(".datetimepicker").datetimepicker({ format:'Y-m-d', timepicker:false, mouseWheel: false, dayOfWeekStart : 1, // poniedziałek scrollMonth : false, // nie przewija myszą miesięcy scrollInput : false, // nie przewija nic i18n:{ pl:{ months:[ 'Styczeń','Luty','Marzec','wiecień', 'Maj','Czerwiec','Lipiec','Sierpień', 'Wrzesień','Październik','Listopad','Grudzień', ], dayOfWeek:[ "Nie", "Pon", "Wto", "Śr", "Czw", "Pt", "Sob", ] } } });
Użycie w szablonie:
<?= $this->Form->text('purchase_date', [ 'class' => 'form-control w-25 datetimepicker', 'default' => (new \DateTime())->format('Y-m-d') ]) ?>
<!DOCTYPE html>
<html>
<head>
<script src="https://cloud.tinymce.com/stable/tinymce.min.js"></script>
<script>tinymce.init({ selector:'textarea' });</script>
</head>
<body>
<textarea>Pole edytora</textarea>
</body>
</html>
<html>
<head>
<link rel="stylesheet" href="/css/flipclock.css">
</head>
<body>
<div class="your-clock"></div>
<script src="/js/libs/jquery.js"></script>
<script src="/js/flipclock/flipclock.min.js"></script>
</body>
</html>
var clock = $('.your-clock').FlipClock({
// ... your options here
});
https://github.com/servocoder/RichFilemanager/wiki/Configuration-options
Instalacja projektu w katalogu filemanager
# composer create-project --prefer-dist servocoder/richfilemanager filemanager
# chown -R www-data.www-data filemanager/userdata
– ustawienie virtualnego serwera np. https://mymanager.pl
– dostęp poprzez podany URL
Zmiana userfiles na media
# nano filemanager/connectors/php/filemanager.php $local->setRoot('media', true, true);
Dostęp do pliku
https://mymanager.pl/media/dir/file.png
Plik konfiguracyjny tinyMce