Appearance
JS API (public/main.js)
Файл: public/main.js
Огляд
Файл містить ініціалізації та допоміжні функції для фронтенд-частини пакету: ініціалізація tooltip, select2, datetimepicker, treeview, select2-tree, colorpicker, modal-ajax, sortable, LFM/EditorJS інтеграції та інші.
Публічні ініціалізації (функції доступні на глобальному window):
initJsVerificationSlugField()— ініціалізація перевірки slug поля (зробити input editable при чекбоксі)initColorpicker()— ініціалізація colorpicker (підтримує autosave через data-url-save)initSortableY()— ініціалізація jQuery UI sortable по вертикаліinitSelect2()— ініціалізація Select2 з опціями autosave, tags, ajax suggest/tagsinitCheckbox()— ініціалізація AJAX-збереження чекбоксів (.f-checkbox-ajax)initSelect2Tree()— ініціалізація Select2Tree (отримує дерево по AJAX)initTreeview()— ініціалізація bootstrap-treeviewinitInputCalc()— обробка полів калькулятора (обчислення виразу на Enter/blur)initTooltip()— ініціалізація bootstrap tooltip
Короткі приклади
Select2 autosave:
- Додати
data-url-save="/save-url" data-name="field_name"до елементу.f-select2
- Додати
AJAX send через кнопки з
.js-ajax-send:- data-url, data-method, data-confirm, data-data (може бути JSON)
Залежності
- jQuery
- Bootstrap (tooltip, modal)
- Select2
- jQuery UI (sortable)
- Colorpicker plugin
- MagnificPopup (для попап зображень)
- Toastr (повідомлення)
Edges / Notes
- Функції на глобальному scope викликаються за іменем з
data-fn-initsпісля вставки HTML (наприклад у модальному вікні) - Існують захисні механізми (confirm, CSRF token, обробка помилок)
- Файл містить багато helper-функцій (numberWithSpaces, humanFileSize, generateRandomPassword)
Для повного опису кожної функції рекомендую скопіювати потрібні фрагменти із public/main.js до окремої сторінки компоненту (або додати приклади виклику).
Детальні обробники подій та допоміжні функції
Нижче наведені часто використовувані обробники jQuery / допоміжні функції, визначені в public/main.js, з описом та прикладами використання (багато з них використовуються в examples/components.blade.php).
.js-ajax-send— універсальна кнопка/посилання AJAX
- Селектор: будь-який клікабельний елемент з класом
.js-ajax-send. - Підтримувані атрибути даних:
data-url— URL для запиту (резервний варіант: атрибут href)data-method— HTTP метод (за замовчуваннямPOST)data-confirm— текст підтвердження, що відображається черезconfirm()перед виконанням діїdata-submit— якщо true, створить і надішле форму замість виконання AJAXdata-data— JSON або об'єкт з даними для AJAX або відправки формиdata-csrf— значення користувацького токена CSRF (резервне копіювання до meta[name="csrf-token"])data-toggle="tooltip"— підказка буде прихована перед виконанням діїdata-fn-inits— імена функцій ініціалізації JS, розділені комами, які потрібно викликати після завершення AJAX
Поведение:
- Якщо
data-submitдорівнює true → обробник створює форму (додає приховані поля, _method якщо потрібно, токен CSRF) і надсилає сторінку (корисно для не-AJAX видалення/перенаправлення). - В іншому випадку виконує
$.ajaxзurl,method,data. - У разі успіху:
- Показує повідомлення
toastr, якщо існуєresponse.message. - Вставляє
response.htmlна сторінку (підтримує відображення об'єктів селекторів -> html або рядкове вставлення в найближчий.js-html-container). - Виконує дії на основі
response.action(reload,redirect,remove). - Викликає необов'язкові глобальні зворотні виклики
window.onAjaxSuccess(response, $btn)таwindow.onHtmlUpdated(response.html).
- Показує повідомлення
- Після завершення: знову активує кнопку та виконує функції з
data-fn-inits(якщо присутні).
Приклад використання (з прикладів):
blade
<a href="{{ route('lte3.data.save') }}" class="btn btn-danger js-ajax-send" data-confirm="Delete?">Delete</a>
<a class="dropdown-item js-ajax-send" data-method="delete" data-confirm="Remove?" href="{{ route('lte3.data.save') }}">Remove</a>js-ajax-send — приклади використання і очікувані відповіді
Нижче наведені практичні приклади використання .js-ajax-send (нативні приклади із examples/components.blade.php) і приклади JSON-відповідей, які підтримує фронтенд.
- Просте видалення (AJAX)
Blade (посилання в списку/кнопка):
blade
<a href="{{ route('lte3.data.save') }}" class="dropdown-item js-ajax-send" data-method="delete" data-confirm="Remove?">Remove</a>Пояснення:
data-method="delete"— HTTP метод.data-confirm— запит підтвердження черезconfirm()перед виконанням.- Якщо бекенд повертає JSON з
action: 'remove'абоselector, JS видалить відповідний DOM-елемент.
Приклад відповіді (успіх):
json
{
"status": "success",
"message": "Item removed",
"action": "remove",
"selector": "#item-123"
}- Відповідь без
selectorпризведе до видалення найближчогоtr/.item/.cardпоруч з кнопкою.
- Використання
data-submit— створити й відправити форму (не AJAX)
Blade (інструментальна кнопка, хочемо POST-перехід):
blade
<a href="/some/endpoint" class="btn js-ajax-send" data-submit="true" data-method="POST" data-data='{"id":123, "force":1}' data-csrf="{{ csrf_token() }}">Submit</a>Пояснення:
- Якщо
data-submit="true"— скрипт динамічно створює<form>з прихованими полями, додає_methodдля PUT/PATCH/DELETE та_tokenпри POST/PUT тощо і виконує submit; це корисно для забезпечення стандартного поведінки форми (редиректів) без AJAX.
- Передача додаткових параметрів через
data-data
Blade:
blade
<a href="/admin/action" class="js-ajax-send" data-data='{"id": 55, "flag": true}' data-method="POST">Action</a>Пояснення:
data-dataможе бути рядком JSON або JS-обʼєктом (якщо елемент створювався скриптом). Скріпт намагається парсити рядок, якщо починається з{.
- Оновлення HTML:
response.htmlяк об'єкт або рядок
- Якщо бекенд повертає
response.htmlяк об'єкт, ключі трактуються як селектори (якщо ключ починається з.або#) — скрипт робить$('<selector>').html(value)або.append()якщоresponse.htmlAppendsмістить селектор.
Приклад відповіді (обʼєкт):
json
{
"message": "Updated",
"html": {
".items-list": "<li>New item</li>",
"#summary": "<strong>Summary updated</strong>"
},
"htmlAppends": [".items-list"]
}- Якщо
response.html— рядок, то JS шукає найближчий контейнер з селектором.js-html-containerпоруч з кнопкою і замінює або додає вміст.
- Використання
data-fn-initsдля повторної ініціалізації
Blade:
blade
<a href="/some/ajax" class="js-ajax-send" data-fn-inits="initSelect2,initColorpicker">Load</a>Пояснення:
- Після
completeобробник викликає вказані глобальні функції, якщо вони існують. Це зручно, щоб перезапустити Select2, colorpickers, tooltips тощо після вставки HTML.
- Дії на основі
response.action
Підтримувані action в JS:
reload— перезавантажити сторінку (з невеликою затримкою)redirect— виконатиwindow.location.href = response.redirect_url(якщо задано)remove— видалитиresponse.selectorабо найближчий.item, tr, .card
Приклад:
json
{ "action": "redirect", "redirect_url": "/admin/list" }- CSRF, _method і захист
- Якщо виконується відправка форми (
data-submit) — скрипт додає_methodдля методів PUT/PATCH/DELETE і_tokenзdata-csrfабоmeta[name="csrf-token"]для автентифікації Laravel. - Для AJAX викликів ви можете також передати
X-CSRF-TOKENв заголовку на боці сервера або включити токен уdata-data.
- Повідомлення та помилки
- При успіху JS показує
toastr[response.type || 'success'](response.message). - При помилці AJAX показує
toastr.error()з повідомленням зxhr.responseJSON.message.
- Приклад повного потоку: кнопка + бекенд
Blade (кнопка видалення рядка):
blade
<a href="{{ route('items.delete', $item->id) }}" class="btn btn-danger js-ajax-send"
data-method="delete"
data-confirm="Delete item?"
data-fn-inits="initSortableY,initSelect2"
data-data='{"keep_logs":1}'>Delete</a>Server (Laravel controller) — приклад повернення JSON:
php
return response()->json([
'status' => 'success',
'message' => 'Item deleted',
'action' => 'remove',
'selector' => '#item-'. $id
]);- Кастомні callback'и
- Ви можете визначити
window.onAjaxSuccess = function(response, $btn) { /* custom */ }щоб централізовано опрацьовувати додаткову логіку при успішному AJAX. - Також
window.onHtmlUpdated(html)викликається, коли HTML був отриманий і вставлений — зручно для логування/статистики або додаткових ініціалізацій.
Коротке резюме рекомендацій
- Використовуйте
data-confirmдля важливих дій (видалення). - Передавайте додаткові дані через
data-dataяк JSON; перевіряйте коректність JSON. - Якщо сервер робить редирект — поверніть
action: 'redirect'зredirect_url. - Для оновлень DOM повертайте
response.htmlяк об'єкт селектор->html або рядок для вставки у.js-html-container. - Використовуйте
data-fn-initsдля забезпечення повторної ініціалізації віджетів після вставки HTML.
Other useful helpers (not specific to fields)
This section documents additional generic utilities and UI helpers defined in public/main.js that are handy across the admin UI.
lteAlert(status, msg)— unified toast helper
- Usage: call from other scripts to show a toastr notification.
statusis e.g.success,info,warning,error.
Example:
js
lteAlert('success', 'Saved successfully');- Number & size formatters
numberWithSpaces(x)— formats integer/float with thousands separators (space): 10000 -> "10 000".humanFileSize(bytes, si = false, dp = 1)— human-readable file sizes (supports SI and binary units): 2048 -> "2.0 KiB".
Examples:
js
$('.js-num-format').each(function(){
this.textContent = numberWithSpaces(parseFloat(this.textContent));
});
console.log(humanFileSize(3456789)); // "3.3 MiB" (by default binary units)- Sidebar & active-links helpers
setSidebarActiveable($nav, $item)andsetActiveableUrl($wrap, $item, tag, activeClass)are used to mark sidebar/menu items as active based on current URL ordata-patregex on links.- You don't normally call these manually — they run on page load for elements with
.nav-sidebar.js-activeableor.js-activeable-url.
toggleSelectableBlocks(value, map)— show/hide blocks by map
- Used by
select2andradiogroupto show dependent blocks.mapis an object { value => [selectors] }. - Example usage is documented in the
select2/radiogrouppages (seemapsection).
initTooltip()— initialize Bootstrap tooltips
- Called on load and after HTML updates. To mark element use
data-toggle="tooltip".
- Sortables
initSortableY()— initializes vertical jQuery UI sortable lists for.sortable-yelements. If the wrapper hasdata-url, the updated order will be POSTed as{data: order}to the server.sortableNested— used for nested sortable trees (.js-sortable-nested) and supportsonDropwhere the plugin serializes the nested order and optionally POSTs it todata-url.
Example: a table body with class="sortable-y" data-url="/save/order" will send new order after drag.
- Preloader
#table-preloaderoverlay is hidden during bootstrap by$('#table-preloader').fadeOut(250); components can show/hide their own.overlayelements while AJAX is running.
- Blurred/secret text toggles
.js-blur-texttoggles a temporary reveal of sensitive text (removes.revealedafter 10s)..js-secret-value-btntoggles an input betweenpasswordand originaldata-origin-type. Use in input groups to reveal/hide secret values.
- File & Media helpers
- File delete in lists:
.f-file .f-file-item .js-btn-deleteor.f-media-file .f-file-item .js-btn-delete— marks file as deleted by setting a hidden input.js-input-deleteand hides the row. - File selection info:
.js-files-inputchange handler writes file names & sizes (throughhumanFileSize) into.js-files-info. - LFM helpers:
.f-lfmhas handlers to clear, delete, and add new LFM fields. UseLte3::lfmFile()/Lte3::lfmImage()to render appropriate markup; the JS connects.f-lfmbuttons to filemanager.
- Dynamic multi-block handlers
.f-multyblocks+ template.f-item-templatepattern:- Template contains field names with
$iplaceholder; the JS clones and replaces$iwith current index, fixes ids anddata-field-name, and re-initializes any embedded widgets by calling functions fromdata-fn-initson the wrapper.
- Template contains field names with
- Buttons:
.js-btn-addand.js-btn-deleteinside.f-multyblockscontrol items adding/removing.
Example template snippet (Blade):
blade
<template class="f-item-template">
{!! Lte3::text('block[items][$i][question]', null, ['label' => 'Question']) !!}
</template>- Input calculator
- Class
.js-input-calcallows entering simple math expressions (e.g.,2+2*3). On blur or Enter the expression is evaluated usingeval()and the result is set back into the input. The input is sanitized to allow digits/operators only.
Caveat: eval() is used — ensure inputs are trusted or sanitized in your application context.
- Password generator helpers
generateRandomPassword(length, complexity)andgetRandomLength(min,max)with button.js-passgenfill found input with a generated password. Usedata-length-from,data-length-to,data-complexity,data-input-recipientto configure.
- Table options & column reordering
- The script reads
.js-options-columnsanddata-optionsto reorder<th>and corresponding<td>cells according toweightandactiveflags saved in options, hiding inactive columns. - Use
Lte3::tableOptions()to render the modal and the options structure (see docs/fields/tableOptions.md).
- Global callbacks hooks
window.onAjaxSuccess(response, $btn)— optional, called after successful.js-ajax-sendresponse.window.onHtmlUpdated(html)— optional, called after HTML was inserted (useful to re-run custom initialization).
Where to find code
- Implementation lives in
vendor/fomvasss/laravel-lte3/public/main.js— open it to view exact behavior or to extend it.
Testing & usage tips
- For dynamic content inserted by
.js-ajax-send, always returnresponse.htmland/or usedata-fn-initsto reinitialize widgets like Select2 and tooltips. - For file upload flows, verify
js-form-submit-file-changedis present on the form so uploading auto-submits. - When using
.js-input-calc, validate/sanitize values on server side as well.