feat: add compiled application javascript

This commit is contained in:
2026-05-21 16:06:07 +07:00
parent 13bfb5f32f
commit 4732492d15
38 changed files with 881 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
$(document).ready(function() {
/**
* Global AJAX Form Handler
* Intercepts forms with class .ajax-form and handles them via AJAX.
*/
$(document).on('submit', 'form.ajax-form', function(e) {
e.preventDefault();
const $form = $(this);
const $submitBtn = $form.find('button[type="submit"]');
const originalBtnHtml = $submitBtn.html();
const actionUrl = $form.attr('action');
const method = $form.attr('method') || 'POST';
// CKEditor 5 Sync
$form.find('textarea').each(function() {
if (this.ckeditorInstance) {
this.ckeditorInstance.updateSourceElement();
}
});
// 1. Loading state
$submitBtn.prop('disabled', true).html('<span class="spinner-border spinner-border-sm me-2"></span> ' + ( $submitBtn.data('loading-text') || 'Saving...' ));
// 2. Perform Request
const formData = new FormData(this);
// Allow page-specific code to modify formData before sending
// (e.g. appending FilePond files)
$form.trigger('ajaxForm:beforeSend', [formData]);
$.ajax({
url: actionUrl,
method: method,
data: formData,
processData: false,
contentType: false,
dataType: 'json',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
// Notif (Allow skipping global alert)
if ($form.data('alert') !== false) {
const swalInstance = window.StandardSwal || Swal;
swalInstance.fire({
icon: 'success',
title: 'Success!',
text: response.message || 'Data saved successfully.',
timer: 1500,
showConfirmButton: false
});
}
// 3. UI Updates
// Close active modal if exists
const $modal = $form.closest('.modal');
if ($modal.length) {
const modalInstance = bootstrap.Modal.getInstance($modal[0]);
if (modalInstance) {
modalInstance.hide();
} else {
// Fallback jQuery hide if instance not found
$($modal[0]).modal('hide');
}
// Robust Cleanup: Ensure backdrop is removed and scrolling is restored
// This fixes the common Bootstrap bug where backdrop stays stuck
setTimeout(() => {
$('.modal-backdrop').remove();
$('body').removeClass('modal-open').css({
'overflow': '',
'padding-right': ''
});
}, 400);
}
// Refresh DataTable if window.reloadDataTable is defined
if (typeof window.reloadDataTable === 'function') {
window.reloadDataTable();
}
// Reset form if it's not an update form (optional based on data-reset attribute)
if ($form.data('reset') !== false && !$form.find('input[name="_method"][value="PUT"]').length) {
$form[0].reset();
// Reset Choices.js if present
$form.find('select').each(function() {
if (this.choices) this.choices.setChoiceByValue('');
});
}
// Trigger custom event for specific page logic
$form.trigger('ajaxForm:success', [response]);
},
error: function(xhr) {
let errorMsg = 'Something went wrong.';
if (xhr.status === 422) {
const errors = xhr.responseJSON.errors;
errorMsg = '<ul class="text-start mb-0">';
Object.values(errors).flat().forEach(err => {
errorMsg += `<li>${err}</li>`;
});
errorMsg += '</ul>';
} else if (xhr.responseJSON && xhr.responseJSON.message) {
errorMsg = xhr.responseJSON.message;
}
if ($form.data('alert') !== false) {
const swalInstance = window.StandardSwal || Swal;
swalInstance.fire({
icon: 'error',
title: 'Validation Error',
html: errorMsg,
confirmButtonText: 'Understood'
});
}
$form.trigger('ajaxForm:error', [xhr]);
},
complete: function() {
// Restore button
$submitBtn.prop('disabled', false).html(originalBtnHtml);
}
});
});
});
File diff suppressed because one or more lines are too long
+571
View File
@@ -0,0 +1,571 @@
/*!
* Bootstrap v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
/*!
Copyright (c) 2016 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
* @kurkle/color v0.3.4
* https://github.com/kurkle/color#readme
* (c) 2024 Jukka Kurkela
* Released under the MIT License
*/
/*!
* Chart.js v4.4.8
* https://www.chartjs.org
* (c) 2025 Chart.js Contributors
* Released under the MIT License
*/
/*!
* froala_editor v4.5.0 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2025 Froala Labs
*/
/*!
* jQuery JavaScript Library v3.7.1
* https://jquery.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2023-08-28T13:37Z
*/
/*!
* jQuery SmartWizard v6.0.6
* The awesome step wizard plugin for jQuery
* http://www.techlaboratory.net/jquery-smartwizard
*
* Created by Dipu Raj (http://dipu.me)
*
* Licensed under the terms of the MIT License
* https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE
*/
/*! ../../internals/path */
/*! ../../modules/es.array.from */
/*! ../../modules/es.string.iterator */
/*! ../dist/icons.json */
/*! ../internals/a-function */
/*! ../internals/an-object */
/*! ../internals/array-from */
/*! ../internals/array-includes */
/*! ../internals/bind-context */
/*! ../internals/call-with-safe-iteration-closing */
/*! ../internals/check-correctness-of-iteration */
/*! ../internals/classof */
/*! ../internals/classof-raw */
/*! ../internals/copy-constructor-properties */
/*! ../internals/correct-prototype-getter */
/*! ../internals/create-iterator-constructor */
/*! ../internals/create-property */
/*! ../internals/create-property-descriptor */
/*! ../internals/define-iterator */
/*! ../internals/descriptors */
/*! ../internals/document-create-element */
/*! ../internals/enum-bug-keys */
/*! ../internals/export */
/*! ../internals/fails */
/*! ../internals/function-to-string */
/*! ../internals/get-iterator-method */
/*! ../internals/global */
/*! ../internals/has */
/*! ../internals/hidden-keys */
/*! ../internals/hide */
/*! ../internals/html */
/*! ../internals/ie8-dom-define */
/*! ../internals/indexed-object */
/*! ../internals/internal-state */
/*! ../internals/is-array-iterator-method */
/*! ../internals/is-forced */
/*! ../internals/is-object */
/*! ../internals/is-pure */
/*! ../internals/iterators */
/*! ../internals/iterators-core */
/*! ../internals/native-symbol */
/*! ../internals/native-weak-map */
/*! ../internals/object-create */
/*! ../internals/object-define-properties */
/*! ../internals/object-define-property */
/*! ../internals/object-get-own-property-descriptor */
/*! ../internals/object-get-own-property-names */
/*! ../internals/object-get-own-property-symbols */
/*! ../internals/object-get-prototype-of */
/*! ../internals/object-keys */
/*! ../internals/object-keys-internal */
/*! ../internals/object-property-is-enumerable */
/*! ../internals/object-set-prototype-of */
/*! ../internals/own-keys */
/*! ../internals/redefine */
/*! ../internals/require-object-coercible */
/*! ../internals/set-global */
/*! ../internals/set-to-string-tag */
/*! ../internals/shared */
/*! ../internals/shared-key */
/*! ../internals/string-at */
/*! ../internals/to-absolute-index */
/*! ../internals/to-indexed-object */
/*! ../internals/to-integer */
/*! ../internals/to-length */
/*! ../internals/to-object */
/*! ../internals/to-primitive */
/*! ../internals/uid */
/*! ../internals/validate-set-prototype-of-arguments */
/*! ../internals/well-known-symbol */
/*! ./../../webpack/buildin/global.js */
/*! ./default-attrs.json */
/*! ./icon */
/*! ./icons */
/*! ./replace */
/*! ./tags.json */
/*! ./to-svg */
/*! /home/runner/work/feather/feather/src/index.js */
/*! Responsive 3.0.4
* © SpryMedia Ltd - datatables.net/license
*/
/*! choices.js v11.1.0 | © 2025 Josh Johnson | https://github.com/jshjohnson/Choices#readme */
/*! classnames/dedupe */
/*! core-js/es/array/from */
/*! exports provided: activity, airplay, alert-circle, alert-octagon, alert-triangle, align-center, align-justify, align-left, align-right, anchor, aperture, archive, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, award, bar-chart-2, bar-chart, battery-charging, battery, bell-off, bell, bluetooth, bold, book-open, book, bookmark, box, briefcase, calendar, camera-off, camera, cast, check-circle, check-square, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, chrome, circle, clipboard, clock, cloud-drizzle, cloud-lightning, cloud-off, cloud-rain, cloud-snow, cloud, code, codepen, codesandbox, coffee, columns, command, compass, copy, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, cpu, credit-card, crop, crosshair, database, delete, disc, divide-circle, divide-square, divide, dollar-sign, download-cloud, download, dribbble, droplet, edit-2, edit-3, edit, external-link, eye-off, eye, facebook, fast-forward, feather, figma, file-minus, file-plus, file-text, file, film, filter, flag, folder-minus, folder-plus, folder, framer, frown, gift, git-branch, git-commit, git-merge, git-pull-request, github, gitlab, globe, grid, hard-drive, hash, headphones, heart, help-circle, hexagon, home, image, inbox, info, instagram, italic, key, layers, layout, life-buoy, link-2, link, linkedin, list, loader, lock, log-in, log-out, mail, map-pin, map, maximize-2, maximize, meh, menu, message-circle, message-square, mic-off, mic, minimize-2, minimize, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, mouse-pointer, move, music, navigation-2, navigation, octagon, package, paperclip, pause-circle, pause, pen-tool, percent, phone-call, phone-forwarded, phone-incoming, phone-missed, phone-off, phone-outgoing, phone, pie-chart, play-circle, play, plus-circle, plus-square, plus, pocket, power, printer, radio, refresh-ccw, refresh-cw, repeat, rewind, rotate-ccw, rotate-cw, rss, save, scissors, search, send, server, settings, share-2, share, shield-off, shield, shopping-bag, shopping-cart, shuffle, sidebar, skip-back, skip-forward, slack, slash, sliders, smartphone, smile, speaker, square, star, stop-circle, sun, sunrise, sunset, table, tablet, tag, target, terminal, thermometer, thumbs-down, thumbs-up, toggle-left, toggle-right, tool, trash-2, trash, trello, trending-down, trending-up, triangle, truck, tv, twitch, twitter, type, umbrella, underline, unlock, upload-cloud, upload, user-check, user-minus, user-plus, user-x, user, users, video-off, video, voicemail, volume-1, volume-2, volume-x, volume, watch, wifi-off, wifi, wind, x-circle, x-octagon, x-square, x, youtube, zap-off, zap, zoom-in, zoom-out, default */
/*! exports provided: activity, airplay, alert-circle, alert-octagon, alert-triangle, align-center, align-justify, align-left, align-right, anchor, archive, at-sign, award, aperture, bar-chart, bar-chart-2, battery, battery-charging, bell, bell-off, bluetooth, book-open, book, bookmark, box, briefcase, calendar, camera, cast, chevron-down, chevron-up, circle, clipboard, clock, cloud-drizzle, cloud-lightning, cloud-rain, cloud-snow, cloud, codepen, codesandbox, code, coffee, columns, command, compass, copy, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, cpu, credit-card, crop, crosshair, database, delete, disc, dollar-sign, droplet, edit, edit-2, edit-3, eye, eye-off, external-link, facebook, fast-forward, figma, file-minus, file-plus, file-text, film, filter, flag, folder-minus, folder-plus, folder, framer, frown, gift, git-branch, git-commit, git-merge, git-pull-request, github, gitlab, globe, hard-drive, hash, headphones, heart, help-circle, hexagon, home, image, inbox, instagram, key, layers, layout, life-buoy, link, link-2, linkedin, list, lock, log-in, log-out, mail, map-pin, map, maximize, maximize-2, meh, menu, message-circle, message-square, mic-off, mic, minimize, minimize-2, minus, monitor, moon, more-horizontal, more-vertical, mouse-pointer, move, music, navigation, navigation-2, octagon, package, paperclip, pause, pause-circle, pen-tool, percent, phone-call, phone-forwarded, phone-incoming, phone-missed, phone-off, phone-outgoing, phone, play, pie-chart, play-circle, plus, plus-circle, plus-square, pocket, power, printer, radio, refresh-cw, refresh-ccw, repeat, rewind, rotate-ccw, rotate-cw, rss, save, scissors, search, send, settings, share-2, shield, shield-off, shopping-bag, shopping-cart, shuffle, skip-back, skip-forward, slack, slash, sliders, smartphone, smile, speaker, star, stop-circle, sun, sunrise, sunset, tablet, tag, target, terminal, thermometer, thumbs-down, thumbs-up, toggle-left, toggle-right, tool, trash, trash-2, triangle, truck, tv, twitch, twitter, type, umbrella, unlock, user-check, user-minus, user-plus, user-x, user, users, video-off, video, voicemail, volume, volume-1, volume-2, volume-x, watch, wifi-off, wifi, wind, x-circle, x-octagon, x-square, x, youtube, zap-off, zap, zoom-in, zoom-out, default */
/*! exports provided: xmlns, width, height, viewBox, fill, stroke, stroke-width, stroke-linecap, stroke-linejoin, default */
/*! lozad.js - v1.16.0 - 2020-09-06
* https://github.com/ApoorvSaxena/lozad.js
* Copyright (c) 2020 Apoorv Saxena; Licensed MIT */
/*! main.js | Adminuiux 2025 */
/*! no static exports found */
/*! responsive.js | Adminuiux 2025 */
/*!*********************!*\
!*** ./src/icon.js ***!
\*********************/
/*!**********************!*\
!*** ./src/icons.js ***!
\**********************/
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*!***********************!*\
!*** ./src/tags.json ***!
\***********************/
/*!***********************!*\
!*** ./src/to-svg.js ***!
\***********************/
/*!************************!*\
!*** ./src/replace.js ***!
\************************/
/*!*************************!*\
!*** ./dist/icons.json ***!
\*************************/
/*!********************************!*\
!*** ./src/default-attrs.json ***!
\********************************/
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*!*******************************************!*\
!*** ./node_modules/classnames/dedupe.js ***!
\*******************************************/
/*!***********************************************!*\
!*** ./node_modules/core-js/es/array/from.js ***!
\***********************************************/
/*!***********************************************!*\
!*** ./node_modules/core-js/internals/has.js ***!
\***********************************************/
/*!***********************************************!*\
!*** ./node_modules/core-js/internals/uid.js ***!
\***********************************************/
/*!************************************************!*\
!*** ./node_modules/core-js/internals/hide.js ***!
\************************************************/
/*!************************************************!*\
!*** ./node_modules/core-js/internals/html.js ***!
\************************************************/
/*!************************************************!*\
!*** ./node_modules/core-js/internals/path.js ***!
\************************************************/
/*!*************************************************!*\
!*** ./node_modules/core-js/internals/fails.js ***!
\*************************************************/
/*!**************************************************!*\
!*** ./node_modules/core-js/internals/export.js ***!
\**************************************************/
/*!**************************************************!*\
!*** ./node_modules/core-js/internals/global.js ***!
\**************************************************/
/*!**************************************************!*\
!*** ./node_modules/core-js/internals/shared.js ***!
\**************************************************/
/*!**************************************************!*\
!*** multi core-js/es/array/from ./src/index.js ***!
\**************************************************/
/*!***************************************************!*\
!*** ./node_modules/core-js/internals/classof.js ***!
\***************************************************/
/*!***************************************************!*\
!*** ./node_modules/core-js/internals/is-pure.js ***!
\***************************************************/
/*!****************************************************!*\
!*** ./node_modules/core-js/internals/own-keys.js ***!
\****************************************************/
/*!****************************************************!*\
!*** ./node_modules/core-js/internals/redefine.js ***!
\****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/an-object.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/is-forced.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/is-object.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/iterators.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/string-at.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/to-length.js ***!
\*****************************************************/
/*!*****************************************************!*\
!*** ./node_modules/core-js/internals/to-object.js ***!
\*****************************************************/
/*!******************************************************!*\
!*** ./node_modules/core-js/internals/a-function.js ***!
\******************************************************/
/*!******************************************************!*\
!*** ./node_modules/core-js/internals/array-from.js ***!
\******************************************************/
/*!******************************************************!*\
!*** ./node_modules/core-js/internals/set-global.js ***!
\******************************************************/
/*!******************************************************!*\
!*** ./node_modules/core-js/internals/shared-key.js ***!
\******************************************************/
/*!******************************************************!*\
!*** ./node_modules/core-js/internals/to-integer.js ***!
\******************************************************/
/*!*******************************************************!*\
!*** ./node_modules/core-js/internals/classof-raw.js ***!
\*******************************************************/
/*!*******************************************************!*\
!*** ./node_modules/core-js/internals/descriptors.js ***!
\*******************************************************/
/*!*******************************************************!*\
!*** ./node_modules/core-js/internals/hidden-keys.js ***!
\*******************************************************/
/*!*******************************************************!*\
!*** ./node_modules/core-js/internals/object-keys.js ***!
\*******************************************************/
/*!*******************************************************!*\
!*** ./node_modules/core-js/modules/es.array.from.js ***!
\*******************************************************/
/*!********************************************************!*\
!*** ./node_modules/core-js/internals/bind-context.js ***!
\********************************************************/
/*!********************************************************!*\
!*** ./node_modules/core-js/internals/to-primitive.js ***!
\********************************************************/
/*!*********************************************************!*\
!*** ./node_modules/core-js/internals/enum-bug-keys.js ***!
\*********************************************************/
/*!*********************************************************!*\
!*** ./node_modules/core-js/internals/native-symbol.js ***!
\*********************************************************/
/*!*********************************************************!*\
!*** ./node_modules/core-js/internals/object-create.js ***!
\*********************************************************/
/*!**********************************************************!*\
!*** ./node_modules/core-js/internals/array-includes.js ***!
\**********************************************************/
/*!**********************************************************!*\
!*** ./node_modules/core-js/internals/ie8-dom-define.js ***!
\**********************************************************/
/*!**********************************************************!*\
!*** ./node_modules/core-js/internals/indexed-object.js ***!
\**********************************************************/
/*!**********************************************************!*\
!*** ./node_modules/core-js/internals/internal-state.js ***!
\**********************************************************/
/*!**********************************************************!*\
!*** ./node_modules/core-js/internals/iterators-core.js ***!
\**********************************************************/
/*!***********************************************************!*\
!*** ./node_modules/core-js/internals/create-property.js ***!
\***********************************************************/
/*!***********************************************************!*\
!*** ./node_modules/core-js/internals/define-iterator.js ***!
\***********************************************************/
/*!***********************************************************!*\
!*** ./node_modules/core-js/internals/native-weak-map.js ***!
\***********************************************************/
/*!************************************************************!*\
!*** ./node_modules/core-js/modules/es.string.iterator.js ***!
\************************************************************/
/*!*************************************************************!*\
!*** ./node_modules/core-js/internals/set-to-string-tag.js ***!
\*************************************************************/
/*!*************************************************************!*\
!*** ./node_modules/core-js/internals/to-absolute-index.js ***!
\*************************************************************/
/*!*************************************************************!*\
!*** ./node_modules/core-js/internals/to-indexed-object.js ***!
\*************************************************************/
/*!*************************************************************!*\
!*** ./node_modules/core-js/internals/well-known-symbol.js ***!
\*************************************************************/
/*!**************************************************************!*\
!*** ./node_modules/core-js/internals/function-to-string.js ***!
\**************************************************************/
/*!***************************************************************!*\
!*** ./node_modules/core-js/internals/get-iterator-method.js ***!
\***************************************************************/
/*!****************************************************************!*\
!*** ./node_modules/core-js/internals/object-keys-internal.js ***!
\****************************************************************/
/*!******************************************************************!*\
!*** ./node_modules/core-js/internals/object-define-property.js ***!
\******************************************************************/
/*!*******************************************************************!*\
!*** ./node_modules/core-js/internals/document-create-element.js ***!
\*******************************************************************/
/*!*******************************************************************!*\
!*** ./node_modules/core-js/internals/object-get-prototype-of.js ***!
\*******************************************************************/
/*!*******************************************************************!*\
!*** ./node_modules/core-js/internals/object-set-prototype-of.js ***!
\*******************************************************************/
/*!********************************************************************!*\
!*** ./node_modules/core-js/internals/correct-prototype-getter.js ***!
\********************************************************************/
/*!********************************************************************!*\
!*** ./node_modules/core-js/internals/is-array-iterator-method.js ***!
\********************************************************************/
/*!********************************************************************!*\
!*** ./node_modules/core-js/internals/object-define-properties.js ***!
\********************************************************************/
/*!********************************************************************!*\
!*** ./node_modules/core-js/internals/require-object-coercible.js ***!
\********************************************************************/
/*!**********************************************************************!*\
!*** ./node_modules/core-js/internals/create-property-descriptor.js ***!
\**********************************************************************/
/*!***********************************************************************!*\
!*** ./node_modules/core-js/internals/copy-constructor-properties.js ***!
\***********************************************************************/
/*!***********************************************************************!*\
!*** ./node_modules/core-js/internals/create-iterator-constructor.js ***!
\***********************************************************************/
/*!*************************************************************************!*\
!*** ./node_modules/core-js/internals/object-get-own-property-names.js ***!
\*************************************************************************/
/*!*************************************************************************!*\
!*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***!
\*************************************************************************/
/*!**************************************************************************!*\
!*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***!
\**************************************************************************/
/*!***************************************************************************!*\
!*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***!
\***************************************************************************/
/*!****************************************************************************!*\
!*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
\****************************************************************************/
/*!******************************************************************************!*\
!*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***!
\******************************************************************************/
/*!*******************************************************************************!*\
!*** ./node_modules/core-js/internals/validate-set-prototype-of-arguments.js ***!
\*******************************************************************************/
/**
* @version: 3.1
* @author: Dan Grossman http://www.dangrossman.info/
* @copyright: Copyright (c) 2012-2019 Dan Grossman. All rights reserved.
* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php
* @website: http://www.daterangepicker.com/
*/
//! moment.js
//! moment.js locale configuration
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
/*! For license information please see component-carousel.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){swipernav()}));
@@ -0,0 +1 @@
/*! component-carousel.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-chartjs.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){window.randomScalingFactor=function(){return Math.round(20*Math.random())};var a=document.getElementById("areachartblue1").getContext("2d"),o=a.createLinearGradient(0,0,0,65);o.addColorStop(0,"rgba(1, 94, 194, 0.85)"),o.addColorStop(1,"rgba(0, 197, 221, 0)");var r={type:"bar",data:{labels:["1","2","3","4","5","7","8","9","10","11","12","13","14"],datasets:[{label:"# of Votes",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:o,borderColor:"#015EC2",borderWidth:0,borderRadius:4,fill:!0,tension:.5}]},options:{maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{display:!1}}}},n=(new Chart(a,r),document.getElementById("areachartred1").getContext("2d")),t=n.createLinearGradient(0,0,0,65);t.addColorStop(0,"rgba(240, 61, 79, 0.85)"),t.addColorStop(1,"rgba(255, 223, 220, 0)");var d={type:"bar",data:{labels:["1","2","3","4","5","7","8","9","10","11","12","13","14"],datasets:[{label:"# of Votes",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:t,borderColor:"#f03d4f",borderWidth:0,borderRadius:4,fill:!0,tension:.5}]},options:{maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{display:!1}}}},c=(new Chart(n,d),document.getElementById("areachartgreen1").getContext("2d")),e=c.createLinearGradient(0,0,0,65);e.addColorStop(0,"rgba(145, 195, 0, 0.85)"),e.addColorStop(1,"rgba(176, 197, 0, 0)");var l={type:"bar",data:{labels:["1","2","3","4","5","7","8","9","10","11","12","13","14"],datasets:[{label:"# of Votes",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:e,borderColor:"#91C300",borderWidth:0,borderRadius:4,fill:!0,tension:.5}]},options:{maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{display:!1}}}},i=(new Chart(c,l),document.getElementById("areachartyellow1").getContext("2d")),g=i.createLinearGradient(0,0,0,65);g.addColorStop(0,"rgba(253, 100, 0, 0.85)"),g.addColorStop(1,"rgba(253, 186, 0, 0)");var m={type:"bar",data:{labels:["1","2","3","4","5","7","8","9","10","11","12","13","14"],datasets:[{label:"# of Votes",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:g,borderColor:"#fdba00",borderWidth:0,borderRadius:4,fill:!0,tension:.5}]},options:{maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{display:!1}}}},s=(new Chart(i,m),document.getElementById("summarychart").getContext("2d")),S=(s.createLinearGradient(0,0,0,120),{type:"line",data:{labels:["10:30","11:00","11:30","12:00","12:30","01:00","01:30"],datasets:[{label:"# of Votes",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#5840ef",borderWidth:2,fill:!0,tension:.5}]},options:{maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{grid:{display:!1},display:!0,beginAtZero:!0}}}}),F=new Chart(s,S);setInterval((function(){S.data.datasets.forEach((function(a){a.data=a.data.map((function(){return randomScalingFactor()}))})),F.update()}),3e3)}));
@@ -0,0 +1 @@
/*! component chartjs.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-dataTable.js.LICENSE.txt */
"use strict";function lastvisibletd(){$(".table tbody tr td").removeClass("lastvisible"),$(".table tbody tr").each((function(){$(this).find("td:visible:last").addClass("lastvisible")}))}document.addEventListener("DOMContentLoaded",(function(){lastvisibletd()})),document.addEventListener("window.resize",(function(){alert(),$("#datatable").DataTable().columns.adjust().draw(),lastvisibletd()}));
@@ -0,0 +1 @@
/*! component-dataTable.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-dragula.js.LICENSE.txt */
document.addEventListener("DOMContentLoaded",(function(){dragula([document.querySelector("#upcomingschedules"),document.querySelector("#ongoingschedules"),document.querySelector("#completedchedules")])}));
@@ -0,0 +1 @@
/*! component-dragula.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-fullcalendar.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){var a=new Date,t=("0"+(a.getMonth()+1)).slice(-2),s=a.getFullYear(),e=("0"+a.getDate()).slice(-2),l=document.getElementById("calendar");new Calendar(l,{plugins:[dayGridPlugin,timeGridPlugin,listPlugin],initialView:"dayGridMonth",height:"auto",headerToolbar:{left:"prev,next today",center:"title",right:"dayGridMonth,timeGridWeek,timeGridDay"},events:[{title:"All Day Event",className:"bg-success-subtle",start:s+"-"+t+"-01",description:"Lecture"},{title:"Long Event",className:"bg-success-subtle",start:s+"-"+t+"-07",end:s+"-"+t+"-10"},{groupId:999,className:"bg-theme-1-space text-white",title:'<span class="position-absolute top-0 end-0 badge bg-success p-1 m-1"><small>Paid</small></span ><p class="mb-0 small fw-medium">16:00 am</p><div class="row gx-2"><div class="col-auto"><img src="https://i.pravatar.cc/150?img=4" class="avatar avatar-20 rounded-circle" alt=""> <img src="https://i.pravatar.cc/300" class="avatar avatar-20 rounded-circle" alt=""></div> <div class="col">Will Johnson</div></div><p class="mb-0 opacity-75 small text-truncated" >High fever and cough</p>',start:s+"-"+t+"-09T16:00:00"},{groupId:999,title:"Repeating Event",className:"bg-cyan-subtle",start:s+"-"+t+"-16T16:00:00"},{title:'<p class="mb-0 small fw-medium">09:00 am - 12:00 pm </p><div class="row gx-2"><div class="col-auto"><i class="bi bi-microsoft-teams"></i></div><div class="col">Evolution of era</div></div><p class="mb-0 opacity-75 small text-truncated" >Conference</p>',className:"bg-yellow-subtle",start:s+"-"+t+"-11",end:s+"-"+t+"-13"},{title:"Meeting",className:"bg-orange-subtle",start:s+"-"+t+"-12T10:30:00",end:s+"-"+t+"-10T12:30:00"},{title:"Lunch",className:"bg-purple-subtle",start:s+"-"+t+"-"+e+"T04:00:00"},{title:'<p class="mb-0 small fw-medium">10:30 am, 2hr</p><div class="row gx-2"><div class="col-auto"><i class="bi bi-buildings"></i></div><div class="col">Evolution of era</div></div><p class="mb-0 opacity-75 small text-truncated" >Meeting</p>',className:"bg-orange-subtle",start:s+"-"+t+"-"+e+"T10:30:00"},{title:"Happy Hour",className:"bg-green-subtle",start:s+"-"+t+"-"+e+"T12:30:00"},{title:'<p class="mb-0 small fw-medium">16:00 am</p><div class="row gx-2"><div class="col-auto"><img src="https://i.pravatar.cc/150?img=6" class="avatar avatar-20 rounded-circle" alt=""> </div> <div class="col">Will Johnson</div></div><p class="mb-0 opacity-75 small text-truncated" >High fever and cough</p>',className:"bg-info-subtle",start:s+"-"+t+"-10T20:00:00"},{title:'<span class="position-absolute top-0 end-0 badge bg-danger p-1 m-1"><small>Unpaid</small></span ><p class="mb-0 small fw-medium">7:00 am</p><div class="row gx-2"><div class="col-auto"><img src="https://i.pravatar.cc/150?img=8" class="avatar avatar-20 rounded-circle" alt=""> </div> <div class="col">Rickie Birthday</div></div><p class="mb-0 opacity-75 small text-truncated" >Birthday Celebration</p>',className:"bg-theme-1-space text-white",start:s+"-"+t+"-"+e+"T07:00:00"},{title:"Click for Google",className:"bg-primary-subtle",url:"http://google.com/",start:s+"-"+t+"-28"}],eventContent:function(a){return{html:a.event.title}}}).render()}));
@@ -0,0 +1 @@
/*! component-fullcalendar.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-inputs.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){checkstrength()}));
@@ -0,0 +1 @@
/*! component-inputs.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-progressbarjs.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){var t;new ProgressBar.Circle(circleprogressblue1,{color:"#015EC2",strokeWidth:10,trailWidth:10,easing:"easeInOut",trailColor:"rgba(66, 157, 255, 0.15)",duration:1400,text:{autoStyleContainer:!1},from:{color:"#015EC2",width:10},to:{color:"#015EC2",width:10},step:function(t,e){e.path.setAttribute("stroke",t.color),e.path.setAttribute("stroke-width",t.width);var o=Math.round(100*e.value());0===o?e.setText(""):e.setText(o+"<small>%<small>")}}).animate(.65),(t=new ProgressBar.Line(containerLine,{strokeWidth:3,easing:"easeInOut",duration:1400,color:"#2196f3",trailColor:"#eee",trailWidth:1,svgStyle:{width:"100%",height:"100%"},text:{style:{color:"#999",position:"absolute",right:"0",top:"30px",padding:0,margin:0,transform:null},autoStyleContainer:!1},from:{color:"#2196f3"},to:{color:"#ffc107"},step:(t,e)=>{e.setText(Math.round(100*e.value())+" %")}})).animate(.85),(t=new ProgressBar.Path("#heart-path",{easing:"easeInOut",duration:1400})).set(0),t.animate(1),(t=new ProgressBar.SemiCircle(halfcircleprogress,{strokeWidth:6,color:"#ffc107",trailColor:"#DDDDDD",trailWidth:4,easing:"easeInOut",duration:1400,svgStyle:null,text:{value:"",alignToBottom:!1},from:{color:"#ffc107"},to:{color:"#4caf50"},step:(t,e)=>{e.path.setAttribute("stroke",t.color);var o=Math.round(100*e.value());0===o?e.setText(""):e.setText(o),e.text.style.color=t.color}})).text.style.fontFamily='"Raleway", Helvetica, sans-serif',t.text.style.fontSize="2rem",t.animate(.85)}));
@@ -0,0 +1 @@
/*! component-progresbarjs.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-rangeslider.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){range2(),range3(),range4()}));
@@ -0,0 +1 @@
/*! component-rangeslider.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-smartwizard.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){$("#smartwizard").smartWizard({toolbar:{extraHtml:'<a class="btn btn-outline-accent float-start" href="#">Skip</a><a class="btn btn-theme finish-btn" style="display:none" href="#">Finish</a>'}}),$("#smartwizard").on("showStep",(function(t,a,n,s,e){"last"===e?$(".finish-btn").show():$(".finish-btn").hide()})),$("#smartwizard2").smartWizard({theme:"dots",toolbar:{extraHtml:'<a class="btn btn-outline-accent float-start" href="mobileux-dashboard.html">Skip</a><a class="btn btn-theme finish-btn" style="display:none" href="mobileux-dashboard.html">Finish</a>'}})}));
@@ -0,0 +1 @@
/*! component-smartwizard.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see component-toasts.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){const t=document.getElementById("liveToast1Btn"),e=document.getElementById("liveToast1");if(t){const n=bootstrap.Toast.getOrCreateInstance(e);t.addEventListener("click",(()=>{n.show()}))}const n=document.getElementById("liveToast2Btn"),o=document.getElementById("liveToast2");if(n){const t=bootstrap.Toast.getOrCreateInstance(o);n.addEventListener("click",(()=>{t.show()}))}const s=document.getElementById("liveToast3Btn"),c=document.getElementById("liveToast3");if(s){const t=bootstrap.Toast.getOrCreateInstance(c);s.addEventListener("click",(()=>{t.show()}))}})),$(window).on("load",(function(){}));
@@ -0,0 +1 @@
/*! component-toast.js | Adminuiux 2025 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-auth.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){setActivelink(),fixedHeaderSpace(),featherjs(),coverimg(),dontclosedd(),checkstrength(),bstooltip(),swipernavpagination(),PageLoaderHide()}));
@@ -0,0 +1 @@
/*! mobileux auth.js | Adminuiux 2025-2026 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-billing.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){window.randomScalingFactor=function(){return Math.round(20*Math.random())};var a=document.getElementById("summarychart").getContext("2d"),n={type:"line",data:{labels:["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],datasets:[{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:1,backgroundColor:"rgba(0, 73, 232, 0.1)",borderColor:"rgba(0, 73, 232, 1)",borderWidth:1,fill:!0,tension:.3},{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:1,backgroundColor:"rgba(200, 0, 54, 0.1)",borderColor:"rgba(200, 0, 54, 0.35)",borderWidth:1,fill:!0,tension:.3}]},options:{animation:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{grid:{display:!1},display:!0,beginAtZero:!0}}}},o=new Chart(a,n);setInterval((function(){n.data.datasets.forEach((function(a){a.data=a.data.map((function(){return randomScalingFactor()}))})),o.update()}),3e3)}));
@@ -0,0 +1 @@
/*! mobileux dashboard.js | Adminuiux 2025-2026 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-dashboard.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){window.randomScalingFactor=function(){return Math.round(20*Math.random())};var a=document.getElementById("summarychart").getContext("2d"),n={type:"line",data:{labels:["10:30","11:00","11:30","12:00","12:30","01:00","01:30"],datasets:[{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#0049e8",borderWidth:1,fill:!1,tension:0},{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"rgba(0, 73, 232, 0.35)",borderWidth:1,fill:!1,tension:0}]},options:{animation:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{grid:{display:!1},display:!0,beginAtZero:!0}}}},o=new Chart(a,n);setInterval((function(){n.data.datasets.forEach((function(a){a.data=a.data.map((function(){return randomScalingFactor()}))})),o.update()}),3e3)}));
@@ -0,0 +1 @@
/*! mobileux dashboard.js | Adminuiux 2025-2026 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-splash.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){}));
@@ -0,0 +1 @@
/*! mobileux splash.js | Adminuiux 2025-2026 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-todo.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){window.randomScalingFactor=function(){return Math.round(20*Math.random())};var o=document.getElementById("summarychart").getContext("2d");new Chart(o,{type:"line",data:{labels:["21 Mon","22 Tue","23 Wed","24 Thu","25 Fri"],datasets:[{label:"# of active task",data:["22","24","23","21","20","18","16","14"],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#0049e8",borderWidth:1,fill:!1,tension:0},{label:"# of in-progress",data:["2","3","2","1","4","2","1","2"],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#fc7a1e",borderWidth:1,fill:!1,tension:0},{label:"# of completed",data:["3","5","8","9","9","10","11","13"],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#00a885",borderWidth:1,fill:!1,tension:0},{label:"# of cancelled",data:["0","0","0","1","1","2","2","2"],radius:1,backgroundColor:"rgba(0, 0, 0, 0)",borderColor:"#c80036",borderWidth:1,fill:!1,tension:0}]},options:{animation:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{grid:{display:!1},display:!0,beginAtZero:!0}}}})}));
@@ -0,0 +1 @@
/*! mobileux dashboard.js | Adminuiux 2025-2026 */
@@ -0,0 +1,2 @@
/*! For license information please see mobileux-wallet.js.LICENSE.txt */
"use strict";document.addEventListener("DOMContentLoaded",(function(){window.randomScalingFactor=function(){return Math.round(20*Math.random())};var t=document.getElementById("summarychart").getContext("2d"),a=t.createLinearGradient(0,0,0,100);a.addColorStop(0,"rgba(255, 138, 84, 0.85)"),a.addColorStop(1,"rgba(119, 198, 255, 0)");var o={type:"bar",data:{labels:["10:30","11:00","11:30","12:00","12:30","01:00","01:30"],datasets:[{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:"#0049e8",borderColor:"#0049e8",borderWidth:0,barThickness:6,fill:!0,tension:.5},{label:"# of hours",data:[randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()],radius:0,backgroundColor:a,borderColor:"#03045e",borderWidth:0,barThickness:6,fill:!0,tension:.5}]},options:{animation:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{y:{display:!1,beginAtZero:!0},x:{grid:{display:!1},display:!0,beginAtZero:!0}}}},r=new Chart(t,o);setInterval((function(){o.data.datasets.forEach((function(t){t.data=t.data.map((function(){return randomScalingFactor()}))})),r.update()}),3e3);var e=document.getElementById("doughnutchart").getContext("2d");new Chart(e,{type:"doughnut",data:{labels:["IT","Bio","Designing","Other"],datasets:[{label:"Learning Categories",data:[45,30,25,10],backgroundColor:["rgba(246, 50, 72, 0.85)","rgba(255, 159, 80, 0.85)","#0049e8","#becede"],borderWidth:0}]},options:{responsive:!0,cutout:50,tooltips:{position:"nearest",yAlign:"bottom"},plugins:{legend:{display:!1,position:"top"},title:{display:!1,text:"Chart.js Doughnut Chart"}},layout:{padding:0}}});new ProgressBar.Circle(circleprogressblue1,{color:"#0049e8",strokeWidth:10,trailWidth:10,easing:"easeInOut",trailColor:"rgba(0, 73, 232, 0.15)",duration:1400,text:{autoStyleContainer:!1},from:{color:"#0049e8",width:10},to:{color:"#0049e8",width:10},step:function(t,a){a.path.setAttribute("stroke",t.color),a.path.setAttribute("stroke-width",t.width);var o=Math.round(100*a.value());0===o?a.setText(""):a.setText(o+"<small>%<small>")}}).animate(.65),new ProgressBar.Circle(circleprogressgreen1,{color:"#91C300",strokeWidth:10,trailWidth:10,easing:"easeInOut",trailColor:"#eaf4d8",duration:1400,text:{autoStyleContainer:!1},from:{color:"#91C300",width:10},to:{color:"#91C300",width:10},step:function(t,a){a.path.setAttribute("stroke",t.color),a.path.setAttribute("stroke-width",t.width);var o=Math.round(100*a.value());0===o?a.setText(""):a.setText(o+"<small>%<small>")}}).animate(.85)}));
@@ -0,0 +1 @@
/*! mobileux dashboard.js | Adminuiux 2025-2026 */
+54
View File
@@ -0,0 +1,54 @@
/**
* Password Visibility Toggle
* Targets elements with class .password-toggle
* Robust implementation that works with or without .input-group container.
*/
document.addEventListener('click', function(e) {
const btn = e.target.closest('.password-toggle');
if (!btn) return;
// Search for input:
// 1. Inside same .input-group
// 2. Inside same parent
// 3. As a sibling
let container = btn.closest('.input-group');
let input = null;
if (container) {
input = container.querySelector('input[type="password"], input[type="text"]');
}
if (!input) {
input = btn.parentElement.querySelector('input[type="password"], input[type="text"]');
}
if (!input) {
// Look at previous siblings
let prev = btn.previousElementSibling;
while (prev) {
if (prev.tagName === 'INPUT') {
input = prev;
break;
}
prev = prev.previousElementSibling;
}
}
if (input) {
const icon = btn.querySelector('i');
if (input.type === 'password') {
input.type = 'text';
if (icon) {
icon.classList.remove('bi-eye');
icon.classList.add('bi-eye-slash');
}
} else {
input.type = 'password';
if (icon) {
icon.classList.remove('bi-eye-slash');
icon.classList.add('bi-eye');
}
}
}
});
+77
View File
@@ -0,0 +1,77 @@
/**
* GLOBAL PASSWORD VALIDATION
* ----------------------------------
* - Min 12 characters
* - Uppercase, lowercase
* - Number & symbol
*/
window.PasswordValidator = (function () {
let states = {};
function validate(value) {
const errors = [];
if (value.length < 12) errors.push("Minimum 12 characters");
if (!/[a-z]/.test(value)) errors.push("At least 1 lowercase letter");
if (!/[A-Z]/.test(value)) errors.push("At least 1 uppercase letter");
if (!/[0-9]/.test(value)) errors.push("At least 1 number");
if (!/[@$!%*#?&^()_\-+=]/.test(value)) errors.push("At least 1 symbol");
return errors;
}
function bind(options) {
const { inputId, errorId, formSelector, required = true } = options;
const input = document.getElementById(inputId);
const errorBox = document.getElementById(errorId);
const form = document.querySelector(formSelector);
if (!input || !errorBox || !form) return;
states[inputId] = !required;
input.addEventListener("input", () => {
const value = input.value.trim();
if (!required && value === "") {
reset(input, errorBox);
states[inputId] = true;
return;
}
const errors = validate(value);
if (errors.length) {
input.classList.add("is-invalid");
errorBox.classList.remove("d-none");
errorBox.innerHTML = errors.map((e) => `${e}`).join("<br>");
states[inputId] = false;
} else {
reset(input, errorBox);
states[inputId] = true;
}
});
form.addEventListener("submit", (e) => {
if (!states[inputId]) {
e.preventDefault();
Swal.fire({
icon: "error",
title: "Invalid Password",
text: "Password does not meet the required criteria.",
});
}
});
}
function reset(input, errorBox) {
input.classList.remove("is-invalid");
errorBox.classList.add("d-none");
}
return {
bind,
};
})();