Debouncing – opóźnienie wykonania funkcji

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() ); });

JS – DATE

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);    // 1686268800000 
const end_tz   = Date.parse(end_date);      // 1686182400000

if(end_tz < start_tz) {
   alert('Błędna data zakończenia. Popraw !!!');
   $('#end-date').val('');
}

Przełączanie URL – query string – filtrowanie po wielu parametrach

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

Przyrostki rozmiaru pliku

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)";
}

JS – konwersja B na KB, MB, GB, TB,…

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)";
}

tinymce – pełne URL obrazków

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.

datetimepicker

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')
]) ?>

więcej opcji w tabeli

reachFileManager plugin

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