first commit
This commit is contained in:
		
							
								
								
									
										129
									
								
								resources/assets/css/demo.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								resources/assets/css/demo.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,129 @@
 | 
			
		||||
/*
 | 
			
		||||
* demo.css
 | 
			
		||||
* File include item demo only specific css only
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
.light-style .menu .app-brand.demo {
 | 
			
		||||
  height: 64px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dark-style .menu .app-brand.demo {
 | 
			
		||||
  height: 64px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.app-brand-logo.demo {
 | 
			
		||||
  -ms-flex-align: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  -ms-flex-pack: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  width: 34px;
 | 
			
		||||
  height: 24px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.app-brand-logo.demo svg {
 | 
			
		||||
  width: 35px;
 | 
			
		||||
  height: 24px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.app-brand-text.demo {
 | 
			
		||||
  font-size: 1.375rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ! For .layout-navbar-fixed added fix padding top tpo .layout-page */
 | 
			
		||||
.layout-navbar-fixed .layout-wrapper:not(.layout-without-menu) .layout-page {
 | 
			
		||||
  padding-top: 64px !important;
 | 
			
		||||
}
 | 
			
		||||
.layout-navbar-fixed .layout-wrapper:not(.layout-horizontal):not(.layout-without-menu) .layout-page {
 | 
			
		||||
  padding-top: 72px !important;
 | 
			
		||||
}
 | 
			
		||||
/* Navbar page z-index issue solution */
 | 
			
		||||
.content-wrapper .navbar {
 | 
			
		||||
  z-index: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Content
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
.demo-blocks > * {
 | 
			
		||||
  display: block !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.demo-inline-spacing > * {
 | 
			
		||||
  margin: 1rem 0.375rem 0 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ? .demo-vertical-spacing class is used to have vertical margins between elements. To remove margin-top from the first-child, use .demo-only-element class with .demo-vertical-spacing class. For example, we have used this class in forms-input-groups.html file. */
 | 
			
		||||
.demo-vertical-spacing > * {
 | 
			
		||||
  margin-top: 1rem !important;
 | 
			
		||||
  margin-bottom: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
.demo-vertical-spacing.demo-only-element > :first-child {
 | 
			
		||||
  margin-top: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.demo-vertical-spacing-lg > * {
 | 
			
		||||
  margin-top: 1.875rem !important;
 | 
			
		||||
  margin-bottom: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
.demo-vertical-spacing-lg.demo-only-element > :first-child {
 | 
			
		||||
  margin-top: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.demo-vertical-spacing-xl > * {
 | 
			
		||||
  margin-top: 5rem !important;
 | 
			
		||||
  margin-bottom: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
.demo-vertical-spacing-xl.demo-only-element > :first-child {
 | 
			
		||||
  margin-top: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.rtl-only {
 | 
			
		||||
  display: none !important;
 | 
			
		||||
  text-align: left !important;
 | 
			
		||||
  direction: ltr !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[dir='rtl'] .rtl-only {
 | 
			
		||||
  display: block !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Dropdown buttons going out of small screens */
 | 
			
		||||
@media (max-width: 576px) {
 | 
			
		||||
  #dropdown-variation-demo .btn-group .text-truncate {
 | 
			
		||||
    width: 254px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
  #dropdown-variation-demo .btn-group .text-truncate::after {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 45%;
 | 
			
		||||
    right: 0.65rem;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Layout demo
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
.layout-demo-wrapper {
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-align: center;
 | 
			
		||||
  -ms-flex-align: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  margin-top: 1rem;
 | 
			
		||||
}
 | 
			
		||||
.layout-demo-placeholder img {
 | 
			
		||||
  width: 900px;
 | 
			
		||||
}
 | 
			
		||||
.layout-demo-info {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-top: 1rem;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										245
									
								
								resources/assets/js/bootstrap-table/bootstrapTableManager.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								resources/assets/js/bootstrap-table/bootstrapTableManager.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,245 @@
 | 
			
		||||
import '../../vendor/libs/bootstrap-table/bootstrap-table';
 | 
			
		||||
import '../notifications/LivewireNotification';
 | 
			
		||||
 | 
			
		||||
class BootstrapTableManager {
 | 
			
		||||
    constructor(bootstrapTableWrap, config = {}) {
 | 
			
		||||
        const defaultConfig = {
 | 
			
		||||
            header: [],
 | 
			
		||||
            format: [],
 | 
			
		||||
            search_columns: [],
 | 
			
		||||
            actionColumn: false,
 | 
			
		||||
            height: 'auto',
 | 
			
		||||
            minHeight: 300,
 | 
			
		||||
            bottomMargin : 195,
 | 
			
		||||
            search: true,
 | 
			
		||||
            showColumns: true,
 | 
			
		||||
            showColumnsToggleAll: true,
 | 
			
		||||
            showExport: true,
 | 
			
		||||
            exportfileName: 'datatTable',
 | 
			
		||||
            exportWithDatetime: true,
 | 
			
		||||
            showFullscreen: true,
 | 
			
		||||
            showPaginationSwitch: true,
 | 
			
		||||
            showRefresh: true,
 | 
			
		||||
            showToggle: true,
 | 
			
		||||
            /*
 | 
			
		||||
            smartDisplay: false,
 | 
			
		||||
            searchOnEnterKey: true,
 | 
			
		||||
            showHeader: false,
 | 
			
		||||
            showFooter: true,
 | 
			
		||||
            showRefresh: true,
 | 
			
		||||
            showToggle: true,
 | 
			
		||||
            showFullscreen: true,
 | 
			
		||||
            detailView: true,
 | 
			
		||||
            searchAlign: 'right',
 | 
			
		||||
            buttonsAlign: 'right',
 | 
			
		||||
            toolbarAlign: 'left',
 | 
			
		||||
            paginationVAlign: 'bottom',
 | 
			
		||||
            paginationHAlign: 'right',
 | 
			
		||||
            paginationDetailHAlign:	'left',
 | 
			
		||||
            paginationSuccessivelySize: 5,
 | 
			
		||||
            paginationPagesBySide: 3,
 | 
			
		||||
            paginationUseIntermediate: true,
 | 
			
		||||
            */
 | 
			
		||||
            clickToSelect: true,
 | 
			
		||||
            minimumCountColumns: 4,
 | 
			
		||||
            fixedColumns: true,
 | 
			
		||||
            fixedNumber: 1,
 | 
			
		||||
            idField: 'id',
 | 
			
		||||
            pagination: true,
 | 
			
		||||
            pageList: [25, 50, 100, 500, 1000],
 | 
			
		||||
            sortName: 'id',
 | 
			
		||||
            sortOrder: 'asc',
 | 
			
		||||
            cookie: false,
 | 
			
		||||
            cookieExpire: '365d',
 | 
			
		||||
            cookieIdTable: 'myTableCookies', // Nombre único para las cookies de la tabla
 | 
			
		||||
            cookieStorage: 'localStorage',
 | 
			
		||||
            cookiePath: '/',
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.$bootstrapTable  = $('.bootstrap-table', bootstrapTableWrap);
 | 
			
		||||
        this.$toolbar         = $('.bt-toolbar', bootstrapTableWrap);
 | 
			
		||||
        this.$searchColumns   = $('.search_columns', bootstrapTableWrap);
 | 
			
		||||
        this.$btnRefresh      = $('.btn-refresh', bootstrapTableWrap);
 | 
			
		||||
        this.$btnClearFilters = $('.btn-clear-filters', bootstrapTableWrap);
 | 
			
		||||
 | 
			
		||||
        this.config = { ...defaultConfig, ...config };
 | 
			
		||||
 | 
			
		||||
        this.config.toolbar       = `${bootstrapTableWrap} .bt-toolbar`;
 | 
			
		||||
        this.config.height        = this.config.height == 'auto'? this.getTableHeight(): this.config.height;
 | 
			
		||||
        this.config.cookieIdTable = this.config.exportWithDatetime? this.config.cookieIdTable + '-' + this.getFormattedDateYMDHm(): this.config.cookieIdTable;
 | 
			
		||||
 | 
			
		||||
        this.tableFormatters = {}; // Mueve la carga de formatters aquí
 | 
			
		||||
 | 
			
		||||
        this.initTable();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Calcula la altura de la tabla.
 | 
			
		||||
     */
 | 
			
		||||
    getTableHeight() {
 | 
			
		||||
        const btHeight = window.innerHeight - this.$toolbar.height() - this.bottomMargin;
 | 
			
		||||
 | 
			
		||||
        return btHeight < this.config.minHeight ? this.config.minHeight : btHeight;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Genera un ID único para la tabla basado en una cookie.
 | 
			
		||||
     */
 | 
			
		||||
    getCookieId() {
 | 
			
		||||
        const generateShortHash = (str) => {
 | 
			
		||||
            let hash = 0;
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < str.length; i++) {
 | 
			
		||||
                const char = str.charCodeAt(i);
 | 
			
		||||
 | 
			
		||||
                hash = (hash << 5) - hash + char;
 | 
			
		||||
                hash &= hash; // Convertir a entero de 32 bits
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return Math.abs(hash).toString().substring(0, 12);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return `bootstrap-table-cache-${generateShortHash(this.config.title)}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Carga los formatters dinámicamente
 | 
			
		||||
     */
 | 
			
		||||
    async loadFormatters() {
 | 
			
		||||
        const formattersModules = import.meta.glob('../../../../../**/resources/assets/js/bootstrap-table/*Formatters.js');
 | 
			
		||||
 | 
			
		||||
        const formatterPromises = Object.entries(formattersModules).map(async ([path, importer]) => {
 | 
			
		||||
            const module = await importer();
 | 
			
		||||
            Object.assign(this.tableFormatters, module);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        await Promise.all(formatterPromises);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    btColumns() {
 | 
			
		||||
        const columns = [];
 | 
			
		||||
 | 
			
		||||
        Object.entries(this.config.header).forEach(([key, value]) => {
 | 
			
		||||
            const columnFormat = this.config.format[key] || {};
 | 
			
		||||
 | 
			
		||||
            if (typeof columnFormat.formatter === 'object') {
 | 
			
		||||
                const formatterName = columnFormat.formatter.name;
 | 
			
		||||
                const formatterParams = columnFormat.formatter.params || {};
 | 
			
		||||
 | 
			
		||||
                const formatterFunction = this.tableFormatters[formatterName];
 | 
			
		||||
                if (formatterFunction) {
 | 
			
		||||
                    columnFormat.formatter = (value, row, index) => formatterFunction(value, row, index, formatterParams);
 | 
			
		||||
                } else {
 | 
			
		||||
                    console.warn(`Formatter "${formatterName}" no encontrado para la columna "${key}"`);
 | 
			
		||||
                }
 | 
			
		||||
            } else if (typeof columnFormat.formatter === 'string') {
 | 
			
		||||
                const formatterFunction = this.tableFormatters[columnFormat.formatter];
 | 
			
		||||
                if (formatterFunction) {
 | 
			
		||||
                    columnFormat.formatter = formatterFunction;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (columnFormat.onlyFormatter) {
 | 
			
		||||
                columns.push({
 | 
			
		||||
                    align: 'center',
 | 
			
		||||
                    formatter: columnFormat.formatter || (() => ''),
 | 
			
		||||
                    forceHide: true,
 | 
			
		||||
                    switchable: false,
 | 
			
		||||
                    field: key,
 | 
			
		||||
                    title: value,
 | 
			
		||||
                });
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const column = {
 | 
			
		||||
                title: value,
 | 
			
		||||
                field: key,
 | 
			
		||||
                sortable: true,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            columns.push({ ...column, ...columnFormat });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Petición AJAX para la tabla.
 | 
			
		||||
     */
 | 
			
		||||
    ajaxRequest(params) {
 | 
			
		||||
        const url = `${window.location.href}?${$.param(params.data)}&${$('.bt-toolbar :input').serialize()}`;
 | 
			
		||||
 | 
			
		||||
        $.get(url).then((res) => params.success(res));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    toValidFilename(str, extension = 'txt') {
 | 
			
		||||
        return str
 | 
			
		||||
            .normalize("NFD") // 🔹 Normaliza caracteres con tilde
 | 
			
		||||
            .replace(/[\u0300-\u036f]/g, "") // 🔹 Elimina acentos y diacríticos
 | 
			
		||||
            .replace(/[<>:"\/\\|?*\x00-\x1F]/g, '') // 🔹 Elimina caracteres inválidos
 | 
			
		||||
            .replace(/\s+/g, '-') // 🔹 Reemplaza espacios con guiones
 | 
			
		||||
            .replace(/-+/g, '-') // 🔹 Evita múltiples guiones seguidos
 | 
			
		||||
            .replace(/^-+|-+$/g, '') // 🔹 Elimina guiones al inicio y fin
 | 
			
		||||
            .toLowerCase() // 🔹 Convierte a minúsculas
 | 
			
		||||
            + (extension ? '.' + extension.replace(/^\.+/, '') : ''); // 🔹 Asegura la extensión válida
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getFormattedDateYMDHm(date = new Date()) {
 | 
			
		||||
        const year = date.getFullYear();
 | 
			
		||||
        const month = String(date.getMonth() + 1).padStart(2, '0'); // 🔹 Asegura dos dígitos
 | 
			
		||||
        const day = String(date.getDate()).padStart(2, '0');
 | 
			
		||||
        const hours = String(date.getHours()).padStart(2, '0');
 | 
			
		||||
        const minutes = String(date.getMinutes()).padStart(2, '0');
 | 
			
		||||
 | 
			
		||||
        return `${year}${month}${day}-${hours}${minutes}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inicia la tabla después de cargar los formatters
 | 
			
		||||
     */
 | 
			
		||||
    async initTable() {
 | 
			
		||||
        await this.loadFormatters(); // Asegura que los formatters estén listos antes de inicializar
 | 
			
		||||
 | 
			
		||||
        this.$bootstrapTable
 | 
			
		||||
            .bootstrapTable('destroy').bootstrapTable({
 | 
			
		||||
                height: this.config.height,
 | 
			
		||||
                locale: 'es-MX',
 | 
			
		||||
                ajax: (params) => this.ajaxRequest(params),
 | 
			
		||||
                toolbar: this.config.toolbar,
 | 
			
		||||
                search: this.config.search,
 | 
			
		||||
                showColumns: this.config.showColumns,
 | 
			
		||||
                showColumnsToggleAll: this.config.showColumnsToggleAll,
 | 
			
		||||
                showExport: this.config.showExport,
 | 
			
		||||
                exportTypes: ['csv', 'txt', 'xlsx'],
 | 
			
		||||
                exportOptions: {
 | 
			
		||||
                    fileName: this.config.fileName,
 | 
			
		||||
                },
 | 
			
		||||
                showFullscreen: this.config.showFullscreen,
 | 
			
		||||
                showPaginationSwitch: this.config.showPaginationSwitch,
 | 
			
		||||
                showRefresh: this.config.showRefresh,
 | 
			
		||||
                showToggle: this.config.showToggle,
 | 
			
		||||
                clickToSelect: this.config.clickToSelect,
 | 
			
		||||
                minimumCountColumns: this.config.minimumCountColumns,
 | 
			
		||||
                fixedColumns: this.config.fixedColumns,
 | 
			
		||||
                fixedNumber: this.config.fixedNumber,
 | 
			
		||||
                idField: this.config.idField,
 | 
			
		||||
                pagination: this.config.pagination,
 | 
			
		||||
                pageList: this.config.pageList,
 | 
			
		||||
                sidePagination: "server",
 | 
			
		||||
                sortName: this.config.sortName,
 | 
			
		||||
                sortOrder: this.config.sortOrder,
 | 
			
		||||
                mobileResponsive: true,
 | 
			
		||||
                resizable: true,
 | 
			
		||||
                cookie: this.config.cookie,
 | 
			
		||||
                cookieExpire: this.config.cookieExpire,
 | 
			
		||||
                cookieIdTable: this.config.cookieIdTable,
 | 
			
		||||
                columns: this.btColumns(),
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
window.BootstrapTableManager = BootstrapTableManager;
 | 
			
		||||
							
								
								
									
										132
									
								
								resources/assets/js/bootstrap-table/globalConfig.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								resources/assets/js/bootstrap-table/globalConfig.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,132 @@
 | 
			
		||||
const appRoutesElement = document.getElementById('app-routes');
 | 
			
		||||
 | 
			
		||||
export const routes = appRoutesElement ? JSON.parse(appRoutesElement.textContent) : {};
 | 
			
		||||
 | 
			
		||||
export const booleanStatusCatalog = {
 | 
			
		||||
    activo: {
 | 
			
		||||
        trueText: 'Activo',
 | 
			
		||||
        falseText: 'Inactivo',
 | 
			
		||||
        trueClass: 'badge bg-label-success',
 | 
			
		||||
        falseClass: 'badge bg-label-danger',
 | 
			
		||||
    },
 | 
			
		||||
    habilitado: {
 | 
			
		||||
        trueText: 'Habilitado',
 | 
			
		||||
        falseText: 'Deshabilitado',
 | 
			
		||||
        trueClass: 'badge bg-label-success',
 | 
			
		||||
        falseClass: 'badge bg-label-danger',
 | 
			
		||||
        trueIcon: 'ti ti-checkup-list',
 | 
			
		||||
        falseIcon: 'ti ti-ban',
 | 
			
		||||
    },
 | 
			
		||||
    checkSI: {
 | 
			
		||||
        trueText: 'SI',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'badge bg-label-info',
 | 
			
		||||
        falseText: '',
 | 
			
		||||
    },
 | 
			
		||||
    check: {
 | 
			
		||||
        trueIcon: 'ti ti-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    checkbox: {
 | 
			
		||||
        trueIcon: 'ti ti-checkbox',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    checklist: {
 | 
			
		||||
        trueIcon: 'ti ti-checklist',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    phone_done: {
 | 
			
		||||
        trueIcon: 'ti ti-phone-done',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    checkup_list: {
 | 
			
		||||
        trueIcon: 'ti ti-checkup-list',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    list_check: {
 | 
			
		||||
        trueIcon: 'ti ti-list-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    camera_check: {
 | 
			
		||||
        trueIcon: 'ti ti-camera-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    mail_check: {
 | 
			
		||||
        trueIcon: 'ti ti-mail-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    clock_check: {
 | 
			
		||||
        trueIcon: 'ti ti-clock-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    user_check: {
 | 
			
		||||
        trueIcon: 'ti ti-user-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    circle_check: {
 | 
			
		||||
        trueIcon: 'ti ti-circle-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    shield_check: {
 | 
			
		||||
        trueIcon: 'ti ti-shield-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    },
 | 
			
		||||
    calendar_check: {
 | 
			
		||||
        trueIcon: 'ti ti-calendar-check',
 | 
			
		||||
        falseIcon: '',
 | 
			
		||||
        trueClass: 'text-green-800',
 | 
			
		||||
        falseClass: '',
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const badgeColorCatalog = {
 | 
			
		||||
    primary: { color: 'primary' },
 | 
			
		||||
    secondary: { color: 'secondary' },
 | 
			
		||||
    success: { color: 'success' },
 | 
			
		||||
    danger: { color: 'danger' },
 | 
			
		||||
    warning: { color: 'warning' },
 | 
			
		||||
    info: { color: 'info' },
 | 
			
		||||
    dark: { color: 'dark' },
 | 
			
		||||
    light: { color: 'light', textColor: 'text-dark' }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const statusIntBadgeBgCatalogCss = {
 | 
			
		||||
    1: 'warning',
 | 
			
		||||
    2: 'info',
 | 
			
		||||
    10: 'success',
 | 
			
		||||
    12: 'danger',
 | 
			
		||||
    11: 'warning'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const statusIntBadgeBgCatalog = {
 | 
			
		||||
    1: 'Inactivo',
 | 
			
		||||
    2: 'En proceso',
 | 
			
		||||
    10: 'Activo',
 | 
			
		||||
    11: 'Archivado',
 | 
			
		||||
    12: 'Cancelado',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										193
									
								
								resources/assets/js/bootstrap-table/globalFormatters.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								resources/assets/js/bootstrap-table/globalFormatters.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,193 @@
 | 
			
		||||
import { booleanStatusCatalog, statusIntBadgeBgCatalogCss, statusIntBadgeBgCatalog } from './globalConfig';
 | 
			
		||||
import {routes} from '../../../../../laravel-vuexy-admin/resources/assets/js/bootstrap-table/globalConfig.js';
 | 
			
		||||
 | 
			
		||||
export const userActionFormatter = (value, row, index) => {
 | 
			
		||||
    if (!row.id) return '';
 | 
			
		||||
 | 
			
		||||
    const showUrl = routes['admin.user.show'].replace(':id', row.id);
 | 
			
		||||
    const editUrl = routes['admin.user.edit'].replace(':id', row.id);
 | 
			
		||||
    const deleteUrl = routes['admin.user.delete'].replace(':id', row.id);
 | 
			
		||||
 | 
			
		||||
    return `
 | 
			
		||||
        <div class="flex space-x-2">
 | 
			
		||||
            <a href="${editUrl}" title="Editar" class="icon-button hover:text-slate-700">
 | 
			
		||||
                <i class="ti ti-edit"></i>
 | 
			
		||||
            </a>
 | 
			
		||||
            <a href="${deleteUrl}" title="Eliminar" class="icon-button hover:text-slate-700">
 | 
			
		||||
                <i class="ti ti-trash"></i>
 | 
			
		||||
            </a>
 | 
			
		||||
            <a href="${showUrl}" title="Ver" class="icon-button hover:text-slate-700">
 | 
			
		||||
                <i class="ti ti-eye"></i>
 | 
			
		||||
            </a>
 | 
			
		||||
        </div>
 | 
			
		||||
    `.trim();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const dynamicBooleanFormatter = (value, row, index, options = {}) => {
 | 
			
		||||
    const { tag = 'default', customOptions = {} } = options;
 | 
			
		||||
    const catalogConfig = booleanStatusCatalog[tag] || {};
 | 
			
		||||
 | 
			
		||||
    const finalOptions = {
 | 
			
		||||
        ...catalogConfig,
 | 
			
		||||
        ...customOptions, // Permite sobreescribir la configuración predeterminada
 | 
			
		||||
        ...options // Permite pasar opciones rápidas
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const {
 | 
			
		||||
        trueIcon = '',
 | 
			
		||||
        falseIcon = '',
 | 
			
		||||
        trueText = 'Sí',
 | 
			
		||||
        falseText = 'No',
 | 
			
		||||
        trueClass = 'badge bg-label-success',
 | 
			
		||||
        falseClass = 'badge bg-label-danger',
 | 
			
		||||
        iconClass = 'text-green-800'
 | 
			
		||||
    } = finalOptions;
 | 
			
		||||
 | 
			
		||||
    const trueElement  = !trueIcon && !trueText ? '' : `<span class="${trueClass}">${trueIcon ? `<i class="${trueIcon} ${iconClass}"></i> ` : ''}${trueText}</span>`;
 | 
			
		||||
    const falseElement = !falseIcon && !falseText ? '' : `<span class="${falseClass}">${falseIcon ? `<i class="${falseIcon}"></i> ` : ''}${falseText}</span>`;
 | 
			
		||||
 | 
			
		||||
    return value? trueElement : falseElement;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const dynamicBadgeFormatter = (value, row, index, options = {}) => {
 | 
			
		||||
    const {
 | 
			
		||||
        color = 'primary', // Valor por defecto
 | 
			
		||||
        textColor = '',    // Permite agregar color de texto si es necesario
 | 
			
		||||
        additionalClass = '' // Permite añadir clases adicionales
 | 
			
		||||
    } = options;
 | 
			
		||||
 | 
			
		||||
    return `<span class="badge bg-${color} ${textColor} ${additionalClass}">${value}</span>`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const statusIntBadgeBgFormatter = (value, row, index) => {
 | 
			
		||||
    return value
 | 
			
		||||
        ? `<span class="badge bg-label-${statusIntBadgeBgCatalogCss[value]}">${statusIntBadgeBgCatalog[value]}</span>`
 | 
			
		||||
        : '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const textNowrapFormatter = (value, row, index) => {
 | 
			
		||||
    if (!value) return '';
 | 
			
		||||
        return `<span class="text-nowrap">${value}</span>`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const toCurrencyFormatter = (value, row, index) => {
 | 
			
		||||
    return isNaN(value) ? '' : Number(value).toCurrency();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const numberFormatter = (value, row, index) => {
 | 
			
		||||
    return isNaN(value) ? '' : Number(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const monthFormatter = (value, row, index) => {
 | 
			
		||||
    switch (parseInt(value)) {
 | 
			
		||||
        case 1:
 | 
			
		||||
            return 'Enero';
 | 
			
		||||
        case 2:
 | 
			
		||||
            return 'Febrero';
 | 
			
		||||
        case 3:
 | 
			
		||||
            return 'Marzo';
 | 
			
		||||
        case 4:
 | 
			
		||||
            return 'Abril';
 | 
			
		||||
        case 5:
 | 
			
		||||
            return 'Mayo';
 | 
			
		||||
        case 6:
 | 
			
		||||
            return 'Junio';
 | 
			
		||||
        case 7:
 | 
			
		||||
            return 'Julio';
 | 
			
		||||
        case 8:
 | 
			
		||||
            return 'Agosto';
 | 
			
		||||
        case 9:
 | 
			
		||||
            return 'Septiembre';
 | 
			
		||||
        case 10:
 | 
			
		||||
            return 'Octubre';
 | 
			
		||||
        case 11:
 | 
			
		||||
            return 'Noviembre';
 | 
			
		||||
        case 12:
 | 
			
		||||
            return 'Diciembre';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const humaneTimeFormatter = (value, row, index) => {
 | 
			
		||||
    return isNaN(value) ? '' : Number(value).humaneTime();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Genera la URL del avatar basado en iniciales o devuelve la foto de perfil si está disponible.
 | 
			
		||||
 * @param {string} fullName - Nombre completo del usuario.
 | 
			
		||||
 * @param {string|null} profilePhoto - Ruta de la foto de perfil.
 | 
			
		||||
 * @returns {string} - URL del avatar.
 | 
			
		||||
 */
 | 
			
		||||
function getAvatarUrl(fullName, profilePhoto) {
 | 
			
		||||
    const baseUrl = window.baseUrl || '';
 | 
			
		||||
 | 
			
		||||
    if (profilePhoto) {
 | 
			
		||||
        return `${baseUrl}storage/profile-photos/${profilePhoto}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return `${baseUrl}admin/usuario/avatar/?name=${fullName}`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formatea la columna del perfil de usuario con avatar, nombre y correo.
 | 
			
		||||
 */
 | 
			
		||||
export const userProfileFormatter = (value, row, index) => {
 | 
			
		||||
    if (!row.id) return '';
 | 
			
		||||
 | 
			
		||||
    const profileUrl = routes['admin.user.show'].replace(':id', row.id);
 | 
			
		||||
    const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
 | 
			
		||||
    const email = row.email ? row.email : 'Sin correo';
 | 
			
		||||
 | 
			
		||||
    return `
 | 
			
		||||
        <div class="flex items-center space-x-3" style="min-width: 240px">
 | 
			
		||||
            <a href="${profileUrl}" class="flex-shrink-0">
 | 
			
		||||
                <img src="${avatar}" alt="Avatar" class="w-10 h-10 rounded-full border border-gray-300 shadow-sm hover:scale-105 transition-transform">
 | 
			
		||||
            </a>
 | 
			
		||||
            <div class="truncate">
 | 
			
		||||
                <a href="${profileUrl}" class="font-medium text-slate-700 hover:underline block text-wrap">${row.full_name}</a>
 | 
			
		||||
                <small class="text-muted block truncate">${email}</small>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    `;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formatea la columna del perfil de contacto con avatar, nombre y correo.
 | 
			
		||||
 */
 | 
			
		||||
export const contactProfileFormatter = (value, row, index) => {
 | 
			
		||||
    if (!row.id) return '';
 | 
			
		||||
 | 
			
		||||
    const profileUrl = routes['admin.contact.show'].replace(':id', row.id);
 | 
			
		||||
    const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
 | 
			
		||||
    const email = row.email ? row.email : 'Sin correo';
 | 
			
		||||
 | 
			
		||||
    return `
 | 
			
		||||
        <div class="flex items-center space-x-3" style="min-width: 240px">
 | 
			
		||||
            <a href="${profileUrl}" class="flex-shrink-0">
 | 
			
		||||
                <img src="${avatar}" alt="Avatar" class="w-10 h-10 rounded-full border border-gray-300 shadow-sm hover:scale-105 transition-transform">
 | 
			
		||||
            </a>
 | 
			
		||||
            <div class="truncate">
 | 
			
		||||
                <a href="${profileUrl}" class="font-medium text-slate-700 hover:underline block text-wrap">${row.full_name}</a>
 | 
			
		||||
                <small class="text-muted block truncate">${email}</small>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    `;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const creatorFormatter = (value, row, index) => {
 | 
			
		||||
    if (!row.creator) return '';
 | 
			
		||||
 | 
			
		||||
    const email   = row.creator_email || 'Sin correo';
 | 
			
		||||
    const showUrl = routes['admin.user.show'].replace(':id', row.id);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return `
 | 
			
		||||
        <div class="flex flex-col">
 | 
			
		||||
            <a href="${showUrl}" class="font-medium text-slate-600 hover:underline block text-wrap">${row.creator}</a>
 | 
			
		||||
            <small class="text-muted">${email}</small>
 | 
			
		||||
        </div>
 | 
			
		||||
    `;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								resources/assets/js/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								resources/assets/js/config.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Config
 | 
			
		||||
 * -------------------------------------------------------------------------------------
 | 
			
		||||
 * ! IMPORTANT: Make sure you clear the browser local storage In order to see the config changes in the template.
 | 
			
		||||
 * ! To clear local storage: (https://www.leadshook.com/help/how-to-clear-local-storage-in-google-chrome-browser/).
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
// JS global variables
 | 
			
		||||
window.config = {
 | 
			
		||||
    colors: {
 | 
			
		||||
        primary: '#7367f0',
 | 
			
		||||
        secondary: '#808390',
 | 
			
		||||
        success: '#28c76f',
 | 
			
		||||
        info: '#00bad1',
 | 
			
		||||
        warning: '#ff9f43',
 | 
			
		||||
        danger: '#FF4C51',
 | 
			
		||||
        dark: '#4b4b4b',
 | 
			
		||||
        black: '#000',
 | 
			
		||||
        white: '#fff',
 | 
			
		||||
        cardColor: '#fff',
 | 
			
		||||
        bodyBg: '#f8f7fa',
 | 
			
		||||
        bodyColor: '#6d6b77',
 | 
			
		||||
        headingColor: '#444050',
 | 
			
		||||
        textMuted: '#acaab1',
 | 
			
		||||
        borderColor: '#e6e6e8'
 | 
			
		||||
    },
 | 
			
		||||
    colors_label: {
 | 
			
		||||
        primary: '#7367f029',
 | 
			
		||||
        secondary: '#a8aaae29',
 | 
			
		||||
        success: '#28c76f29',
 | 
			
		||||
        info: '#00cfe829',
 | 
			
		||||
        warning: '#ff9f4329',
 | 
			
		||||
        danger: '#ea545529',
 | 
			
		||||
        dark: '#4b4b4b29'
 | 
			
		||||
    },
 | 
			
		||||
    colors_dark: {
 | 
			
		||||
        cardColor: '#2f3349',
 | 
			
		||||
        bodyBg: '#25293c',
 | 
			
		||||
        bodyColor: '#b2b1cb',
 | 
			
		||||
        headingColor: '#cfcce4',
 | 
			
		||||
        textMuted: '#8285a0',
 | 
			
		||||
        borderColor: '#565b79'
 | 
			
		||||
    },
 | 
			
		||||
    enableMenuLocalStorage: true // Enable menu state with local storage support
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
window.assetsPath = document.documentElement.getAttribute('data-assets-path');
 | 
			
		||||
window.baseUrl = document.documentElement.getAttribute('data-base-url');
 | 
			
		||||
window.quicklinksUpdateUrl = document.documentElement.getAttribute('data-quicklinks-update-url');
 | 
			
		||||
window.templateName = document.documentElement.getAttribute('data-template');
 | 
			
		||||
window.rtlSupport = false; // set true for rtl support (rtl + ltr), false for ltr only.
 | 
			
		||||
							
								
								
									
										477
									
								
								resources/assets/js/forms/formConvasHelper.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										477
									
								
								resources/assets/js/forms/formConvasHelper.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,477 @@
 | 
			
		||||
/**
 | 
			
		||||
 * FormCanvasHelper
 | 
			
		||||
 *
 | 
			
		||||
 * Clase para orquestar la interacción entre un formulario dentro de un Offcanvas
 | 
			
		||||
 * de Bootstrap y el estado de Livewire (modo create/edit/delete), además de
 | 
			
		||||
 * manipular ciertos componentes externos como Select2.
 | 
			
		||||
 *
 | 
			
		||||
 * Se diseñó teniendo en cuenta que el DOM del Offcanvas puede reconstruirse
 | 
			
		||||
 * (re-render) de manera frecuente, por lo que muchos getters reacceden al DOM
 | 
			
		||||
 * dinámicamente.
 | 
			
		||||
 */
 | 
			
		||||
export default class FormCanvasHelper {
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {string} offcanvasId       - ID del elemento Offcanvas en el DOM.
 | 
			
		||||
     * @param {object} liveWireInstance  - Instancia de Livewire asociada al formulario.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(offcanvasId, liveWireInstance) {
 | 
			
		||||
        this.offcanvasId = offcanvasId;
 | 
			
		||||
        this.liveWireInstance = liveWireInstance;
 | 
			
		||||
 | 
			
		||||
        // Validamos referencias mínimas para evitar errores tempranos
 | 
			
		||||
        // Si alguna falta, se mostrará un error en consola.
 | 
			
		||||
        this.validateInitialDomRefs();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Verifica la existencia básica de elementos en el DOM.
 | 
			
		||||
     * Muestra errores en consola si faltan elementos críticos.
 | 
			
		||||
     */
 | 
			
		||||
    validateInitialDomRefs() {
 | 
			
		||||
        const offcanvasEl = document.getElementById(this.offcanvasId);
 | 
			
		||||
 | 
			
		||||
        if (!offcanvasEl) {
 | 
			
		||||
            console.error(`❌ No se encontró el contenedor Offcanvas con ID: ${this.offcanvasId}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const formEl = offcanvasEl.querySelector('form');
 | 
			
		||||
        if (!formEl) {
 | 
			
		||||
            console.error(`❌ No se encontró el formulario dentro de #${this.offcanvasId}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const offcanvasTitle = offcanvasEl.querySelector('.offcanvas-title');
 | 
			
		||||
        const submitButtons = formEl.querySelectorAll('.btn-submit');
 | 
			
		||||
        const resetButtons = formEl.querySelectorAll('.btn-reset');
 | 
			
		||||
 | 
			
		||||
        if (!offcanvasTitle || !submitButtons.length || !resetButtons.length) {
 | 
			
		||||
            console.error(`❌ Faltan el título, botones de submit o reset dentro de #${this.offcanvasId}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter para el contenedor Offcanvas actual.
 | 
			
		||||
     * Retorna siempre la referencia más reciente del DOM.
 | 
			
		||||
     */
 | 
			
		||||
    get offcanvasEl() {
 | 
			
		||||
        return document.getElementById(this.offcanvasId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter para el formulario dentro del Offcanvas.
 | 
			
		||||
     */
 | 
			
		||||
    get formEl() {
 | 
			
		||||
        return this.offcanvasEl?.querySelector('form') ?? null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter para el título del Offcanvas.
 | 
			
		||||
     */
 | 
			
		||||
    get offcanvasTitleEl() {
 | 
			
		||||
        return this.offcanvasEl?.querySelector('.offcanvas-title') ?? null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter para la instancia de Bootstrap Offcanvas.
 | 
			
		||||
     * Siempre retorna la instancia más reciente en caso de re-render.
 | 
			
		||||
     */
 | 
			
		||||
    get offcanvasInstance() {
 | 
			
		||||
        if (!this.offcanvasEl) return null;
 | 
			
		||||
        return bootstrap.Offcanvas.getOrCreateInstance(this.offcanvasEl);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Retorna todos los botones de submit en el formulario.
 | 
			
		||||
     */
 | 
			
		||||
    get submitButtons() {
 | 
			
		||||
        return this.formEl?.querySelectorAll('.btn-submit') ?? [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Retorna todos los botones de reset en el formulario.
 | 
			
		||||
     */
 | 
			
		||||
    get resetButtons() {
 | 
			
		||||
        return this.formEl?.querySelectorAll('.btn-reset') ?? [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Método principal para manejar la recarga del Offcanvas según los estados en Livewire.
 | 
			
		||||
     * Se encarga de resetear el formulario, limpiar errores y cerrar/abrir el Offcanvas
 | 
			
		||||
     * según sea necesario.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string|null} triggerMode - Forzar la acción (e.g., 'reset', 'create'). Si no se especifica, se verifica según Livewire.
 | 
			
		||||
     */
 | 
			
		||||
    reloadOffcanvas(triggerMode = null) {
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
            const mode = this.liveWireInstance.get('mode');
 | 
			
		||||
            const successProcess  = this.liveWireInstance.get('successProcess');
 | 
			
		||||
            const validationError = this.liveWireInstance.get('validationError');
 | 
			
		||||
 | 
			
		||||
            // Si se completa la acción o triggerMode = 'reset',
 | 
			
		||||
            // reseteamos completamente y cerramos el Offcanvas.
 | 
			
		||||
            if (triggerMode === 'reset' || successProcess) {
 | 
			
		||||
                this.resetFormAndState('create');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Forzar modo create si se solicita explícitamente
 | 
			
		||||
            if (triggerMode === 'create') {
 | 
			
		||||
                // Evitamos re-reset si ya estamos en 'create'
 | 
			
		||||
                if (mode === 'create') return;
 | 
			
		||||
 | 
			
		||||
                this.resetFormAndState('create');
 | 
			
		||||
 | 
			
		||||
                this.focusOnOpen();
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Si no, simplemente preparamos la UI según el modo actual.
 | 
			
		||||
            this.prepareOffcanvasUI(mode);
 | 
			
		||||
 | 
			
		||||
            // Si hay errores de validación, reabrimos el Offcanvas para mostrarlos.
 | 
			
		||||
            if (validationError) {
 | 
			
		||||
                this.liveWireInstance.set('validationError', null, false);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Si estamos en edit o delete, solo abrimos el Offcanvas.
 | 
			
		||||
            if (mode === 'edit' || mode === 'delete') {
 | 
			
		||||
                this.clearErrors();
 | 
			
		||||
 | 
			
		||||
                if(mode === 'edit') {
 | 
			
		||||
                    this.focusOnOpen();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }, 20);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Reabre o fuerza la apertura del Offcanvas si hay errores de validación
 | 
			
		||||
     * o si el modo de Livewire es 'edit' o 'delete'.
 | 
			
		||||
     *
 | 
			
		||||
     * Normalmente se llama cuando hay un dispatch/evento de Livewire,
 | 
			
		||||
     * por ejemplo si el servidor devuelve un error de validación (para mostrarlo)
 | 
			
		||||
     * o si se acaba de cargar un registro para editar o eliminar.
 | 
			
		||||
     *
 | 
			
		||||
     * - Si hay `validationError`, forzamos la reapertura con `toggleOffcanvas(true, true)`
 | 
			
		||||
     *   para que se refresque correctamente y el usuario vea los errores.
 | 
			
		||||
     * - Si el modo es 'edit' o 'delete', simplemente mostramos el Offcanvas sin forzar
 | 
			
		||||
     *   un refresco de la interfaz.
 | 
			
		||||
     */
 | 
			
		||||
    refresh() {
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
            const mode = this.liveWireInstance.get('mode');
 | 
			
		||||
            const successProcess  = this.liveWireInstance.get('successProcess');
 | 
			
		||||
            const validationError = this.liveWireInstance.get('validationError');
 | 
			
		||||
 | 
			
		||||
            // cerramos el Offcanvas.
 | 
			
		||||
            if (successProcess) {
 | 
			
		||||
                this.toggleOffcanvas(false);
 | 
			
		||||
 | 
			
		||||
                this.resetFormAndState('create');
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (validationError) {
 | 
			
		||||
                // Forzamos la reapertura para que se rendericen
 | 
			
		||||
                this.toggleOffcanvas(true, true);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (mode === 'edit' || mode === 'delete') {
 | 
			
		||||
                // Abrimos el Offcanvas para edición o eliminación
 | 
			
		||||
                this.toggleOffcanvas(true);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }, 10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Prepara la UI del Offcanvas según el modo actual: cambia texto de botones, título,
 | 
			
		||||
     * habilita o deshabilita campos, etc.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} mode - Modo actual en Livewire: 'create', 'edit' o 'delete'
 | 
			
		||||
     */
 | 
			
		||||
    prepareOffcanvasUI(mode) {
 | 
			
		||||
        // Configura el texto y estilo de botones
 | 
			
		||||
        this.configureButtons(mode);
 | 
			
		||||
 | 
			
		||||
        // Ajusta el título del Offcanvas
 | 
			
		||||
        this.configureTitle(mode);
 | 
			
		||||
 | 
			
		||||
        // Activa o desactiva campos según el modo
 | 
			
		||||
        this.configureReadonlyMode(mode === 'delete');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Cierra o muestra el Offcanvas.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {boolean} show  - true para mostrar, false para ocultar.
 | 
			
		||||
     * @param {boolean} force - true para forzar el refresco rápido del Offcanvas.
 | 
			
		||||
     */
 | 
			
		||||
    toggleOffcanvas(show = false, force = false) {
 | 
			
		||||
        const instance = this.offcanvasInstance;
 | 
			
		||||
 | 
			
		||||
        if (!instance) return;
 | 
			
		||||
 | 
			
		||||
        if (show) {
 | 
			
		||||
            if (force) {
 | 
			
		||||
                // "Force" hace un hide + show para asegurar un nuevo render
 | 
			
		||||
                instance.hide();
 | 
			
		||||
                setTimeout(() => instance.show(), 10);
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                instance.show();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
            instance.hide();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Resetea el formulario y el estado en Livewire (modo, id, errores).
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} targetMode - Modo al que queremos resetear, típicamente 'create'.
 | 
			
		||||
     */
 | 
			
		||||
    resetFormAndState(targetMode) {
 | 
			
		||||
        if (!this.formEl) return;
 | 
			
		||||
 | 
			
		||||
        // Restablecemos en Livewire
 | 
			
		||||
        this.liveWireInstance.set('successProcess', null, false);
 | 
			
		||||
        this.liveWireInstance.set('validationError', null, false);
 | 
			
		||||
        this.liveWireInstance.set('mode', targetMode, false);
 | 
			
		||||
        this.liveWireInstance.set('id', null, false);
 | 
			
		||||
 | 
			
		||||
        // Limpiamos el formulario
 | 
			
		||||
        this.formEl.reset();
 | 
			
		||||
        this.clearErrors();
 | 
			
		||||
 | 
			
		||||
        // Restablecemos valores por defecto del formulario
 | 
			
		||||
        const defaults = this.liveWireInstance.get('defaultValues');
 | 
			
		||||
        if (defaults && typeof defaults === 'object') {
 | 
			
		||||
            Object.entries(defaults).forEach(([key, value]) => {
 | 
			
		||||
                this.liveWireInstance.set(key, value, false);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Limpiar select2 automáticamente
 | 
			
		||||
        $(this.formEl)
 | 
			
		||||
            .find('select.select2-hidden-accessible')
 | 
			
		||||
            .each(function () {
 | 
			
		||||
                $(this).val(null).trigger('change');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        // Desactivamos el modo lectura
 | 
			
		||||
        this.configureReadonlyMode(false);
 | 
			
		||||
 | 
			
		||||
        // Reconfiguramos el Offcanvas UI
 | 
			
		||||
        this.prepareOffcanvasUI(targetMode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Configura el texto y estilo de los botones de submit y reset
 | 
			
		||||
     * según el modo de Livewire.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} mode - 'create', 'edit' o 'delete'
 | 
			
		||||
     */
 | 
			
		||||
    configureButtons(mode) {
 | 
			
		||||
        const singularName = this.liveWireInstance.get('singularName');
 | 
			
		||||
 | 
			
		||||
        // Limpiar clases previas
 | 
			
		||||
        this.submitButtons.forEach(button => {
 | 
			
		||||
            button.classList.remove('btn-danger', 'btn-primary');
 | 
			
		||||
        });
 | 
			
		||||
        this.resetButtons.forEach(button => {
 | 
			
		||||
            button.classList.remove('btn-text-secondary', 'btn-label-secondary');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Configurar botón de submit según el modo
 | 
			
		||||
        this.submitButtons.forEach(button => {
 | 
			
		||||
            switch (mode) {
 | 
			
		||||
                case 'create':
 | 
			
		||||
                    button.classList.add('btn-primary');
 | 
			
		||||
                    button.textContent = `Crear ${singularName.toLowerCase()}`;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'edit':
 | 
			
		||||
                    button.classList.add('btn-primary');
 | 
			
		||||
                    button.textContent = `Guardar cambios`;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'delete':
 | 
			
		||||
                    button.classList.add('btn-danger');
 | 
			
		||||
                    button.textContent = `Eliminar ${singularName.toLowerCase()}`;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Configurar botones de reset según el modo
 | 
			
		||||
        this.resetButtons.forEach(button => {
 | 
			
		||||
            // Cambia la clase dependiendo si se trata de un modo 'delete' o no
 | 
			
		||||
            const buttonClass = (mode === 'delete') ? 'btn-text-secondary' : 'btn-label-secondary';
 | 
			
		||||
            button.classList.add(buttonClass);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Ajusta el título del Offcanvas según el modo y la propiedad configurada en Livewire.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {string} mode - 'create', 'edit' o 'delete'
 | 
			
		||||
     */
 | 
			
		||||
    configureTitle(mode) {
 | 
			
		||||
        if (!this.offcanvasTitleEl) return;
 | 
			
		||||
 | 
			
		||||
        const capitalizeFirstLetter =(str) => {
 | 
			
		||||
            return str.charAt(0).toUpperCase() + str.slice(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const singularName    = this.liveWireInstance.get('singularName');
 | 
			
		||||
        const columnNameLabel = this.liveWireInstance.get('columnNameLabel');
 | 
			
		||||
        const editName        = this.liveWireInstance.get(columnNameLabel);
 | 
			
		||||
 | 
			
		||||
        switch (mode) {
 | 
			
		||||
            case 'create':
 | 
			
		||||
                this.offcanvasTitleEl.innerHTML = `<i class="ti ti-plus ml-2"></i> ${capitalizeFirstLetter(singularName)} `;
 | 
			
		||||
                break;
 | 
			
		||||
            case 'edit':
 | 
			
		||||
                this.offcanvasTitleEl.innerHTML = `${editName} <i class="ti ti-lg ti-pencil ml-2 text-success"></i>`;
 | 
			
		||||
                break;
 | 
			
		||||
            case 'delete':
 | 
			
		||||
                this.offcanvasTitleEl.innerHTML = `${editName} <i class="ti ti-lg ti-eraser ml-2 text-danger"></i>`;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Configura el modo de solo lectura/edición en los campos del formulario.
 | 
			
		||||
     * Deshabilita inputs y maneja el "readonly" en checkboxes/radios.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {boolean} readOnly - true si queremos modo lectura, false para edición.
 | 
			
		||||
     */
 | 
			
		||||
    configureReadonlyMode(readOnly) {
 | 
			
		||||
        if (!this.formEl) return;
 | 
			
		||||
 | 
			
		||||
        const inputs = this.formEl.querySelectorAll('input, textarea, select');
 | 
			
		||||
 | 
			
		||||
        inputs.forEach(el => {
 | 
			
		||||
            // Saltar campos marcados como "data-always-enabled"
 | 
			
		||||
            if (el.hasAttribute('data-always-enabled')) return;
 | 
			
		||||
 | 
			
		||||
            // Para selects
 | 
			
		||||
            if (el.tagName === 'SELECT') {
 | 
			
		||||
                if ($(el).hasClass('select2-hidden-accessible')) {
 | 
			
		||||
                    // Deshabilitar select2
 | 
			
		||||
                    $(el).prop('disabled', readOnly).trigger('change.select2');
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.toggleSelectReadonly(el, readOnly);
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Para checkboxes / radios
 | 
			
		||||
            if (el.type === 'checkbox' || el.type === 'radio') {
 | 
			
		||||
                this.toggleCheckboxReadonly(el, readOnly);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Para inputs de texto / textarea
 | 
			
		||||
            el.readOnly = readOnly;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Alterna modo "readonly" en un checkbox/radio simulando la inhabilitación
 | 
			
		||||
     * sin marcarlo como 'disabled' (para mantener su apariencia).
 | 
			
		||||
     *
 | 
			
		||||
     * @param {HTMLElement} checkbox - Elemento checkbox o radio.
 | 
			
		||||
     * @param {boolean} enabled      - true si se quiere modo lectura, false en caso contrario.
 | 
			
		||||
     */
 | 
			
		||||
    toggleCheckboxReadonly(checkbox, enabled) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            checkbox.setAttribute('readonly-mode', 'true');
 | 
			
		||||
            checkbox.style.pointerEvents = 'none';
 | 
			
		||||
            checkbox.onclick = function (event) {
 | 
			
		||||
                event.preventDefault();
 | 
			
		||||
            };
 | 
			
		||||
        } else {
 | 
			
		||||
            checkbox.removeAttribute('readonly-mode');
 | 
			
		||||
            checkbox.style.pointerEvents = '';
 | 
			
		||||
            checkbox.onclick = null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Alterna modo "readonly" para un <select> convencional.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {HTMLElement} select - Elemento select.
 | 
			
		||||
     * @param {boolean} enabled    - true si queremos readonly, false si editable.
 | 
			
		||||
     */
 | 
			
		||||
    toggleSelectReadonly(select, enabled) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            select.setAttribute('readonly-mode', 'true');
 | 
			
		||||
            select.style.pointerEvents = 'none';
 | 
			
		||||
            select.tabIndex = -1;
 | 
			
		||||
        } else {
 | 
			
		||||
            select.removeAttribute('readonly-mode');
 | 
			
		||||
            select.style.pointerEvents = '';
 | 
			
		||||
            select.tabIndex = '';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Hace focus en el elemento con el selector dado.
 | 
			
		||||
     */
 | 
			
		||||
    focusOnOpen() {
 | 
			
		||||
        const focusSelector = this.liveWireInstance.get('focusOnOpen'); // Obtiene el selector de Livewire
 | 
			
		||||
 | 
			
		||||
        if (!focusSelector) return;
 | 
			
		||||
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
            // Buscar el elemento real en el DOM
 | 
			
		||||
            const focusElement = document.getElementById(focusSelector);
 | 
			
		||||
 | 
			
		||||
            // Si existe, hacer focus
 | 
			
		||||
            if (focusElement) {
 | 
			
		||||
                focusElement.focus();
 | 
			
		||||
            } else {
 | 
			
		||||
                console.warn(`Elemento no encontrado: ${focusSelector}`);
 | 
			
		||||
            }
 | 
			
		||||
        }, 250);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Limpia mensajes de error y la clase 'is-invalid' en el formulario.
 | 
			
		||||
     */
 | 
			
		||||
    clearErrors() {
 | 
			
		||||
        if (!this.formEl) return;
 | 
			
		||||
 | 
			
		||||
        // Remover mensajes de error en texto
 | 
			
		||||
        this.formEl.querySelectorAll('.text-danger').forEach(el => el.remove());
 | 
			
		||||
 | 
			
		||||
        // Remover la clase 'is-invalid' de los inputs afectados
 | 
			
		||||
        this.formEl.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));
 | 
			
		||||
 | 
			
		||||
        // Remover las notificaciones
 | 
			
		||||
        this.formEl.querySelectorAll('.notification-container').forEach(el => el.innerHTML = '');
 | 
			
		||||
 | 
			
		||||
        // Removemos el checkbox de confirmación de eliminar
 | 
			
		||||
        const confirmDeletion = this.formEl.querySelector('.confirm-deletion');
 | 
			
		||||
 | 
			
		||||
        if (confirmDeletion) {
 | 
			
		||||
            confirmDeletion.remove();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Exponemos la clase en window para acceso global (si fuese necesario)
 | 
			
		||||
window.FormCanvasHelper = FormCanvasHelper;
 | 
			
		||||
							
								
								
									
										245
									
								
								resources/assets/js/forms/formCustomListener.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								resources/assets/js/forms/formCustomListener.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,245 @@
 | 
			
		||||
export default class FormCustomListener {
 | 
			
		||||
    constructor(config = {}) {
 | 
			
		||||
        const defaultConfig = {
 | 
			
		||||
            formSelector: '.form-custom-listener', // Selector para formularios
 | 
			
		||||
            buttonSelectors: [], // Selectores específicos para botones
 | 
			
		||||
            callbacks: [], // Callbacks correspondientes a los botones específicos
 | 
			
		||||
            allowedInputTags: ['INPUT', 'SELECT', 'TEXTAREA'], // Tags permitidos para cambios
 | 
			
		||||
            validationConfig: null, // Nueva propiedad para la configuración de validación
 | 
			
		||||
            dispatchOnSubmit: null // Callback Livewire para disparar al enviar el formulario
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.config = { ...defaultConfig, ...config };
 | 
			
		||||
 | 
			
		||||
        // Aseguramos que los métodos que dependen de `this` estén vinculados al contexto correcto
 | 
			
		||||
        this.defaultButtonHandler = this.defaultButtonHandler.bind(this);
 | 
			
		||||
        this.formValidationInstance = null;
 | 
			
		||||
 | 
			
		||||
        this.initForms();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inicializa los formularios encontrados en el DOM.
 | 
			
		||||
     */
 | 
			
		||||
    initForms() {
 | 
			
		||||
        const forms = document.querySelectorAll(this.config.formSelector);
 | 
			
		||||
 | 
			
		||||
        if (forms.length === 0) {
 | 
			
		||||
            console.error(`No se encontraron formularios con el selector ${this.config.formSelector}.`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        forms.forEach(form => {
 | 
			
		||||
            if (form.dataset.initialized === 'true') {
 | 
			
		||||
                console.warn(`Formulario ya inicializado: ${form}`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.initFormEvents(form);
 | 
			
		||||
 | 
			
		||||
            // Si se pasó configuración de validación, inicialízala
 | 
			
		||||
            if (this.config.validationConfig) {
 | 
			
		||||
                this.initializeValidation(form);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            form.dataset.initialized = 'true'; // Marcar formulario como inicializado
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Configura los eventos para un formulario individual.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario que será manejado.
 | 
			
		||||
     */
 | 
			
		||||
    initFormEvents(form) {
 | 
			
		||||
        const buttons = this.getButtons(form);
 | 
			
		||||
 | 
			
		||||
        buttons.forEach(({ button, callback }, index) => {
 | 
			
		||||
            if (button) {
 | 
			
		||||
                button.addEventListener('click', () => {
 | 
			
		||||
                    this.handleButtonClick(index, form, buttons, callback);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        form.addEventListener('input', event =>
 | 
			
		||||
            this.handleInputChange(
 | 
			
		||||
                event,
 | 
			
		||||
                form,
 | 
			
		||||
                buttons.map(b => b.button)
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Obtiene los botones y sus callbacks según la configuración.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario del cual obtener botones.
 | 
			
		||||
     * @returns {Array} Array de objetos con { button, callback }.
 | 
			
		||||
     */
 | 
			
		||||
    getButtons(form) {
 | 
			
		||||
        const buttons = [];
 | 
			
		||||
 | 
			
		||||
        this.config.buttonSelectors.forEach((selector, index) => {
 | 
			
		||||
            const buttonList = Array.from(form.querySelectorAll(selector));
 | 
			
		||||
            const callback = this.config.callbacks[index];
 | 
			
		||||
 | 
			
		||||
            buttonList.forEach(button => {
 | 
			
		||||
                buttons.push({ button, callback });
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return buttons;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Maneja los cambios en los campos de entrada.
 | 
			
		||||
     * @param {Event} event - El evento del cambio.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario actual.
 | 
			
		||||
     * @param {HTMLElement[]} buttons - Array de botones en el formulario.
 | 
			
		||||
     */
 | 
			
		||||
    handleInputChange(event, form, buttons) {
 | 
			
		||||
        const target = event.target;
 | 
			
		||||
 | 
			
		||||
        if (['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {
 | 
			
		||||
            this.toggleButtonsState(buttons, true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Maneja el clic en un botón específico.
 | 
			
		||||
     * @param {number} index - Índice del botón.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario actual.
 | 
			
		||||
     * @param {Array} buttons - Array de objetos { button, callback }.
 | 
			
		||||
     * @param {function|null} callback - Callback definido para el botón.
 | 
			
		||||
     */
 | 
			
		||||
    handleButtonClick(index, form, buttons, callback) {
 | 
			
		||||
        if (typeof callback === 'function') {
 | 
			
		||||
            callback(
 | 
			
		||||
                form,
 | 
			
		||||
                buttons[index].button,
 | 
			
		||||
                buttons.map(b => b.button)
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            this.defaultButtonHandler(
 | 
			
		||||
                form,
 | 
			
		||||
                buttons[index].button,
 | 
			
		||||
                buttons.map(b => b.button)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Maneja la acción cuando el formulario es válido.
 | 
			
		||||
     * Este método puede ser sobreescrito para personalizar el comportamiento.
 | 
			
		||||
     */
 | 
			
		||||
    handleFormValid(form) {
 | 
			
		||||
        // Ejecutar callback opcional (si lo proporcionaste)
 | 
			
		||||
        if (typeof this.config.handleValidForm === 'function') {
 | 
			
		||||
            this.config.handleValidForm(form);
 | 
			
		||||
        } else if (this.config.dispatchOnSubmit) {
 | 
			
		||||
            this.handleValidForm(form);
 | 
			
		||||
        } else {
 | 
			
		||||
            form.submit();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Método que maneja la acción cuando el formulario es válido.
 | 
			
		||||
     * Al ser un método de la clase, no necesitamos usar bind.
 | 
			
		||||
     */
 | 
			
		||||
    handleValidForm(form) {
 | 
			
		||||
        const saveButton = form.querySelector('#save_website_button');
 | 
			
		||||
        const allButtons = Array.from(form.querySelectorAll('.btn'));
 | 
			
		||||
 | 
			
		||||
        this.toggleButtonsState(allButtons, false); // Deshabilitar todos los botones
 | 
			
		||||
        this.toggleFormFields(form, false); // Deshabilitar todos los campos del formulario
 | 
			
		||||
        this.setButtonLoadingState(saveButton, true); // Poner en estado de carga al botón anfitrión
 | 
			
		||||
 | 
			
		||||
        // Enviar la solicitud de Livewire correspondiente al enviar el formulario
 | 
			
		||||
        Livewire.dispatch(this.config.dispatchOnSubmit);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Manejador por defecto para los botones.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario actual.
 | 
			
		||||
     * @param {HTMLElement} hostButton - El botón anfitrión que disparó el evento.
 | 
			
		||||
     * @param {HTMLElement[]} allButtons - Todos los botones relevantes del formulario.
 | 
			
		||||
     */
 | 
			
		||||
    defaultButtonHandler(form, hostButton, allButtons) {
 | 
			
		||||
        this.toggleButtonsState(allButtons, false); // Deshabilitar todos los botones
 | 
			
		||||
        this.toggleFormFields(form, false); // Deshabilitar todos los campos del formulario
 | 
			
		||||
        this.setButtonLoadingState(hostButton, true); // Poner en estado de carga al botón anfitrión
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Deshabilita o habilita los campos del formulario.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario actual.
 | 
			
		||||
     * @param {boolean} isEnabled - Si los campos deben habilitarse.
 | 
			
		||||
     */
 | 
			
		||||
    toggleFormFields(form, isEnabled) {
 | 
			
		||||
        form.querySelectorAll('input, select, textarea').forEach(field => {
 | 
			
		||||
            field.disabled = !isEnabled;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Habilita o deshabilita los botones.
 | 
			
		||||
     * @param {HTMLElement[]} buttons - Array de botones.
 | 
			
		||||
     * @param {boolean} isEnabled - Si los botones deben habilitarse.
 | 
			
		||||
     */
 | 
			
		||||
    toggleButtonsState(buttons, isEnabled) {
 | 
			
		||||
        buttons.forEach(button => {
 | 
			
		||||
            if (button) button.disabled = !isEnabled;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Cambia el estado de carga de un botón.
 | 
			
		||||
     * @param {HTMLElement} button - Botón que se manejará.
 | 
			
		||||
     * @param {boolean} isLoading - Si el botón está en estado de carga.
 | 
			
		||||
     */
 | 
			
		||||
    setButtonLoadingState(button, isLoading) {
 | 
			
		||||
        if (!button) return;
 | 
			
		||||
 | 
			
		||||
        const loadingText = button.getAttribute('data-loading-text');
 | 
			
		||||
        if (loadingText && isLoading) {
 | 
			
		||||
            button.setAttribute('data-original-text', button.innerHTML);
 | 
			
		||||
            button.innerHTML = loadingText;
 | 
			
		||||
            button.disabled = true;
 | 
			
		||||
        } else if (!isLoading) {
 | 
			
		||||
            button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
 | 
			
		||||
            button.disabled = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inicializa la validación del formulario con la configuración proporcionada.
 | 
			
		||||
     * @param {HTMLElement} form - El formulario que va a ser validado.
 | 
			
		||||
     */
 | 
			
		||||
    initializeValidation(form) {
 | 
			
		||||
        if (this.config.validationConfig) {
 | 
			
		||||
            this.formValidationInstance = FormValidation.formValidation(form, this.config.validationConfig).on(
 | 
			
		||||
                'core.form.valid',
 | 
			
		||||
                () => this.handleFormValid(form)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reloadValidation() {
 | 
			
		||||
        const form = document.querySelector(this.config.formSelector);
 | 
			
		||||
 | 
			
		||||
        // Verificar si el formulario existe y si la validación está inicializada
 | 
			
		||||
        if (form && this.formValidationInstance) {
 | 
			
		||||
            try {
 | 
			
		||||
                // En lugar de destruir la validación, simplemente reiniciamos la validación.
 | 
			
		||||
                this.formValidationInstance.resetForm(); // Resetear el formulario, limpiando los errores
 | 
			
		||||
 | 
			
		||||
                // Reinicializar la validación con la configuración actual
 | 
			
		||||
                this.initializeValidation(form);
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
                console.error('Error al reiniciar la validación:', error);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            console.warn('Formulario no encontrado o instancia de validación no disponible.');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								resources/assets/js/layout/quicklinks-navbar.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								resources/assets/js/layout/quicklinks-navbar.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Quicklinks Navbar
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
$(function () {
 | 
			
		||||
    // Navbar Quicklinks with autosuggest (typeahead)
 | 
			
		||||
    const $dropdownShortcuts = $('.dropdown-shortcuts'),
 | 
			
		||||
        $dropdownShortcutsAdd = $('.dropdown-shortcuts-add'),
 | 
			
		||||
        $dropdownShortcutsRemove = $('.dropdown-shortcuts-remove');
 | 
			
		||||
 | 
			
		||||
    const route = document.documentElement.getAttribute('data-route');
 | 
			
		||||
 | 
			
		||||
    if ($dropdownShortcuts.length) {
 | 
			
		||||
        $dropdownShortcutsAdd.on('click', function () {
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: quicklinksUpdateUrl,
 | 
			
		||||
                method: 'POST',
 | 
			
		||||
                data: {
 | 
			
		||||
                    action: 'update',
 | 
			
		||||
                    route: route
 | 
			
		||||
                },
 | 
			
		||||
                headers: {
 | 
			
		||||
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 | 
			
		||||
                },
 | 
			
		||||
                success: function (response) {
 | 
			
		||||
                    location.reload();
 | 
			
		||||
                },
 | 
			
		||||
                error: function (xhr) {
 | 
			
		||||
                    console.error(xhr.responseJSON.message);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        $dropdownShortcutsRemove.on('click', function () {
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: quicklinksUpdateUrl,
 | 
			
		||||
                method: 'POST',
 | 
			
		||||
                data: {
 | 
			
		||||
                    action: 'remove',
 | 
			
		||||
                    route: route
 | 
			
		||||
                },
 | 
			
		||||
                headers: {
 | 
			
		||||
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 | 
			
		||||
                },
 | 
			
		||||
                success: function (response) {
 | 
			
		||||
                    location.reload();
 | 
			
		||||
                },
 | 
			
		||||
                error: function (xhr) {
 | 
			
		||||
                    console.error(xhr.responseJSON.message);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										201
									
								
								resources/assets/js/layout/search-navbar.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								resources/assets/js/layout/search-navbar.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,201 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Search Navbar
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
$(function () {
 | 
			
		||||
    window.Helpers.initSidebarToggle();
 | 
			
		||||
    // Toggle Universal Sidebar
 | 
			
		||||
 | 
			
		||||
    // Navbar Search with autosuggest (typeahead)
 | 
			
		||||
    var searchToggler = $('.search-toggler'),
 | 
			
		||||
        searchInputWrapper = $('.search-input-wrapper'),
 | 
			
		||||
        searchInput = $('.search-input'),
 | 
			
		||||
        contentBackdrop = $('.content-backdrop');
 | 
			
		||||
 | 
			
		||||
    // Open search input on click of search icon
 | 
			
		||||
    if (searchToggler.length) {
 | 
			
		||||
        searchToggler.on('click', function () {
 | 
			
		||||
            if (searchInputWrapper.length) {
 | 
			
		||||
                searchInputWrapper.toggleClass('d-none');
 | 
			
		||||
                searchInput.trigger('focus');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        document.addEventListener('keydown', function (event) {
 | 
			
		||||
            const ctrlKey = event.ctrlKey;
 | 
			
		||||
            const slashKey = event.key === '/'; // Usa 'key' para obtener la tecla como texto
 | 
			
		||||
 | 
			
		||||
            if (ctrlKey && slashKey) {
 | 
			
		||||
                const searchInputWrapper = document.querySelector('.search-input-wrapper');
 | 
			
		||||
                const searchInput = document.querySelector('.search-input');
 | 
			
		||||
 | 
			
		||||
                if (searchInputWrapper) {
 | 
			
		||||
                    searchInputWrapper.classList.toggle('d-none'); // Alterna la visibilidad
 | 
			
		||||
                    if (searchInput) {
 | 
			
		||||
                        searchInput.focus(); // Coloca el foco en el input
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Note: Following code is required to update container class of typeahead dropdown width on focus of search input. setTimeout is required to allow time to initiate Typeahead UI.
 | 
			
		||||
        setTimeout(function () {
 | 
			
		||||
            var twitterTypeahead = $('.twitter-typeahead');
 | 
			
		||||
 | 
			
		||||
            searchInput.on('focus', function () {
 | 
			
		||||
                if (searchInputWrapper.hasClass('container-xxl')) {
 | 
			
		||||
                    searchInputWrapper.find(twitterTypeahead).addClass('container-xxl');
 | 
			
		||||
                    twitterTypeahead.removeClass('container-fluid');
 | 
			
		||||
                } else if (searchInputWrapper.hasClass('container-fluid')) {
 | 
			
		||||
                    searchInputWrapper.find(twitterTypeahead).addClass('container-fluid');
 | 
			
		||||
                    twitterTypeahead.removeClass('container-xxl');
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }, 10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (searchInput.length) {
 | 
			
		||||
        // Función para normalizar cadenas (eliminar acentos)
 | 
			
		||||
        function normalizeString(str) {
 | 
			
		||||
            return str
 | 
			
		||||
                .normalize('NFD')
 | 
			
		||||
                .replace(/[\u0300-\u036f]/g, '')
 | 
			
		||||
                .toLowerCase();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Filter config con soporte para ignorar acentos
 | 
			
		||||
        var filterConfig = function (data) {
 | 
			
		||||
            return function findMatches(q, cb) {
 | 
			
		||||
                let matches = [];
 | 
			
		||||
 | 
			
		||||
                // Normalizar la consulta
 | 
			
		||||
                const normalizedQuery = normalizeString(q);
 | 
			
		||||
 | 
			
		||||
                data.filter(function (i) {
 | 
			
		||||
                    const normalizedName = normalizeString(i.name);
 | 
			
		||||
 | 
			
		||||
                    if (normalizedName.startsWith(normalizedQuery)) {
 | 
			
		||||
                        matches.push(i);
 | 
			
		||||
                    } else if (
 | 
			
		||||
                        !normalizedName.startsWith(normalizedQuery) &&
 | 
			
		||||
                        normalizedName.includes(normalizedQuery)
 | 
			
		||||
                    ) {
 | 
			
		||||
                        matches.push(i);
 | 
			
		||||
 | 
			
		||||
                        // Ordenar por coincidencia secundaria
 | 
			
		||||
                        matches.sort(function (a, b) {
 | 
			
		||||
                            return b.name < a.name ? 1 : -1;
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                cb(matches);
 | 
			
		||||
            };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // Search JSON
 | 
			
		||||
        var searchJson = 'search-navbar'; // For vertical layout
 | 
			
		||||
 | 
			
		||||
        if ($('#layout-menu').hasClass('menu-horizontal')) {
 | 
			
		||||
            var searchJson = 'search-navbar'; // For vertical layout
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Search API AJAX call
 | 
			
		||||
        var searchData = $.ajax({
 | 
			
		||||
            url: assetsPath + '../../admin/' + searchJson, //? Use your own search api instead
 | 
			
		||||
            dataType: 'json',
 | 
			
		||||
            async: false
 | 
			
		||||
        }).responseJSON;
 | 
			
		||||
 | 
			
		||||
        // Init typeahead on searchInput
 | 
			
		||||
        searchInput.each(function () {
 | 
			
		||||
            var $this = $(this);
 | 
			
		||||
 | 
			
		||||
            searchInput
 | 
			
		||||
                .typeahead(
 | 
			
		||||
                    {
 | 
			
		||||
                        hint: false,
 | 
			
		||||
                        classNames: {
 | 
			
		||||
                            menu: 'tt-menu navbar-search-suggestion',
 | 
			
		||||
                            cursor: 'active',
 | 
			
		||||
                            suggestion: 'suggestion d-flex justify-content-between px-4 py-2 w-100'
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    // Páginas
 | 
			
		||||
                    {
 | 
			
		||||
                        name: 'pages',
 | 
			
		||||
                        display: 'name',
 | 
			
		||||
                        limit: 8,
 | 
			
		||||
                        source: filterConfig(searchData.pages),
 | 
			
		||||
                        templates: {
 | 
			
		||||
                            header: '<h6 class="suggestions-header text-primary mb-0 mx-4 mt-3 pb-2">Páginas</h6>',
 | 
			
		||||
                            suggestion: function ({ url, icon, name }) {
 | 
			
		||||
                                return (
 | 
			
		||||
                                    '<a href="' +
 | 
			
		||||
                                    url +
 | 
			
		||||
                                    '">' +
 | 
			
		||||
                                    '<div>' +
 | 
			
		||||
                                    '<i class="ti ' +
 | 
			
		||||
                                    icon +
 | 
			
		||||
                                    ' me-2"></i>' +
 | 
			
		||||
                                    '<span class="align-middle">' +
 | 
			
		||||
                                    name +
 | 
			
		||||
                                    '</span>' +
 | 
			
		||||
                                    '</div>' +
 | 
			
		||||
                                    '</a>'
 | 
			
		||||
                                );
 | 
			
		||||
                            },
 | 
			
		||||
                            notFound:
 | 
			
		||||
                                '<div class="not-found px-4 py-2">' +
 | 
			
		||||
                                '<h6 class="suggestions-header text-primary mb-2">Páginas</h6>' +
 | 
			
		||||
                                '<p class="py-2 mb-0"><i class="ti ti-alert-circle ti-xs me-2"></i> No se encontro resultados</p>' +
 | 
			
		||||
                                '</div>'
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                )
 | 
			
		||||
                //On typeahead result render.
 | 
			
		||||
                .on('typeahead:render', function () {
 | 
			
		||||
                    // Show content backdrop,
 | 
			
		||||
                    contentBackdrop.addClass('show').removeClass('fade');
 | 
			
		||||
                })
 | 
			
		||||
                // On typeahead select
 | 
			
		||||
                .on('typeahead:select', function (ev, suggestion) {
 | 
			
		||||
                    // Open selected page
 | 
			
		||||
                    if (suggestion.url !== 'javascript:;') window.location = suggestion.url;
 | 
			
		||||
                })
 | 
			
		||||
                // On typeahead close
 | 
			
		||||
                .on('typeahead:close', function () {
 | 
			
		||||
                    // Clear search
 | 
			
		||||
                    searchInput.val('');
 | 
			
		||||
                    $this.typeahead('val', '');
 | 
			
		||||
 | 
			
		||||
                    // Hide search input wrapper
 | 
			
		||||
                    searchInputWrapper.addClass('d-none');
 | 
			
		||||
 | 
			
		||||
                    // Fade content backdrop
 | 
			
		||||
                    contentBackdrop.addClass('fade').removeClass('show');
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            // On searchInput keyup, Fade content backdrop if search input is blank
 | 
			
		||||
            searchInput.on('keyup', function () {
 | 
			
		||||
                if (searchInput.val() == '') contentBackdrop.addClass('fade').removeClass('show');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Init PerfectScrollbar in search result
 | 
			
		||||
        var psSearch;
 | 
			
		||||
 | 
			
		||||
        $('.navbar-search-suggestion').each(function () {
 | 
			
		||||
            psSearch = new PerfectScrollbar($(this)[0], {
 | 
			
		||||
                wheelPropagation: false,
 | 
			
		||||
                suppressScrollX: true
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        searchInput.on('keyup', function () {
 | 
			
		||||
            psSearch.update();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										375
									
								
								resources/assets/js/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										375
									
								
								resources/assets/js/main.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,375 @@
 | 
			
		||||
import './layout/quicklinks-navbar.js';
 | 
			
		||||
import './layout/search-navbar.js';
 | 
			
		||||
 | 
			
		||||
('use strict');
 | 
			
		||||
 | 
			
		||||
window.isRtl = window.Helpers.isRtl();
 | 
			
		||||
window.isDarkStyle = window.Helpers.isDarkStyle();
 | 
			
		||||
 | 
			
		||||
let menu,
 | 
			
		||||
    animate,
 | 
			
		||||
    isHorizontalLayout = false;
 | 
			
		||||
 | 
			
		||||
if (document.getElementById('layout-menu')) {
 | 
			
		||||
    isHorizontalLayout = document.getElementById('layout-menu').classList.contains('menu-horizontal');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
(function () {
 | 
			
		||||
    setTimeout(function () {
 | 
			
		||||
        window.Helpers.initCustomOptionCheck();
 | 
			
		||||
    }, 1000);
 | 
			
		||||
 | 
			
		||||
    if (typeof Waves !== 'undefined') {
 | 
			
		||||
        Waves.init();
 | 
			
		||||
        Waves.attach(
 | 
			
		||||
            ".btn[class*='btn-']:not(.position-relative):not([class*='btn-outline-']):not([class*='btn-label-'])",
 | 
			
		||||
            ['waves-light']
 | 
			
		||||
        );
 | 
			
		||||
        Waves.attach("[class*='btn-outline-']:not(.position-relative)");
 | 
			
		||||
        Waves.attach("[class*='btn-label-']:not(.position-relative)");
 | 
			
		||||
        Waves.attach('.pagination .page-item .page-link');
 | 
			
		||||
        Waves.attach('.dropdown-menu .dropdown-item');
 | 
			
		||||
        Waves.attach('.light-style .list-group .list-group-item-action');
 | 
			
		||||
        Waves.attach('.dark-style .list-group .list-group-item-action', ['waves-light']);
 | 
			
		||||
        Waves.attach('.nav-tabs:not(.nav-tabs-widget) .nav-item .nav-link');
 | 
			
		||||
        Waves.attach('.nav-pills .nav-item .nav-link', ['waves-light']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Initialize menu
 | 
			
		||||
    //-----------------
 | 
			
		||||
 | 
			
		||||
    let layoutMenuEl = document.querySelectorAll('#layout-menu');
 | 
			
		||||
    layoutMenuEl.forEach(function (element) {
 | 
			
		||||
        menu = new Menu(element, {
 | 
			
		||||
            orientation: isHorizontalLayout ? 'horizontal' : 'vertical',
 | 
			
		||||
            closeChildren: isHorizontalLayout ? true : false,
 | 
			
		||||
            // ? This option only works with Horizontal menu
 | 
			
		||||
            showDropdownOnHover: localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') // If value(showDropdownOnHover) is set in local storage
 | 
			
		||||
                ? localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') === 'true' // Use the local storage value
 | 
			
		||||
                : window.templateCustomizer !== undefined // If value is set in config.js
 | 
			
		||||
                  ? window.templateCustomizer.settings.defaultShowDropdownOnHover // Use the config.js value
 | 
			
		||||
                  : true // Use this if you are not using the config.js and want to set value directly from here
 | 
			
		||||
        });
 | 
			
		||||
        // Change parameter to true if you want scroll animation
 | 
			
		||||
        window.Helpers.scrollToActive((animate = false));
 | 
			
		||||
        window.Helpers.mainMenu = menu;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Initialize menu togglers and bind click on each
 | 
			
		||||
    let menuToggler = document.querySelectorAll('.layout-menu-toggle');
 | 
			
		||||
    menuToggler.forEach(item => {
 | 
			
		||||
        item.addEventListener('click', event => {
 | 
			
		||||
            event.preventDefault();
 | 
			
		||||
            window.Helpers.toggleCollapsed();
 | 
			
		||||
            // Enable menu state with local storage support if enableMenuLocalStorage = true from config.js
 | 
			
		||||
            if (config.enableMenuLocalStorage && !window.Helpers.isSmallScreen()) {
 | 
			
		||||
                try {
 | 
			
		||||
                    localStorage.setItem(
 | 
			
		||||
                        'templateCustomizer-' + templateName + '--LayoutCollapsed',
 | 
			
		||||
                        String(window.Helpers.isCollapsed())
 | 
			
		||||
                    );
 | 
			
		||||
                    // Update customizer checkbox state on click of menu toggler
 | 
			
		||||
                    let layoutCollapsedCustomizerOptions = document.querySelector(
 | 
			
		||||
                        '.template-customizer-layouts-options'
 | 
			
		||||
                    );
 | 
			
		||||
                    if (layoutCollapsedCustomizerOptions) {
 | 
			
		||||
                        let layoutCollapsedVal = window.Helpers.isCollapsed() ? 'collapsed' : 'expanded';
 | 
			
		||||
                        layoutCollapsedCustomizerOptions.querySelector(`input[value="${layoutCollapsedVal}"]`).click();
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (e) {}
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Menu swipe gesture
 | 
			
		||||
 | 
			
		||||
    // Detect swipe gesture on the target element and call swipe In
 | 
			
		||||
    window.Helpers.swipeIn('.drag-target', function (e) {
 | 
			
		||||
        window.Helpers.setCollapsed(false);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Detect swipe gesture on the target element and call swipe Out
 | 
			
		||||
    window.Helpers.swipeOut('#layout-menu', function (e) {
 | 
			
		||||
        if (window.Helpers.isSmallScreen()) window.Helpers.setCollapsed(true);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Display in main menu when menu scrolls
 | 
			
		||||
    let menuInnerContainer = document.getElementsByClassName('menu-inner'),
 | 
			
		||||
        menuInnerShadow = document.getElementsByClassName('menu-inner-shadow')[0];
 | 
			
		||||
    if (menuInnerContainer.length > 0 && menuInnerShadow) {
 | 
			
		||||
        menuInnerContainer[0].addEventListener('ps-scroll-y', function () {
 | 
			
		||||
            if (this.querySelector('.ps__thumb-y').offsetTop) {
 | 
			
		||||
                menuInnerShadow.style.display = 'block';
 | 
			
		||||
            } else {
 | 
			
		||||
                menuInnerShadow.style.display = 'none';
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Update light/dark image based on current style
 | 
			
		||||
    function switchImage(style) {
 | 
			
		||||
        if (style === 'system') {
 | 
			
		||||
            if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
 | 
			
		||||
                style = 'dark';
 | 
			
		||||
            } else {
 | 
			
		||||
                style = 'light';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        const switchImagesList = [].slice.call(document.querySelectorAll('[data-app-' + style + '-img]'));
 | 
			
		||||
        switchImagesList.map(function (imageEl) {
 | 
			
		||||
            const setImage = imageEl.getAttribute('data-app-' + style + '-img');
 | 
			
		||||
            imageEl.src = baseUrl + 'vendor/vuexy-admin/img/' + setImage; // Using window.assetsPath to get the exact relative path
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Style Switcher (Light/Dark/System Mode)
 | 
			
		||||
    let styleSwitcher = document.querySelector('.dropdown-style-switcher');
 | 
			
		||||
 | 
			
		||||
    // Active class on style switcher dropdown items
 | 
			
		||||
    const activeStyle = document.documentElement.getAttribute('data-style');
 | 
			
		||||
 | 
			
		||||
    // Get style from local storage or use 'system' as default
 | 
			
		||||
    let storedStyle =
 | 
			
		||||
        localStorage.getItem('templateCustomizer-' + templateName + '--Style') || //if no template style then use Customizer style
 | 
			
		||||
        (window.templateCustomizer?.settings?.defaultStyle ?? 'light'); //!if there is no Customizer then use default style as light
 | 
			
		||||
 | 
			
		||||
    // Set style on click of style switcher item if template customizer is enabled
 | 
			
		||||
    if (window.templateCustomizer && styleSwitcher) {
 | 
			
		||||
        let styleSwitcherItems = [].slice.call(styleSwitcher.children[1].querySelectorAll('.dropdown-item'));
 | 
			
		||||
        styleSwitcherItems.forEach(function (item) {
 | 
			
		||||
            item.classList.remove('active');
 | 
			
		||||
            item.addEventListener('click', function () {
 | 
			
		||||
                let currentStyle = this.getAttribute('data-theme');
 | 
			
		||||
                if (currentStyle === 'light') {
 | 
			
		||||
                    window.templateCustomizer.setStyle('light');
 | 
			
		||||
                } else if (currentStyle === 'dark') {
 | 
			
		||||
                    window.templateCustomizer.setStyle('dark');
 | 
			
		||||
                } else {
 | 
			
		||||
                    window.templateCustomizer.setStyle('system');
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            if (item.getAttribute('data-theme') === activeStyle) {
 | 
			
		||||
                // Add 'active' class to the item if it matches the activeStyle
 | 
			
		||||
                item.classList.add('active');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Update style switcher icon based on the stored style
 | 
			
		||||
 | 
			
		||||
        const styleSwitcherIcon = styleSwitcher.querySelector('i');
 | 
			
		||||
 | 
			
		||||
        if (storedStyle === 'light') {
 | 
			
		||||
            styleSwitcherIcon.classList.add('ti-sun');
 | 
			
		||||
            new bootstrap.Tooltip(styleSwitcherIcon, {
 | 
			
		||||
                title: 'Light Mode',
 | 
			
		||||
                fallbackPlacements: ['bottom']
 | 
			
		||||
            });
 | 
			
		||||
        } else if (storedStyle === 'dark') {
 | 
			
		||||
            styleSwitcherIcon.classList.add('ti-moon-stars');
 | 
			
		||||
            new bootstrap.Tooltip(styleSwitcherIcon, {
 | 
			
		||||
                title: 'Dark Mode',
 | 
			
		||||
                fallbackPlacements: ['bottom']
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            styleSwitcherIcon.classList.add('ti-device-desktop-analytics');
 | 
			
		||||
            new bootstrap.Tooltip(styleSwitcherIcon, {
 | 
			
		||||
                title: 'System Mode',
 | 
			
		||||
                fallbackPlacements: ['bottom']
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Run switchImage function based on the stored style
 | 
			
		||||
    switchImage(storedStyle);
 | 
			
		||||
 | 
			
		||||
    let languageDropdown = document.getElementsByClassName('dropdown-language');
 | 
			
		||||
 | 
			
		||||
    if (languageDropdown.length) {
 | 
			
		||||
        let dropdownItems = languageDropdown[0].querySelectorAll('.dropdown-item');
 | 
			
		||||
        const dropdownActiveItem = languageDropdown[0].querySelector('.dropdown-item.active');
 | 
			
		||||
 | 
			
		||||
        directionChange(dropdownActiveItem.dataset.textDirection);
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < dropdownItems.length; i++) {
 | 
			
		||||
            dropdownItems[i].addEventListener('click', function () {
 | 
			
		||||
                let textDirection = this.getAttribute('data-text-direction');
 | 
			
		||||
                window.templateCustomizer.setLang(this.getAttribute('data-language'));
 | 
			
		||||
                directionChange(textDirection);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        function directionChange(textDirection) {
 | 
			
		||||
            if (textDirection === 'rtl') {
 | 
			
		||||
                if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') !== 'true')
 | 
			
		||||
                    window.templateCustomizer ? window.templateCustomizer.setRtl(true) : '';
 | 
			
		||||
            } else {
 | 
			
		||||
                if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') === 'true')
 | 
			
		||||
                    window.templateCustomizer ? window.templateCustomizer.setRtl(false) : '';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // add on click javascript for template customizer reset button id template-customizer-reset-btn
 | 
			
		||||
 | 
			
		||||
    setTimeout(function () {
 | 
			
		||||
        let templateCustomizerResetBtn = document.querySelector('.template-customizer-reset-btn');
 | 
			
		||||
        if (templateCustomizerResetBtn) {
 | 
			
		||||
            templateCustomizerResetBtn.onclick = function () {
 | 
			
		||||
                window.location.href = baseUrl + 'lang/en';
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    }, 1500);
 | 
			
		||||
 | 
			
		||||
    // Notification
 | 
			
		||||
    // ------------
 | 
			
		||||
    const notificationMarkAsReadAll = document.querySelector('.dropdown-notifications-all');
 | 
			
		||||
    const notificationMarkAsReadList = document.querySelectorAll('.dropdown-notifications-read');
 | 
			
		||||
 | 
			
		||||
    // Notification: Mark as all as read
 | 
			
		||||
    if (notificationMarkAsReadAll) {
 | 
			
		||||
        notificationMarkAsReadAll.addEventListener('click', event => {
 | 
			
		||||
            notificationMarkAsReadList.forEach(item => {
 | 
			
		||||
                item.closest('.dropdown-notifications-item').classList.add('marked-as-read');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    // Notification: Mark as read/unread onclick of dot
 | 
			
		||||
    if (notificationMarkAsReadList) {
 | 
			
		||||
        notificationMarkAsReadList.forEach(item => {
 | 
			
		||||
            item.addEventListener('click', event => {
 | 
			
		||||
                item.closest('.dropdown-notifications-item').classList.toggle('marked-as-read');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Notification: Mark as read/unread onclick of dot
 | 
			
		||||
    const notificationArchiveMessageList = document.querySelectorAll('.dropdown-notifications-archive');
 | 
			
		||||
    notificationArchiveMessageList.forEach(item => {
 | 
			
		||||
        item.addEventListener('click', event => {
 | 
			
		||||
            item.closest('.dropdown-notifications-item').remove();
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Init helpers & misc
 | 
			
		||||
    // --------------------
 | 
			
		||||
 | 
			
		||||
    // Init BS Tooltip
 | 
			
		||||
    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
 | 
			
		||||
    tooltipTriggerList.map(function (tooltipTriggerEl) {
 | 
			
		||||
        return new bootstrap.Tooltip(tooltipTriggerEl);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Accordion active class
 | 
			
		||||
    const accordionActiveFunction = function (e) {
 | 
			
		||||
        if (e.type == 'show.bs.collapse' || e.type == 'show.bs.collapse') {
 | 
			
		||||
            e.target.closest('.accordion-item').classList.add('active');
 | 
			
		||||
        } else {
 | 
			
		||||
            e.target.closest('.accordion-item').classList.remove('active');
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const accordionTriggerList = [].slice.call(document.querySelectorAll('.accordion'));
 | 
			
		||||
    const accordionList = accordionTriggerList.map(function (accordionTriggerEl) {
 | 
			
		||||
        accordionTriggerEl.addEventListener('show.bs.collapse', accordionActiveFunction);
 | 
			
		||||
        accordionTriggerEl.addEventListener('hide.bs.collapse', accordionActiveFunction);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // If layout is RTL add .dropdown-menu-end class to .dropdown-menu
 | 
			
		||||
    // if (isRtl) {
 | 
			
		||||
    //   Helpers._addClass('dropdown-menu-end', document.querySelectorAll('#layout-navbar .dropdown-menu'));
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    // Auto update layout based on screen size
 | 
			
		||||
    window.Helpers.setAutoUpdate(true);
 | 
			
		||||
 | 
			
		||||
    // Toggle Password Visibility
 | 
			
		||||
    window.Helpers.initPasswordToggle();
 | 
			
		||||
 | 
			
		||||
    // Speech To Text
 | 
			
		||||
    window.Helpers.initSpeechToText();
 | 
			
		||||
 | 
			
		||||
    // Init PerfectScrollbar in Navbar Dropdown (i.e notification)
 | 
			
		||||
    window.Helpers.initNavbarDropdownScrollbar();
 | 
			
		||||
 | 
			
		||||
    let horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']");
 | 
			
		||||
    if (horizontalMenuTemplate) {
 | 
			
		||||
        // if screen size is small then set navbar fixed
 | 
			
		||||
        if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
            window.Helpers.setNavbarFixed('fixed');
 | 
			
		||||
        } else {
 | 
			
		||||
            window.Helpers.setNavbarFixed('');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // On window resize listener
 | 
			
		||||
    // -------------------------
 | 
			
		||||
    document.addEventListener(
 | 
			
		||||
        'resize',
 | 
			
		||||
        function (event) {
 | 
			
		||||
            // Hide open search input and set value blank
 | 
			
		||||
            if (window.innerWidth >= window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
                if (document.querySelector('.search-input-wrapper')) {
 | 
			
		||||
                    document.querySelector('.search-input-wrapper').classList.add('d-none');
 | 
			
		||||
                    document.querySelector('.search-input').value = '';
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // Horizontal Layout : Update menu based on window size
 | 
			
		||||
            if (horizontalMenuTemplate) {
 | 
			
		||||
                // if screen size is small then set navbar fixed
 | 
			
		||||
                if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
                    window.Helpers.setNavbarFixed('fixed');
 | 
			
		||||
                } else {
 | 
			
		||||
                    window.Helpers.setNavbarFixed('');
 | 
			
		||||
                }
 | 
			
		||||
                setTimeout(function () {
 | 
			
		||||
                    if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
                        if (document.getElementById('layout-menu')) {
 | 
			
		||||
                            if (document.getElementById('layout-menu').classList.contains('menu-horizontal')) {
 | 
			
		||||
                                menu.switchMenu('vertical');
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        if (document.getElementById('layout-menu')) {
 | 
			
		||||
                            if (document.getElementById('layout-menu').classList.contains('menu-vertical')) {
 | 
			
		||||
                                menu.switchMenu('horizontal');
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }, 100);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        true
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // Manage menu expanded/collapsed with templateCustomizer & local storage
 | 
			
		||||
    //------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    // If current layout is horizontal OR current window screen is small (overlay menu) than return from here
 | 
			
		||||
    if (isHorizontalLayout || window.Helpers.isSmallScreen()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // If current layout is vertical and current window screen is > small
 | 
			
		||||
 | 
			
		||||
    // Auto update menu collapsed/expanded based on the themeConfig
 | 
			
		||||
    if (typeof TemplateCustomizer !== 'undefined') {
 | 
			
		||||
        if (window.templateCustomizer.settings.defaultMenuCollapsed) {
 | 
			
		||||
            window.Helpers.setCollapsed(true, false);
 | 
			
		||||
        } else {
 | 
			
		||||
            window.Helpers.setCollapsed(false, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Manage menu expanded/collapsed state with local storage support If enableMenuLocalStorage = true in config.js
 | 
			
		||||
    if (typeof config !== 'undefined') {
 | 
			
		||||
        if (config.enableMenuLocalStorage) {
 | 
			
		||||
            try {
 | 
			
		||||
                if (localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') !== null)
 | 
			
		||||
                    window.Helpers.setCollapsed(
 | 
			
		||||
                        localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') === 'true',
 | 
			
		||||
                        false
 | 
			
		||||
                    );
 | 
			
		||||
            } catch (e) {}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
							
								
								
									
										133
									
								
								resources/assets/js/maps/LeafletMapHelper.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								resources/assets/js/maps/LeafletMapHelper.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,133 @@
 | 
			
		||||
import './../../vendor/libs/leaflet/leaflet'
 | 
			
		||||
 | 
			
		||||
export const LeafletMapHelper = (() => {
 | 
			
		||||
    let mapInstance, markerInstance;
 | 
			
		||||
 | 
			
		||||
    const DEFAULT_COORDS = [19.4326, -99.1332]; // Coordenadas de CDMX por defecto
 | 
			
		||||
 | 
			
		||||
    // Valida coordenadas
 | 
			
		||||
    const isValidCoordinate = (lat, lng) => {
 | 
			
		||||
        return lat && !isNaN(lat) && lat >= -90 && lat <= 90 && lat !== 0 &&
 | 
			
		||||
               lng && !isNaN(lng) && lng >= -180 && lng <= 180 && lng !== 0;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Crea opciones del mapa según el modo
 | 
			
		||||
    const getMapOptions = (mode) => ({
 | 
			
		||||
        scrollWheelZoom: mode !== 'delete',
 | 
			
		||||
        dragging: mode !== 'delete',
 | 
			
		||||
        doubleClickZoom: mode !== 'delete',
 | 
			
		||||
        boxZoom: mode !== 'delete',
 | 
			
		||||
        keyboard: mode !== 'delete',
 | 
			
		||||
        zoomControl: mode !== 'delete',
 | 
			
		||||
        touchZoom: mode !== 'delete'
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Destruir el mapa existente
 | 
			
		||||
    const destroyMap = () => {
 | 
			
		||||
        if (mapInstance) {
 | 
			
		||||
            mapInstance.off();
 | 
			
		||||
            mapInstance.remove();
 | 
			
		||||
            mapInstance = null;
 | 
			
		||||
        }
 | 
			
		||||
        removeMarker();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Crear marcador en el mapa
 | 
			
		||||
    const createMarker = (lat, lng, draggable = false, onDragEnd) => {
 | 
			
		||||
        if (isValidCoordinate(lat, lng)) {
 | 
			
		||||
            markerInstance = L.marker([lat, lng], { draggable }).addTo(mapInstance)
 | 
			
		||||
                .bindPopup('<b>Ubicación seleccionada</b>').openPopup();
 | 
			
		||||
 | 
			
		||||
            if (draggable && onDragEnd) {
 | 
			
		||||
                markerInstance.on('dragend', (e) => {
 | 
			
		||||
                    const { lat, lng } = e.target.getLatLng();
 | 
			
		||||
                    onDragEnd(lat, lng);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Eliminar marcador
 | 
			
		||||
    const removeMarker = () => {
 | 
			
		||||
        if (markerInstance) {
 | 
			
		||||
            markerInstance.remove();
 | 
			
		||||
            markerInstance = null;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Actualizar coordenadas en formulario
 | 
			
		||||
    const updateCoordinates = (lat, lng, latSelector, lngSelector, livewireInstance) => {
 | 
			
		||||
        const latInput = document.querySelector(latSelector);
 | 
			
		||||
        const lngInput = document.querySelector(lngSelector);
 | 
			
		||||
 | 
			
		||||
        if (!latInput || !lngInput) {
 | 
			
		||||
            console.warn(`⚠️ No se encontró el elemento del DOM para latitud (${latSelector}) o longitud (${lngSelector})`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        latInput.value = lat ? lat.toFixed(6) : '';
 | 
			
		||||
        lngInput.value = lng ? lng.toFixed(6) : '';
 | 
			
		||||
 | 
			
		||||
        if (livewireInstance) {
 | 
			
		||||
            livewireInstance.lat = lat ? lat.toFixed(6) : null;
 | 
			
		||||
            livewireInstance.lng = lng ? lng.toFixed(6) : null;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Inicializar el mapa
 | 
			
		||||
    const initializeMap = (locationInputs, mode = 'create', livewireInstance = null) => {
 | 
			
		||||
        const mapElement = document.getElementById(locationInputs.mapId);
 | 
			
		||||
 | 
			
		||||
        if (!mapElement) {
 | 
			
		||||
            console.error(`❌ No se encontró el contenedor del mapa con ID: ${locationInputs.mapId}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let latElement = document.querySelector(locationInputs.lat);
 | 
			
		||||
        let lngElement = document.querySelector(locationInputs.lng);
 | 
			
		||||
 | 
			
		||||
        if (!latElement || !lngElement) {
 | 
			
		||||
            console.error(`❌ No se encontraron los campos de latitud (${locationInputs.lat}) o longitud (${locationInputs.lng})`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let lat = parseFloat(latElement.value);
 | 
			
		||||
        let lng = parseFloat(lngElement.value);
 | 
			
		||||
 | 
			
		||||
        const mapCoords = isValidCoordinate(lat, lng) ? [lat, lng] : DEFAULT_COORDS;
 | 
			
		||||
        const zoomLevel = isValidCoordinate(lat, lng) ? 16 : 13;
 | 
			
		||||
 | 
			
		||||
        if (mapInstance) destroyMap();
 | 
			
		||||
 | 
			
		||||
        mapInstance = L.map(locationInputs.mapId, getMapOptions(mode)).setView(mapCoords, zoomLevel);
 | 
			
		||||
        L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(mapInstance);
 | 
			
		||||
 | 
			
		||||
        if (mode !== 'create') createMarker(lat, lng, mode === 'edit', (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance));
 | 
			
		||||
 | 
			
		||||
        if (mode !== 'delete') {
 | 
			
		||||
            mapInstance.on('click', (e) => {
 | 
			
		||||
                const { lat, lng } = e.latlng;
 | 
			
		||||
                removeMarker();
 | 
			
		||||
                createMarker(lat, lng, true, (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance));
 | 
			
		||||
                updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
        const btnClearElement = document.querySelector(locationInputs.btnClear);
 | 
			
		||||
 | 
			
		||||
        if(!btnClearElement){
 | 
			
		||||
            console.error(`❌ No se encontró el botón de limpiar con ID: ${locationInputs.btnClear}`);return;
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        initializeMap,
 | 
			
		||||
        clearCoordinates: () => {
 | 
			
		||||
            removeMarker();
 | 
			
		||||
        },
 | 
			
		||||
    };
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
window.LeafletMapHelper = LeafletMapHelper;
 | 
			
		||||
							
								
								
									
										12
									
								
								resources/assets/js/maps/LocationIQSearchHelper.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								resources/assets/js/maps/LocationIQSearchHelper.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
export class LocationIQSearchHelper {
 | 
			
		||||
    constructor(apiKey) {
 | 
			
		||||
        this.apiKey = apiKey;
 | 
			
		||||
        this.baseUrl = 'https://us1.locationiq.com/v1/search.php';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async searchAddress(query) {
 | 
			
		||||
        const response = await fetch(`${this.baseUrl}?key=${this.apiKey}&q=${query}&format=json`);
 | 
			
		||||
        if (!response.ok) throw new Error('Error al buscar la dirección');
 | 
			
		||||
        return await response.json();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										207
									
								
								resources/assets/js/notifications/LivewireNotification.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								resources/assets/js/notifications/LivewireNotification.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,207 @@
 | 
			
		||||
export default class LivewireNotification {
 | 
			
		||||
    constructor(config = {}) {
 | 
			
		||||
        const defaultConfig = {
 | 
			
		||||
            delay: 9000, // Tiempo predeterminado para las notificaciones
 | 
			
		||||
            onNotificationShown: null, // Callback al mostrar una notificación
 | 
			
		||||
            onNotificationRemoved: null, // Callback al eliminar una notificación
 | 
			
		||||
            onNotificationClosed: null // Callback al cerrar una notificación mediante botón
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.config = { ...defaultConfig, ...config };
 | 
			
		||||
        this.initLivewireNotification();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inicializa la escucha de notificaciones desde Livewire.
 | 
			
		||||
     */
 | 
			
		||||
    initLivewireNotification() {
 | 
			
		||||
        // Mostrar notificación almacenada después de la recarga
 | 
			
		||||
        const storedNotification = localStorage.getItem('pendingNotification');
 | 
			
		||||
 | 
			
		||||
        if (storedNotification) {
 | 
			
		||||
            const event = JSON.parse(storedNotification);
 | 
			
		||||
            this.showStoredNotification(event);
 | 
			
		||||
            localStorage.removeItem('pendingNotification'); // Limpiar después de mostrar
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Escuchar nuevas notificaciones desde Livewire
 | 
			
		||||
        Livewire.on('notification', event => {
 | 
			
		||||
            if (event.deferReload) {
 | 
			
		||||
                // Guardar la notificación en localStorage para mostrar después de la recarga
 | 
			
		||||
                localStorage.setItem('pendingNotification', JSON.stringify(event));
 | 
			
		||||
 | 
			
		||||
                window.location.reload();
 | 
			
		||||
            } else {
 | 
			
		||||
                // Mostrar la notificación inmediatamente
 | 
			
		||||
                this.showNotification(event);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Escuchar evento personalizado para almacenar la notificación en localStorage
 | 
			
		||||
        document.addEventListener('store-notification', (event) => {
 | 
			
		||||
            const notification = {
 | 
			
		||||
                type: event.detail.type || 'info',
 | 
			
		||||
                message: event.detail.message || 'Notificación',
 | 
			
		||||
                delay: event.detail.delay || 5000,
 | 
			
		||||
                target: event.detail.target || 'body'
 | 
			
		||||
            };
 | 
			
		||||
            localStorage.setItem('pendingNotification', JSON.stringify(notification));
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Método para emitir notificaciones desde JavaScript.
 | 
			
		||||
     * @param {Object} options - Opciones de la notificación.
 | 
			
		||||
     * @param {Function} callback - Callback opcional que se ejecutará después de mostrar la notificación.
 | 
			
		||||
     * @param {number} customTimeout - Timeout personalizado (opcional).
 | 
			
		||||
     */
 | 
			
		||||
    emitNotification(options, callback, customTimeout) {
 | 
			
		||||
        const event = {
 | 
			
		||||
            target: options.target || 'body',
 | 
			
		||||
            message: options.message || 'Notificación',
 | 
			
		||||
            type: options.type || 'info',
 | 
			
		||||
            deferReload: options.deferReload || false,
 | 
			
		||||
            delay: customTimeout || options.delay || this.config.delay // Usar el timeout personalizado o el predeterminado
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // Mostrar la notificación
 | 
			
		||||
        this.showNotification(event);
 | 
			
		||||
 | 
			
		||||
        // Ejecutar callback si está definido
 | 
			
		||||
        if (typeof callback === 'function') {
 | 
			
		||||
            callback(event);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Muestra una notificación almacenada.
 | 
			
		||||
     * @param {Object} event - Datos del evento de notificación.
 | 
			
		||||
     */
 | 
			
		||||
    showStoredNotification(event) {
 | 
			
		||||
        this.showNotification(event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Muestra una notificación.
 | 
			
		||||
     * @param {Object} event - Datos del evento de notificación.
 | 
			
		||||
     */
 | 
			
		||||
    showNotification(event) {
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
            const targetElement = document.querySelector(event.target);
 | 
			
		||||
 | 
			
		||||
            if (!targetElement) {
 | 
			
		||||
                console.error(`Target ${event.target} no encontrado. Mostrando en el contenedor global.`);
 | 
			
		||||
 | 
			
		||||
                this.showInGlobalContainer(event);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Crear un contenedor para notificaciones si no existe
 | 
			
		||||
            if (!targetElement.querySelector('.notification-container')) {
 | 
			
		||||
                const container = document.createElement('div');
 | 
			
		||||
 | 
			
		||||
                container.className = 'notification-container';
 | 
			
		||||
                targetElement.appendChild(container);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const notificationContainer = targetElement.querySelector('.notification-container');
 | 
			
		||||
            const notificationElement = this.renderNotification(notificationContainer, event);
 | 
			
		||||
 | 
			
		||||
            // Callback opcional al mostrar la notificación
 | 
			
		||||
            if (typeof this.config.onNotificationShown === 'function') {
 | 
			
		||||
                this.config.onNotificationShown(notificationElement, event);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Configurar el timeout para eliminar la notificación
 | 
			
		||||
            this.setdelay(notificationElement, event);
 | 
			
		||||
 | 
			
		||||
            // Configurar el evento para el botón de cierre
 | 
			
		||||
            this.setupCloseButton(notificationElement, event);
 | 
			
		||||
        }, 5);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Renderiza una notificación en el contenedor global (body).
 | 
			
		||||
     * @param {Object} event - Datos del evento de notificación.
 | 
			
		||||
     */
 | 
			
		||||
    showInGlobalContainer(event) {
 | 
			
		||||
        const globalContainer = document.body;
 | 
			
		||||
        if (!globalContainer.querySelector('.notification-container')) {
 | 
			
		||||
            const container = document.createElement('div');
 | 
			
		||||
 | 
			
		||||
            container.className = 'notification-container';
 | 
			
		||||
            globalContainer.appendChild(container);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const notificationContainer = globalContainer.querySelector('.notification-container');
 | 
			
		||||
        const notificationElement = this.renderNotification(notificationContainer, event);
 | 
			
		||||
 | 
			
		||||
        if (typeof this.config.onNotificationShown === 'function') {
 | 
			
		||||
            this.config.onNotificationShown(notificationElement, event);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.setdelay(notificationElement, event);
 | 
			
		||||
        this.setupCloseButton(notificationElement, event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Renderiza una notificación en el contenedor.
 | 
			
		||||
     * @param {HTMLElement} container - Contenedor de notificaciones.
 | 
			
		||||
     * @param {Object} event - Evento de notificación con tipo y mensaje.
 | 
			
		||||
     * @returns {HTMLElement} - Elemento de la notificación recién creada.
 | 
			
		||||
     */
 | 
			
		||||
    renderNotification(container, event) {
 | 
			
		||||
        const notificationElement = document.createElement('div');
 | 
			
		||||
 | 
			
		||||
        notificationElement.className = `alert alert-${event.type} alert-dismissible fade show`;
 | 
			
		||||
        notificationElement.role = 'alert';
 | 
			
		||||
        notificationElement.innerHTML = `${event.message} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>`;
 | 
			
		||||
 | 
			
		||||
        container.appendChild(notificationElement);
 | 
			
		||||
 | 
			
		||||
        return notificationElement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Configura un timeout para limpiar una notificación específica.
 | 
			
		||||
     * @param {HTMLElement} notificationElement - Elemento de la notificación.
 | 
			
		||||
     * @param {Object} event - Evento asociado a la notificación.
 | 
			
		||||
     */
 | 
			
		||||
    setdelay(notificationElement, event) {
 | 
			
		||||
        const timeout = event.delay || this.config.delay;
 | 
			
		||||
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
            if (notificationElement && notificationElement.parentElement) {
 | 
			
		||||
                notificationElement.remove();
 | 
			
		||||
 | 
			
		||||
                // Callback opcional al eliminar la notificación
 | 
			
		||||
                if (typeof this.config.onNotificationRemoved === 'function') {
 | 
			
		||||
                    this.config.onNotificationRemoved(notificationElement, event);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }, timeout);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Configura el cierre manual de una notificación mediante el botón "Cerrar".
 | 
			
		||||
     * @param {HTMLElement} notificationElement - Elemento de la notificación.
 | 
			
		||||
     * @param {Object} event - Evento asociado a la notificación.
 | 
			
		||||
     */
 | 
			
		||||
    setupCloseButton(notificationElement, event) {
 | 
			
		||||
        const closeButton = notificationElement.querySelector('.btn-close');
 | 
			
		||||
        if (closeButton) {
 | 
			
		||||
            closeButton.addEventListener('click', () => {
 | 
			
		||||
                notificationElement.remove();
 | 
			
		||||
 | 
			
		||||
                // Callback opcional al cerrar la notificación manualmente
 | 
			
		||||
                if (typeof this.config.onNotificationClosed === 'function') {
 | 
			
		||||
                    this.config.onNotificationClosed(notificationElement, event);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(!window.livewireNotification) {
 | 
			
		||||
    window.livewireNotification = new LivewireNotification();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2090
									
								
								resources/assets/vendor/fonts/bootstrap-icons.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2090
									
								
								resources/assets/vendor/fonts/bootstrap-icons.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										7
									
								
								resources/assets/vendor/fonts/fontawesome.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/fonts/fontawesome.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
$fa-font-path: 'fontawesome';
 | 
			
		||||
$fa-font-size-base: 16px;
 | 
			
		||||
 | 
			
		||||
@import '@fortawesome/fontawesome-free/scss/fontawesome';
 | 
			
		||||
@import '@fortawesome/fontawesome-free/scss/regular';
 | 
			
		||||
@import '@fortawesome/fontawesome-free/scss/solid';
 | 
			
		||||
@import '@fortawesome/fontawesome-free/scss/brands';
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										21294
									
								
								resources/assets/vendor/fonts/tabler-icons.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21294
									
								
								resources/assets/vendor/fonts/tabler-icons.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.eot
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.eot
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										6384
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.svg
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6384
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.svg
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 After Width: | Height: | Size: 5.4 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.ttf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.woff
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.woff
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/fonts/tabler/tabler-icons.woff2
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										101
									
								
								resources/assets/vendor/js/_template-customizer/_template-customizer.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								resources/assets/vendor/js/_template-customizer/_template-customizer.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
<div id="template-customizer" class="bg-card">
 | 
			
		||||
  <a href="javascript:void(0)" class="template-customizer-open-btn" tabindex="-1"></a>
 | 
			
		||||
 | 
			
		||||
  <div class="p-6 m-0 lh-1 border-bottom template-customizer-header position-relative py-4">
 | 
			
		||||
    <h6 class="template-customizer-t-panel_header mb-1"></h6>
 | 
			
		||||
    <p class="template-customizer-t-panel_sub_header mb-0 small"></p>
 | 
			
		||||
    <div class="d-flex align-items-center gap-2 position-absolute end-0 top-0 mt-6 me-5">
 | 
			
		||||
      <a
 | 
			
		||||
        href="javascript:void(0)"
 | 
			
		||||
        class="template-customizer-reset-btn text-heading"
 | 
			
		||||
        data-bs-toggle="tooltip"
 | 
			
		||||
        data-bs-placement="bottom"
 | 
			
		||||
        title="Reset Customizer"
 | 
			
		||||
        ><i class="ti ti-refresh ti-lg"></i
 | 
			
		||||
        ><span class="badge rounded-pill bg-danger badge-dot badge-notifications d-none"></span
 | 
			
		||||
      ></a>
 | 
			
		||||
      <a href="javascript:void(0)" class="template-customizer-close-btn fw-light text-heading" tabindex="-1">
 | 
			
		||||
        <i class="ti ti-x ti-lg"></i>
 | 
			
		||||
      </a>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div class="template-customizer-inner pt-6">
 | 
			
		||||
    <!-- Theming -->
 | 
			
		||||
    <div class="template-customizer-theming">
 | 
			
		||||
      <h5 class="m-0 px-6 py-6">
 | 
			
		||||
        <span class="template-customizer-t-theming_header bg-label-primary rounded-1 py-1 px-3 small"></span>
 | 
			
		||||
      </h5>
 | 
			
		||||
 | 
			
		||||
      <!-- Style -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 template-customizer-style w-100">
 | 
			
		||||
        <label for="customizerStyle" class="form-label d-block template-customizer-t-style_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-styles-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- Themes -->
 | 
			
		||||
      <div class="m-0 px-6 template-customizer-themes w-100">
 | 
			
		||||
        <label for="customizerTheme" class="form-label template-customizer-t-theme_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-themes-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <!--/ Theming -->
 | 
			
		||||
 | 
			
		||||
    <!-- Layout -->
 | 
			
		||||
    <div class="template-customizer-layout">
 | 
			
		||||
      <hr class="m-0 px-6 my-6" />
 | 
			
		||||
      <h5 class="m-0 px-6 pb-6">
 | 
			
		||||
        <span class="template-customizer-t-layout_header bg-label-primary rounded-2 py-1 px-3 small"></span>
 | 
			
		||||
      </h5>
 | 
			
		||||
 | 
			
		||||
      <!-- Layout(Menu) -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 d-block template-customizer-layouts">
 | 
			
		||||
        <label for="customizerStyle" class="form-label d-block template-customizer-t-layout_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-layouts-options">
 | 
			
		||||
          <!--? Uncomment If using offcanvas layout -->
 | 
			
		||||
          <!-- <div class="col-12">
 | 
			
		||||
            <div class="form-check">
 | 
			
		||||
              <input class="form-check-input" type="radio" name="layoutRadios" id="layoutRadios-offcanvas"
 | 
			
		||||
                value="static-offcanvas">
 | 
			
		||||
              <label class="form-check-label template-customizer-t-layout_offcanvas"
 | 
			
		||||
                for="layoutRadios-offcanvas"></label>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div> -->
 | 
			
		||||
          <!-- <div class="col-12">
 | 
			
		||||
            <div class="form-check">
 | 
			
		||||
              <input class="form-check-input" type="radio" name="layoutRadios" id="layoutRadios-fixed_offcanvas"
 | 
			
		||||
                value="fixed-offcanvas">
 | 
			
		||||
              <label class="form-check-label template-customizer-t-layout_fixed_offcanvas"
 | 
			
		||||
                for="layoutRadios-fixed_offcanvas"></label>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div> -->
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- Header Options for Horizontal -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 template-customizer-headerOptions w-100">
 | 
			
		||||
        <label for="customizerHeader" class="form-label template-customizer-t-layout_header_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-header-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- Fixed navbar -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 template-customizer-layoutNavbarOptions w-100">
 | 
			
		||||
        <label for="customizerNavbar" class="form-label template-customizer-t-layout_navbar_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-navbar-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- Content -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 template-customizer-content w-100">
 | 
			
		||||
        <label for="customizerContent" class="form-label template-customizer-t-content_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-content-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- Directions -->
 | 
			
		||||
      <div class="m-0 px-6 pb-6 template-customizer-directions w-100">
 | 
			
		||||
        <label for="customizerDirection" class="form-label template-customizer-t-direction_label mb-2"></label>
 | 
			
		||||
        <div class="row px-1 template-customizer-directions-options"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <!--/ Layout -->
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
							
								
								
									
										342
									
								
								resources/assets/vendor/js/_template-customizer/_template-customizer.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								resources/assets/vendor/js/_template-customizer/_template-customizer.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,342 @@
 | 
			
		||||
/*
 | 
			
		||||
* Template Customizer Style
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
$customizer-width: 400px;
 | 
			
		||||
$customizer-width-sm: 300px;
 | 
			
		||||
$customizer-hide-width: 1200px;
 | 
			
		||||
$customizer-spacer: 20px;
 | 
			
		||||
$customizer-font-size: inherit;
 | 
			
		||||
 | 
			
		||||
$open-btn-size: 38px;
 | 
			
		||||
$open-btn-spacer: 0;
 | 
			
		||||
$open-btn-font-size: 18px;
 | 
			
		||||
$open-btn-top: 180px;
 | 
			
		||||
$open-btn-top-md: 145px;
 | 
			
		||||
 | 
			
		||||
$open-btn-bg: var(--bs-primary);
 | 
			
		||||
$open-btn-bg-dark: var(--bs-primary);
 | 
			
		||||
$open-btn-color: #fff;
 | 
			
		||||
$open-btn-border-radius: 0.375rem;
 | 
			
		||||
$open-customizer-primary-color: var(--bs-primary);
 | 
			
		||||
 | 
			
		||||
#template-customizer {
 | 
			
		||||
  font-family: 'Public Sans', BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif,
 | 
			
		||||
    'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' !important;
 | 
			
		||||
  font-size: $customizer-font-size !important;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  right: 0;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  z-index: 99999999;
 | 
			
		||||
  display: -webkit-box;
 | 
			
		||||
  display: -ms-flexbox;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  -webkit-box-orient: vertical;
 | 
			
		||||
  -webkit-box-direction: normal;
 | 
			
		||||
  -ms-flex-direction: column;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  width: $customizer-width;
 | 
			
		||||
  -webkit-box-shadow: 0px 5px 30px 0px rgba(47, 43, 61, 0.18);
 | 
			
		||||
  box-shadow: 0px 5px 30px 0px rgba(47, 43, 61, 0.18);
 | 
			
		||||
  -webkit-transition: all 0.2s ease-in;
 | 
			
		||||
  -o-transition: all 0.2s ease-in;
 | 
			
		||||
  transition: all 0.2s ease-in;
 | 
			
		||||
  -webkit-transform: translateX($customizer-width + $customizer-spacer);
 | 
			
		||||
  -ms-transform: translateX($customizer-width + $customizer-spacer);
 | 
			
		||||
  transform: translateX($customizer-width + $customizer-spacer);
 | 
			
		||||
 | 
			
		||||
  .dark-style & {
 | 
			
		||||
    -webkit-box-shadow: 0px 5px 30px 0px rgba(19, 17, 32, 0.24);
 | 
			
		||||
    box-shadow: 0px 5px 30px 0px rgba(19, 17, 32, 0.24);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  h5 {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  > h5 {
 | 
			
		||||
    flex: 0 0 auto;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .disabled {
 | 
			
		||||
    color: #d1d2d3 !important;
 | 
			
		||||
  }
 | 
			
		||||
  .form-label {
 | 
			
		||||
    font-size: 0.9375rem;
 | 
			
		||||
  }
 | 
			
		||||
  .form-check-label {
 | 
			
		||||
    font-size: 0.8125rem;
 | 
			
		||||
  }
 | 
			
		||||
  &.template-customizer-open {
 | 
			
		||||
    -webkit-transition-delay: 0.1s;
 | 
			
		||||
    -o-transition-delay: 0.1s;
 | 
			
		||||
    transition-delay: 0.1s;
 | 
			
		||||
    -webkit-transform: none !important;
 | 
			
		||||
    -ms-transform: none !important;
 | 
			
		||||
    transform: none !important;
 | 
			
		||||
 | 
			
		||||
    .custom-option.checked {
 | 
			
		||||
      color: $open-customizer-primary-color;
 | 
			
		||||
      border-width: 2px;
 | 
			
		||||
      margin: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .template-customizer-header {
 | 
			
		||||
    a:hover {
 | 
			
		||||
      color: inherit !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Customizer button
 | 
			
		||||
 | 
			
		||||
  .template-customizer-open-btn {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: $open-btn-top;
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 991.98px) {
 | 
			
		||||
      top: $open-btn-top-md;
 | 
			
		||||
    }
 | 
			
		||||
    left: 0;
 | 
			
		||||
    z-index: -1;
 | 
			
		||||
    display: block;
 | 
			
		||||
    width: $open-btn-size;
 | 
			
		||||
    height: $open-btn-size;
 | 
			
		||||
    border-top-left-radius: $open-btn-border-radius;
 | 
			
		||||
    border-bottom-left-radius: $open-btn-border-radius;
 | 
			
		||||
    background: $open-btn-bg;
 | 
			
		||||
    box-shadow: 0px 2px 6px 0px rgba(115, 103, 240, 0.3);
 | 
			
		||||
    color: $open-btn-color !important;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    font-size: $open-btn-font-size !important;
 | 
			
		||||
    line-height: $open-btn-size;
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    -webkit-transition: all 0.1s linear 0.2s;
 | 
			
		||||
    -o-transition: all 0.1s linear 0.2s;
 | 
			
		||||
    transition: all 0.1s linear 0.2s;
 | 
			
		||||
    -webkit-transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
 | 
			
		||||
    -ms-transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
 | 
			
		||||
    transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
 | 
			
		||||
 | 
			
		||||
    .dark-style & {
 | 
			
		||||
      background: $open-btn-bg-dark;
 | 
			
		||||
    }
 | 
			
		||||
    &::before {
 | 
			
		||||
      content: '';
 | 
			
		||||
      width: 22px;
 | 
			
		||||
      height: 22px;
 | 
			
		||||
      display: block;
 | 
			
		||||
      background-size: 100% 100%;
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABClJREFUaEPtmY1RFEEQhbsjUCIQIhAiUCNQIxAiECIQIxAiECIAIpAMhAiECIQI2vquZqnZvp6fhb3SK5mqq6Ju92b69bzXf6is+dI1t1+eAfztG5z1BsxsU0S+ici2iPB3vm5E5EpEDlSVv2dZswFIxv8UkZcNy+5EZGcuEHMCOBeR951uvVDVD53vVl+bE8DvDu8Pxtyo6ta/BsByg1R15Bwzqz5/LJgn34CZwfnPInI4BUB6/1hV0cSjVxcAM4PbcBZjL0XklIPN7Is3fLCkdQPpPYw/VNXj5IhPIvJWRIhSl6p60ULWBGBm30Vk123EwRxCuIzWkkjNrCZywith10ewE1Xdq4GoAjCz/RTXW44Ynt+LyBEfT43kYfbj86J3w5Q32DNcRQDpwF+dkQXDMey8xem0L3TEqB4g3PZWad8agBMRgZPeu96D1/C2Zbh3X0p80Op1xxloztN48bMQQNoc7+eLEuAoPSPiIDY4Ooo+E6ixeNXM+D3GERz2U3CIqMstLJUgJQDe+7eq6mub0NYEkLAKwEHkiBQDCZtddZCZ8d6r7JDwFkoARklHRPZUFVDVZWbwGuNrC4EfdOzFrRABh3Wnqhv+d70AEBLGFROPmeHlnM81G69UdSd6IUuM0GgUVn1uqWmg5EmMfBeEyB7Pe3txBkY+rGT8j0J+WXq/BgDkUCaqLgEAnwcRog0veMIqFAAwCy2wnw+bI2GaGboBgF9k5N0o0rUSGUb4eO0BeO9j/GYhkSHMHMTIqwGARX6p6a+nlPBl8kZuXMD9j6pKfF9aZuaFOdJCEL5D4eYb9wCYVCanrBmGyii/tIq+SLj/HQBCaM5bLzwfPqdQ6FpVHyra4IbuVbXaY7dETC2ESPNNWiIOi69CcdgSMXsh4tNSUiklMgwmC0aNd08Y5WAES6HHehM4gu97wyhBgWpgqXsrASglprDy7CwhehMZOSbK6JMSma+Fio1KltCmlBIj7gfZOGx8ppQSXrhzFnOhJ/31BDkjFHRvOd09x0mRBA9SFgxUgHpQg0q0t5ymPMlL+EnldFTfDA0NAmf+OTQ0X0sRouf7NNkYGhrOYNrxtIaGg83MNzVDSe3LXLhP7O/yrCsCz1zlWTpjWkuZAOBpX3yVnLqI1yLCOKU6qMrmP7SSrUEw54XF4WBIK5FxCMOr3lVsfGqNSmPzBXUnJTIX1jyVBq9wO6UObOpgC5GjO98vFKnTdQMZXxEsWZlDiCZMIxAbNxQOqlpVZtobejBaZNoBnRDzMFpkxvTQOD36BlrcySZuI6p1ACB6LU3wWuf5581+oHfD1vi89bz3nFUC8Nm7ZlP3nKkFbM4bWPt/MSFwklprYItwt6cmvpWJ2IVcQBCz6bLysSCv3SaANCiTsnaNRrNRqMXVVT1/BrAqz/buu/Y38Ad3KC5PARej0QAAAABJRU5ErkJggg==');
 | 
			
		||||
      top: 50%;
 | 
			
		||||
      left: 50%;
 | 
			
		||||
      transform: translate(-50%, -50%);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Customizer Hidden
 | 
			
		||||
    .customizer-hide & {
 | 
			
		||||
      display: none;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [dir='rtl'] & {
 | 
			
		||||
      border-radius: 0;
 | 
			
		||||
      border-top-right-radius: $open-btn-border-radius;
 | 
			
		||||
      border-bottom-right-radius: $open-btn-border-radius;
 | 
			
		||||
 | 
			
		||||
      &::before {
 | 
			
		||||
        margin-left: -2px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.template-customizer-open .template-customizer-open-btn {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    -webkit-transition-delay: 0s;
 | 
			
		||||
    -o-transition-delay: 0s;
 | 
			
		||||
    transition-delay: 0s;
 | 
			
		||||
    -webkit-transform: none !important;
 | 
			
		||||
    -ms-transform: none !important;
 | 
			
		||||
    transform: none !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Customizer inner
 | 
			
		||||
  .template-customizer-inner {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
    -webkit-box-flex: 0;
 | 
			
		||||
    -ms-flex: 0 1 auto;
 | 
			
		||||
    flex: 0 1 auto;
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    -webkit-transition: opacity 0.2s;
 | 
			
		||||
    -o-transition: opacity 0.2s;
 | 
			
		||||
    transition: opacity 0.2s;
 | 
			
		||||
 | 
			
		||||
    > div:first-child {
 | 
			
		||||
      > hr:first-of-type {
 | 
			
		||||
        display: none !important;
 | 
			
		||||
      }
 | 
			
		||||
      > h5:first-of-type {
 | 
			
		||||
        padding-top: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Theme
 | 
			
		||||
  .template-customizer-themes-inner {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    -webkit-transition: opacity 0.2s;
 | 
			
		||||
    -o-transition: opacity 0.2s;
 | 
			
		||||
    transition: opacity 0.2s;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .template-customizer-theme-item {
 | 
			
		||||
    display: -webkit-box;
 | 
			
		||||
    display: -ms-flexbox;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    -webkit-box-align: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    -ms-flex-align: center;
 | 
			
		||||
    -webkit-box-flex: 1;
 | 
			
		||||
    -ms-flex: 1 1 100%;
 | 
			
		||||
    flex: 1 1 100%;
 | 
			
		||||
    -webkit-box-pack: justify;
 | 
			
		||||
    -ms-flex-pack: justify;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    margin-bottom: 10px;
 | 
			
		||||
    padding: 0 24px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
 | 
			
		||||
    input {
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      z-index: -1; // Put the input behind the label so it doesn't overlay text
 | 
			
		||||
      opacity: 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input ~ span {
 | 
			
		||||
      opacity: 0.25;
 | 
			
		||||
      -webkit-transition: all 0.2s;
 | 
			
		||||
      -o-transition: all 0.2s;
 | 
			
		||||
      transition: all 0.2s;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .template-customizer-theme-checkmark {
 | 
			
		||||
      display: inline-block;
 | 
			
		||||
      width: 6px;
 | 
			
		||||
      height: 12px;
 | 
			
		||||
      border-right: 1px solid;
 | 
			
		||||
      border-bottom: 1px solid;
 | 
			
		||||
      opacity: 0;
 | 
			
		||||
      -webkit-transition: all 0.2s;
 | 
			
		||||
      -o-transition: all 0.2s;
 | 
			
		||||
      transition: all 0.2s;
 | 
			
		||||
      -webkit-transform: rotate(45deg);
 | 
			
		||||
      -ms-transform: rotate(45deg);
 | 
			
		||||
      transform: rotate(45deg);
 | 
			
		||||
 | 
			
		||||
      [dir='rtl'] & {
 | 
			
		||||
        border-right: none;
 | 
			
		||||
        border-left: 1px solid;
 | 
			
		||||
        -webkit-transform: rotate(-45deg);
 | 
			
		||||
        -ms-transform: rotate(-45deg);
 | 
			
		||||
        transform: rotate(-45deg);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input:checked:not([disabled]) ~ span,
 | 
			
		||||
    &:hover input:not([disabled]) ~ span {
 | 
			
		||||
      opacity: 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input:checked:not([disabled]) ~ span .template-customizer-theme-checkmark {
 | 
			
		||||
      opacity: 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .template-customizer-theme-colors {
 | 
			
		||||
    span {
 | 
			
		||||
      display: block;
 | 
			
		||||
      margin: 0 1px;
 | 
			
		||||
      width: 10px;
 | 
			
		||||
      height: 10px;
 | 
			
		||||
      border-radius: 50%;
 | 
			
		||||
      -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
 | 
			
		||||
      box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.template-customizer-loading .template-customizer-inner,
 | 
			
		||||
  &.template-customizer-loading-theme .template-customizer-themes-inner {
 | 
			
		||||
    opacity: 0.2;
 | 
			
		||||
 | 
			
		||||
    &::after {
 | 
			
		||||
      content: '';
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      top: 0;
 | 
			
		||||
      right: 0;
 | 
			
		||||
      bottom: 0;
 | 
			
		||||
      left: 0;
 | 
			
		||||
      z-index: 999;
 | 
			
		||||
      display: block;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@media (max-width: $customizer-hide-width) {
 | 
			
		||||
  #template-customizer {
 | 
			
		||||
    display: none;
 | 
			
		||||
    visibility: hidden !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@media (max-width: 575.98px) {
 | 
			
		||||
  #template-customizer {
 | 
			
		||||
    width: $customizer-width-sm;
 | 
			
		||||
    -webkit-transform: translateX($customizer-width-sm + $customizer-spacer);
 | 
			
		||||
    -ms-transform: translateX($customizer-width-sm + $customizer-spacer);
 | 
			
		||||
    transform: translateX($customizer-width-sm + $customizer-spacer);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layout-menu-100vh #template-customizer {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
[dir='rtl'] {
 | 
			
		||||
  #template-customizer {
 | 
			
		||||
    right: auto;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    -webkit-transform: translateX(-($customizer-width + $customizer-spacer));
 | 
			
		||||
    -ms-transform: translateX(-($customizer-width + $customizer-spacer));
 | 
			
		||||
    transform: translateX(-($customizer-width + $customizer-spacer));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #template-customizer .template-customizer-open-btn {
 | 
			
		||||
    right: 0;
 | 
			
		||||
    left: auto;
 | 
			
		||||
    -webkit-transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
 | 
			
		||||
    -ms-transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
 | 
			
		||||
    transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #template-customizer .template-customizer-close-btn {
 | 
			
		||||
    right: auto;
 | 
			
		||||
    left: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#template-customizer .template-customizer-layouts-options[disabled] {
 | 
			
		||||
  opacity: 0.5;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ! FIX: mode switch position in RTL
 | 
			
		||||
[dir='rtl'] {
 | 
			
		||||
  .template-customizer-t-style_switch_light {
 | 
			
		||||
    padding-right: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/js/bootstrap.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/js/bootstrap.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import * as bootstrap from 'bootstrap'
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.bootstrap = bootstrap
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { bootstrap }
 | 
			
		||||
							
								
								
									
										73
									
								
								resources/assets/vendor/js/dropdown-hover.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								resources/assets/vendor/js/dropdown-hover.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,73 @@
 | 
			
		||||
// Add onHover event for dropdowns
 | 
			
		||||
 | 
			
		||||
;(function ($) {
 | 
			
		||||
  if (!$ || !$.fn) return
 | 
			
		||||
 | 
			
		||||
  const SELECTOR = '[data-bs-toggle=dropdown][data-trigger=hover]'
 | 
			
		||||
  const TIMEOUT = 150
 | 
			
		||||
 | 
			
		||||
  function openDropdown($i) {
 | 
			
		||||
    let t = $i.data('dd-timeout')
 | 
			
		||||
 | 
			
		||||
    if (t) {
 | 
			
		||||
      clearTimeout(t)
 | 
			
		||||
      t = null
 | 
			
		||||
      $i.data('dd-timeout', t)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($i.attr('aria-expanded') !== 'true') $i.dropdown('toggle')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function closeDropdown($i) {
 | 
			
		||||
    let t = $i.data('dd-timeout')
 | 
			
		||||
 | 
			
		||||
    if (t) clearTimeout(t)
 | 
			
		||||
 | 
			
		||||
    t = setTimeout(() => {
 | 
			
		||||
      let t2 = $i.data('dd-timeout')
 | 
			
		||||
 | 
			
		||||
      if (t2) {
 | 
			
		||||
        clearTimeout(t2)
 | 
			
		||||
        t2 = null
 | 
			
		||||
        $i.data('dd-timeout', t2)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if ($i.attr('aria-expanded') === 'true') $i.dropdown('toggle')
 | 
			
		||||
    }, TIMEOUT)
 | 
			
		||||
 | 
			
		||||
    $i.data('dd-timeout', t)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $(function () {
 | 
			
		||||
    $('body')
 | 
			
		||||
      .on('mouseenter', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
 | 
			
		||||
        const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
 | 
			
		||||
        const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')
 | 
			
		||||
 | 
			
		||||
        if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return
 | 
			
		||||
 | 
			
		||||
        // Set hovered flag
 | 
			
		||||
        if ($(this).is(SELECTOR)) {
 | 
			
		||||
          $(this).data('hovered', true)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        openDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
 | 
			
		||||
      })
 | 
			
		||||
      .on('mouseleave', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
 | 
			
		||||
        const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
 | 
			
		||||
        const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')
 | 
			
		||||
 | 
			
		||||
        if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return
 | 
			
		||||
 | 
			
		||||
        // Remove hovered flag
 | 
			
		||||
        if ($(this).is(SELECTOR)) {
 | 
			
		||||
          $(this).data('hovered', false)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        closeDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
 | 
			
		||||
      })
 | 
			
		||||
      .on('hide.bs.dropdown', function (e) {
 | 
			
		||||
        if ($(this).find(SELECTOR).data('hovered')) e.preventDefault()
 | 
			
		||||
      })
 | 
			
		||||
  })
 | 
			
		||||
})(window.jQuery)
 | 
			
		||||
							
								
								
									
										1151
									
								
								resources/assets/vendor/js/helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1151
									
								
								resources/assets/vendor/js/helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										206
									
								
								resources/assets/vendor/js/mega-dropdown.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								resources/assets/vendor/js/mega-dropdown.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,206 @@
 | 
			
		||||
const TIMEOUT = 150
 | 
			
		||||
 | 
			
		||||
class MegaDropdown {
 | 
			
		||||
  constructor(element, options = {}) {
 | 
			
		||||
    this._onHover = options.trigger === 'hover' || element.getAttribute('data-trigger') === 'hover'
 | 
			
		||||
 | 
			
		||||
    this._container = MegaDropdown._findParent(element, 'mega-dropdown')
 | 
			
		||||
    if (!this._container) return
 | 
			
		||||
 | 
			
		||||
    this._menu = this._container.querySelector('.dropdown-toggle ~ .dropdown-menu')
 | 
			
		||||
    if (!this._menu) return
 | 
			
		||||
 | 
			
		||||
    element.setAttribute('aria-expanded', 'false')
 | 
			
		||||
 | 
			
		||||
    this._el = element
 | 
			
		||||
    this._bindEvents()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  open() {
 | 
			
		||||
    if (this._timeout) {
 | 
			
		||||
      clearTimeout(this._timeout)
 | 
			
		||||
      this._timeout = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._focusTimeout) {
 | 
			
		||||
      clearTimeout(this._focusTimeout)
 | 
			
		||||
      this._focusTimeout = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._el.getAttribute('aria-expanded') !== 'true') {
 | 
			
		||||
      this._triggerEvent('show')
 | 
			
		||||
      this._container.classList.add('show')
 | 
			
		||||
      this._menu.classList.add('show')
 | 
			
		||||
      this._el.setAttribute('aria-expanded', 'true')
 | 
			
		||||
      this._el.focus()
 | 
			
		||||
      this._triggerEvent('shown')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  close(force) {
 | 
			
		||||
    if (this._timeout) {
 | 
			
		||||
      clearTimeout(this._timeout)
 | 
			
		||||
      this._timeout = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._focusTimeout) {
 | 
			
		||||
      clearTimeout(this._focusTimeout)
 | 
			
		||||
      this._focusTimeout = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._onHover && !force) {
 | 
			
		||||
      this._timeout = setTimeout(() => {
 | 
			
		||||
        if (this._timeout) {
 | 
			
		||||
          clearTimeout(this._timeout)
 | 
			
		||||
          this._timeout = null
 | 
			
		||||
        }
 | 
			
		||||
        this._close()
 | 
			
		||||
      }, TIMEOUT)
 | 
			
		||||
    } else {
 | 
			
		||||
      this._close()
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  toggle() {
 | 
			
		||||
    // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
    this._el.getAttribute('aria-expanded') === 'true' ? this.close(true) : this.open()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  destroy() {
 | 
			
		||||
    this._unbindEvents()
 | 
			
		||||
    this._el = null
 | 
			
		||||
 | 
			
		||||
    if (this._timeout) {
 | 
			
		||||
      clearTimeout(this._timeout)
 | 
			
		||||
      this._timeout = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._focusTimeout) {
 | 
			
		||||
      clearTimeout(this._focusTimeout)
 | 
			
		||||
      this._focusTimeout = null
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _close() {
 | 
			
		||||
    if (this._el.getAttribute('aria-expanded') === 'true') {
 | 
			
		||||
      this._triggerEvent('hide')
 | 
			
		||||
      this._container.classList.remove('show')
 | 
			
		||||
      this._menu.classList.remove('show')
 | 
			
		||||
      this._el.setAttribute('aria-expanded', 'false')
 | 
			
		||||
      this._triggerEvent('hidden')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _bindEvents() {
 | 
			
		||||
    this._elClickEvnt = e => {
 | 
			
		||||
      e.preventDefault()
 | 
			
		||||
      this.toggle()
 | 
			
		||||
    }
 | 
			
		||||
    this._el.addEventListener('click', this._elClickEvnt)
 | 
			
		||||
 | 
			
		||||
    this._bodyClickEvnt = e => {
 | 
			
		||||
      if (!this._container.contains(e.target) && this._container.classList.contains('show')) {
 | 
			
		||||
        this.close(true)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    document.body.addEventListener('click', this._bodyClickEvnt, true)
 | 
			
		||||
 | 
			
		||||
    this._menuClickEvnt = e => {
 | 
			
		||||
      if (e.target.classList.contains('mega-dropdown-link')) {
 | 
			
		||||
        this.close(true)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    this._menu.addEventListener('click', this._menuClickEvnt, true)
 | 
			
		||||
 | 
			
		||||
    this._focusoutEvnt = () => {
 | 
			
		||||
      if (this._focusTimeout) {
 | 
			
		||||
        clearTimeout(this._focusTimeout)
 | 
			
		||||
        this._focusTimeout = null
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (this._el.getAttribute('aria-expanded') !== 'true') return
 | 
			
		||||
 | 
			
		||||
      this._focusTimeout = setTimeout(() => {
 | 
			
		||||
        if (
 | 
			
		||||
          document.activeElement.tagName.toUpperCase() !== 'BODY' &&
 | 
			
		||||
          MegaDropdown._findParent(document.activeElement, 'mega-dropdown') !== this._container
 | 
			
		||||
        ) {
 | 
			
		||||
          this.close(true)
 | 
			
		||||
        }
 | 
			
		||||
      }, 100)
 | 
			
		||||
    }
 | 
			
		||||
    this._container.addEventListener('focusout', this._focusoutEvnt, true)
 | 
			
		||||
 | 
			
		||||
    if (this._onHover) {
 | 
			
		||||
      this._enterEvnt = () => {
 | 
			
		||||
        if (window.getComputedStyle(this._menu, null).getPropertyValue('position') === 'static') return
 | 
			
		||||
        this.open()
 | 
			
		||||
      }
 | 
			
		||||
      this._leaveEvnt = () => {
 | 
			
		||||
        if (window.getComputedStyle(this._menu, null).getPropertyValue('position') === 'static') return
 | 
			
		||||
        this.close()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._el.addEventListener('mouseenter', this._enterEvnt)
 | 
			
		||||
      this._menu.addEventListener('mouseenter', this._enterEvnt)
 | 
			
		||||
      this._el.addEventListener('mouseleave', this._leaveEvnt)
 | 
			
		||||
      this._menu.addEventListener('mouseleave', this._leaveEvnt)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _unbindEvents() {
 | 
			
		||||
    if (this._elClickEvnt) {
 | 
			
		||||
      this._el.removeEventListener('click', this._elClickEvnt)
 | 
			
		||||
      this._elClickEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._bodyClickEvnt) {
 | 
			
		||||
      document.body.removeEventListener('click', this._bodyClickEvnt, true)
 | 
			
		||||
      this._bodyClickEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._menuClickEvnt) {
 | 
			
		||||
      this._menu.removeEventListener('click', this._menuClickEvnt, true)
 | 
			
		||||
      this._menuClickEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._focusoutEvnt) {
 | 
			
		||||
      this._container.removeEventListener('focusout', this._focusoutEvnt, true)
 | 
			
		||||
      this._focusoutEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._enterEvnt) {
 | 
			
		||||
      this._el.removeEventListener('mouseenter', this._enterEvnt)
 | 
			
		||||
      this._menu.removeEventListener('mouseenter', this._enterEvnt)
 | 
			
		||||
      this._enterEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
    if (this._leaveEvnt) {
 | 
			
		||||
      this._el.removeEventListener('mouseleave', this._leaveEvnt)
 | 
			
		||||
      this._menu.removeEventListener('mouseleave', this._leaveEvnt)
 | 
			
		||||
      this._leaveEvnt = null
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _findParent(el, cls) {
 | 
			
		||||
    if (el.tagName.toUpperCase() === 'BODY') return null
 | 
			
		||||
    el = el.parentNode
 | 
			
		||||
    while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
 | 
			
		||||
      el = el.parentNode
 | 
			
		||||
    }
 | 
			
		||||
    return el.tagName.toUpperCase() !== 'BODY' ? el : null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _triggerEvent(event) {
 | 
			
		||||
    if (document.createEvent) {
 | 
			
		||||
      let customEvent
 | 
			
		||||
 | 
			
		||||
      if (typeof Event === 'function') {
 | 
			
		||||
        customEvent = new Event(event)
 | 
			
		||||
      } else {
 | 
			
		||||
        customEvent = document.createEvent('Event')
 | 
			
		||||
        customEvent.initEvent(event, false, true)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._container.dispatchEvent(customEvent)
 | 
			
		||||
    } else {
 | 
			
		||||
      this._container.fireEvent(`on${event}`, document.createEventObject())
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
window.MegaDropdown = MegaDropdown
 | 
			
		||||
export { MegaDropdown }
 | 
			
		||||
							
								
								
									
										991
									
								
								resources/assets/vendor/js/menu.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										991
									
								
								resources/assets/vendor/js/menu.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,991 @@
 | 
			
		||||
const TRANSITION_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd']
 | 
			
		||||
// const TRANSITION_PROPERTIES = ['transition', 'MozTransition', 'webkitTransition', 'WebkitTransition', 'OTransition']
 | 
			
		||||
const DELTA = 5
 | 
			
		||||
 | 
			
		||||
class Menu {
 | 
			
		||||
  constructor(el, config = {}, _PS = null) {
 | 
			
		||||
    this._el = el
 | 
			
		||||
    this._horizontal = config.orientation === 'horizontal'
 | 
			
		||||
    this._animate = config.animate !== false
 | 
			
		||||
    this._accordion = config.accordion !== false
 | 
			
		||||
    this._showDropdownOnHover = Boolean(config.showDropdownOnHover)
 | 
			
		||||
    this._closeChildren = Boolean(config.closeChildren)
 | 
			
		||||
    this._rtl = document.documentElement.getAttribute('dir') === 'rtl' || document.body.getAttribute('dir') === 'rtl'
 | 
			
		||||
 | 
			
		||||
    this._onOpen = config.onOpen || (() => {})
 | 
			
		||||
    this._onOpened = config.onOpened || (() => {})
 | 
			
		||||
    this._onClose = config.onClose || (() => {})
 | 
			
		||||
    this._onClosed = config.onClosed || (() => {})
 | 
			
		||||
 | 
			
		||||
    this._psScroll = null
 | 
			
		||||
    this._topParent = null
 | 
			
		||||
    this._menuBgClass = null
 | 
			
		||||
 | 
			
		||||
    el.classList.add('menu')
 | 
			
		||||
    el.classList[this._animate ? 'remove' : 'add']('menu-no-animation')
 | 
			
		||||
 | 
			
		||||
    if (!this._horizontal) {
 | 
			
		||||
      el.classList.add('menu-vertical')
 | 
			
		||||
      el.classList.remove('menu-horizontal')
 | 
			
		||||
 | 
			
		||||
      const PerfectScrollbarLib = _PS || window.PerfectScrollbar
 | 
			
		||||
 | 
			
		||||
      if (PerfectScrollbarLib) {
 | 
			
		||||
        this._scrollbar = new PerfectScrollbarLib(el.querySelector('.menu-inner'), {
 | 
			
		||||
          suppressScrollX: true,
 | 
			
		||||
          wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        window.Helpers.menuPsScroll = this._scrollbar
 | 
			
		||||
      } else {
 | 
			
		||||
        el.querySelector('.menu-inner').classList.add('overflow-auto')
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      el.classList.add('menu-horizontal')
 | 
			
		||||
      el.classList.remove('menu-vertical')
 | 
			
		||||
 | 
			
		||||
      this._inner = el.querySelector('.menu-inner')
 | 
			
		||||
      const container = this._inner.parentNode
 | 
			
		||||
 | 
			
		||||
      this._prevBtn = el.querySelector('.menu-horizontal-prev')
 | 
			
		||||
      if (!this._prevBtn) {
 | 
			
		||||
        this._prevBtn = document.createElement('a')
 | 
			
		||||
        this._prevBtn.href = '#'
 | 
			
		||||
        this._prevBtn.className = 'menu-horizontal-prev'
 | 
			
		||||
        container.appendChild(this._prevBtn)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._wrapper = el.querySelector('.menu-horizontal-wrapper')
 | 
			
		||||
      if (!this._wrapper) {
 | 
			
		||||
        this._wrapper = document.createElement('div')
 | 
			
		||||
        this._wrapper.className = 'menu-horizontal-wrapper'
 | 
			
		||||
        this._wrapper.appendChild(this._inner)
 | 
			
		||||
        container.appendChild(this._wrapper)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._nextBtn = el.querySelector('.menu-horizontal-next')
 | 
			
		||||
      if (!this._nextBtn) {
 | 
			
		||||
        this._nextBtn = document.createElement('a')
 | 
			
		||||
        this._nextBtn.href = '#'
 | 
			
		||||
        this._nextBtn.className = 'menu-horizontal-next'
 | 
			
		||||
        container.appendChild(this._nextBtn)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._innerPosition = 0
 | 
			
		||||
      this.update()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add data attribute for bg color class of menu
 | 
			
		||||
    const menuClassList = el.classList
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < menuClassList.length; i++) {
 | 
			
		||||
      if (menuClassList[i].startsWith('bg-')) {
 | 
			
		||||
        this._menuBgClass = menuClassList[i]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    el.setAttribute('data-bg-class', this._menuBgClass)
 | 
			
		||||
 | 
			
		||||
    // Switch to vertical menu on small screen for horizontal menu layout on page load
 | 
			
		||||
    if (this._horizontal && window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
      this.switchMenu('vertical')
 | 
			
		||||
    } else {
 | 
			
		||||
      this._bindEvents()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Link menu instance to element
 | 
			
		||||
    el.menuInstance = this
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _bindEvents() {
 | 
			
		||||
    // Click Event
 | 
			
		||||
    this._evntElClick = e => {
 | 
			
		||||
      // Find top parent element
 | 
			
		||||
      if (e.target.closest('ul') && e.target.closest('ul').classList.contains('menu-inner')) {
 | 
			
		||||
        const menuItem = Menu._findParent(e.target, 'menu-item', false)
 | 
			
		||||
 | 
			
		||||
        // eslint-disable-next-line prefer-destructuring
 | 
			
		||||
        if (menuItem) this._topParent = menuItem.childNodes[0]
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const toggleLink = e.target.classList.contains('menu-toggle')
 | 
			
		||||
        ? e.target
 | 
			
		||||
        : Menu._findParent(e.target, 'menu-toggle', false)
 | 
			
		||||
 | 
			
		||||
      if (toggleLink) {
 | 
			
		||||
        e.preventDefault()
 | 
			
		||||
 | 
			
		||||
        if (toggleLink.getAttribute('data-hover') !== 'true') {
 | 
			
		||||
          this.toggle(toggleLink)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if ((!this._showDropdownOnHover && this._horizontal) || !this._horizontal || window.Helpers.isMobileDevice)
 | 
			
		||||
      this._el.addEventListener('click', this._evntElClick)
 | 
			
		||||
 | 
			
		||||
    this._evntWindowResize = () => {
 | 
			
		||||
      this.update()
 | 
			
		||||
      if (this._lastWidth !== window.innerWidth) {
 | 
			
		||||
        this._lastWidth = window.innerWidth
 | 
			
		||||
        this.update()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']")
 | 
			
		||||
      if (!this._horizontal && !horizontalMenuTemplate) this.manageScroll()
 | 
			
		||||
    }
 | 
			
		||||
    window.addEventListener('resize', this._evntWindowResize)
 | 
			
		||||
 | 
			
		||||
    if (this._horizontal) {
 | 
			
		||||
      this._evntPrevBtnClick = e => {
 | 
			
		||||
        e.preventDefault()
 | 
			
		||||
        if (this._prevBtn.classList.contains('disabled')) return
 | 
			
		||||
        this._slide('prev')
 | 
			
		||||
      }
 | 
			
		||||
      this._prevBtn.addEventListener('click', this._evntPrevBtnClick)
 | 
			
		||||
 | 
			
		||||
      this._evntNextBtnClick = e => {
 | 
			
		||||
        e.preventDefault()
 | 
			
		||||
        if (this._nextBtn.classList.contains('disabled')) return
 | 
			
		||||
        this._slide('next')
 | 
			
		||||
      }
 | 
			
		||||
      this._nextBtn.addEventListener('click', this._evntNextBtnClick)
 | 
			
		||||
 | 
			
		||||
      this._evntBodyClick = e => {
 | 
			
		||||
        if (!this._inner.contains(e.target) && this._el.querySelectorAll('.menu-inner > .menu-item.open').length)
 | 
			
		||||
          this.closeAll()
 | 
			
		||||
      }
 | 
			
		||||
      document.body.addEventListener('click', this._evntBodyClick)
 | 
			
		||||
 | 
			
		||||
      if (this._showDropdownOnHover) {
 | 
			
		||||
        /** ***********************************************
 | 
			
		||||
         * Horizontal Menu Mouse Over Event
 | 
			
		||||
         * ? e.target !== e.currentTarget condition to disable mouseover event on whole menu navbar
 | 
			
		||||
         * ? !e.target.parentNode.classList.contains('open') to disable mouseover events on icon, text and dropdown arrow
 | 
			
		||||
         */
 | 
			
		||||
        this._evntElMouseOver = e => {
 | 
			
		||||
          if (e.target !== e.currentTarget && !e.target.parentNode.classList.contains('open')) {
 | 
			
		||||
            const toggleLink = e.target.classList.contains('menu-toggle') ? e.target : null
 | 
			
		||||
 | 
			
		||||
            if (toggleLink) {
 | 
			
		||||
              e.preventDefault()
 | 
			
		||||
 | 
			
		||||
              if (toggleLink.getAttribute('data-hover') !== 'true') {
 | 
			
		||||
                this.toggle(toggleLink)
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          e.stopPropagation()
 | 
			
		||||
        }
 | 
			
		||||
        if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
          this._el.addEventListener('mouseover', this._evntElMouseOver)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /** ***********************************************
 | 
			
		||||
         * Horizontal Menu Mouse Out Event
 | 
			
		||||
         * ? e.target !== e.currentTarget condition to disable mouseout event on whole menu navbar
 | 
			
		||||
         * ? mouseOutEl.parentNode.classList.contains('open') to check if the mouseout element has open class or not
 | 
			
		||||
         * ? !mouseOutEl.classList.contains('menu-toggle') to check if mouseout was from single menu item and not from the one which has submenu
 | 
			
		||||
         * ? !mouseOverEl.parentNode.classList.contains('menu-link') to disable mouseout event for icon, text and dropdown arrow
 | 
			
		||||
         */
 | 
			
		||||
        this._evntElMouseOut = e => {
 | 
			
		||||
          const mainEl = e.currentTarget
 | 
			
		||||
          const mouseOutEl = e.target
 | 
			
		||||
          const mouseOverEl = e.toElement || e.relatedTarget
 | 
			
		||||
 | 
			
		||||
          // Find absolute parent of any menu item from which mouseout event triggered
 | 
			
		||||
          if (mouseOutEl.closest('ul') && mouseOutEl.closest('ul').classList.contains('menu-inner')) {
 | 
			
		||||
            this._topParent = mouseOutEl
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          if (
 | 
			
		||||
            mouseOutEl !== mainEl &&
 | 
			
		||||
            (mouseOutEl.parentNode.classList.contains('open') || !mouseOutEl.classList.contains('menu-toggle')) &&
 | 
			
		||||
            mouseOverEl &&
 | 
			
		||||
            mouseOverEl.parentNode &&
 | 
			
		||||
            !mouseOverEl.parentNode.classList.contains('menu-link')
 | 
			
		||||
          ) {
 | 
			
		||||
            // When mouse goes totally out of menu items, check mouse over element to confirm it's not the child of menu, once confirmed close the menu
 | 
			
		||||
            if (this._topParent && !Menu.childOf(mouseOverEl, this._topParent.parentNode)) {
 | 
			
		||||
              const toggleLink = this._topParent.classList.contains('menu-toggle') ? this._topParent : null
 | 
			
		||||
 | 
			
		||||
              if (toggleLink) {
 | 
			
		||||
                e.preventDefault()
 | 
			
		||||
 | 
			
		||||
                if (toggleLink.getAttribute('data-hover') !== 'true') {
 | 
			
		||||
                  this.toggle(toggleLink)
 | 
			
		||||
                  this._topParent = null
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // When mouse enter the sub menu, check if it's child of the initially mouse overed menu item(Actual Parent),
 | 
			
		||||
            // if it's the parent do not close the sub menu else close the sub menu
 | 
			
		||||
            if (Menu.childOf(mouseOverEl, mouseOutEl.parentNode)) {
 | 
			
		||||
              return
 | 
			
		||||
            }
 | 
			
		||||
            const toggleLink = mouseOutEl.classList.contains('menu-toggle') ? mouseOutEl : null
 | 
			
		||||
 | 
			
		||||
            if (toggleLink) {
 | 
			
		||||
              e.preventDefault()
 | 
			
		||||
 | 
			
		||||
              if (toggleLink.getAttribute('data-hover') !== 'true') {
 | 
			
		||||
                this.toggle(toggleLink)
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          e.stopPropagation()
 | 
			
		||||
        }
 | 
			
		||||
        if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
          this._el.addEventListener('mouseout', this._evntElMouseOut)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static childOf(/* child node */ c, /* parent node */ p) {
 | 
			
		||||
    // returns boolean
 | 
			
		||||
    if (c.parentNode) {
 | 
			
		||||
      while ((c = c.parentNode) && c !== p);
 | 
			
		||||
      return !!c
 | 
			
		||||
    }
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _unbindEvents() {
 | 
			
		||||
    if (this._evntElClick) {
 | 
			
		||||
      this._el.removeEventListener('click', this._evntElClick)
 | 
			
		||||
      this._evntElClick = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntElMouseOver) {
 | 
			
		||||
      this._el.removeEventListener('mouseover', this._evntElMouseOver)
 | 
			
		||||
      this._evntElMouseOver = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntElMouseOut) {
 | 
			
		||||
      this._el.removeEventListener('mouseout', this._evntElMouseOut)
 | 
			
		||||
      this._evntElMouseOut = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntWindowResize) {
 | 
			
		||||
      window.removeEventListener('resize', this._evntWindowResize)
 | 
			
		||||
      this._evntWindowResize = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntBodyClick) {
 | 
			
		||||
      document.body.removeEventListener('click', this._evntBodyClick)
 | 
			
		||||
      this._evntBodyClick = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntInnerMousemove) {
 | 
			
		||||
      this._inner.removeEventListener('mousemove', this._evntInnerMousemove)
 | 
			
		||||
      this._evntInnerMousemove = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._evntInnerMouseleave) {
 | 
			
		||||
      this._inner.removeEventListener('mouseleave', this._evntInnerMouseleave)
 | 
			
		||||
      this._evntInnerMouseleave = null
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _isRoot(item) {
 | 
			
		||||
    return !Menu._findParent(item, 'menu-item', false)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _findParent(el, cls, throwError = true) {
 | 
			
		||||
    if (el.tagName.toUpperCase() === 'BODY') return null
 | 
			
		||||
    el = el.parentNode
 | 
			
		||||
    while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
 | 
			
		||||
      el = el.parentNode
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    el = el.tagName.toUpperCase() !== 'BODY' ? el : null
 | 
			
		||||
 | 
			
		||||
    if (!el && throwError) throw new Error(`Cannot find \`.${cls}\` parent element`)
 | 
			
		||||
 | 
			
		||||
    return el
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _findChild(el, cls) {
 | 
			
		||||
    const items = el.childNodes
 | 
			
		||||
    const found = []
 | 
			
		||||
 | 
			
		||||
    for (let i = 0, l = items.length; i < l; i++) {
 | 
			
		||||
      if (items[i].classList) {
 | 
			
		||||
        let passed = 0
 | 
			
		||||
 | 
			
		||||
        for (let j = 0; j < cls.length; j++) {
 | 
			
		||||
          if (items[i].classList.contains(cls[j])) passed += 1
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (cls.length === passed) found.push(items[i])
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return found
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _findMenu(item) {
 | 
			
		||||
    let curEl = item.childNodes[0]
 | 
			
		||||
    let menu = null
 | 
			
		||||
 | 
			
		||||
    while (curEl && !menu) {
 | 
			
		||||
      if (curEl.classList && curEl.classList.contains('menu-sub')) menu = curEl
 | 
			
		||||
      curEl = curEl.nextSibling
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!menu) throw new Error('Cannot find `.menu-sub` element for the current `.menu-toggle`')
 | 
			
		||||
 | 
			
		||||
    return menu
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Has class
 | 
			
		||||
  static _hasClass(cls, el = window.Helpers.ROOT_EL) {
 | 
			
		||||
    let result = false
 | 
			
		||||
 | 
			
		||||
    cls.split(' ').forEach(c => {
 | 
			
		||||
      if (el.classList.contains(c)) result = true
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    return result
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  open(el, closeChildren = this._closeChildren) {
 | 
			
		||||
    const item = this._findUnopenedParent(Menu._getItem(el, true), closeChildren)
 | 
			
		||||
 | 
			
		||||
    if (!item) return
 | 
			
		||||
 | 
			
		||||
    const toggleLink = Menu._getLink(item, true)
 | 
			
		||||
 | 
			
		||||
    Menu._promisify(this._onOpen, this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
      .then(() => {
 | 
			
		||||
        if (!this._horizontal || !Menu._isRoot(item)) {
 | 
			
		||||
          if (this._animate && !this._horizontal) {
 | 
			
		||||
            window.requestAnimationFrame(() => this._toggleAnimation(true, item, false))
 | 
			
		||||
            if (this._accordion) this._closeOther(item, closeChildren)
 | 
			
		||||
          } else if (this._animate) {
 | 
			
		||||
            this._toggleDropdown(true, item, closeChildren)
 | 
			
		||||
            // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
            this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
          } else {
 | 
			
		||||
            item.classList.add('open')
 | 
			
		||||
            // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
            this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
            if (this._accordion) this._closeOther(item, closeChildren)
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this._toggleDropdown(true, item, closeChildren)
 | 
			
		||||
          // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
          this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .catch(() => {})
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  close(el, closeChildren = this._closeChildren, _autoClose = false) {
 | 
			
		||||
    const item = Menu._getItem(el, true)
 | 
			
		||||
    const toggleLink = Menu._getLink(el, true)
 | 
			
		||||
 | 
			
		||||
    if (!item.classList.contains('open') || item.classList.contains('disabled')) return
 | 
			
		||||
 | 
			
		||||
    Menu._promisify(this._onClose, this, item, toggleLink, Menu._findMenu(item), _autoClose)
 | 
			
		||||
      .then(() => {
 | 
			
		||||
        if (!this._horizontal || !Menu._isRoot(item)) {
 | 
			
		||||
          if (this._animate && !this._horizontal) {
 | 
			
		||||
            window.requestAnimationFrame(() => this._toggleAnimation(false, item, closeChildren))
 | 
			
		||||
          } else {
 | 
			
		||||
            item.classList.remove('open')
 | 
			
		||||
 | 
			
		||||
            if (closeChildren) {
 | 
			
		||||
              const opened = item.querySelectorAll('.menu-item.open')
 | 
			
		||||
              for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
            this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this._toggleDropdown(false, item, closeChildren)
 | 
			
		||||
          // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
          this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .catch(() => {})
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _closeOther(item, closeChildren) {
 | 
			
		||||
    const opened = Menu._findChild(item.parentNode, ['menu-item', 'open'])
 | 
			
		||||
 | 
			
		||||
    for (let i = 0, l = opened.length; i < l; i++) {
 | 
			
		||||
      if (opened[i] !== item) this.close(opened[i], closeChildren)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  toggle(el, closeChildren = this._closeChildren) {
 | 
			
		||||
    const item = Menu._getItem(el, true)
 | 
			
		||||
    // const toggleLink = Menu._getLink(el, true)
 | 
			
		||||
 | 
			
		||||
    if (item.classList.contains('open')) this.close(item, closeChildren)
 | 
			
		||||
    else this.open(item, closeChildren)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _toggleDropdown(show, item, closeChildren) {
 | 
			
		||||
    const menu = Menu._findMenu(item)
 | 
			
		||||
    const actualItem = item
 | 
			
		||||
    let subMenuItem = false
 | 
			
		||||
 | 
			
		||||
    if (show) {
 | 
			
		||||
      if (Menu._findParent(item, 'menu-sub', false)) {
 | 
			
		||||
        subMenuItem = true
 | 
			
		||||
        item = this._topParent ? this._topParent.parentNode : item
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
      const position = this._innerPosition
 | 
			
		||||
      const itemOffset = this._getItemOffset(item)
 | 
			
		||||
      const itemWidth = Math.round(item.getBoundingClientRect().width)
 | 
			
		||||
 | 
			
		||||
      if (itemOffset - DELTA <= -1 * position) {
 | 
			
		||||
        this._innerPosition = -1 * itemOffset
 | 
			
		||||
      } else if (itemOffset + position + itemWidth + DELTA >= wrapperWidth) {
 | 
			
		||||
        if (itemWidth > wrapperWidth) {
 | 
			
		||||
          this._innerPosition = -1 * itemOffset
 | 
			
		||||
        } else {
 | 
			
		||||
          this._innerPosition = -1 * (itemOffset + itemWidth - wrapperWidth)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      actualItem.classList.add('open')
 | 
			
		||||
 | 
			
		||||
      const menuWidth = Math.round(menu.getBoundingClientRect().width)
 | 
			
		||||
 | 
			
		||||
      if (subMenuItem) {
 | 
			
		||||
        if (
 | 
			
		||||
          itemOffset + this._innerPosition + menuWidth * 2 > wrapperWidth &&
 | 
			
		||||
          menuWidth < wrapperWidth &&
 | 
			
		||||
          menuWidth >= itemWidth
 | 
			
		||||
        ) {
 | 
			
		||||
          menu.style.left = [this._rtl ? '100%' : '-100%']
 | 
			
		||||
        }
 | 
			
		||||
      } else if (
 | 
			
		||||
        itemOffset + this._innerPosition + menuWidth > wrapperWidth &&
 | 
			
		||||
        menuWidth < wrapperWidth &&
 | 
			
		||||
        menuWidth > itemWidth
 | 
			
		||||
      ) {
 | 
			
		||||
        menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = `-${menuWidth - itemWidth}px`
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._closeOther(actualItem, closeChildren)
 | 
			
		||||
      this._updateSlider()
 | 
			
		||||
    } else {
 | 
			
		||||
      const toggle = Menu._findChild(item, ['menu-toggle'])
 | 
			
		||||
 | 
			
		||||
      // eslint-disable-next-line no-unused-expressions
 | 
			
		||||
      toggle.length && toggle[0].removeAttribute('data-hover', 'true')
 | 
			
		||||
      item.classList.remove('open')
 | 
			
		||||
      menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = null
 | 
			
		||||
 | 
			
		||||
      if (closeChildren) {
 | 
			
		||||
        const opened = menu.querySelectorAll('.menu-item.open')
 | 
			
		||||
 | 
			
		||||
        for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _slide(direction) {
 | 
			
		||||
    const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
    const innerWidth = this._innerWidth
 | 
			
		||||
    let newPosition
 | 
			
		||||
 | 
			
		||||
    if (direction === 'next') {
 | 
			
		||||
      newPosition = this._getSlideNextPos()
 | 
			
		||||
 | 
			
		||||
      if (innerWidth + newPosition < wrapperWidth) {
 | 
			
		||||
        newPosition = wrapperWidth - innerWidth
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      newPosition = this._getSlidePrevPos()
 | 
			
		||||
 | 
			
		||||
      if (newPosition > 0) newPosition = 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._innerPosition = newPosition
 | 
			
		||||
    this.update()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getSlideNextPos() {
 | 
			
		||||
    const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
    const position = this._innerPosition
 | 
			
		||||
    let curItem = this._inner.childNodes[0]
 | 
			
		||||
    let left = 0
 | 
			
		||||
 | 
			
		||||
    while (curItem) {
 | 
			
		||||
      if (curItem.tagName) {
 | 
			
		||||
        const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
 | 
			
		||||
 | 
			
		||||
        if (left + position - DELTA <= wrapperWidth && left + position + curItemWidth + DELTA >= wrapperWidth) {
 | 
			
		||||
          if (curItemWidth > wrapperWidth && left === -1 * position) left += curItemWidth
 | 
			
		||||
          break
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        left += curItemWidth
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      curItem = curItem.nextSibling
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1 * left
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getSlidePrevPos() {
 | 
			
		||||
    const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
    const position = this._innerPosition
 | 
			
		||||
    let curItem = this._inner.childNodes[0]
 | 
			
		||||
    let left = 0
 | 
			
		||||
 | 
			
		||||
    while (curItem) {
 | 
			
		||||
      if (curItem.tagName) {
 | 
			
		||||
        const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
 | 
			
		||||
 | 
			
		||||
        if (left - DELTA <= -1 * position && left + curItemWidth + DELTA >= -1 * position) {
 | 
			
		||||
          if (curItemWidth <= wrapperWidth) left = left + curItemWidth - wrapperWidth
 | 
			
		||||
          break
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        left += curItemWidth
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      curItem = curItem.nextSibling
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1 * left
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _getItem(el, toggle) {
 | 
			
		||||
    let item = null
 | 
			
		||||
    const selector = toggle ? 'menu-toggle' : 'menu-link'
 | 
			
		||||
 | 
			
		||||
    if (el.classList.contains('menu-item')) {
 | 
			
		||||
      if (Menu._findChild(el, [selector]).length) item = el
 | 
			
		||||
    } else if (el.classList.contains(selector)) {
 | 
			
		||||
      item = el.parentNode.classList.contains('menu-item') ? el.parentNode : null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!item) {
 | 
			
		||||
      throw new Error(`${toggle ? 'Toggable ' : ''}\`.menu-item\` element not found.`)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return item
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _getLink(el, toggle) {
 | 
			
		||||
    let found = []
 | 
			
		||||
    const selector = toggle ? 'menu-toggle' : 'menu-link'
 | 
			
		||||
 | 
			
		||||
    if (el.classList.contains(selector)) found = [el]
 | 
			
		||||
    else if (el.classList.contains('menu-item')) found = Menu._findChild(el, [selector])
 | 
			
		||||
 | 
			
		||||
    if (!found.length) throw new Error(`\`${selector}\` element not found.`)
 | 
			
		||||
 | 
			
		||||
    return found[0]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _findUnopenedParent(item, closeChildren) {
 | 
			
		||||
    let tree = []
 | 
			
		||||
    let parentItem = null
 | 
			
		||||
 | 
			
		||||
    while (item) {
 | 
			
		||||
      if (item.classList.contains('disabled')) {
 | 
			
		||||
        parentItem = null
 | 
			
		||||
        tree = []
 | 
			
		||||
      } else {
 | 
			
		||||
        if (!item.classList.contains('open')) parentItem = item
 | 
			
		||||
        tree.push(item)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      item = Menu._findParent(item, 'menu-item', false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!parentItem) return null
 | 
			
		||||
    if (tree.length === 1) return parentItem
 | 
			
		||||
 | 
			
		||||
    tree = tree.slice(0, tree.indexOf(parentItem))
 | 
			
		||||
 | 
			
		||||
    for (let i = 0, l = tree.length; i < l; i++) {
 | 
			
		||||
      tree[i].classList.add('open')
 | 
			
		||||
 | 
			
		||||
      if (this._accordion) {
 | 
			
		||||
        const openedItems = Menu._findChild(tree[i].parentNode, ['menu-item', 'open'])
 | 
			
		||||
 | 
			
		||||
        for (let j = 0, k = openedItems.length; j < k; j++) {
 | 
			
		||||
          if (openedItems[j] !== tree[i]) {
 | 
			
		||||
            openedItems[j].classList.remove('open')
 | 
			
		||||
 | 
			
		||||
            if (closeChildren) {
 | 
			
		||||
              const openedChildren = openedItems[j].querySelectorAll('.menu-item.open')
 | 
			
		||||
              for (let x = 0, z = openedChildren.length; x < z; x++) {
 | 
			
		||||
                openedChildren[x].classList.remove('open')
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return parentItem
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _toggleAnimation(open, item, closeChildren) {
 | 
			
		||||
    const toggleLink = Menu._getLink(item, true)
 | 
			
		||||
    const menu = Menu._findMenu(item)
 | 
			
		||||
 | 
			
		||||
    Menu._unbindAnimationEndEvent(item)
 | 
			
		||||
 | 
			
		||||
    const linkHeight = Math.round(toggleLink.getBoundingClientRect().height)
 | 
			
		||||
 | 
			
		||||
    item.style.overflow = 'hidden'
 | 
			
		||||
 | 
			
		||||
    const clearItemStyle = () => {
 | 
			
		||||
      item.classList.remove('menu-item-animating')
 | 
			
		||||
      item.classList.remove('menu-item-closing')
 | 
			
		||||
      item.style.overflow = null
 | 
			
		||||
      item.style.height = null
 | 
			
		||||
 | 
			
		||||
      if (!this._horizontal) this.update()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (open) {
 | 
			
		||||
      item.style.height = `${linkHeight}px`
 | 
			
		||||
      item.classList.add('menu-item-animating')
 | 
			
		||||
      item.classList.add('open')
 | 
			
		||||
 | 
			
		||||
      Menu._bindAnimationEndEvent(item, () => {
 | 
			
		||||
        clearItemStyle()
 | 
			
		||||
        this._onOpened(this, item, toggleLink, menu)
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
 | 
			
		||||
      }, 50)
 | 
			
		||||
    } else {
 | 
			
		||||
      item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
 | 
			
		||||
      item.classList.add('menu-item-animating')
 | 
			
		||||
      item.classList.add('menu-item-closing')
 | 
			
		||||
 | 
			
		||||
      Menu._bindAnimationEndEvent(item, () => {
 | 
			
		||||
        item.classList.remove('open')
 | 
			
		||||
        clearItemStyle()
 | 
			
		||||
 | 
			
		||||
        if (closeChildren) {
 | 
			
		||||
          const opened = item.querySelectorAll('.menu-item.open')
 | 
			
		||||
          for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._onClosed(this, item, toggleLink, menu)
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        item.style.height = `${linkHeight}px`
 | 
			
		||||
      }, 50)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _bindAnimationEndEvent(el, handler) {
 | 
			
		||||
    const cb = e => {
 | 
			
		||||
      if (e.target !== el) return
 | 
			
		||||
      Menu._unbindAnimationEndEvent(el)
 | 
			
		||||
      handler(e)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let duration = window.getComputedStyle(el).transitionDuration
 | 
			
		||||
    duration = parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000)
 | 
			
		||||
 | 
			
		||||
    el._menuAnimationEndEventCb = cb
 | 
			
		||||
    TRANSITION_EVENTS.forEach(ev => el.addEventListener(ev, el._menuAnimationEndEventCb, false))
 | 
			
		||||
 | 
			
		||||
    el._menuAnimationEndEventTimeout = setTimeout(() => {
 | 
			
		||||
      cb({ target: el })
 | 
			
		||||
    }, duration + 50)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getItemOffset(item) {
 | 
			
		||||
    let curItem = this._inner.childNodes[0]
 | 
			
		||||
    let left = 0
 | 
			
		||||
 | 
			
		||||
    while (curItem !== item) {
 | 
			
		||||
      if (curItem.tagName) {
 | 
			
		||||
        left += Math.round(curItem.getBoundingClientRect().width)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      curItem = curItem.nextSibling
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return left
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _updateSlider(wrapperWidth = null, innerWidth = null, position = null) {
 | 
			
		||||
    const _wrapperWidth = wrapperWidth !== null ? wrapperWidth : Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
    const _innerWidth = innerWidth !== null ? innerWidth : this._innerWidth
 | 
			
		||||
    const _position = position !== null ? position : this._innerPosition
 | 
			
		||||
 | 
			
		||||
    if (_innerWidth < _wrapperWidth || window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
      this._prevBtn.classList.add('d-none')
 | 
			
		||||
      this._nextBtn.classList.add('d-none')
 | 
			
		||||
    } else {
 | 
			
		||||
      this._prevBtn.classList.remove('d-none')
 | 
			
		||||
      this._nextBtn.classList.remove('d-none')
 | 
			
		||||
    }
 | 
			
		||||
    if (_innerWidth > _wrapperWidth && window.innerWidth > window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
      if (_position === 0) this._prevBtn.classList.add('disabled')
 | 
			
		||||
      else this._prevBtn.classList.remove('disabled')
 | 
			
		||||
 | 
			
		||||
      if (_innerWidth + _position <= _wrapperWidth) this._nextBtn.classList.add('disabled')
 | 
			
		||||
      else this._nextBtn.classList.remove('disabled')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _promisify(fn, ...args) {
 | 
			
		||||
    const result = fn(...args)
 | 
			
		||||
    if (result instanceof Promise) {
 | 
			
		||||
      return result
 | 
			
		||||
    }
 | 
			
		||||
    if (result === false) {
 | 
			
		||||
      return Promise.reject()
 | 
			
		||||
    }
 | 
			
		||||
    return Promise.resolve()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get _innerWidth() {
 | 
			
		||||
    const items = this._inner.childNodes
 | 
			
		||||
    let width = 0
 | 
			
		||||
 | 
			
		||||
    for (let i = 0, l = items.length; i < l; i++) {
 | 
			
		||||
      if (items[i].tagName) {
 | 
			
		||||
        width += Math.round(items[i].getBoundingClientRect().width)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return width
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get _innerPosition() {
 | 
			
		||||
    return parseInt(this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] || '0px', 10)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set _innerPosition(value) {
 | 
			
		||||
    this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] = `${value}px`
 | 
			
		||||
    return value
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static _unbindAnimationEndEvent(el) {
 | 
			
		||||
    const cb = el._menuAnimationEndEventCb
 | 
			
		||||
 | 
			
		||||
    if (el._menuAnimationEndEventTimeout) {
 | 
			
		||||
      clearTimeout(el._menuAnimationEndEventTimeout)
 | 
			
		||||
      el._menuAnimationEndEventTimeout = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!cb) return
 | 
			
		||||
 | 
			
		||||
    TRANSITION_EVENTS.forEach(ev => el.removeEventListener(ev, cb, false))
 | 
			
		||||
    el._menuAnimationEndEventCb = null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  closeAll(closeChildren = this._closeChildren) {
 | 
			
		||||
    const opened = this._el.querySelectorAll('.menu-inner > .menu-item.open')
 | 
			
		||||
 | 
			
		||||
    for (let i = 0, l = opened.length; i < l; i++) this.close(opened[i], closeChildren)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static setDisabled(el, disabled) {
 | 
			
		||||
    Menu._getItem(el, false).classList[disabled ? 'add' : 'remove']('disabled')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isActive(el) {
 | 
			
		||||
    return Menu._getItem(el, false).classList.contains('active')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isOpened(el) {
 | 
			
		||||
    return Menu._getItem(el, false).classList.contains('open')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isDisabled(el) {
 | 
			
		||||
    return Menu._getItem(el, false).classList.contains('disabled')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  update() {
 | 
			
		||||
    if (!this._horizontal) {
 | 
			
		||||
      if (this._scrollbar) {
 | 
			
		||||
        this._scrollbar.update()
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      this.closeAll()
 | 
			
		||||
 | 
			
		||||
      const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
 | 
			
		||||
      const innerWidth = this._innerWidth
 | 
			
		||||
      let position = this._innerPosition
 | 
			
		||||
 | 
			
		||||
      if (wrapperWidth - position > innerWidth) {
 | 
			
		||||
        position = wrapperWidth - innerWidth
 | 
			
		||||
        if (position > 0) position = 0
 | 
			
		||||
        this._innerPosition = position
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._updateSlider(wrapperWidth, innerWidth, position)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  manageScroll() {
 | 
			
		||||
    const { PerfectScrollbar } = window
 | 
			
		||||
    const menuInner = document.querySelector('.menu-inner')
 | 
			
		||||
 | 
			
		||||
    if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
 | 
			
		||||
      if (this._scrollbar !== null) {
 | 
			
		||||
        // window.Helpers.menuPsScroll.destroy()
 | 
			
		||||
        this._scrollbar.destroy()
 | 
			
		||||
        this._scrollbar = null
 | 
			
		||||
      }
 | 
			
		||||
      menuInner.classList.add('overflow-auto')
 | 
			
		||||
    } else {
 | 
			
		||||
      if (this._scrollbar === null) {
 | 
			
		||||
        const menuScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
 | 
			
		||||
          suppressScrollX: true,
 | 
			
		||||
          wheelPropagation: false
 | 
			
		||||
        })
 | 
			
		||||
        // window.Helpers.menuPsScroll = menuScroll
 | 
			
		||||
        this._scrollbar = menuScroll
 | 
			
		||||
      }
 | 
			
		||||
      menuInner.classList.remove('overflow-auto')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  switchMenu(menu) {
 | 
			
		||||
    // Unbind Events
 | 
			
		||||
    this._unbindEvents()
 | 
			
		||||
 | 
			
		||||
    // const html = document.documentElement
 | 
			
		||||
    const navbar = document.querySelector('nav.layout-navbar')
 | 
			
		||||
    const navbarCollapse = document.querySelector('#navbar-collapse')
 | 
			
		||||
    /* const fullNavbar = document.querySelector('.layout-navbar-full')
 | 
			
		||||
    const contentNavbar = document.querySelector('.layout-content-navbar')
 | 
			
		||||
    const contentWrapper = document.querySelector('.content-wrapper') */
 | 
			
		||||
    const asideMenuWrapper = document.querySelector('#layout-menu div')
 | 
			
		||||
    const asideMenu = document.querySelector('#layout-menu')
 | 
			
		||||
    const horzMenuClasses = ['layout-menu-horizontal', 'menu', 'menu-horizontal', 'container-fluid', 'flex-grow-0']
 | 
			
		||||
    const vertMenuClasses = ['layout-menu', 'menu', 'menu-vertical']
 | 
			
		||||
    const horzMenuWrapper = document.querySelector('.menu-horizontal-wrapper')
 | 
			
		||||
    const menuInner = document.querySelector('.menu-inner')
 | 
			
		||||
    const brand = document.querySelector('.app-brand')
 | 
			
		||||
    const menuToggler = document.querySelector('.layout-menu-toggle')
 | 
			
		||||
    const activeMenuItems = document.querySelectorAll('.menu-inner .active')
 | 
			
		||||
    /* const layoutPage = document.querySelector('.layout-page')
 | 
			
		||||
    const layoutContainer = document.querySelector('.layout-container')
 | 
			
		||||
    const content = document.querySelector('.container-fluid') */
 | 
			
		||||
 | 
			
		||||
    // const { PerfectScrollbar } = window
 | 
			
		||||
 | 
			
		||||
    if (menu === 'vertical') {
 | 
			
		||||
      this._horizontal = false
 | 
			
		||||
      asideMenuWrapper.insertBefore(brand, horzMenuWrapper)
 | 
			
		||||
      asideMenuWrapper.insertBefore(menuInner, horzMenuWrapper)
 | 
			
		||||
      asideMenuWrapper.classList.add('flex-column', 'p-0')
 | 
			
		||||
      asideMenu.classList.remove(...asideMenu.classList)
 | 
			
		||||
      asideMenu.classList.add(...vertMenuClasses, this._menuBgClass)
 | 
			
		||||
      brand.classList.remove('d-none', 'd-lg-flex')
 | 
			
		||||
      menuToggler.classList.remove('d-none')
 | 
			
		||||
      // if (PerfectScrollbar !== undefined) {
 | 
			
		||||
      //   this._psScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
 | 
			
		||||
      //     suppressScrollX: true,
 | 
			
		||||
      //     wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
 | 
			
		||||
      //   })
 | 
			
		||||
      // }
 | 
			
		||||
 | 
			
		||||
      menuInner.classList.add('overflow-auto')
 | 
			
		||||
 | 
			
		||||
      // Add open class to active items
 | 
			
		||||
      for (let i = 0; i < activeMenuItems.length - 1; ++i) {
 | 
			
		||||
        activeMenuItems[i].classList.add('open')
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      this._horizontal = true
 | 
			
		||||
      navbar.children[0].insertBefore(brand, navbarCollapse)
 | 
			
		||||
      brand.classList.add('d-none', 'd-lg-flex')
 | 
			
		||||
      horzMenuWrapper.appendChild(menuInner)
 | 
			
		||||
      asideMenuWrapper.classList.remove('flex-column', 'p-0')
 | 
			
		||||
      asideMenu.classList.remove(...asideMenu.classList)
 | 
			
		||||
      asideMenu.classList.add(...horzMenuClasses, this._menuBgClass)
 | 
			
		||||
      menuToggler.classList.add('d-none')
 | 
			
		||||
      menuInner.classList.remove('overflow-auto')
 | 
			
		||||
 | 
			
		||||
      // if (PerfectScrollbar !== undefined && this._psScroll !== null) {
 | 
			
		||||
      //   this._psScroll.destroy()
 | 
			
		||||
      //   this._psScroll = null
 | 
			
		||||
      // }
 | 
			
		||||
 | 
			
		||||
      // Remove open class from active items
 | 
			
		||||
      for (let i = 0; i < activeMenuItems.length; ++i) {
 | 
			
		||||
        activeMenuItems[i].classList.remove('open')
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._bindEvents()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  destroy() {
 | 
			
		||||
    if (!this._el) return
 | 
			
		||||
 | 
			
		||||
    this._unbindEvents()
 | 
			
		||||
 | 
			
		||||
    const items = this._el.querySelectorAll('.menu-item')
 | 
			
		||||
    for (let i = 0, l = items.length; i < l; i++) {
 | 
			
		||||
      Menu._unbindAnimationEndEvent(items[i])
 | 
			
		||||
      items[i].classList.remove('menu-item-animating')
 | 
			
		||||
      items[i].classList.remove('open')
 | 
			
		||||
      items[i].style.overflow = null
 | 
			
		||||
      items[i].style.height = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const menus = this._el.querySelectorAll('.menu-menu')
 | 
			
		||||
    for (let i2 = 0, l2 = menus.length; i2 < l2; i2++) {
 | 
			
		||||
      menus[i2].style.marginRight = null
 | 
			
		||||
      menus[i2].style.marginLeft = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._el.classList.remove('menu-no-animation')
 | 
			
		||||
 | 
			
		||||
    if (this._wrapper) {
 | 
			
		||||
      this._prevBtn.parentNode.removeChild(this._prevBtn)
 | 
			
		||||
      this._nextBtn.parentNode.removeChild(this._nextBtn)
 | 
			
		||||
      this._wrapper.parentNode.insertBefore(this._inner, this._wrapper)
 | 
			
		||||
      this._wrapper.parentNode.removeChild(this._wrapper)
 | 
			
		||||
      this._inner.style.marginLeft = null
 | 
			
		||||
      this._inner.style.marginRight = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._el.menuInstance = null
 | 
			
		||||
    delete this._el.menuInstance
 | 
			
		||||
 | 
			
		||||
    this._el = null
 | 
			
		||||
    this._horizontal = null
 | 
			
		||||
    this._animate = null
 | 
			
		||||
    this._accordion = null
 | 
			
		||||
    this._showDropdownOnHover = null
 | 
			
		||||
    this._closeChildren = null
 | 
			
		||||
    this._rtl = null
 | 
			
		||||
    this._onOpen = null
 | 
			
		||||
    this._onOpened = null
 | 
			
		||||
    this._onClose = null
 | 
			
		||||
    this._onClosed = null
 | 
			
		||||
    if (this._scrollbar) {
 | 
			
		||||
      this._scrollbar.destroy()
 | 
			
		||||
      this._scrollbar = null
 | 
			
		||||
    }
 | 
			
		||||
    this._inner = null
 | 
			
		||||
    this._prevBtn = null
 | 
			
		||||
    this._wrapper = null
 | 
			
		||||
    this._nextBtn = null
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
window.Menu = Menu
 | 
			
		||||
export { Menu }
 | 
			
		||||
							
								
								
									
										1400
									
								
								resources/assets/vendor/js/template-customizer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1400
									
								
								resources/assets/vendor/js/template-customizer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/@form-validation/auto-focus.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/@form-validation/auto-focus.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import { AutoFocus } from '@form-validation/plugin-auto-focus';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  FormValidation.plugins.AutoFocus = AutoFocus;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { AutoFocus };
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/@form-validation/bootstrap5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/@form-validation/bootstrap5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import { Bootstrap5 } from '@form-validation/plugin-bootstrap5';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  FormValidation.plugins.Bootstrap5 = Bootstrap5;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { Bootstrap5 };
 | 
			
		||||
							
								
								
									
										4
									
								
								resources/assets/vendor/libs/@form-validation/form-validation.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								resources/assets/vendor/libs/@form-validation/form-validation.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
@import '@form-validation/core/lib/styles/index';
 | 
			
		||||
@import '@form-validation/plugin-framework/lib/styles/index';
 | 
			
		||||
@import '@form-validation/plugin-message/lib/styles/index';
 | 
			
		||||
@import '@form-validation/plugin-bootstrap5/lib/styles/index';
 | 
			
		||||
							
								
								
									
										8
									
								
								resources/assets/vendor/libs/@form-validation/popular.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								resources/assets/vendor/libs/@form-validation/popular.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
import FormValidation from '@form-validation/bundle/popular'
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.FormValidation = FormValidation;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { FormValidation };
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										414
									
								
								resources/assets/vendor/libs/_tabler/_tabler.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										414
									
								
								resources/assets/vendor/libs/_tabler/_tabler.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,414 @@
 | 
			
		||||
@-webkit-keyframes spin {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: rotate(0);
 | 
			
		||||
    transform: rotate(0);
 | 
			
		||||
  }
 | 
			
		||||
  100% {
 | 
			
		||||
    -webkit-transform: rotate(359deg);
 | 
			
		||||
    transform: rotate(359deg);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes spin {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: rotate(0);
 | 
			
		||||
    transform: rotate(0);
 | 
			
		||||
  }
 | 
			
		||||
  100% {
 | 
			
		||||
    -webkit-transform: rotate(359deg);
 | 
			
		||||
    transform: rotate(359deg);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes burst {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: scale(1);
 | 
			
		||||
    transform: scale(1);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  90% {
 | 
			
		||||
    -webkit-transform: scale(1.5);
 | 
			
		||||
    transform: scale(1.5);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes burst {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: scale(1);
 | 
			
		||||
    transform: scale(1);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  90% {
 | 
			
		||||
    -webkit-transform: scale(1.5);
 | 
			
		||||
    transform: scale(1.5);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes flashing {
 | 
			
		||||
  0% {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  45% {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
  90% {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes flashing {
 | 
			
		||||
  0% {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  45% {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
  90% {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes fade-left {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateX(0);
 | 
			
		||||
    transform: translateX(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateX(-20px);
 | 
			
		||||
    transform: translateX(-20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes fade-left {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateX(0);
 | 
			
		||||
    transform: translateX(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateX(-20px);
 | 
			
		||||
    transform: translateX(-20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes fade-right {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateX(0);
 | 
			
		||||
    transform: translateX(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateX(20px);
 | 
			
		||||
    transform: translateX(20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes fade-right {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateX(0);
 | 
			
		||||
    transform: translateX(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateX(20px);
 | 
			
		||||
    transform: translateX(20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes fade-up {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateY(0);
 | 
			
		||||
    transform: translateY(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateY(-20px);
 | 
			
		||||
    transform: translateY(-20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes fade-up {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateY(0);
 | 
			
		||||
    transform: translateY(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateY(-20px);
 | 
			
		||||
    transform: translateY(-20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes fade-down {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateY(0);
 | 
			
		||||
    transform: translateY(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateY(20px);
 | 
			
		||||
    transform: translateY(20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes fade-down {
 | 
			
		||||
  0% {
 | 
			
		||||
    -webkit-transform: translateY(0);
 | 
			
		||||
    transform: translateY(0);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  75% {
 | 
			
		||||
    -webkit-transform: translateY(20px);
 | 
			
		||||
    transform: translateY(20px);
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@-webkit-keyframes tada {
 | 
			
		||||
  from {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1);
 | 
			
		||||
    transform: scale3d(1, 1, 1);
 | 
			
		||||
  }
 | 
			
		||||
  10%,
 | 
			
		||||
  20% {
 | 
			
		||||
    -webkit-transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
    transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
  }
 | 
			
		||||
  30%,
 | 
			
		||||
  50%,
 | 
			
		||||
  70%,
 | 
			
		||||
  90% {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
 | 
			
		||||
    transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
 | 
			
		||||
  }
 | 
			
		||||
  40%,
 | 
			
		||||
  60%,
 | 
			
		||||
  80% {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
    transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
  }
 | 
			
		||||
  to {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1);
 | 
			
		||||
    transform: scale3d(1, 1, 1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@keyframes tada {
 | 
			
		||||
  from {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1);
 | 
			
		||||
    transform: scale3d(1, 1, 1);
 | 
			
		||||
  }
 | 
			
		||||
  10%,
 | 
			
		||||
  20% {
 | 
			
		||||
    -webkit-transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
    transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
  }
 | 
			
		||||
  30%,
 | 
			
		||||
  50%,
 | 
			
		||||
  70%,
 | 
			
		||||
  90% {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
 | 
			
		||||
    transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
 | 
			
		||||
  }
 | 
			
		||||
  40%,
 | 
			
		||||
  60%,
 | 
			
		||||
  80% {
 | 
			
		||||
    -webkit-transform: rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
    transform: rotate3d(0, 0, 1, -10deg);
 | 
			
		||||
  }
 | 
			
		||||
  to {
 | 
			
		||||
    -webkit-transform: scale3d(1, 1, 1);
 | 
			
		||||
    transform: scale3d(1, 1, 1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-spin {
 | 
			
		||||
  -webkit-animation: spin 2s linear infinite;
 | 
			
		||||
  animation: spin 2s linear infinite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-spin-hover:hover {
 | 
			
		||||
  -webkit-animation: spin 2s linear infinite;
 | 
			
		||||
  animation: spin 2s linear infinite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-tada {
 | 
			
		||||
  -webkit-animation: tada 1.5s ease infinite;
 | 
			
		||||
  animation: tada 1.5s ease infinite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-tada-hover:hover {
 | 
			
		||||
  -webkit-animation: tada 1.5s ease infinite;
 | 
			
		||||
  animation: tada 1.5s ease infinite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-flashing {
 | 
			
		||||
  -webkit-animation: flashing 1.5s infinite linear;
 | 
			
		||||
  animation: flashing 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-flashing-hover:hover {
 | 
			
		||||
  -webkit-animation: flashing 1.5s infinite linear;
 | 
			
		||||
  animation: flashing 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-burst {
 | 
			
		||||
  -webkit-animation: burst 1.5s infinite linear;
 | 
			
		||||
  animation: burst 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-burst-hover:hover {
 | 
			
		||||
  -webkit-animation: burst 1.5s infinite linear;
 | 
			
		||||
  animation: burst 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-up {
 | 
			
		||||
  -webkit-animation: fade-up 1.5s infinite linear;
 | 
			
		||||
  animation: fade-up 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-up-hover:hover {
 | 
			
		||||
  -webkit-animation: fade-up 1.5s infinite linear;
 | 
			
		||||
  animation: fade-up 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-down {
 | 
			
		||||
  -webkit-animation: fade-down 1.5s infinite linear;
 | 
			
		||||
  animation: fade-down 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-down-hover:hover {
 | 
			
		||||
  -webkit-animation: fade-down 1.5s infinite linear;
 | 
			
		||||
  animation: fade-down 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-left {
 | 
			
		||||
  -webkit-animation: fade-left 1.5s infinite linear;
 | 
			
		||||
  animation: fade-left 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-left-hover:hover {
 | 
			
		||||
  -webkit-animation: fade-left 1.5s infinite linear;
 | 
			
		||||
  animation: fade-left 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-right {
 | 
			
		||||
  -webkit-animation: fade-right 1.5s infinite linear;
 | 
			
		||||
  animation: fade-right 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-fade-right-hover:hover {
 | 
			
		||||
  -webkit-animation: fade-right 1.5s infinite linear;
 | 
			
		||||
  animation: fade-right 1.5s infinite linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-xs {
 | 
			
		||||
  font-size: 1rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-sm {
 | 
			
		||||
  font-size: 1.125rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-md {
 | 
			
		||||
  font-size: 1.375rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-lg {
 | 
			
		||||
  font-size: 1.5rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-xl {
 | 
			
		||||
  font-size: 2.25rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ti-10px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-12px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-14px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-16px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 16px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-18px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-20px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-22px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 22px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-24px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 24px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-26px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 26px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-28px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 28px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-30px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 30px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-32px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 32px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-36px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 36px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-40px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 40px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-42px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 42px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.ti-48px {
 | 
			
		||||
  &,
 | 
			
		||||
  &:before {
 | 
			
		||||
    font-size: 48px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/animate-css/animate.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/animate-css/animate.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
@import 'animate.css/animate';
 | 
			
		||||
							
								
								
									
										93
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,93 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/functions';
 | 
			
		||||
 | 
			
		||||
@mixin bs-datepicker-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
  $range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
  $range-color: $background;
 | 
			
		||||
 | 
			
		||||
  .datepicker {
 | 
			
		||||
    table {
 | 
			
		||||
      tr td {
 | 
			
		||||
        &.active,
 | 
			
		||||
        &.active.highlighted,
 | 
			
		||||
        .focused,
 | 
			
		||||
        span.active,
 | 
			
		||||
        span.active.disabled,
 | 
			
		||||
        &.range-start,
 | 
			
		||||
        &.range-end {
 | 
			
		||||
          background: $background !important;
 | 
			
		||||
          color: $color !important;
 | 
			
		||||
          box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        &.range,
 | 
			
		||||
        &.range.highlighted,
 | 
			
		||||
        &.range.today {
 | 
			
		||||
          color: $range-color !important;
 | 
			
		||||
          background: $range-bg !important;
 | 
			
		||||
 | 
			
		||||
          &.focused {
 | 
			
		||||
            background: rgba-to-hex(rgba($background, 0.24), $card-bg) !important;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.disabled {
 | 
			
		||||
            background: transparentize($range-bg, 0.5) !important;
 | 
			
		||||
            color: transparentize($range-color, 0.5) !important;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        &.today:not(.active),
 | 
			
		||||
        &.today:not(.active):hover {
 | 
			
		||||
          color: $background;
 | 
			
		||||
          background-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin bs-datepicker-dark-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
  $range-bg: rgba-to-hex(rgba($background, 0.24), $card-bg);
 | 
			
		||||
  $range-color: $background;
 | 
			
		||||
 | 
			
		||||
  .datepicker {
 | 
			
		||||
    table {
 | 
			
		||||
      tr td {
 | 
			
		||||
        &.active,
 | 
			
		||||
        &.active.highlighted,
 | 
			
		||||
        .focused,
 | 
			
		||||
        span.active,
 | 
			
		||||
        span.active.disabled,
 | 
			
		||||
        &.range-start,
 | 
			
		||||
        &.range-end {
 | 
			
		||||
          color: $color !important;
 | 
			
		||||
          background: $background !important;
 | 
			
		||||
          box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        &.range,
 | 
			
		||||
        &.range.highlighted,
 | 
			
		||||
        &.range.today {
 | 
			
		||||
          color: $range-color !important;
 | 
			
		||||
          background: $range-bg !important;
 | 
			
		||||
 | 
			
		||||
          &.disabled {
 | 
			
		||||
            color: transparentize($range-color, 0.5) !important;
 | 
			
		||||
            background: transparentize($range-bg, 0.5) !important;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.focused {
 | 
			
		||||
            background: rgba-to-hex(rgba($background, 0.24), $card-bg) !important;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        &.today:not(.active),
 | 
			
		||||
        &.today:not(.active):hover {
 | 
			
		||||
          color: $background;
 | 
			
		||||
          background-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'bootstrap-datepicker/dist/js/bootstrap-datepicker';
 | 
			
		||||
							
								
								
									
										482
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										482
									
								
								resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,482 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
$datepicker-arrow-size: 0.45rem !default;
 | 
			
		||||
$datepicker-item-width: 2.25rem !default;
 | 
			
		||||
$datepicker-item-height: 2.25rem !default;
 | 
			
		||||
$white: #fff;
 | 
			
		||||
 | 
			
		||||
.datepicker {
 | 
			
		||||
  direction: ltr;
 | 
			
		||||
 | 
			
		||||
  &.dropdown-menu {
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
  }
 | 
			
		||||
  .datepicker-days {
 | 
			
		||||
    margin: 0.875rem 0.875rem 0.875rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Basic styles for next and prev arrows
 | 
			
		||||
  .next,
 | 
			
		||||
  .prev {
 | 
			
		||||
    color: transparent !important;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0.65rem;
 | 
			
		||||
    height: 1.875rem;
 | 
			
		||||
    width: 1.875rem;
 | 
			
		||||
    border-radius: light.$border-radius-pill;
 | 
			
		||||
    display: table-caption;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // LRT & RTL only styles for arrows
 | 
			
		||||
  table thead tr th {
 | 
			
		||||
    &.next {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        float: right;
 | 
			
		||||
        right: 0.125rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        float: left;
 | 
			
		||||
        left: 0.125rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.prev {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 2.75rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 2.75rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  &.datepicker-inline {
 | 
			
		||||
    table {
 | 
			
		||||
      thead tr th {
 | 
			
		||||
        &.next {
 | 
			
		||||
          inset-inline-end: 0.5rem !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .datepicker-days {
 | 
			
		||||
      .datepicker-switch {
 | 
			
		||||
        top: 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // next & prev arrow after style
 | 
			
		||||
  .next::after,
 | 
			
		||||
  .prev::after {
 | 
			
		||||
    content: '';
 | 
			
		||||
    display: block;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 46%;
 | 
			
		||||
    top: 46%;
 | 
			
		||||
    height: $datepicker-arrow-size;
 | 
			
		||||
    width: $datepicker-arrow-size;
 | 
			
		||||
    border-radius: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    transform: rotate(-45deg);
 | 
			
		||||
    transform-origin: left;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .next::after {
 | 
			
		||||
    margin-left: -$datepicker-arrow-size * 0.35;
 | 
			
		||||
    border-width: 0 1.9px 1.9px 0;
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      transform: rotate(-45deg);
 | 
			
		||||
      border-width: 1.9px 0 0 1.9px;
 | 
			
		||||
      margin-left: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prev::after {
 | 
			
		||||
    border-width: 1.9px 0 0 1.9px;
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      transform: rotate(-45deg);
 | 
			
		||||
      border-width: 0 1.9px 1.9px 0;
 | 
			
		||||
      margin-left: -$datepicker-arrow-size * 0.5;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // arrow alignments excluding datepicker-days
 | 
			
		||||
  .datepicker-months,
 | 
			
		||||
  .datepicker-years,
 | 
			
		||||
  .datepicker-decades,
 | 
			
		||||
  .datepicker-centuries {
 | 
			
		||||
    .next {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .prev {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 3.4rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 3.4rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // switch default styles
 | 
			
		||||
  .datepicker-switch {
 | 
			
		||||
    vertical-align: middle;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    @include app-ltr {
 | 
			
		||||
      text-align: left;
 | 
			
		||||
    }
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      text-align: right;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // switch alignments datepicker-days
 | 
			
		||||
  .datepicker-days {
 | 
			
		||||
    .datepicker-switch {
 | 
			
		||||
      top: -4px;
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        left: -1.68rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        right: -1.68rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // switch alignments excluding datepicker-days
 | 
			
		||||
  .datepicker-months,
 | 
			
		||||
  .datepicker-years,
 | 
			
		||||
  .datepicker-decades,
 | 
			
		||||
  .datepicker-centuries {
 | 
			
		||||
    .datepicker-switch {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        left: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        right: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  table thead tr:nth-child(2) {
 | 
			
		||||
    height: 60px !important;
 | 
			
		||||
    width: 80px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.datepicker-rtl {
 | 
			
		||||
    direction: rtl;
 | 
			
		||||
 | 
			
		||||
    table tr td span {
 | 
			
		||||
      float: right;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    direction: rtl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.datepicker table {
 | 
			
		||||
  user-select: none;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  border-radius: light.$dropdown-border-radius;
 | 
			
		||||
  tbody {
 | 
			
		||||
    //! FIX: padding or margin top will not work in table
 | 
			
		||||
    &:before {
 | 
			
		||||
      content: '@';
 | 
			
		||||
      display: block;
 | 
			
		||||
      line-height: 6px;
 | 
			
		||||
      text-indent: -99999px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.datepicker table tr td,
 | 
			
		||||
.datepicker table tr th {
 | 
			
		||||
  font-weight: 400;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  border: none;
 | 
			
		||||
 | 
			
		||||
  &.dow {
 | 
			
		||||
    font-size: light.$font-size-sm;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.datepicker table tr td {
 | 
			
		||||
  border-radius: light.$border-radius-pill;
 | 
			
		||||
  width: $datepicker-item-width;
 | 
			
		||||
  height: $datepicker-item-height;
 | 
			
		||||
  &.day:hover,
 | 
			
		||||
  &.focused {
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.disabled,
 | 
			
		||||
  &.disabled:hover {
 | 
			
		||||
    cursor: default;
 | 
			
		||||
    background: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.range {
 | 
			
		||||
    border-radius: 0 !important;
 | 
			
		||||
    &.today {
 | 
			
		||||
      box-shadow: none !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // span.month,
 | 
			
		||||
  // span.year {
 | 
			
		||||
  //   margin: 0 0.5rem;
 | 
			
		||||
  // }
 | 
			
		||||
 | 
			
		||||
  &.range-start:not(.range-end) {
 | 
			
		||||
    @include app-ltr {
 | 
			
		||||
      border-bottom-right-radius: 0 !important;
 | 
			
		||||
      border-top-right-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      border-bottom-left-radius: 0 !important;
 | 
			
		||||
      border-top-left-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.range-end:not(.range-start) {
 | 
			
		||||
    @include app-ltr {
 | 
			
		||||
      border-bottom-left-radius: 0 !important;
 | 
			
		||||
      border-top-left-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      border-bottom-right-radius: 0 !important;
 | 
			
		||||
      border-top-right-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.selected,
 | 
			
		||||
  &.selected:hover,
 | 
			
		||||
  &.selected.highlighted {
 | 
			
		||||
    color: $white;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Styles for datepicker months, years, decades etc
 | 
			
		||||
.datepicker table tr td span {
 | 
			
		||||
  display: block;
 | 
			
		||||
  float: left;
 | 
			
		||||
  width: 3.625rem;
 | 
			
		||||
  height: 2rem;
 | 
			
		||||
  line-height: 2rem;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
 | 
			
		||||
  &.disabled,
 | 
			
		||||
  &.disabled:hover {
 | 
			
		||||
    background: none;
 | 
			
		||||
    cursor: default;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    float: right;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.datepicker .datepicker-switch,
 | 
			
		||||
.datepicker .prev,
 | 
			
		||||
.datepicker .next,
 | 
			
		||||
.datepicker tfoot tr th {
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.datepicker-months table,
 | 
			
		||||
.datepicker-years table,
 | 
			
		||||
.datepicker-decades table,
 | 
			
		||||
.datepicker-centuries table {
 | 
			
		||||
  width: (3.375rem * 3) + 2.625rem;
 | 
			
		||||
 | 
			
		||||
  td {
 | 
			
		||||
    padding: 0 0 0.5rem 0.8125rem;
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      padding: 0 0.8125rem 0.5rem 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.datepicker-dropdown {
 | 
			
		||||
  left: 0;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.input-daterange input {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .datepicker-dropdown {
 | 
			
		||||
      z-index: light.$zindex-popover !important;
 | 
			
		||||
      box-shadow: light.$card-box-shadow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .datepicker {
 | 
			
		||||
      th {
 | 
			
		||||
        &.prev,
 | 
			
		||||
        &.next {
 | 
			
		||||
          background-color: light.rgba-to-hex(rgba(light.$black, 0.08), light.$card-bg);
 | 
			
		||||
          &::after {
 | 
			
		||||
            border-color: light.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      &.datepicker-inline {
 | 
			
		||||
        table {
 | 
			
		||||
          box-shadow: light.$box-shadow;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      table {
 | 
			
		||||
        thead {
 | 
			
		||||
          background-color: light.$card-bg;
 | 
			
		||||
          tr,
 | 
			
		||||
          td {
 | 
			
		||||
            color: light.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        tr td,
 | 
			
		||||
        tr th {
 | 
			
		||||
          &.new {
 | 
			
		||||
            color: light.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tr td {
 | 
			
		||||
          &.old,
 | 
			
		||||
          &.disabled {
 | 
			
		||||
            color: light.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.cw {
 | 
			
		||||
            background-color: light.$card-bg;
 | 
			
		||||
            color: light.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.day:hover,
 | 
			
		||||
          &.focused {
 | 
			
		||||
            background: light.rgba-to-hex(light.$gray-50, light.$card-bg);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .datepicker table tr td span {
 | 
			
		||||
      border-radius: light.$border-radius;
 | 
			
		||||
 | 
			
		||||
      &:hover,
 | 
			
		||||
      &.focused {
 | 
			
		||||
        background: light.rgba-to-hex(light.$gray-50, light.$card-bg);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.disabled,
 | 
			
		||||
      &.disabled:hover {
 | 
			
		||||
        color: light.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.old,
 | 
			
		||||
      &.new {
 | 
			
		||||
        color: light.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .datepicker-dropdown {
 | 
			
		||||
      z-index: dark.$zindex-popover !important;
 | 
			
		||||
      box-shadow: dark.$card-box-shadow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .datepicker {
 | 
			
		||||
      th {
 | 
			
		||||
        &.prev,
 | 
			
		||||
        &.next {
 | 
			
		||||
          background-color: dark.rgba-to-hex(rgba(dark.$base, 0.08), dark.$card-bg);
 | 
			
		||||
          &::after {
 | 
			
		||||
            border-color: dark.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      &.datepicker-inline {
 | 
			
		||||
        table {
 | 
			
		||||
          box-shadow: dark.$card-box-shadow;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      table {
 | 
			
		||||
        thead {
 | 
			
		||||
          background-color: dark.$card-bg;
 | 
			
		||||
          tr,
 | 
			
		||||
          td {
 | 
			
		||||
            color: dark.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        tr td,
 | 
			
		||||
        tr th {
 | 
			
		||||
          &.new {
 | 
			
		||||
            color: dark.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tr td {
 | 
			
		||||
          color: dark.$body-color;
 | 
			
		||||
 | 
			
		||||
          &.old,
 | 
			
		||||
          &.disabled {
 | 
			
		||||
            color: dark.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.cw {
 | 
			
		||||
            background-color: dark.$card-bg;
 | 
			
		||||
            color: dark.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &.day:hover,
 | 
			
		||||
          &.focused {
 | 
			
		||||
            background: dark.rgba-to-hex(dark.$gray-50, dark.$card-bg);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .datepicker table tr td span {
 | 
			
		||||
      border-radius: dark.$border-radius;
 | 
			
		||||
 | 
			
		||||
      &:hover,
 | 
			
		||||
      &.focused {
 | 
			
		||||
        background: dark.rgba-to-hex(dark.$gray-50, dark.$card-bg);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.disabled,
 | 
			
		||||
      &.disabled:hover {
 | 
			
		||||
        color: dark.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.old,
 | 
			
		||||
      &.new {
 | 
			
		||||
        color: dark.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,81 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/functions';
 | 
			
		||||
 | 
			
		||||
@mixin bs-daterangepicker-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
 | 
			
		||||
  $highlighted-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
  $highlighted-color: $background;
 | 
			
		||||
 | 
			
		||||
  .daterangepicker td.active:not(.off) {
 | 
			
		||||
    background: $background !important;
 | 
			
		||||
    color: $white;
 | 
			
		||||
    box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker {
 | 
			
		||||
    .start-date:not(.end-date):not(.off),
 | 
			
		||||
    .end-date:not(.start-date):not(.off) {
 | 
			
		||||
      background-color: $background;
 | 
			
		||||
      color: $white;
 | 
			
		||||
      border: 0 !important;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background-color: $background !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker .input-mini.active {
 | 
			
		||||
    border-color: $background !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker td.in-range:not(.start-date):not(.end-date):not(.off) {
 | 
			
		||||
    color: $highlighted-color !important;
 | 
			
		||||
    background-color: $highlighted-bg !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .ranges li.active {
 | 
			
		||||
    color: $highlighted-color !important;
 | 
			
		||||
    background-color: $highlighted-bg !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin bs-daterangepicker-dark-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
 | 
			
		||||
  $highlighted-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
  $highlighted-color: $background;
 | 
			
		||||
 | 
			
		||||
  .daterangepicker td.active:not(.off) {
 | 
			
		||||
    background: $background !important;
 | 
			
		||||
    color: $white;
 | 
			
		||||
    box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker {
 | 
			
		||||
    .start-date:not(.end-date):not(.off),
 | 
			
		||||
    .end-date:not(.start-date):not(.off) {
 | 
			
		||||
      background-color: $background;
 | 
			
		||||
      color: $white;
 | 
			
		||||
      border: 0 !important;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background-color: $background !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker .input-mini.active {
 | 
			
		||||
    border-color: $background !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .daterangepicker td.in-range:not(.start-date):not(.end-date):not(.off) {
 | 
			
		||||
    color: $highlighted-color !important;
 | 
			
		||||
    background-color: $highlighted-bg !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .ranges li.active {
 | 
			
		||||
    color: $highlighted-color !important;
 | 
			
		||||
    background-color: $highlighted-bg !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
import 'bootstrap-daterangepicker/daterangepicker';
 | 
			
		||||
 | 
			
		||||
// Patch detect when weeks are shown
 | 
			
		||||
 | 
			
		||||
const fnDaterangepicker = $.fn.daterangepicker;
 | 
			
		||||
 | 
			
		||||
$.fn.daterangepicker = function (options, callback) {
 | 
			
		||||
  fnDaterangepicker.call(this, options, callback);
 | 
			
		||||
 | 
			
		||||
  if (options && (options.showWeekNumbers || options.showISOWeekNumbers)) {
 | 
			
		||||
    this.each(function () {
 | 
			
		||||
      const instance = $(this).data('daterangepicker');
 | 
			
		||||
      if (instance && instance.container) instance.container.addClass('with-week-numbers');
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return this;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										744
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										744
									
								
								resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,744 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
$daterangepicker-arrow-size: 0.45rem !default;
 | 
			
		||||
$daterangepicker-select-width: 3.125rem !default;
 | 
			
		||||
$daterangepicker-cell-size: 2.25rem !default;
 | 
			
		||||
$daterangepicker-padding: 0.8rem !default;
 | 
			
		||||
 | 
			
		||||
// Calculate widths
 | 
			
		||||
$daterangepicker-width: ($daterangepicker-cell-size * 7)+ ($daterangepicker-padding * 2);
 | 
			
		||||
$daterangepicker-width-with-weeks: $daterangepicker-width + $daterangepicker-cell-size;
 | 
			
		||||
 | 
			
		||||
.daterangepicker {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  max-width: none;
 | 
			
		||||
  padding: 0.875rem 0 0.5rem;
 | 
			
		||||
  display: none;
 | 
			
		||||
 | 
			
		||||
  tbody {
 | 
			
		||||
    //! FIX: padding or margin top will not work in table
 | 
			
		||||
    &:before {
 | 
			
		||||
      content: '@';
 | 
			
		||||
      display: block;
 | 
			
		||||
      line-height: 6px;
 | 
			
		||||
      text-indent: -99999px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    direction: rtl !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // datepicker header styles
 | 
			
		||||
  table thead tr:first-child {
 | 
			
		||||
    height: 52px !important;
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
  .calendar-table td {
 | 
			
		||||
    border-radius: 50rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // month and year select styles
 | 
			
		||||
  table thead {
 | 
			
		||||
    th,
 | 
			
		||||
    td {
 | 
			
		||||
      select {
 | 
			
		||||
        background-color: transparent;
 | 
			
		||||
        font-weight: light.$font-weight-medium;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// prev arrow styles excluding single daterangepicker
 | 
			
		||||
.daterangepicker {
 | 
			
		||||
  .drp-calendar:not(.single).left {
 | 
			
		||||
    .prev {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        left: 0.25rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        right: 0.25rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // next arrow styles excluding single daterangepicker
 | 
			
		||||
  .drp-calendar:not(.single).right {
 | 
			
		||||
    .next {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 0.25rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 0.25rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker.auto-apply .drp-buttons {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker.show-calendar .drp-calendar,
 | 
			
		||||
.daterangepicker.show-calendar .drp-buttons {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .drp-calendar {
 | 
			
		||||
  display: none;
 | 
			
		||||
  padding: 0 $daterangepicker-padding $daterangepicker-padding;
 | 
			
		||||
 | 
			
		||||
  &.single .calendar-table {
 | 
			
		||||
    border: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker.single {
 | 
			
		||||
  .drp-selected {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
  .daterangepicker .ranges,
 | 
			
		||||
  .drp-calendar {
 | 
			
		||||
    float: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .calendar-table {
 | 
			
		||||
  border: 0;
 | 
			
		||||
 | 
			
		||||
  // prev & next arrow default styles
 | 
			
		||||
  .next,
 | 
			
		||||
  .prev {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0.65rem;
 | 
			
		||||
    min-width: unset;
 | 
			
		||||
    height: 1.875rem;
 | 
			
		||||
    width: 1.875rem;
 | 
			
		||||
    border-radius: 50rem;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .next span,
 | 
			
		||||
  .prev span {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    border-width: 0 1.9px 1.9px 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-radius: 0;
 | 
			
		||||
    height: $daterangepicker-arrow-size;
 | 
			
		||||
    width: $daterangepicker-arrow-size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prev span {
 | 
			
		||||
    margin-right: -$daterangepicker-arrow-size * 0.5;
 | 
			
		||||
    transform: rotate(135deg);
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      margin-left: -$daterangepicker-arrow-size * 0.5;
 | 
			
		||||
      margin-right: 0;
 | 
			
		||||
      transform: rotate(-45deg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .next span {
 | 
			
		||||
    margin-left: -$daterangepicker-arrow-size * 0.5;
 | 
			
		||||
    transform: rotate(-45deg);
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      margin-left: 0;
 | 
			
		||||
      margin-right: -$daterangepicker-arrow-size * 0.5;
 | 
			
		||||
      transform: rotate(135deg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  table {
 | 
			
		||||
    border: 0;
 | 
			
		||||
    border-spacing: 0;
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  th,
 | 
			
		||||
  td {
 | 
			
		||||
    vertical-align: middle;
 | 
			
		||||
    min-width: $daterangepicker-cell-size;
 | 
			
		||||
    line-height: calc(#{$daterangepicker-cell-size} - 2px);
 | 
			
		||||
    white-space: nowrap;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
  }
 | 
			
		||||
  td {
 | 
			
		||||
    height: $daterangepicker-cell-size;
 | 
			
		||||
    width: $daterangepicker-cell-size;
 | 
			
		||||
  }
 | 
			
		||||
  th {
 | 
			
		||||
    width: $daterangepicker-cell-size;
 | 
			
		||||
    height: $daterangepicker-cell-size + 0.5rem;
 | 
			
		||||
  }
 | 
			
		||||
  tr:first-child th:not(.prev):not(.next) {
 | 
			
		||||
    height: $daterangepicker-cell-size;
 | 
			
		||||
  }
 | 
			
		||||
  // daterangepicker single
 | 
			
		||||
  .daterangepicker .single {
 | 
			
		||||
    // arrow alignments
 | 
			
		||||
    .next {
 | 
			
		||||
      float: right;
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 0.625rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 0.625rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .prev {
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        right: 3.125rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        left: 3.125rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // month alignments
 | 
			
		||||
    th.month {
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      top: 0.5rem;
 | 
			
		||||
      @include app-ltr {
 | 
			
		||||
        text-align: left;
 | 
			
		||||
        left: 0.562rem;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        text-align: right;
 | 
			
		||||
        right: 0.562rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker td {
 | 
			
		||||
  @include app-ltr {
 | 
			
		||||
    &.start-date:not(.end-date) {
 | 
			
		||||
      border-bottom-right-radius: 0 !important;
 | 
			
		||||
      border-top-right-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.end-date:not(.start-date) {
 | 
			
		||||
      border-bottom-left-radius: 0 !important;
 | 
			
		||||
      border-top-left-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.in-range:not(.start-date):not(.end-date) {
 | 
			
		||||
    border-radius: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    &.start-date:not(.end-date) {
 | 
			
		||||
      border-bottom-left-radius: 0 !important;
 | 
			
		||||
      border-top-left-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.end-date:not(.start-date) {
 | 
			
		||||
      border-bottom-right-radius: 0 !important;
 | 
			
		||||
      border-top-right-radius: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker td.disabled,
 | 
			
		||||
.daterangepicker option.disabled {
 | 
			
		||||
  cursor: not-allowed;
 | 
			
		||||
  text-decoration: line-through;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker th.month {
 | 
			
		||||
  width: auto;
 | 
			
		||||
}
 | 
			
		||||
.daterangepicker select {
 | 
			
		||||
  &.monthselect,
 | 
			
		||||
  &.yearselect {
 | 
			
		||||
    height: auto;
 | 
			
		||||
    padding: 1px;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border: 0;
 | 
			
		||||
    cursor: default;
 | 
			
		||||
  }
 | 
			
		||||
  &:focus-visible {
 | 
			
		||||
    outline: 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.monthselect {
 | 
			
		||||
    width: 46%;
 | 
			
		||||
    margin-right: 2%;
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      margin-left: 2%;
 | 
			
		||||
      margin-right: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.yearselect {
 | 
			
		||||
    width: 40%;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.hourselect,
 | 
			
		||||
  &.minuteselect,
 | 
			
		||||
  &.secondselect,
 | 
			
		||||
  &.ampmselect {
 | 
			
		||||
    outline: 0;
 | 
			
		||||
    width: $daterangepicker-select-width;
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
    border-radius: light.$border-radius-sm;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .calendar-time {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  line-height: 30px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
 | 
			
		||||
  select.disabled {
 | 
			
		||||
    cursor: not-allowed;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .drp-buttons {
 | 
			
		||||
  padding: $daterangepicker-padding $daterangepicker-padding * 1.5;
 | 
			
		||||
  clear: both;
 | 
			
		||||
  display: none;
 | 
			
		||||
  text-align: right;
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
 | 
			
		||||
  .btn {
 | 
			
		||||
    margin-left: $daterangepicker-padding * 1.2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
 | 
			
		||||
    .btn {
 | 
			
		||||
      margin-left: 0;
 | 
			
		||||
      margin-right: $daterangepicker-padding * 1.2;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .drp-selected {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  padding-bottom: $daterangepicker-padding;
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .ranges {
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  float: none;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
 | 
			
		||||
  // Daterangepicker Ranges spacing
 | 
			
		||||
  ul {
 | 
			
		||||
    padding: 0.5rem;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
    list-style: none;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  li {
 | 
			
		||||
    border-radius: light.$border-radius;
 | 
			
		||||
    padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
 | 
			
		||||
    &:not(:first-child) {
 | 
			
		||||
      margin-top: 0.125rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker.show-calendar .ranges {
 | 
			
		||||
  border-bottom: 1px solid;
 | 
			
		||||
 | 
			
		||||
  &:empty {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.daterangepicker .drp-calendar.right {
 | 
			
		||||
  @include app-ltr {
 | 
			
		||||
    padding-left: 1px;
 | 
			
		||||
  }
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    padding-right: 1px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .daterangepicker {
 | 
			
		||||
      z-index: light.$zindex-popover !important;
 | 
			
		||||
      border: light.$dropdown-border-width solid light.$dropdown-border-color;
 | 
			
		||||
      border-radius: light.$border-radius;
 | 
			
		||||
      width: calc(#{$daterangepicker-width} + calc(#{light.$dropdown-border-width} * 2));
 | 
			
		||||
      box-shadow: light.$card-box-shadow;
 | 
			
		||||
      background-color: light.$dropdown-bg;
 | 
			
		||||
 | 
			
		||||
      table thead {
 | 
			
		||||
        background: light.$dropdown-bg;
 | 
			
		||||
        th,
 | 
			
		||||
        td {
 | 
			
		||||
          color: light.$headings-color;
 | 
			
		||||
 | 
			
		||||
          &.prev,
 | 
			
		||||
          &.next {
 | 
			
		||||
            span {
 | 
			
		||||
              border-color: light.$body-color !important;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          select {
 | 
			
		||||
            background-color: transparent;
 | 
			
		||||
            color: light.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      &.drop-up {
 | 
			
		||||
        margin-top: -(light.$dropdown-spacer);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.with-week-numbers {
 | 
			
		||||
        width: calc(#{$daterangepicker-width-with-weeks} + calc(#{light.$dropdown-border-width} * 2));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .daterangepicker .calendar-table td {
 | 
			
		||||
      border-radius: light.$border-radius-pill;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .drp-selected {
 | 
			
		||||
      font-size: light.$font-size-sm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-table thead tr:last-child th {
 | 
			
		||||
      border-radius: 0 !important;
 | 
			
		||||
      color: light.$headings-color;
 | 
			
		||||
      font-size: light.$font-size-sm;
 | 
			
		||||
      font-weight: light.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker th.month {
 | 
			
		||||
      color: light.$headings-color;
 | 
			
		||||
      font-weight: light.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.week,
 | 
			
		||||
    .daterangepicker th.week {
 | 
			
		||||
      color: light.$headings-color;
 | 
			
		||||
      font-weight: light.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.disabled,
 | 
			
		||||
    .daterangepicker option.disabled {
 | 
			
		||||
      color: light.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.available:not(.active):hover,
 | 
			
		||||
    .daterangepicker th.available:hover {
 | 
			
		||||
      background-color: light.$gray-50;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.off {
 | 
			
		||||
      color: light.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .ranges li {
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
      padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background-color: light.$dropdown-link-hover-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-table .next,
 | 
			
		||||
    .daterangepicker .calendar-table .prev {
 | 
			
		||||
      background-color: light.$gray-50;
 | 
			
		||||
      span {
 | 
			
		||||
        border-color: light.$body-color;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker select {
 | 
			
		||||
      &.hourselect,
 | 
			
		||||
      &.minuteselect,
 | 
			
		||||
      &.secondselect,
 | 
			
		||||
      &.ampmselect {
 | 
			
		||||
        background: light.rgba-to-hex(light.$gray-100, light.$rgba-to-hex-bg);
 | 
			
		||||
        font-size: light.$font-size-sm;
 | 
			
		||||
        color: light.$body-color;
 | 
			
		||||
        border: 1px solid transparent;
 | 
			
		||||
        option {
 | 
			
		||||
          background: light.$card-bg;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // ! FIX: OS Windows and Linux Browsers DD Option color
 | 
			
		||||
      &.monthselect,
 | 
			
		||||
      &.yearselect {
 | 
			
		||||
        option {
 | 
			
		||||
          color: light.$body-color;
 | 
			
		||||
          background: light.$input-bg;
 | 
			
		||||
          &:disabled {
 | 
			
		||||
            color: light.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-time select.disabled {
 | 
			
		||||
      color: light.$text-light;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include light.media-breakpoint-up(md) {
 | 
			
		||||
      .daterangepicker {
 | 
			
		||||
        width: auto !important;
 | 
			
		||||
 | 
			
		||||
        &:not(.single) .drp-selected {
 | 
			
		||||
          width: auto;
 | 
			
		||||
          padding: 0;
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-ltr-style {
 | 
			
		||||
        .daterangepicker:not(.single) .drp-calendar {
 | 
			
		||||
          float: left;
 | 
			
		||||
 | 
			
		||||
          &.left {
 | 
			
		||||
            padding-right: 1rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-rtl-style {
 | 
			
		||||
        .daterangepicker:not(.single) .drp-calendar {
 | 
			
		||||
          float: right;
 | 
			
		||||
          &.left {
 | 
			
		||||
            padding-left: 1rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include light.media-breakpoint-up(lg) {
 | 
			
		||||
      .daterangepicker .ranges {
 | 
			
		||||
        border-bottom: 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-ltr-style {
 | 
			
		||||
        .daterangepicker {
 | 
			
		||||
          .ranges {
 | 
			
		||||
            float: left;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-rtl-style {
 | 
			
		||||
        .daterangepicker {
 | 
			
		||||
          .ranges {
 | 
			
		||||
            float: right;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .daterangepicker {
 | 
			
		||||
      box-shadow: dark.$card-box-shadow;
 | 
			
		||||
      width: calc(#{$daterangepicker-width} + calc(#{dark.$dropdown-border-width} * 2));
 | 
			
		||||
      margin-top: dark.$dropdown-spacer;
 | 
			
		||||
      background-color: dark.$dropdown-bg;
 | 
			
		||||
      border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
 | 
			
		||||
      border-radius: dark.$border-radius;
 | 
			
		||||
      z-index: dark.$zindex-popover !important;
 | 
			
		||||
 | 
			
		||||
      table thead {
 | 
			
		||||
        background: dark.$dropdown-bg;
 | 
			
		||||
        th,
 | 
			
		||||
        td {
 | 
			
		||||
          color: dark.$headings-color;
 | 
			
		||||
 | 
			
		||||
          &.prev,
 | 
			
		||||
          &.next {
 | 
			
		||||
            span {
 | 
			
		||||
              border-color: dark.$headings-color !important;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          select {
 | 
			
		||||
            background-color: transparent;
 | 
			
		||||
            color: dark.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.with-week-numbers {
 | 
			
		||||
        width: calc(#{$daterangepicker-width-with-weeks} + calc(#{dark.$dropdown-border-width} * 2));
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.drop-up {
 | 
			
		||||
        margin-top: -(dark.$dropdown-spacer);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-table td {
 | 
			
		||||
      border-radius: dark.$border-radius-pill;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .drp-selected {
 | 
			
		||||
      font-size: dark.$font-size-sm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-table thead tr:last-child th {
 | 
			
		||||
      border-radius: 0 !important;
 | 
			
		||||
      color: dark.$headings-color;
 | 
			
		||||
      font-size: dark.$font-size-sm;
 | 
			
		||||
      font-weight: dark.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker th.month {
 | 
			
		||||
      color: dark.$headings-color;
 | 
			
		||||
      font-weight: dark.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.week,
 | 
			
		||||
    .daterangepicker th.week {
 | 
			
		||||
      color: dark.$headings-color;
 | 
			
		||||
      font-weight: dark.$font-weight-normal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.disabled,
 | 
			
		||||
    .daterangepicker option.disabled {
 | 
			
		||||
      color: dark.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.available:not(.active):hover,
 | 
			
		||||
    .daterangepicker th.available:hover {
 | 
			
		||||
      background-color: dark.$gray-50;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker td.off {
 | 
			
		||||
      color: dark.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .ranges li {
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
      padding: dark.$dropdown-item-padding-y dark.$dropdown-item-padding-x;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background-color: dark.$dropdown-link-hover-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-table .next,
 | 
			
		||||
    .daterangepicker .calendar-table .prev {
 | 
			
		||||
      background-color: dark.$gray-50;
 | 
			
		||||
      span {
 | 
			
		||||
        border-color: dark.$body-color;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker select {
 | 
			
		||||
      &.hourselect,
 | 
			
		||||
      &.minuteselect,
 | 
			
		||||
      &.secondselect,
 | 
			
		||||
      &.ampmselect {
 | 
			
		||||
        background: dark.rgba-to-hex(dark.$gray-100, dark.$rgba-to-hex-bg);
 | 
			
		||||
        border: 1px solid transparent;
 | 
			
		||||
        font-size: dark.$font-size-sm;
 | 
			
		||||
        color: dark.$body-color;
 | 
			
		||||
        option {
 | 
			
		||||
          background: dark.$card-bg;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // ! FIX: OS Windows and Linux Browsers DD Option color
 | 
			
		||||
      &.monthselect,
 | 
			
		||||
      &.yearselect {
 | 
			
		||||
        option {
 | 
			
		||||
          color: dark.$body-color;
 | 
			
		||||
          background: dark.$card-bg;
 | 
			
		||||
          &:disabled {
 | 
			
		||||
            color: dark.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .daterangepicker .calendar-time select.disabled {
 | 
			
		||||
      color: dark.$text-light;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include dark.media-breakpoint-up(md) {
 | 
			
		||||
      .daterangepicker {
 | 
			
		||||
        width: auto !important;
 | 
			
		||||
 | 
			
		||||
        &:not(.single) .drp-selected {
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
          width: auto;
 | 
			
		||||
          padding: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-ltr-style {
 | 
			
		||||
        .daterangepicker:not(.single) .drp-calendar {
 | 
			
		||||
          float: left;
 | 
			
		||||
 | 
			
		||||
          &.left {
 | 
			
		||||
            padding-right: 1rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-rtl-style {
 | 
			
		||||
        .daterangepicker:not(.single) .drp-calendar {
 | 
			
		||||
          float: right;
 | 
			
		||||
 | 
			
		||||
          &.left {
 | 
			
		||||
            padding-left: 1rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include dark.media-breakpoint-up(lg) {
 | 
			
		||||
      .daterangepicker .ranges {
 | 
			
		||||
        border-bottom: 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-ltr-style {
 | 
			
		||||
        .daterangepicker {
 | 
			
		||||
          .ranges {
 | 
			
		||||
            float: left;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      @include app-rtl-style {
 | 
			
		||||
        .daterangepicker {
 | 
			
		||||
          .ranges {
 | 
			
		||||
            float: right;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								resources/assets/vendor/libs/bootstrap-select/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								resources/assets/vendor/libs/bootstrap-select/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/functions';
 | 
			
		||||
 | 
			
		||||
@mixin bs-select-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
 | 
			
		||||
  .bootstrap-select {
 | 
			
		||||
    .dropdown-menu.inner a[aria-selected='true'] {
 | 
			
		||||
      background: $background !important;
 | 
			
		||||
      color: $color !important;
 | 
			
		||||
    }
 | 
			
		||||
    // Fix: To add focus border, .bootstrap-select adding border but not able to update as we can not have the focus on div
 | 
			
		||||
    .dropdown-toggle.show {
 | 
			
		||||
      border-color: $background;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'bootstrap-select/js/bootstrap-select';
 | 
			
		||||
							
								
								
									
										259
									
								
								resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,259 @@
 | 
			
		||||
// Bootstrap Select
 | 
			
		||||
// *******************************************************************************
 | 
			
		||||
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'bootstrap-select/sass/bootstrap-select.scss';
 | 
			
		||||
 | 
			
		||||
// Common Styles
 | 
			
		||||
.bootstrap-select *,
 | 
			
		||||
.bootstrap-select .dropdown-toggle:focus {
 | 
			
		||||
  outline: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
.bootstrap-select {
 | 
			
		||||
  .bs-searchbox,
 | 
			
		||||
  .bs-actionsbox,
 | 
			
		||||
  .bs-donebutton {
 | 
			
		||||
    padding: 0 0 8px;
 | 
			
		||||
  }
 | 
			
		||||
  .dropdown-toggle {
 | 
			
		||||
    transition: none;
 | 
			
		||||
    padding: calc(light.$input-padding-y - light.$input-border-width) light.$input-padding-x;
 | 
			
		||||
    box-shadow: none !important;
 | 
			
		||||
    &.show,
 | 
			
		||||
    &:focus {
 | 
			
		||||
      padding: calc(light.$input-padding-y - light.$input-focus-border-width)
 | 
			
		||||
        calc(light.$input-padding-x - light.$input-border-width);
 | 
			
		||||
    }
 | 
			
		||||
    &:after {
 | 
			
		||||
      transform: rotate(45deg) translateY(-100%);
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      inset-inline-end: 23px;
 | 
			
		||||
      top: 50%;
 | 
			
		||||
      margin: 0 !important;
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        inset-inline-end: 12px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &:active {
 | 
			
		||||
      transform: none !important;
 | 
			
		||||
    }
 | 
			
		||||
    &.show {
 | 
			
		||||
      &:after {
 | 
			
		||||
        inset-inline-end: calc(23px - light.$input-border-width);
 | 
			
		||||
        @include app-rtl {
 | 
			
		||||
          inset-inline-end: calc(12px - light.$input-border-width);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .filter-option-inner-inner {
 | 
			
		||||
      line-height: light.$input-line-height;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .btn {
 | 
			
		||||
    &:disabled,
 | 
			
		||||
    &.disabled {
 | 
			
		||||
      color: light.$btn-color !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // For header dropdown close btn
 | 
			
		||||
  .dropdown-menu .popover-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    button {
 | 
			
		||||
      border: none;
 | 
			
		||||
      font-size: light.$h4-font-size;
 | 
			
		||||
      background: transparent;
 | 
			
		||||
      padding-bottom: 0.125rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .is-invalid {
 | 
			
		||||
    ~ .dropdown-toggle {
 | 
			
		||||
      &:after {
 | 
			
		||||
        inset-inline-end: calc(23px - light.$input-border-width);
 | 
			
		||||
        @include app-rtl {
 | 
			
		||||
          inset-inline-end: calc(12px - light.$input-border-width);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bootstrap-select.dropup {
 | 
			
		||||
  .dropdown-toggle {
 | 
			
		||||
    &:after {
 | 
			
		||||
      transform: rotate(317deg) translateY(-30%);
 | 
			
		||||
      inset-inline-end: 14px;
 | 
			
		||||
      @include app-rtl {
 | 
			
		||||
        inset-inline-end: calc(18px);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.show {
 | 
			
		||||
      &:after {
 | 
			
		||||
        inset-inline-end: calc(14px - light.$input-border-width);
 | 
			
		||||
        @include app-rtl {
 | 
			
		||||
          inset-inline-end: calc(18px - light.$input-border-width);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .is-invalid {
 | 
			
		||||
    ~ .dropdown-toggle {
 | 
			
		||||
      &:after {
 | 
			
		||||
        inset-inline-end: calc(14px - light.$input-border-width);
 | 
			
		||||
        @include app-rtl {
 | 
			
		||||
          inset-inline-end: calc(18px - light.$input-border-width);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Menu Position
 | 
			
		||||
.bootstrap-select.show-tick .dropdown-menu {
 | 
			
		||||
  li a {
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
  // RTL
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    li a span.text {
 | 
			
		||||
      margin-left: 2.125rem;
 | 
			
		||||
      margin-right: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .selected span.check-mark {
 | 
			
		||||
    display: block;
 | 
			
		||||
    right: 1rem;
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    transform: translateY(-50%);
 | 
			
		||||
    line-height: 1;
 | 
			
		||||
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      left: 1rem;
 | 
			
		||||
      right: auto;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// To remove ripple effect
 | 
			
		||||
.bootstrap-select .dropdown-menu.inner .selected .waves-ripple {
 | 
			
		||||
  display: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bootstrap-select:not(.input-group-btn),
 | 
			
		||||
.bootstrap-select[class*='col-'] {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html[class] .bootstrap-select.form-select {
 | 
			
		||||
  background: none !important;
 | 
			
		||||
  border: 0 !important;
 | 
			
		||||
  padding: 0 !important;
 | 
			
		||||
  margin: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .bootstrap-select .dropdown-toggle .filter-option {
 | 
			
		||||
    float: right;
 | 
			
		||||
    right: 0;
 | 
			
		||||
    left: auto;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    padding-left: inherit;
 | 
			
		||||
    padding-right: 0;
 | 
			
		||||
    margin-left: -100%;
 | 
			
		||||
    margin-right: 0;
 | 
			
		||||
  }
 | 
			
		||||
  // Fix: Subtext rtl support
 | 
			
		||||
  .bootstrap-select .filter-option-inner-inner {
 | 
			
		||||
    float: right;
 | 
			
		||||
  }
 | 
			
		||||
  .bootstrap-select .dropdown-menu li small.text-muted,
 | 
			
		||||
  .bootstrap-select .filter-option small.text-muted {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: 2px;
 | 
			
		||||
    padding-left: 0;
 | 
			
		||||
    padding-right: 0.5em;
 | 
			
		||||
    float: left;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .bootstrap-select .dropdown-toggle .filter-option-inner {
 | 
			
		||||
    padding-left: inherit;
 | 
			
		||||
    padding-right: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .bootstrap-select {
 | 
			
		||||
      background-color: light.$input-bg;
 | 
			
		||||
      .dropdown-toggle {
 | 
			
		||||
        border-radius: light.$border-radius;
 | 
			
		||||
        border: light.$input-border-width solid light.$input-border-color;
 | 
			
		||||
        &.show,
 | 
			
		||||
        &:focus {
 | 
			
		||||
          border: light.$input-focus-border-width solid light.$primary;
 | 
			
		||||
        }
 | 
			
		||||
        &:not(.show):hover {
 | 
			
		||||
          border-color: light.$input-border-hover-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .dropdown-menu {
 | 
			
		||||
        &[data-popper-placement='top-start'],
 | 
			
		||||
        &[data-popper-placement='top-end'] {
 | 
			
		||||
          box-shadow: 0 -0.2rem 1.25rem rgba(light.rgba-to-hex(light.$gray-500, light.$rgba-to-hex-bg), 0.4);
 | 
			
		||||
        }
 | 
			
		||||
        .notify {
 | 
			
		||||
          background: light.$popover-bg;
 | 
			
		||||
          border: light.$input-border-width solid light.$popover-border-color;
 | 
			
		||||
        }
 | 
			
		||||
        .popover-header button {
 | 
			
		||||
          color: light.$body-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark Style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .bootstrap-select {
 | 
			
		||||
      background-color: dark.$input-bg;
 | 
			
		||||
      .dropdown-toggle {
 | 
			
		||||
        color: dark.$input-color;
 | 
			
		||||
        &:hover {
 | 
			
		||||
          color: dark.$input-color;
 | 
			
		||||
        }
 | 
			
		||||
        border: dark.$input-border-width solid dark.$input-border-color;
 | 
			
		||||
        border-radius: dark.$border-radius;
 | 
			
		||||
        &.show,
 | 
			
		||||
        &:focus {
 | 
			
		||||
          border: dark.$input-focus-border-width solid dark.$primary;
 | 
			
		||||
        }
 | 
			
		||||
        &:not(.show):hover {
 | 
			
		||||
          border-color: dark.$input-border-hover-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .dropdown-menu {
 | 
			
		||||
        &[data-popper-placement='top-start'],
 | 
			
		||||
        &[data-popper-placement='top-end'] {
 | 
			
		||||
          box-shadow: 0 -0.2rem 1.25rem rgba(15, 20, 34, 0.55);
 | 
			
		||||
        }
 | 
			
		||||
        .notify {
 | 
			
		||||
          background: dark.$popover-bg;
 | 
			
		||||
          border: dark.$input-border-width solid dark.$popover-border-color;
 | 
			
		||||
        }
 | 
			
		||||
        .popover-header button {
 | 
			
		||||
          color: dark.$body-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
import 'bootstrap-table';
 | 
			
		||||
import('bootstrap-table/dist/extensions/cookie/bootstrap-table-cookie.js')
 | 
			
		||||
import 'bootstrap-table/dist/extensions/export/bootstrap-table-export.js';
 | 
			
		||||
import 'bootstrap-table/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.js';
 | 
			
		||||
import 'bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile.js';
 | 
			
		||||
import 'bootstrap-table/dist/locale/bootstrap-table-es-MX.js';
 | 
			
		||||
 | 
			
		||||
import * as XLSX from 'xlsx';
 | 
			
		||||
window.XLSX = XLSX;
 | 
			
		||||
							
								
								
									
										2
									
								
								resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
@import 'bootstrap-table/dist/bootstrap-table.css';
 | 
			
		||||
@import 'bootstrap-table/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.css';
 | 
			
		||||
							
								
								
									
										51
									
								
								resources/assets/vendor/libs/bs-stepper/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								resources/assets/vendor/libs/bs-stepper/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
// Stepper Mixin
 | 
			
		||||
// *******************************************************************************
 | 
			
		||||
@mixin bs-stepper-theme($background) {
 | 
			
		||||
  $color: color-contrast($background);
 | 
			
		||||
  .bs-stepper {
 | 
			
		||||
    .step {
 | 
			
		||||
      &.active {
 | 
			
		||||
        .bs-stepper-circle {
 | 
			
		||||
          background-color: $background;
 | 
			
		||||
          color: $color;
 | 
			
		||||
          box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
        }
 | 
			
		||||
        .bs-stepper-icon svg {
 | 
			
		||||
          fill: $background !important;
 | 
			
		||||
        }
 | 
			
		||||
        .bs-stepper-icon i,
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          color: $background !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      &.crossed {
 | 
			
		||||
        .step-trigger {
 | 
			
		||||
          .bs-stepper-circle {
 | 
			
		||||
            background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
 | 
			
		||||
            color: $background !important;
 | 
			
		||||
          }
 | 
			
		||||
          .bs-stepper-icon svg {
 | 
			
		||||
            fill: $background !important;
 | 
			
		||||
          }
 | 
			
		||||
          .bs-stepper-icon i {
 | 
			
		||||
            color: $background !important;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.wizard-icons {
 | 
			
		||||
      .step.crossed {
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          color: $background !important;
 | 
			
		||||
        }
 | 
			
		||||
        & + {
 | 
			
		||||
          .line {
 | 
			
		||||
            i {
 | 
			
		||||
              color: $background;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								resources/assets/vendor/libs/bs-stepper/bs-stepper.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								resources/assets/vendor/libs/bs-stepper/bs-stepper.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
import Stepper from 'bs-stepper/dist/js/bs-stepper';
 | 
			
		||||
 | 
			
		||||
const bsStepper = document.querySelectorAll('.bs-stepper');
 | 
			
		||||
 | 
			
		||||
// Adds crossed class
 | 
			
		||||
bsStepper.forEach(el => {
 | 
			
		||||
  el.addEventListener('show.bs-stepper', function (event) {
 | 
			
		||||
    var index = event.detail.indexStep;
 | 
			
		||||
    var numberOfSteps = el.querySelectorAll('.line').length;
 | 
			
		||||
    var line = el.querySelectorAll('.step');
 | 
			
		||||
 | 
			
		||||
    // The first for loop is for increasing the steps,
 | 
			
		||||
    // the second is for turning them off when going back
 | 
			
		||||
    // and the third with the if statement because the last line
 | 
			
		||||
    // can't seem to turn off when I press the first item. ¯\_(ツ)_/¯
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < index; i++) {
 | 
			
		||||
      line[i].classList.add('crossed');
 | 
			
		||||
 | 
			
		||||
      for (let j = index; j < numberOfSteps; j++) {
 | 
			
		||||
        line[j].classList.remove('crossed');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (event.detail.to == 0) {
 | 
			
		||||
      for (let k = index; k < numberOfSteps; k++) {
 | 
			
		||||
        line[k].classList.remove('crossed');
 | 
			
		||||
      }
 | 
			
		||||
      line[0].classList.remove('crossed');
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.Stepper = Stepper;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { Stepper };
 | 
			
		||||
							
								
								
									
										549
									
								
								resources/assets/vendor/libs/bs-stepper/bs-stepper.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										549
									
								
								resources/assets/vendor/libs/bs-stepper/bs-stepper.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,549 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import 'bs-stepper/dist/css/bs-stepper';
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
$bs-stepper-header-padding-y: 1.5rem !default;
 | 
			
		||||
$bs-stepper-header-padding-x: $bs-stepper-header-padding-y !default;
 | 
			
		||||
$bs-stepper-content-padding-x: 1.5rem !default;
 | 
			
		||||
$bs-stepper-content-padding-y: $bs-stepper-content-padding-x !default;
 | 
			
		||||
$bs-stepper-trigger-padding: 1.25rem !default;
 | 
			
		||||
$bs-stepper-trigger-padding-vertical: 0.6rem !default;
 | 
			
		||||
$bs-stepper-label-max-width: 224px !default;
 | 
			
		||||
$bs-stepper-svg-icon-height: 3.75rem !default;
 | 
			
		||||
$bs-stepper-svg-icon-width: 3.75rem !default;
 | 
			
		||||
$bs-stepper-icon-font-size: 1.6rem !default;
 | 
			
		||||
$bs-stepper-vertical-separator-height: 1.55rem !default;
 | 
			
		||||
$bs-stepper-vertical-header-min-width: 18rem !default;
 | 
			
		||||
 | 
			
		||||
// Default Styles
 | 
			
		||||
.bs-stepper {
 | 
			
		||||
  border-radius: light.$border-radius;
 | 
			
		||||
  .line {
 | 
			
		||||
    flex: 0;
 | 
			
		||||
    min-width: auto;
 | 
			
		||||
    min-height: auto;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .bs-stepper-header {
 | 
			
		||||
    padding: $bs-stepper-header-padding-y $bs-stepper-header-padding-x;
 | 
			
		||||
 | 
			
		||||
    .step {
 | 
			
		||||
      .step-trigger {
 | 
			
		||||
        padding: 0;
 | 
			
		||||
        flex-wrap: nowrap;
 | 
			
		||||
        gap: 0.5rem;
 | 
			
		||||
        font-weight: light.$font-weight-medium;
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          margin: 0;
 | 
			
		||||
          max-width: $bs-stepper-label-max-width;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          text-overflow: ellipsis;
 | 
			
		||||
          text-align: start;
 | 
			
		||||
          display: inline-grid;
 | 
			
		||||
          font-weight: light.$font-weight-medium;
 | 
			
		||||
          font-size: light.$font-size-base;
 | 
			
		||||
          line-height: light.$h6-line-height;
 | 
			
		||||
          .bs-stepper-title {
 | 
			
		||||
            font-weight: light.$font-weight-medium;
 | 
			
		||||
          }
 | 
			
		||||
          .bs-stepper-subtitle {
 | 
			
		||||
            font-size: light.$small-font-size;
 | 
			
		||||
            font-weight: light.$font-weight-base;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        &:hover {
 | 
			
		||||
          background-color: transparent;
 | 
			
		||||
        }
 | 
			
		||||
        @include light.media-breakpoint-down(lg) {
 | 
			
		||||
          padding: calc($bs-stepper-trigger-padding * 0.5) 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .bs-stepper-circle {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        border-radius: light.$border-radius;
 | 
			
		||||
        width: 2.375rem;
 | 
			
		||||
        height: 2.375rem;
 | 
			
		||||
        font-size: light.$h5-font-size;
 | 
			
		||||
        font-weight: light.$font-weight-medium;
 | 
			
		||||
        i {
 | 
			
		||||
          font-size: 1.375rem;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .bs-stepper-content {
 | 
			
		||||
    padding: $bs-stepper-content-padding-y $bs-stepper-content-padding-x;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.vertical {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      min-width: $bs-stepper-vertical-header-min-width;
 | 
			
		||||
      .step {
 | 
			
		||||
        .step-trigger {
 | 
			
		||||
          padding: $bs-stepper-trigger-padding-vertical 0;
 | 
			
		||||
        }
 | 
			
		||||
        &:first-child {
 | 
			
		||||
          .step-trigger {
 | 
			
		||||
            padding-top: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        &:last-child {
 | 
			
		||||
          .step-trigger {
 | 
			
		||||
            padding-bottom: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .line {
 | 
			
		||||
        position: relative;
 | 
			
		||||
        min-height: 1px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .bs-stepper-content {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      .content {
 | 
			
		||||
        &:not(.active) {
 | 
			
		||||
          display: none;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.wizard-icons {
 | 
			
		||||
      .step {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        padding: 0.75rem 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.wizard-icons {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      justify-content: center;
 | 
			
		||||
      .step-trigger {
 | 
			
		||||
        padding: $bs-stepper-trigger-padding;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
        gap: 0.5rem;
 | 
			
		||||
        .bs-stepper-icon {
 | 
			
		||||
          svg {
 | 
			
		||||
            height: $bs-stepper-svg-icon-height;
 | 
			
		||||
            width: $bs-stepper-svg-icon-width;
 | 
			
		||||
          }
 | 
			
		||||
          i {
 | 
			
		||||
            font-size: $bs-stepper-icon-font-size;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      @include light.media-breakpoint-up(lg) {
 | 
			
		||||
        justify-content: space-around;
 | 
			
		||||
        gap: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Remove borders from wizard modern
 | 
			
		||||
  &.wizard-modern {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      border-bottom: none !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .bs-stepper-content {
 | 
			
		||||
      border-radius: light.$border-radius;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.vertical {
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        border-right: none !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &:not(.vertical):not(.wizard-icons) .bs-stepper-header {
 | 
			
		||||
    @include light.media-breakpoint-up(lg) {
 | 
			
		||||
      gap: 1.25rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .bs-stepper.wizard-icons .bs-stepper-header .step-trigger {
 | 
			
		||||
    @include light.media-breakpoint-down(lg) {
 | 
			
		||||
      padding-right: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@include app-ltr(false) {
 | 
			
		||||
  .bs-stepper.wizard-icons .bs-stepper-header .step-trigger {
 | 
			
		||||
    @include light.media-breakpoint-down(lg) {
 | 
			
		||||
      padding-left: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// Styles for Modal example Create App wizard
 | 
			
		||||
#wizard-create-app {
 | 
			
		||||
  &.vertical {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      min-width: $bs-stepper-vertical-header-min-width - 3;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .bs-stepper {
 | 
			
		||||
      background-color: light.$card-bg;
 | 
			
		||||
      &:not(.wizard-modern) {
 | 
			
		||||
        box-shadow: light.$card-box-shadow;
 | 
			
		||||
      }
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        border-bottom: 1px solid light.$border-color;
 | 
			
		||||
 | 
			
		||||
        .line {
 | 
			
		||||
          i {
 | 
			
		||||
            color: light.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .bs-stepper-title,
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          color: light.$headings-color;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          .bs-stepper-subtitle {
 | 
			
		||||
            color: light.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .step {
 | 
			
		||||
          &:not(.active) {
 | 
			
		||||
            .bs-stepper-circle {
 | 
			
		||||
              background-color: light.$gray-50;
 | 
			
		||||
              color: light.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          &.crossed .step-trigger {
 | 
			
		||||
            .bs-stepper-label .bs-stepper-subtitle,
 | 
			
		||||
            .bs-stepper-title {
 | 
			
		||||
              color: light.$text-muted;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .step-trigger:focus {
 | 
			
		||||
        color: light.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.vertical {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          border-bottom: none;
 | 
			
		||||
          @include light.media-breakpoint-down(lg) {
 | 
			
		||||
            border-right: none !important;
 | 
			
		||||
            border-left: none !important;
 | 
			
		||||
            border-bottom: 1px solid light.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.wizard-modern {
 | 
			
		||||
        background-color: transparent;
 | 
			
		||||
        .bs-stepper-content {
 | 
			
		||||
          background-color: light.$card-bg;
 | 
			
		||||
          box-shadow: light.$card-box-shadow;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.wizard-icons {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          .bs-stepper-icon {
 | 
			
		||||
            svg {
 | 
			
		||||
              fill: light.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
            i {
 | 
			
		||||
              fill: light.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          .bs-stepper-label {
 | 
			
		||||
            color: light.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // ! FIX: Vertical border issue in rtl and ltr
 | 
			
		||||
  @include app-rtl(false) {
 | 
			
		||||
    .light-style {
 | 
			
		||||
      .bs-stepper {
 | 
			
		||||
        &.vertical {
 | 
			
		||||
          .bs-stepper-header {
 | 
			
		||||
            border-left: 1px solid light.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  @include app-ltr(false) {
 | 
			
		||||
    .light-style {
 | 
			
		||||
      .bs-stepper {
 | 
			
		||||
        &.vertical {
 | 
			
		||||
          .bs-stepper-header {
 | 
			
		||||
            border-right: 1px solid light.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark Style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .bs-stepper {
 | 
			
		||||
      background-color: dark.$card-bg;
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        border-bottom: 1px solid dark.$border-color;
 | 
			
		||||
        .line {
 | 
			
		||||
          i {
 | 
			
		||||
            color: dark.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .bs-stepper-label,
 | 
			
		||||
        .bs-stepper-title {
 | 
			
		||||
          color: dark.$headings-color;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .bs-stepper-label {
 | 
			
		||||
          .bs-stepper-subtitle {
 | 
			
		||||
            color: dark.$body-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .step {
 | 
			
		||||
          &:not(.active) {
 | 
			
		||||
            .bs-stepper-circle {
 | 
			
		||||
              background-color: dark.$gray-50;
 | 
			
		||||
              color: dark.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          &.crossed .step-trigger {
 | 
			
		||||
            .bs-stepper-label .bs-stepper-subtitle,
 | 
			
		||||
            .bs-stepper-title {
 | 
			
		||||
              color: dark.$text-muted;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .step-trigger:focus {
 | 
			
		||||
        color: dark.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.vertical {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          border-bottom: none;
 | 
			
		||||
          @include light.media-breakpoint-down(lg) {
 | 
			
		||||
            border-right: none !important;
 | 
			
		||||
            border-left: none !important;
 | 
			
		||||
            border-bottom: 1px solid dark.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.wizard-modern {
 | 
			
		||||
        background-color: transparent;
 | 
			
		||||
        .bs-stepper-content {
 | 
			
		||||
          background-color: dark.$card-bg;
 | 
			
		||||
          box-shadow: dark.$card-box-shadow;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.wizard-icons {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          .bs-stepper-icon {
 | 
			
		||||
            i {
 | 
			
		||||
              color: dark.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            svg {
 | 
			
		||||
              fill: dark.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          .bs-stepper-label {
 | 
			
		||||
            color: dark.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // ! FIX: Vertical border issue in rtl and ltr
 | 
			
		||||
  @include app-rtl(false) {
 | 
			
		||||
    .dark-style {
 | 
			
		||||
      .bs-stepper {
 | 
			
		||||
        &.vertical {
 | 
			
		||||
          .bs-stepper-header {
 | 
			
		||||
            border-left: 1px solid dark.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  @include app-ltr(false) {
 | 
			
		||||
    .dark-style {
 | 
			
		||||
      .bs-stepper {
 | 
			
		||||
        &.vertical {
 | 
			
		||||
          .bs-stepper-header {
 | 
			
		||||
            border-right: 1px solid dark.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .bs-stepper {
 | 
			
		||||
    .bs-stepper-content {
 | 
			
		||||
      .btn-next:not(.btn-submit),
 | 
			
		||||
      .btn-prev {
 | 
			
		||||
        i {
 | 
			
		||||
          transform: rotate(180deg);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.vertical {
 | 
			
		||||
      &.wizard-icons {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          .line:before {
 | 
			
		||||
            right: 50%;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Remove borders from wizard modern
 | 
			
		||||
    &.wizard-modern {
 | 
			
		||||
      &.vertical {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          border-left: none !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include light.media-breakpoint-up(lg) {
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        .line {
 | 
			
		||||
          i {
 | 
			
		||||
            transform: rotate(180deg);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include light.media-breakpoint-down(lg) {
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        .step {
 | 
			
		||||
          .step-trigger {
 | 
			
		||||
            .bs-stepper-label {
 | 
			
		||||
              margin-left: 0;
 | 
			
		||||
              margin-right: 1rem;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      &.wizard-icons {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          .line {
 | 
			
		||||
            &:before {
 | 
			
		||||
              margin-right: 0.75rem;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Media Queries
 | 
			
		||||
@include light.media-breakpoint-down(lg) {
 | 
			
		||||
  .bs-stepper {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      align-items: flex-start;
 | 
			
		||||
      .step {
 | 
			
		||||
        .step-trigger {
 | 
			
		||||
          flex-direction: row;
 | 
			
		||||
          .bs-stepper-label {
 | 
			
		||||
            margin-left: 0.35rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        &:first-child {
 | 
			
		||||
          .step-trigger {
 | 
			
		||||
            padding-top: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        &:last-child {
 | 
			
		||||
          .step-trigger {
 | 
			
		||||
            padding-bottom: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.vertical {
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        align-items: flex-start;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.wizard-icons {
 | 
			
		||||
        .bs-stepper-header {
 | 
			
		||||
          .line:before {
 | 
			
		||||
            left: 0.75rem;
 | 
			
		||||
            margin-left: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &:not(.vertical) {
 | 
			
		||||
      .bs-stepper-header {
 | 
			
		||||
        .line {
 | 
			
		||||
          i {
 | 
			
		||||
            display: none;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.wizard-icons {
 | 
			
		||||
      .bs-stepper-header .step:not(:first-child) {
 | 
			
		||||
        .bs-stepper-icon {
 | 
			
		||||
          svg {
 | 
			
		||||
            margin-top: 0.5rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (max-width: 520px) {
 | 
			
		||||
  .bs-stepper-header {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Styles for Create App Modal Wizard
 | 
			
		||||
#wizard-create-app {
 | 
			
		||||
  &.vertical {
 | 
			
		||||
    .bs-stepper-header {
 | 
			
		||||
      min-width: $bs-stepper-vertical-header-min-width - 3;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/cleavejs/cleave-phone.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/cleavejs/cleave-phone.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'cleave.js/dist/addons/cleave-phone.us';
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/cleavejs/cleave.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/cleavejs/cleave.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'cleave.js/dist/cleave';
 | 
			
		||||
							
								
								
									
										28
									
								
								resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
import JSZip from 'jszip';
 | 
			
		||||
import pdfMake from 'pdfmake';
 | 
			
		||||
import 'pdfmake/build/vfs_fonts';
 | 
			
		||||
import 'datatables.net-bs5';
 | 
			
		||||
import 'datatables.net-fixedcolumns-bs5';
 | 
			
		||||
import 'datatables.net-fixedheader-bs5';
 | 
			
		||||
import 'datatables.net-select-bs5';
 | 
			
		||||
import 'datatables.net-buttons';
 | 
			
		||||
import 'datatables.net-buttons-bs5';
 | 
			
		||||
import 'datatables.net-buttons/js/buttons.html5';
 | 
			
		||||
import 'datatables.net-buttons/js/buttons.print';
 | 
			
		||||
import 'datatables.net-responsive';
 | 
			
		||||
import 'datatables.net-responsive-bs5';
 | 
			
		||||
import 'datatables.net-rowgroup-bs5';
 | 
			
		||||
import Checkbox from 'jquery-datatables-checkboxes';
 | 
			
		||||
 | 
			
		||||
// This solution related to font issues with pdfMake
 | 
			
		||||
pdfMake.fonts = {
 | 
			
		||||
  Roboto: {
 | 
			
		||||
    normal: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Regular.ttf',
 | 
			
		||||
    bold: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Medium.ttf',
 | 
			
		||||
    italics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Italic.ttf',
 | 
			
		||||
    bolditalics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-MediumItalic.ttf'
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
$.fn.dataTable.ext.Checkbox = Checkbox(window, $);
 | 
			
		||||
$.fn.dataTable.ext.buttons.pdfMake = pdfMake;
 | 
			
		||||
window.JSZip = JSZip;
 | 
			
		||||
							
								
								
									
										394
									
								
								resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										394
									
								
								resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,394 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'datatables.net-bs5/css/dataTables.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// Margin between select, input field and text
 | 
			
		||||
div.dataTables_wrapper div.dataTables_length select {
 | 
			
		||||
  margin-left: 0.5rem;
 | 
			
		||||
  margin-right: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
div.dataTables_wrapper div.dataTables_filter input {
 | 
			
		||||
  margin-left: 1em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dataTable .emp_name {
 | 
			
		||||
  font-weight: light.$font-weight-medium;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Shadow none for action buttons
 | 
			
		||||
.dataTable td .btn {
 | 
			
		||||
  box-shadow: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Card header inside the datatable
 | 
			
		||||
div.dataTables_wrapper .card-header {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
}
 | 
			
		||||
div.dataTables_wrapper div.dataTables_info {
 | 
			
		||||
  padding-top: light.$spacer * 0.5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.table-bordered.dataTable {
 | 
			
		||||
  // For complex header and column search datatable
 | 
			
		||||
  &.dt-complex-header,
 | 
			
		||||
  &.dt-column-search {
 | 
			
		||||
    thead tr th {
 | 
			
		||||
      border-width: 1px;
 | 
			
		||||
    }
 | 
			
		||||
    tfoot tr th {
 | 
			
		||||
      border-width: 1px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  & tfoot tr th {
 | 
			
		||||
    border-bottom-width: 1px;
 | 
			
		||||
  }
 | 
			
		||||
  & > :not(caption) > * {
 | 
			
		||||
    & > * {
 | 
			
		||||
      border-width: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Remove left and right border from datatable with table-bordered class
 | 
			
		||||
table.table-bordered.dataTable {
 | 
			
		||||
  tr:first-child th,
 | 
			
		||||
  td {
 | 
			
		||||
    &:first-child {
 | 
			
		||||
      @include app-ltr() {
 | 
			
		||||
        border-left-width: 0;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl() {
 | 
			
		||||
        border-right-width: 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      @include app-ltr() {
 | 
			
		||||
        border-right-width: 0;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl() {
 | 
			
		||||
        border-left-width: 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  > tbody:not(caption) tr:first-child {
 | 
			
		||||
    border-top-width: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Responsive datatable in desktop screen
 | 
			
		||||
@media screen and (min-width: 1399.98px) {
 | 
			
		||||
  table.table-responsive {
 | 
			
		||||
    display: table;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL style
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  div.dataTables_wrapper .dataTables_filter {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: flex-end;
 | 
			
		||||
    input {
 | 
			
		||||
      margin-left: 0;
 | 
			
		||||
      margin-right: 1rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  table.table-bordered.dataTable th,
 | 
			
		||||
  table.table-bordered.dataTable td {
 | 
			
		||||
    border-right-width: 0;
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      border-left-width: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.dataTable {
 | 
			
		||||
  width: 100% !important;
 | 
			
		||||
  border-collapse: collapse !important;
 | 
			
		||||
  margin-bottom: light.$spacer !important;
 | 
			
		||||
  margin-top: 0 !important;
 | 
			
		||||
  thead th {
 | 
			
		||||
    &.sorting_disabled {
 | 
			
		||||
      &::before,
 | 
			
		||||
      &::after {
 | 
			
		||||
        display: none !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &.sorting {
 | 
			
		||||
      &:before,
 | 
			
		||||
      &:after {
 | 
			
		||||
        visibility: hidden;
 | 
			
		||||
      }
 | 
			
		||||
      &:hover {
 | 
			
		||||
        &:before,
 | 
			
		||||
        &:after {
 | 
			
		||||
          visibility: visible;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    &.table-sm > thead > tr > th {
 | 
			
		||||
      padding-left: 1.25rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.table-sm .sorting:before,
 | 
			
		||||
    &.table-sm .sorting_asc:before,
 | 
			
		||||
    &.table-sm .sorting_desc:before {
 | 
			
		||||
      right: auto !important;
 | 
			
		||||
      left: 0.85em !important;
 | 
			
		||||
    }
 | 
			
		||||
    thead th,
 | 
			
		||||
    thead td,
 | 
			
		||||
    tfoot th,
 | 
			
		||||
    tfoot td {
 | 
			
		||||
      text-align: right;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Checkbox height & width for datatables checkboxes
 | 
			
		||||
  .form-check-input {
 | 
			
		||||
    width: light.$form-datatables-check-input-size;
 | 
			
		||||
    height: light.$form-datatables-check-input-size;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// to add spacing between table and datatable footer elements like pagination & info
 | 
			
		||||
.dataTables_scroll {
 | 
			
		||||
  margin-bottom: 0.75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Used while complex headers
 | 
			
		||||
table.dataTable thead th {
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
table.dataTable thead .sorting,
 | 
			
		||||
table.dataTable thead .sorting_asc,
 | 
			
		||||
table.dataTable thead .sorting_desc,
 | 
			
		||||
table.dataTable thead .sorting_asc_disabled,
 | 
			
		||||
table.dataTable thead .sorting_desc_disabled {
 | 
			
		||||
  &::before,
 | 
			
		||||
  &::after {
 | 
			
		||||
    line-height: 1.25rem !important;
 | 
			
		||||
    font-family: tabler-icons !important;
 | 
			
		||||
    font-size: 1rem !important;
 | 
			
		||||
    width: 10px;
 | 
			
		||||
    height: 10px;
 | 
			
		||||
    right: 0.78rem !important;
 | 
			
		||||
  }
 | 
			
		||||
  &::before {
 | 
			
		||||
    content: '\ea62' !important;
 | 
			
		||||
    top: 0.58rem !important;
 | 
			
		||||
  }
 | 
			
		||||
  &::after {
 | 
			
		||||
    bottom: 0.72rem !important;
 | 
			
		||||
    content: '\ea5f' !important;
 | 
			
		||||
  }
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    &::before {
 | 
			
		||||
      right: auto !important;
 | 
			
		||||
      left: 0.58em !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &::after {
 | 
			
		||||
      right: auto !important;
 | 
			
		||||
      left: 0.58em !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DataTable within card
 | 
			
		||||
div.card-datatable.dataTable,
 | 
			
		||||
div.card-datatable .dataTable {
 | 
			
		||||
  border-right: 0;
 | 
			
		||||
  border-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Card header inside the datatable
 | 
			
		||||
@media screen and (max-width: 575.98px) {
 | 
			
		||||
  div.dataTables_wrapper .card-header {
 | 
			
		||||
    display: block;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .dtr-bs-modal.modal {
 | 
			
		||||
    // padding-left: 0.75rem;
 | 
			
		||||
    .modal-body {
 | 
			
		||||
      padding: 0;
 | 
			
		||||
      overflow: auto;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .dataTable_select div.dataTables_wrapper div.dataTables_info {
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (max-width: 767.98px) {
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_info {
 | 
			
		||||
    padding-bottom: light.$table-cell-padding-y;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.dataTables_wrapper {
 | 
			
		||||
  div.dataTables_length,
 | 
			
		||||
  .dataTables_filter {
 | 
			
		||||
    margin-top: light.$spacer * 1.5;
 | 
			
		||||
    margin-bottom: light.$spacer * 1.5;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// common style for light / dark
 | 
			
		||||
 | 
			
		||||
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
 | 
			
		||||
  .page-item {
 | 
			
		||||
    &,
 | 
			
		||||
    &.next,
 | 
			
		||||
    &.previous,
 | 
			
		||||
    &.first,
 | 
			
		||||
    &.last {
 | 
			
		||||
      .page-link {
 | 
			
		||||
        border-radius: light.$border-radius;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-link {
 | 
			
		||||
  div:not(.table-responsive) div.dataTables_wrapper .dataTables_paginate {
 | 
			
		||||
    margin-right: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@include light.media-breakpoint-down(md) {
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_length label,
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_filter label,
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_info,
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_paginate {
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@include light.media-breakpoint-down(sm) {
 | 
			
		||||
  div.dataTables_wrapper div.dataTables_paginate ul.pagination {
 | 
			
		||||
    justify-content: start !important;
 | 
			
		||||
    overflow-x: scroll;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DataTable within card
 | 
			
		||||
div.card-datatable {
 | 
			
		||||
  padding-bottom: light.$card-spacer-x-sm; // Check this in site and update if needed
 | 
			
		||||
 | 
			
		||||
  [class*='col-md-'] {
 | 
			
		||||
    padding-right: light.$table-cell-padding-x !important;
 | 
			
		||||
    padding-left: light.$table-cell-padding-x !important;
 | 
			
		||||
  }
 | 
			
		||||
  // length, filter & info, pagination row margin
 | 
			
		||||
  &:not(.table-responsive) .dataTables_wrapper .row {
 | 
			
		||||
    &:first-child,
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      margin: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LTR style
 | 
			
		||||
@include app-ltr(false) {
 | 
			
		||||
  div.card-datatable table.dataTable thead th,
 | 
			
		||||
  div.card-datatable table.dataTable tfoot th {
 | 
			
		||||
    &:first-child {
 | 
			
		||||
      padding-left: light.$card-spacer-x;
 | 
			
		||||
      padding-right: light.$card-spacer-x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      padding-right: light.$card-spacer-x-sm;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  div.card-datatable table.dataTable tbody td {
 | 
			
		||||
    &:first-child {
 | 
			
		||||
      padding-left: light.$card-spacer-x;
 | 
			
		||||
      padding-right: light.$card-spacer-x;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL Style
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  table.dataTable.table-sm > thead > tr > th {
 | 
			
		||||
    padding-right: light.$table-cell-padding-x-sm;
 | 
			
		||||
  }
 | 
			
		||||
  table.table-bordered.dataTable tr {
 | 
			
		||||
    td,
 | 
			
		||||
    th,
 | 
			
		||||
    th:first-child {
 | 
			
		||||
      border-left-width: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  table.dataTable {
 | 
			
		||||
    thead th,
 | 
			
		||||
    tbody td,
 | 
			
		||||
    tfoot th {
 | 
			
		||||
      padding-right: light.$table-cell-padding-x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.table-sm thead th,
 | 
			
		||||
    &.table-sm tbody td,
 | 
			
		||||
    &.table-sm tfoot th {
 | 
			
		||||
      padding-right: light.$table-cell-padding-x-sm;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  div.card-datatable table.dataTable {
 | 
			
		||||
    thead th,
 | 
			
		||||
    tbody td,
 | 
			
		||||
    tfoot th {
 | 
			
		||||
      &:first-child {
 | 
			
		||||
        padding-right: light.$card-spacer-x;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &:last-child {
 | 
			
		||||
        padding-left: light.$card-spacer-x;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    div.dataTables_wrapper div.dataTables_info {
 | 
			
		||||
      color: light.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    div.dataTables_scrollBody table {
 | 
			
		||||
      border-top-color: light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    table.dataTable th,
 | 
			
		||||
    table.dataTable td {
 | 
			
		||||
      border-color: light.$table-border-color !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark Style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    div.dataTables_wrapper div.dataTables_info {
 | 
			
		||||
      color: dark.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    div.dataTables_scrollBody table {
 | 
			
		||||
      border-top-color: dark.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    table.dataTable th,
 | 
			
		||||
    table.dataTable td {
 | 
			
		||||
      border-color: dark.$table-border-color !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'datatables.net-buttons-bs5/css/buttons.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// remove 0.5em margin bottom from dt-buttons
 | 
			
		||||
@media screen and (max-width: 767px) {
 | 
			
		||||
  div.dt-buttons {
 | 
			
		||||
    margin-bottom: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
div.dataTables_wrapper .dt-button-collection {
 | 
			
		||||
  border: 0;
 | 
			
		||||
  border-radius: light.$dropdown-border-radius;
 | 
			
		||||
  padding: light.$dropdown-padding-y light.$dropdown-padding-x;
 | 
			
		||||
  width: auto;
 | 
			
		||||
  > div[role='menu'] {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// avoid dropdown to overlap the trigger button
 | 
			
		||||
.dt-button-collection {
 | 
			
		||||
  margin-top: 0.2rem;
 | 
			
		||||
}
 | 
			
		||||
div.dropdown-menu.dt-button-collection,
 | 
			
		||||
div.dt-button-collection .dt-button:not(.dt-btn-split-drop) {
 | 
			
		||||
  min-width: 8rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dt-down-arrow {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// override button radius
 | 
			
		||||
div.dt-button-collection .dt-button,
 | 
			
		||||
div.dt-buttons div.dropdown-menu .dt-button {
 | 
			
		||||
  border-radius: light.$dropdown-border-radius;
 | 
			
		||||
}
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    div.dataTables_wrapper .dt-button-collection {
 | 
			
		||||
      background-color: light.$dropdown-bg;
 | 
			
		||||
    }
 | 
			
		||||
    .dataTable a:not([href]):not([tabindex]) {
 | 
			
		||||
      color: map-get(light.$theme-colors, success);
 | 
			
		||||
    }
 | 
			
		||||
    .dt-button-info {
 | 
			
		||||
      box-shadow: light.$floating-component-shadow;
 | 
			
		||||
    }
 | 
			
		||||
    .dt-button-collection {
 | 
			
		||||
      .dropdown-item {
 | 
			
		||||
        padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    div.dataTables_wrapper .dt-button-collection {
 | 
			
		||||
      background-color: dark.$dropdown-bg;
 | 
			
		||||
    }
 | 
			
		||||
    .dataTable a:not([href]):not([tabindex]) {
 | 
			
		||||
      color: map-get(dark.$theme-colors, success);
 | 
			
		||||
    }
 | 
			
		||||
    .dt-button-info {
 | 
			
		||||
      box-shadow: dark.$floating-component-shadow;
 | 
			
		||||
    }
 | 
			
		||||
    .dt-button-collection {
 | 
			
		||||
      .dropdown-item {
 | 
			
		||||
        padding: dark.$dropdown-item-padding-y dark.$dropdown-item-padding-x;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.dt-button-info {
 | 
			
		||||
  border-width: 0 !important;
 | 
			
		||||
  border-radius: light.$border-radius !important;
 | 
			
		||||
  h2 {
 | 
			
		||||
    font-size: light.$h4-font-size !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.dt-buttons {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  .dt-button-collection .dropdown-item {
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      text-align: right;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  &.btn-group {
 | 
			
		||||
    button {
 | 
			
		||||
      border-color: transparent !important;
 | 
			
		||||
      border-radius: light.$border-radius !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
div.dt-buttons .dropdown-menu .dt-button {
 | 
			
		||||
  border-radius: light.$border-radius;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'jquery-datatables-checkboxes/css/dataTables.checkboxes';
 | 
			
		||||
							
								
								
									
										133
									
								
								resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,133 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'datatables.net-fixedcolumns-bs5/css/fixedColumns.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// Fixed column style
 | 
			
		||||
div.dataTables_scrollBody thead tr,
 | 
			
		||||
div.DTFC_LeftBodyLiner thead tr {
 | 
			
		||||
  border-top-width: 0;
 | 
			
		||||
  border-bottom-width: 0;
 | 
			
		||||
}
 | 
			
		||||
div.dataTables_scrollBody {
 | 
			
		||||
  border: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
@include app-ltr(false) {
 | 
			
		||||
  div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
 | 
			
		||||
  div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
 | 
			
		||||
    border-left: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  table.dataTable thead th,
 | 
			
		||||
  table.dataTable thead td,
 | 
			
		||||
  table.dataTable tfoot th,
 | 
			
		||||
  table.dataTable tfoot td {
 | 
			
		||||
    text-align: right !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    table.DTFC_Cloned tr {
 | 
			
		||||
      border-color: light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    // fixed header and footer border
 | 
			
		||||
    div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
 | 
			
		||||
    div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
 | 
			
		||||
      border-left: 1px solid light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    // fixed column background color
 | 
			
		||||
    table.dataTable thead tr > .dtfc-fixed-left,
 | 
			
		||||
    table.dataTable thead tr > .dtfc-fixed-right,
 | 
			
		||||
    table.dataTable tbody tr > .dtfc-fixed-left,
 | 
			
		||||
    table.dataTable tbody tr > .dtfc-fixed-right,
 | 
			
		||||
    div.dtfc-right-top-blocker,
 | 
			
		||||
    div.dtfc-left-top-blocker {
 | 
			
		||||
      background-color: light.$card-bg;
 | 
			
		||||
      margin-top: 1px !important;
 | 
			
		||||
      height: 0px !important;
 | 
			
		||||
    }
 | 
			
		||||
    // To override BS5 css
 | 
			
		||||
    .dt-fixedcolumns thead {
 | 
			
		||||
      border-top-color: light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    &[dir='rtl'] {
 | 
			
		||||
      div.dataTables_scrollHead,
 | 
			
		||||
      div.dataTables_scrollBody {
 | 
			
		||||
        table {
 | 
			
		||||
          border-width: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_LeftBodyLiner {
 | 
			
		||||
        padding-right: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_RightHeadWrapper,
 | 
			
		||||
      div.DTFC_RightBodyWrapper {
 | 
			
		||||
        table {
 | 
			
		||||
          border: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_RightBodyLiner {
 | 
			
		||||
        padding-left: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    table.DTFC_Cloned tr {
 | 
			
		||||
      background-color: dark.$card-bg;
 | 
			
		||||
      border-color: dark.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    div.dataTables_scrollHead table,
 | 
			
		||||
    div.DTFC_RightHeadWrapper table,
 | 
			
		||||
    table.dataTable.fixedHeader-floating,
 | 
			
		||||
    table.dataTable.fixedHeader-locked {
 | 
			
		||||
      background-color: dark.$card-bg;
 | 
			
		||||
    }
 | 
			
		||||
    // fixed header and footer border
 | 
			
		||||
    div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
 | 
			
		||||
    div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
 | 
			
		||||
      border-left: 1px solid dark.$table-border-color !important;
 | 
			
		||||
    }
 | 
			
		||||
    // fixed column background color
 | 
			
		||||
    table.dataTable thead tr > .dtfc-fixed-left,
 | 
			
		||||
    table.dataTable thead tr > .dtfc-fixed-right,
 | 
			
		||||
    table.dataTable tbody tr > .dtfc-fixed-left,
 | 
			
		||||
    table.dataTable tbody tr > .dtfc-fixed-right,
 | 
			
		||||
    div.dtfc-right-top-blocker,
 | 
			
		||||
    div.dtfc-left-top-blocker {
 | 
			
		||||
      background-color: dark.$card-bg;
 | 
			
		||||
      margin-top: 1px !important;
 | 
			
		||||
      height: 0px !important;
 | 
			
		||||
    }
 | 
			
		||||
    // To override BS5 css
 | 
			
		||||
    .dt-fixedcolumns thead {
 | 
			
		||||
      border-top-color: dark.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    &[dir='rtl'] {
 | 
			
		||||
      div.dataTables_scrollHead,
 | 
			
		||||
      div.dataTables_scrollBody {
 | 
			
		||||
        table {
 | 
			
		||||
          border-width: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_LeftBodyLiner {
 | 
			
		||||
        padding-right: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_RightHeadWrapper,
 | 
			
		||||
      div.DTFC_RightBodyWrapper {
 | 
			
		||||
        table {
 | 
			
		||||
          border: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      div.DTFC_RightBodyLiner {
 | 
			
		||||
        padding-left: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'datatables.net-fixedheader-bs5/css/fixedHeader.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// Fixed header Style
 | 
			
		||||
.dt-fixedheader.fixedHeader-floating.table.dataTable {
 | 
			
		||||
  width: auto !important;
 | 
			
		||||
}
 | 
			
		||||
.dt-fixedheader.fixedHeader-locked.table.dataTable {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Last style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .dtfh-floatingparenthead {
 | 
			
		||||
      border-bottom: 1px solid light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    .table-bordered.dt-fixedheader.fixedHeader-floating.table.dataTable thead > tr > th,
 | 
			
		||||
    .table-bordered.dt-fixedheader.fixedHeader-locked.table.dataTable thead > tr > th {
 | 
			
		||||
      border-bottom-width: 1px;
 | 
			
		||||
      border-color: light.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .dtfh-floatingparenthead {
 | 
			
		||||
      border-bottom: 1px solid dark.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
    .table-bordered.dt-fixedheader.fixedHeader-floating.table.dataTable thead > tr > th,
 | 
			
		||||
    .table-bordered.dt-fixedheader.fixedHeader-locked.table.dataTable thead > tr > th {
 | 
			
		||||
      border-bottom-width: 1px;
 | 
			
		||||
      border-color: dark.$table-border-color;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										195
									
								
								resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,195 @@
 | 
			
		||||
export const datatable_spanish_default = {
 | 
			
		||||
    processing: 'Procesando...',
 | 
			
		||||
    lengthMenu: 'Mostrar _MENU_ registros',
 | 
			
		||||
    zeroRecords: 'No se encontraron resultados',
 | 
			
		||||
    emptyTable: 'Ningún dato disponible en esta tabla',
 | 
			
		||||
    infoEmpty: 'Mostrando registros del 0 al 0 de un total de 0 registros',
 | 
			
		||||
    infoFiltered: '(filtrado de un total de _MAX_ registros)',
 | 
			
		||||
    search: 'Buscar:',
 | 
			
		||||
    infoThousands: ',',
 | 
			
		||||
    loadingRecords: 'Cargando...',
 | 
			
		||||
    paginate: {
 | 
			
		||||
        first: 'Primero',
 | 
			
		||||
        last: 'Último',
 | 
			
		||||
        next: 'Siguiente',
 | 
			
		||||
        previous: 'Anterior'
 | 
			
		||||
    },
 | 
			
		||||
    aria: {
 | 
			
		||||
        sortAscending: ': Activar para ordenar la columna de manera ascendente',
 | 
			
		||||
        sortDescending: ': Activar para ordenar la columna de manera descendente'
 | 
			
		||||
    },
 | 
			
		||||
    buttons: {
 | 
			
		||||
        copy: 'Copiar',
 | 
			
		||||
        colvis: 'Visibilidad',
 | 
			
		||||
        collection: 'Colección',
 | 
			
		||||
        colvisRestore: 'Restaurar visibilidad',
 | 
			
		||||
        copyKeys:
 | 
			
		||||
            'Presione ctrl o u2318 + C para copiar los datos de la tabla al portapapeles del sistema. <br /> <br /> Para cancelar, haga clic en este mensaje o presione escape.',
 | 
			
		||||
        copySuccess: {
 | 
			
		||||
            1: 'Copiada 1 fila al portapapeles',
 | 
			
		||||
            _: 'Copiadas %d fila al portapapeles'
 | 
			
		||||
        },
 | 
			
		||||
        copyTitle: 'Copiar al portapapeles',
 | 
			
		||||
        csv: 'CSV',
 | 
			
		||||
        excel: 'Excel',
 | 
			
		||||
        pageLength: {
 | 
			
		||||
            '-1': 'Mostrar todas las filas',
 | 
			
		||||
            _: 'Mostrar %d filas'
 | 
			
		||||
        },
 | 
			
		||||
        pdf: 'PDF',
 | 
			
		||||
        print: 'Imprimir'
 | 
			
		||||
    },
 | 
			
		||||
    autoFill: {
 | 
			
		||||
        cancel: 'Cancelar',
 | 
			
		||||
        fill: 'Rellene todas las celdas con <i>%d</i>',
 | 
			
		||||
        fillHorizontal: 'Rellenar celdas horizontalmente',
 | 
			
		||||
        fillVertical: 'Rellenar celdas verticalmentemente'
 | 
			
		||||
    },
 | 
			
		||||
    decimal: ',',
 | 
			
		||||
    searchBuilder: {
 | 
			
		||||
        add: 'Añadir condición',
 | 
			
		||||
        button: {
 | 
			
		||||
            0: 'Constructor de búsqueda',
 | 
			
		||||
            _: 'Constructor de búsqueda (%d)'
 | 
			
		||||
        },
 | 
			
		||||
        clearAll: 'Borrar todo',
 | 
			
		||||
        condition: 'Condición',
 | 
			
		||||
        conditions: {
 | 
			
		||||
            date: {
 | 
			
		||||
                after: 'Despues',
 | 
			
		||||
                before: 'Antes',
 | 
			
		||||
                between: 'Entre',
 | 
			
		||||
                empty: 'Vacío',
 | 
			
		||||
                equals: 'Igual a',
 | 
			
		||||
                notBetween: 'No entre',
 | 
			
		||||
                notEmpty: 'No Vacio',
 | 
			
		||||
                not: 'Diferente de'
 | 
			
		||||
            },
 | 
			
		||||
            number: {
 | 
			
		||||
                between: 'Entre',
 | 
			
		||||
                empty: 'Vacio',
 | 
			
		||||
                equals: 'Igual a',
 | 
			
		||||
                gt: 'Mayor a',
 | 
			
		||||
                gte: 'Mayor o igual a',
 | 
			
		||||
                lt: 'Menor que',
 | 
			
		||||
                lte: 'Menor o igual que',
 | 
			
		||||
                notBetween: 'No entre',
 | 
			
		||||
                notEmpty: 'No vacío',
 | 
			
		||||
                not: 'Diferente de'
 | 
			
		||||
            },
 | 
			
		||||
            string: {
 | 
			
		||||
                contains: 'Contiene',
 | 
			
		||||
                empty: 'Vacío',
 | 
			
		||||
                endsWith: 'Termina en',
 | 
			
		||||
                equals: 'Igual a',
 | 
			
		||||
                notEmpty: 'No Vacio',
 | 
			
		||||
                startsWith: 'Empieza con',
 | 
			
		||||
                not: 'Diferente de'
 | 
			
		||||
            },
 | 
			
		||||
            array: {
 | 
			
		||||
                not: 'Diferente de',
 | 
			
		||||
                equals: 'Igual',
 | 
			
		||||
                empty: 'Vacío',
 | 
			
		||||
                contains: 'Contiene',
 | 
			
		||||
                notEmpty: 'No Vacío',
 | 
			
		||||
                without: 'Sin'
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        data: 'Data',
 | 
			
		||||
        deleteTitle: 'Eliminar regla de filtrado',
 | 
			
		||||
        leftTitle: 'Criterios anulados',
 | 
			
		||||
        logicAnd: 'Y',
 | 
			
		||||
        logicOr: 'O',
 | 
			
		||||
        rightTitle: 'Criterios de sangría',
 | 
			
		||||
        title: {
 | 
			
		||||
            0: 'Constructor de búsqueda',
 | 
			
		||||
            _: 'Constructor de búsqueda (%d)'
 | 
			
		||||
        },
 | 
			
		||||
        value: 'Valor'
 | 
			
		||||
    },
 | 
			
		||||
    searchPanes: {
 | 
			
		||||
        clearMessage: 'Borrar todo',
 | 
			
		||||
        collapse: {
 | 
			
		||||
            0: 'Paneles de búsqueda',
 | 
			
		||||
            _: 'Paneles de búsqueda (%d)'
 | 
			
		||||
        },
 | 
			
		||||
        count: '{total}',
 | 
			
		||||
        countFiltered: '{shown} ({total})',
 | 
			
		||||
        emptyPanes: 'Sin paneles de búsqueda',
 | 
			
		||||
        loadMessage: 'Cargando paneles de búsqueda',
 | 
			
		||||
        title: 'Filtros Activos - %d'
 | 
			
		||||
    },
 | 
			
		||||
    select: {
 | 
			
		||||
        cells: {
 | 
			
		||||
            1: '1 celda seleccionada',
 | 
			
		||||
            _: '%d celdas seleccionadas'
 | 
			
		||||
        },
 | 
			
		||||
        columns: {
 | 
			
		||||
            1: '1 columna seleccionada',
 | 
			
		||||
            _: '%d columnas seleccionadas'
 | 
			
		||||
        },
 | 
			
		||||
        rows: {
 | 
			
		||||
            1: '1 fila seleccionada',
 | 
			
		||||
            _: '%d filas seleccionadas'
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    thousands: '.',
 | 
			
		||||
    datetime: {
 | 
			
		||||
        previous: 'Anterior',
 | 
			
		||||
        next: 'Proximo',
 | 
			
		||||
        hours: 'Horas',
 | 
			
		||||
        minutes: 'Minutos',
 | 
			
		||||
        seconds: 'Segundos',
 | 
			
		||||
        unknown: '-',
 | 
			
		||||
        amPm: ['AM', 'PM'],
 | 
			
		||||
        months: {
 | 
			
		||||
            0: 'Enero',
 | 
			
		||||
            1: 'Febrero',
 | 
			
		||||
            10: 'Noviembre',
 | 
			
		||||
            11: 'Diciembre',
 | 
			
		||||
            2: 'Marzo',
 | 
			
		||||
            3: 'Abril',
 | 
			
		||||
            4: 'Mayo',
 | 
			
		||||
            5: 'Junio',
 | 
			
		||||
            6: 'Julio',
 | 
			
		||||
            7: 'Agosto',
 | 
			
		||||
            8: 'Septiembre',
 | 
			
		||||
            9: 'Octubre'
 | 
			
		||||
        },
 | 
			
		||||
        weekdays: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
 | 
			
		||||
    },
 | 
			
		||||
    editor: {
 | 
			
		||||
        close: 'Cerrar',
 | 
			
		||||
        create: {
 | 
			
		||||
            button: 'Nuevo',
 | 
			
		||||
            title: 'Crear Nuevo Registro',
 | 
			
		||||
            submit: 'Crear'
 | 
			
		||||
        },
 | 
			
		||||
        edit: {
 | 
			
		||||
            button: 'Editar',
 | 
			
		||||
            title: 'Editar Registro',
 | 
			
		||||
            submit: 'Actualizar'
 | 
			
		||||
        },
 | 
			
		||||
        remove: {
 | 
			
		||||
            button: 'Eliminar',
 | 
			
		||||
            title: 'Eliminar Registro',
 | 
			
		||||
            submit: 'Eliminar',
 | 
			
		||||
            confirm: {
 | 
			
		||||
                _: '¿Está seguro que desea eliminar %d filas?',
 | 
			
		||||
                1: '¿Está seguro que desea eliminar 1 fila?'
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        error: {
 | 
			
		||||
            system: 'Ha ocurrido un error en el sistema (<a target="\\" rel="\\ nofollow" href="\\">Más información<\\/a>).</a>'
 | 
			
		||||
        },
 | 
			
		||||
        multi: {
 | 
			
		||||
            title: 'Múltiples Valores',
 | 
			
		||||
            info: 'Los elementos seleccionados contienen diferentes valores para este registro. Para editar y establecer todos los elementos de este registro con el mismo valor, hacer click o tap aquí, de lo contrario conservarán sus valores individuales.',
 | 
			
		||||
            restore: 'Deshacer Cambios',
 | 
			
		||||
            noMulti: 'Este registro puede ser editado individualmente, pero no como parte de un grupo.'
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    info: 'Mostrando _START_ a _END_ de _TOTAL_ registros',
 | 
			
		||||
    search: '',
 | 
			
		||||
    searchPlaceholder: 'Buscar'
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										9
									
								
								resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
@mixin bs-datatables-theme($background) {
 | 
			
		||||
  // Style for responsive icon
 | 
			
		||||
  table.dataTable.dtr-column > tbody > tr > td.control:before,
 | 
			
		||||
  table.dataTable.dtr-column > tbody > tr > th.control:before {
 | 
			
		||||
    background-color: $background;
 | 
			
		||||
    border: 2px solid $rgba-to-hex-bg;
 | 
			
		||||
    box-shadow: 0 0 3px $gray-800;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,57 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import 'datatables.net-responsive-bs5/css/responsive.bootstrap5';
 | 
			
		||||
@import 'mixins';
 | 
			
		||||
 | 
			
		||||
// Responsive table area '+' icon position
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr > td.control,
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr > th.control {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  &:before,
 | 
			
		||||
  &:before {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    line-height: 0.9em;
 | 
			
		||||
    font-weight: light.$font-weight-medium;
 | 
			
		||||
    height: 0.85em;
 | 
			
		||||
    width: 0.85em;
 | 
			
		||||
    color: light.$white;
 | 
			
		||||
    border-radius: 1em;
 | 
			
		||||
    box-sizing: content-box;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    font-family: 'Courier New', Courier, monospace;
 | 
			
		||||
    content: '+';
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    left: 50%;
 | 
			
		||||
    transform: translate(-50%, -50%);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr.parent td.dtr-control:before,
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr.parent th.dtr-control:before,
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr.parent td.control:before,
 | 
			
		||||
table.dataTable.dtr-column > tbody > tr.parent th.control:before {
 | 
			
		||||
  content: '+';
 | 
			
		||||
}
 | 
			
		||||
// To scroll within datatable area
 | 
			
		||||
@media screen and (max-width: 1399.98px) {
 | 
			
		||||
  table.dataTable.table-responsive {
 | 
			
		||||
    display: block;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Modal table style
 | 
			
		||||
.modal.dtr-bs-modal {
 | 
			
		||||
  .modal-body {
 | 
			
		||||
    padding: 0;
 | 
			
		||||
  }
 | 
			
		||||
  .table {
 | 
			
		||||
    tr:last-child > td {
 | 
			
		||||
      border-bottom: 0;
 | 
			
		||||
    }
 | 
			
		||||
    .btn {
 | 
			
		||||
      box-shadow: none !important;
 | 
			
		||||
    }
 | 
			
		||||
    .emp_name {
 | 
			
		||||
      font-weight: light.$font-weight-medium;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
@import 'datatables.net-rowgroup-bs5/css/rowGroup.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    tr.group,
 | 
			
		||||
    tr.group:hover {
 | 
			
		||||
      background-color: light.$gray-100 !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    tr.group,
 | 
			
		||||
    tr.group:hover {
 | 
			
		||||
      background-color: rgba(dark.$base, 0.1) !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@use '../../scss/_components/include' as comp;
 | 
			
		||||
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'datatables.net-select-bs5/css/select.bootstrap5';
 | 
			
		||||
 | 
			
		||||
// Background color for select row
 | 
			
		||||
table.dataTable tbody > tr.selected td,
 | 
			
		||||
table.dataTable tbody > tr > .selected td {
 | 
			
		||||
  background-color: rgba(light.$primary, 0.08);
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
}
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    table.dataTable tbody tr.selected td,
 | 
			
		||||
    table.dataTable tbody th.selected td,
 | 
			
		||||
    table.dataTable tbody td.selected td {
 | 
			
		||||
      color: light.$body-color !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark Style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    table.dataTable tbody > tr.selected > *,
 | 
			
		||||
    table.dataTable tbody > tr > .selected > * {
 | 
			
		||||
      box-shadow: inset 0 0 0 dark.$gray-50;
 | 
			
		||||
      color: dark.$table-active-color;
 | 
			
		||||
    }
 | 
			
		||||
    table.dataTable tbody tr.selected td,
 | 
			
		||||
    table.dataTable tbody th.selected td,
 | 
			
		||||
    table.dataTable tbody td.selected td {
 | 
			
		||||
      color: inherit;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								resources/assets/vendor/libs/dropzone/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								resources/assets/vendor/libs/dropzone/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
@mixin dropzone-theme($border) {
 | 
			
		||||
  .dropzone.dz-drag-hover {
 | 
			
		||||
    border-color: $border !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								resources/assets/vendor/libs/dropzone/dropzone.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								resources/assets/vendor/libs/dropzone/dropzone.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
import Dropzone from 'dropzone/dist/dropzone';
 | 
			
		||||
 | 
			
		||||
Dropzone.autoDiscover = false;
 | 
			
		||||
 | 
			
		||||
// File upload progress animation
 | 
			
		||||
Dropzone.prototype.uploadFiles = function (files) {
 | 
			
		||||
  const minSteps = 6;
 | 
			
		||||
  const maxSteps = 60;
 | 
			
		||||
  const timeBetweenSteps = 100;
 | 
			
		||||
  const bytesPerStep = 100000;
 | 
			
		||||
  const isUploadSuccess = true;
 | 
			
		||||
 | 
			
		||||
  const self = this;
 | 
			
		||||
 | 
			
		||||
  for (let i = 0; i < files.length; i++) {
 | 
			
		||||
    const file = files[i];
 | 
			
		||||
    const totalSteps = Math.round(Math.min(maxSteps, Math.max(minSteps, file.size / bytesPerStep)));
 | 
			
		||||
 | 
			
		||||
    for (let step = 0; step < totalSteps; step++) {
 | 
			
		||||
      const duration = timeBetweenSteps * (step + 1);
 | 
			
		||||
 | 
			
		||||
      setTimeout(
 | 
			
		||||
        (function (file, totalSteps, step) {
 | 
			
		||||
          return function () {
 | 
			
		||||
            file.upload = {
 | 
			
		||||
              progress: (100 * (step + 1)) / totalSteps,
 | 
			
		||||
              total: file.size,
 | 
			
		||||
              bytesSent: ((step + 1) * file.size) / totalSteps
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            self.emit('uploadprogress', file, file.upload.progress, file.upload.bytesSent);
 | 
			
		||||
            if (file.upload.progress === 100) {
 | 
			
		||||
              if (isUploadSuccess) {
 | 
			
		||||
                file.status = Dropzone.SUCCESS;
 | 
			
		||||
                self.emit('success', file, 'success', null);
 | 
			
		||||
              } else {
 | 
			
		||||
                file.status = Dropzone.ERROR;
 | 
			
		||||
                self.emit('error', file, 'Some upload error', null);
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              self.emit('complete', file);
 | 
			
		||||
              self.processQueue();
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        })(file, totalSteps, step),
 | 
			
		||||
        duration
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.Dropzone = Dropzone;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { Dropzone };
 | 
			
		||||
							
								
								
									
										460
									
								
								resources/assets/vendor/libs/dropzone/dropzone.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										460
									
								
								resources/assets/vendor/libs/dropzone/dropzone.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,460 @@
 | 
			
		||||
// Dropzone
 | 
			
		||||
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
$dz-box-padding: 1.25rem !default;
 | 
			
		||||
$dz-icon-size: 1.875rem !default;
 | 
			
		||||
$dz-thumbnail-width: 10rem !default;
 | 
			
		||||
$dz-thumbnail-height: 7.5rem !default;
 | 
			
		||||
$dz-preview-padding: 0.625rem !default;
 | 
			
		||||
$dz-progress-height: 0.5rem !default;
 | 
			
		||||
$dz-icon-block-size: 3.75rem !default;
 | 
			
		||||
 | 
			
		||||
// common styles
 | 
			
		||||
.dropzone {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  border-radius: light.$border-radius-lg;
 | 
			
		||||
 | 
			
		||||
  // Disabled
 | 
			
		||||
  &:not(.dz-clickable) {
 | 
			
		||||
    opacity: 0.5;
 | 
			
		||||
    cursor: not-allowed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Hover
 | 
			
		||||
  &.dz-drag-hover {
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
 | 
			
		||||
    .dz-message {
 | 
			
		||||
      opacity: 0.5;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-message {
 | 
			
		||||
  font-size: light.$h4-font-size;
 | 
			
		||||
  &:before {
 | 
			
		||||
    content: '';
 | 
			
		||||
    border-radius: 6px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 5rem;
 | 
			
		||||
    left: calc(50% - 23px);
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    width: 40px;
 | 
			
		||||
    background-repeat: no-repeat !important;
 | 
			
		||||
    background-position: center !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .note {
 | 
			
		||||
    font-size: light.$font-size-base;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fallback
 | 
			
		||||
.dz-browser-not-supported {
 | 
			
		||||
  &.dropzone-box {
 | 
			
		||||
    min-height: auto !important;
 | 
			
		||||
    border: none !important;
 | 
			
		||||
    border-radius: 0 !important;
 | 
			
		||||
    padding: 0 !important;
 | 
			
		||||
    width: auto !important;
 | 
			
		||||
    cursor: default !important;
 | 
			
		||||
    transition: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .dz-message {
 | 
			
		||||
    display: none !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Default message
 | 
			
		||||
 | 
			
		||||
.dz-started .dz-message {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-message {
 | 
			
		||||
  margin: 8rem 0 3rem;
 | 
			
		||||
  font-weight: 500;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
 | 
			
		||||
  .note {
 | 
			
		||||
    display: block;
 | 
			
		||||
    margin-top: 0.5rem;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// styles for dropzone in ecommerce
 | 
			
		||||
.app-ecommerce {
 | 
			
		||||
  .dz-message {
 | 
			
		||||
    margin-top: 5rem;
 | 
			
		||||
    &::before {
 | 
			
		||||
      top: 3rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Preview
 | 
			
		||||
.dz-preview {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  vertical-align: top;
 | 
			
		||||
  background: #fff;
 | 
			
		||||
  font-size: 0.8125rem;
 | 
			
		||||
  margin: 1rem;
 | 
			
		||||
  margin-right: $dz-box-padding - 1;
 | 
			
		||||
  box-sizing: content-box;
 | 
			
		||||
  cursor: default;
 | 
			
		||||
  @include light.media-breakpoint-down(sm) {
 | 
			
		||||
    margin: $dz-box-padding - 0.5;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// File information
 | 
			
		||||
.dz-filename {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  padding: $dz-preview-padding $dz-preview-padding 0 $dz-preview-padding;
 | 
			
		||||
  background: light.$white;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  text-overflow: ellipsis;
 | 
			
		||||
 | 
			
		||||
  &:hover {
 | 
			
		||||
    white-space: normal;
 | 
			
		||||
    text-overflow: inherit;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-size {
 | 
			
		||||
  padding: 1.875rem $dz-preview-padding $dz-preview-padding $dz-preview-padding;
 | 
			
		||||
  font-size: 0.6875rem;
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Progressbar
 | 
			
		||||
.dz-preview .progress,
 | 
			
		||||
.dz-preview .progess-bar {
 | 
			
		||||
  height: $dz-progress-height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-preview .progress {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: 1.25rem;
 | 
			
		||||
  right: 1.25rem;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  margin-top: -$dz-progress-height * 0.5;
 | 
			
		||||
  z-index: 30;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-complete .progress {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Thumbnail
 | 
			
		||||
.dz-thumbnail {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  padding: $dz-preview-padding;
 | 
			
		||||
  height: $dz-thumbnail-height;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  box-sizing: content-box;
 | 
			
		||||
 | 
			
		||||
  > img,
 | 
			
		||||
  .dz-nopreview {
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    transform: translateY(-50%) scale(1);
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
    display: block;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  > img {
 | 
			
		||||
    max-height: 100%;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-nopreview {
 | 
			
		||||
  font-weight: light.$font-weight-medium;
 | 
			
		||||
  text-transform: uppercase;
 | 
			
		||||
  font-size: 0.6875rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-thumbnail img[src] ~ .dz-nopreview {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Remove link
 | 
			
		||||
.dz-remove {
 | 
			
		||||
  display: block;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  padding: 0.375rem 0;
 | 
			
		||||
  font-size: 0.75rem;
 | 
			
		||||
 | 
			
		||||
  &:hover,
 | 
			
		||||
  &:focus {
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-top-color: transparent;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// error/success states
 | 
			
		||||
.dz-error-mark,
 | 
			
		||||
.dz-success-mark {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: 50%;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  display: none;
 | 
			
		||||
  margin-left: -$dz-icon-block-size * 0.5;
 | 
			
		||||
  margin-top: -$dz-icon-block-size * 0.5;
 | 
			
		||||
  height: $dz-icon-block-size;
 | 
			
		||||
  width: $dz-icon-block-size;
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  background-position: center center;
 | 
			
		||||
  background-size: $dz-icon-size $dz-icon-size;
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
  box-shadow: 0 0 1.25rem rgba(0, 0, 0, 0.06);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-success-mark {
 | 
			
		||||
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-error-mark {
 | 
			
		||||
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dz-error-message {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: -1px;
 | 
			
		||||
  left: -1px;
 | 
			
		||||
  bottom: -1px;
 | 
			
		||||
  right: -1px;
 | 
			
		||||
  display: none;
 | 
			
		||||
  color: light.$white;
 | 
			
		||||
  z-index: 40;
 | 
			
		||||
  padding: 0.75rem;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
  font-weight: light.$font-weight-medium;
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Error state
 | 
			
		||||
.dz-error {
 | 
			
		||||
  .dz-error-message {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .dz-error-mark {
 | 
			
		||||
    display: block;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &:hover {
 | 
			
		||||
    .dz-error-message {
 | 
			
		||||
      display: block;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-error-mark {
 | 
			
		||||
      display: none;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Success state
 | 
			
		||||
.dz-success .dz-success-mark {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .dz-hidden-input {
 | 
			
		||||
    left: auto !important;
 | 
			
		||||
    right: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    $dz-overlay-bg: light.$dark;
 | 
			
		||||
    $dz-thumbnail-bg: light.$gray-25;
 | 
			
		||||
    $dz-border-color: light.$card-border-color;
 | 
			
		||||
 | 
			
		||||
    .dropzone {
 | 
			
		||||
      border: 2px dashed $dz-border-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-preview {
 | 
			
		||||
      border: light.$card-border-width solid $dz-border-color;
 | 
			
		||||
      border-radius: light.$border-radius;
 | 
			
		||||
      box-shadow: light.$card-box-shadow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-message {
 | 
			
		||||
      color: light.$headings-color;
 | 
			
		||||
      &:before {
 | 
			
		||||
        background-image: light.str-replace(
 | 
			
		||||
          light.str-replace(light.$upload-icon, 'currentColor', light.$headings-color),
 | 
			
		||||
          '#',
 | 
			
		||||
          '%23'
 | 
			
		||||
        ) !important;
 | 
			
		||||
        background: #eeedf0;
 | 
			
		||||
      }
 | 
			
		||||
      .note {
 | 
			
		||||
        color: light.$body-color;
 | 
			
		||||
        font-weight: light.$font-weight-normal;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-thumbnail {
 | 
			
		||||
      border-bottom: 1px solid light.rgba-to-hex($dz-border-color);
 | 
			
		||||
      background: $dz-thumbnail-bg;
 | 
			
		||||
 | 
			
		||||
      @include light.border-top-radius(if(light.$border-radius, calc(#{light.$border-radius} - 1px), 0));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-size {
 | 
			
		||||
      color: light.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-remove {
 | 
			
		||||
      color: light.$body-color;
 | 
			
		||||
      border-top: 1px solid light.rgba-to-hex($dz-border-color);
 | 
			
		||||
 | 
			
		||||
      @include light.border-bottom-radius(if(light.$border-radius, calc(#{light.$border-radius} - 1px), 0));
 | 
			
		||||
 | 
			
		||||
      &:hover,
 | 
			
		||||
      &:focus {
 | 
			
		||||
        color: light.$body-color;
 | 
			
		||||
        background: light.$gray-100;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-nopreview {
 | 
			
		||||
      color: light.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-error-mark,
 | 
			
		||||
    .dz-success-mark {
 | 
			
		||||
      background-color: rgba($dz-overlay-bg, 0.5);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-error-message {
 | 
			
		||||
      background: rgba(map-get(light.$theme-colors, danger), 0.8);
 | 
			
		||||
 | 
			
		||||
      @include light.border-top-radius(light.$border-radius);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include light.media-breakpoint-up(sm) {
 | 
			
		||||
      .dz-preview {
 | 
			
		||||
        display: inline-block;
 | 
			
		||||
        width: $dz-thumbnail-width + ($dz-preview-padding * 2);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .dz-thumbnail {
 | 
			
		||||
        width: $dz-thumbnail-width;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dark style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    $dz-overlay-bg: dark.$dark;
 | 
			
		||||
    $dz-thumbnail-bg: dark.$gray-25;
 | 
			
		||||
    $dz-border-color: dark.$card-border-color;
 | 
			
		||||
 | 
			
		||||
    .dropzone {
 | 
			
		||||
      border: 2px dashed $dz-border-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-preview {
 | 
			
		||||
      background: dark.$card-bg;
 | 
			
		||||
      border: dark.$card-border-width solid $dz-border-color;
 | 
			
		||||
      border-radius: dark.$border-radius;
 | 
			
		||||
      box-shadow: dark.$card-box-shadow;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-message {
 | 
			
		||||
      color: dark.$headings-color;
 | 
			
		||||
      &:before {
 | 
			
		||||
        background-image: light.str-replace(
 | 
			
		||||
          light.str-replace(light.$upload-icon, 'currentColor', dark.$headings-color),
 | 
			
		||||
          '#',
 | 
			
		||||
          '%23'
 | 
			
		||||
        ) !important;
 | 
			
		||||
        background: #373b50;
 | 
			
		||||
      }
 | 
			
		||||
      .note {
 | 
			
		||||
        color: dark.$body-color;
 | 
			
		||||
        font-weight: dark.$font-weight-normal;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-filename {
 | 
			
		||||
      background: dark.$card-bg;
 | 
			
		||||
      padding-top: 0.25rem;
 | 
			
		||||
      padding-bottom: 0.25rem;
 | 
			
		||||
      border-bottom: dark.$card-border-width solid $dz-border-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-size {
 | 
			
		||||
      color: dark.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-thumbnail {
 | 
			
		||||
      border-bottom: 1px solid $dz-border-color;
 | 
			
		||||
      background: $dz-thumbnail-bg;
 | 
			
		||||
 | 
			
		||||
      @include dark.border-top-radius(if(dark.$border-radius, calc(#{dark.$border-radius} - 1px), 0));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-nopreview {
 | 
			
		||||
      color: dark.$text-muted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-remove {
 | 
			
		||||
      color: dark.$body-color;
 | 
			
		||||
      border-top: 1px solid $dz-border-color;
 | 
			
		||||
 | 
			
		||||
      @include dark.border-bottom-radius(if(dark.$border-radius, calc(#{dark.$border-radius} - 1px), 0));
 | 
			
		||||
 | 
			
		||||
      &:hover,
 | 
			
		||||
      &:focus {
 | 
			
		||||
        color: dark.$body-color;
 | 
			
		||||
        background: dark.$gray-100;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-error-mark,
 | 
			
		||||
    .dz-success-mark {
 | 
			
		||||
      background-color: rgba($dz-overlay-bg, 0.5);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dz-error-message {
 | 
			
		||||
      background: rgba(map-get(dark.$theme-colors, danger), 0.8);
 | 
			
		||||
 | 
			
		||||
      @include dark.border-top-radius(dark.$border-radius);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @include dark.media-breakpoint-up(sm) {
 | 
			
		||||
      .dz-preview {
 | 
			
		||||
        display: inline-block;
 | 
			
		||||
        width: $dz-thumbnail-width + ($dz-preview-padding * 2);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .dz-thumbnail {
 | 
			
		||||
        width: $dz-thumbnail-width;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								resources/assets/vendor/libs/flatpickr/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								resources/assets/vendor/libs/flatpickr/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,114 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/functions';
 | 
			
		||||
 | 
			
		||||
@mixin flatpickr-theme($background, $color: null) {
 | 
			
		||||
  $in-range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
  $in-range-color: $background;
 | 
			
		||||
 | 
			
		||||
  .flatpickr-day {
 | 
			
		||||
    &.today,
 | 
			
		||||
    &.today:hover {
 | 
			
		||||
      color: $background !important;
 | 
			
		||||
      border-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
      background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.inRange,
 | 
			
		||||
    &.nextMonthDay.inRange,
 | 
			
		||||
    &.prevMonthDay.inRange,
 | 
			
		||||
    &.today.inRange,
 | 
			
		||||
    &.prevMonthDay.today.inRange,
 | 
			
		||||
    &.nextMonthDay.today.inRange {
 | 
			
		||||
      color: $background !important;
 | 
			
		||||
      background: $in-range-bg !important;
 | 
			
		||||
      border-color: $in-range-bg !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.selected,
 | 
			
		||||
    &.selected.inRange,
 | 
			
		||||
    &.selected:focus,
 | 
			
		||||
    &.selected:hover,
 | 
			
		||||
    &.selected.nextMonthDay,
 | 
			
		||||
    &.selected.prevMonthDay,
 | 
			
		||||
    &.startRange,
 | 
			
		||||
    &.startRange.inRange,
 | 
			
		||||
    &.startRange:focus,
 | 
			
		||||
    &.startRange:hover,
 | 
			
		||||
    &.startRange.nextMonthDay,
 | 
			
		||||
    &.startRange.prevMonthDay,
 | 
			
		||||
    &.endRange,
 | 
			
		||||
    &.endRange.inRange,
 | 
			
		||||
    &.endRange:focus,
 | 
			
		||||
    &.endRange:hover,
 | 
			
		||||
    &.endRange.nextMonthDay,
 | 
			
		||||
    &.endRange.prevMonthDay,
 | 
			
		||||
    &.week.selected {
 | 
			
		||||
      color: $color !important;
 | 
			
		||||
      background: $background !important;
 | 
			
		||||
      border-color: $background !important;
 | 
			
		||||
      box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin flatpickr-dark-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
  $in-range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
 | 
			
		||||
  $in-range-color: $background;
 | 
			
		||||
 | 
			
		||||
  .flatpickr-calendar .numInputWrapper span {
 | 
			
		||||
    &.arrowUp:after {
 | 
			
		||||
      border-bottom-color: $color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.arrowDown:after {
 | 
			
		||||
      border-top-color: $color;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .flatpickr-day {
 | 
			
		||||
    &.today,
 | 
			
		||||
    &.today:hover,
 | 
			
		||||
    &.inRange {
 | 
			
		||||
      color: $background !important;
 | 
			
		||||
      border-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
 | 
			
		||||
      background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.inRange,
 | 
			
		||||
    &.nextMonthDay.inRange,
 | 
			
		||||
    &.prevMonthDay.inRange,
 | 
			
		||||
    &.today.inRange,
 | 
			
		||||
    &.nextMonthDay.today.inRange,
 | 
			
		||||
    &.prevMonthDay.today.inRange {
 | 
			
		||||
      border-color: $in-range-bg !important;
 | 
			
		||||
      background: $in-range-bg !important;
 | 
			
		||||
      color: $background !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &.selected,
 | 
			
		||||
    &.selected.inRange,
 | 
			
		||||
    &.selected:focus,
 | 
			
		||||
    &.selected:hover,
 | 
			
		||||
    &.selected.prevMonthDay,
 | 
			
		||||
    &.selected.nextMonthDay,
 | 
			
		||||
    &.startRange,
 | 
			
		||||
    &.startRange.inRange,
 | 
			
		||||
    &.startRange:focus,
 | 
			
		||||
    &.startRange:hover,
 | 
			
		||||
    &.startRange.prevMonthDay,
 | 
			
		||||
    &.startRange.nextMonthDay,
 | 
			
		||||
    &.endRange,
 | 
			
		||||
    &.endRange.inRange,
 | 
			
		||||
    &.endRange:focus,
 | 
			
		||||
    &.endRange:hover,
 | 
			
		||||
    &.endRange.nextMonthDay,
 | 
			
		||||
    &.endRange.prevMonthDay,
 | 
			
		||||
    &.week.selected {
 | 
			
		||||
      background: $background !important;
 | 
			
		||||
      border-color: $background !important;
 | 
			
		||||
      color: $color !important;
 | 
			
		||||
      box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/flatpickr/flatpickr.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/flatpickr/flatpickr.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import flatpickr from 'flatpickr/dist/flatpickr';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.flatpickr = flatpickr;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { flatpickr };
 | 
			
		||||
							
								
								
									
										1172
									
								
								resources/assets/vendor/libs/flatpickr/flatpickr.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1172
									
								
								resources/assets/vendor/libs/flatpickr/flatpickr.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										23
									
								
								resources/assets/vendor/libs/fullcalendar/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								resources/assets/vendor/libs/fullcalendar/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
@mixin fullcalendar-theme($background, $color) {
 | 
			
		||||
  .fc {
 | 
			
		||||
    // FC event
 | 
			
		||||
    @include bg-label-variant('.fc-event-primary:not(.fc-list-event)', $background);
 | 
			
		||||
    // FC list event
 | 
			
		||||
    .fc-event-primary.fc-list-event {
 | 
			
		||||
      .fc-list-event-dot {
 | 
			
		||||
        border-color: $background !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-button-primary:not(.fc-prev-button):not(.fc-next-button) {
 | 
			
		||||
      background-color: rgba($background, 0.16) !important;
 | 
			
		||||
      border: 0;
 | 
			
		||||
      color: $background;
 | 
			
		||||
      &.fc-button-active,
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background-color: rgba($background, 0.24) !important;
 | 
			
		||||
        color: $background;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								resources/assets/vendor/libs/fullcalendar/fullcalendar.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								resources/assets/vendor/libs/fullcalendar/fullcalendar.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
import { Calendar } from '@fullcalendar/core';
 | 
			
		||||
import dayGridPlugin from '@fullcalendar/daygrid';
 | 
			
		||||
import interactionPlugin from '@fullcalendar/interaction';
 | 
			
		||||
import listPlugin from '@fullcalendar/list';
 | 
			
		||||
import timegridPlugin from '@fullcalendar/timegrid';
 | 
			
		||||
 | 
			
		||||
const calendarPlugins = {
 | 
			
		||||
  dayGrid: dayGridPlugin,
 | 
			
		||||
  interaction: interactionPlugin,
 | 
			
		||||
  list: listPlugin,
 | 
			
		||||
  timeGrid: timegridPlugin
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.Calendar = Calendar;
 | 
			
		||||
  window.dayGridPlugin = dayGridPlugin;
 | 
			
		||||
  window.interactionPlugin = interactionPlugin;
 | 
			
		||||
  window.listPlugin = listPlugin;
 | 
			
		||||
  window.timegridPlugin = timegridPlugin;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { Calendar, dayGridPlugin, interactionPlugin, listPlugin, timegridPlugin };
 | 
			
		||||
							
								
								
									
										535
									
								
								resources/assets/vendor/libs/fullcalendar/fullcalendar.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										535
									
								
								resources/assets/vendor/libs/fullcalendar/fullcalendar.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,535 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'mixins';
 | 
			
		||||
 | 
			
		||||
$fullcalendar-event-padding-y: 0.25rem !default;
 | 
			
		||||
$fullcalendar-event-padding-x: 0.75rem !default;
 | 
			
		||||
$fullcalendar-event-margin-top: 0.625rem !default;
 | 
			
		||||
$fullcalendar-event-font-size: light.$font-size-base !default;
 | 
			
		||||
$fullcalendar-event-font-weight: light.$font-weight-medium !default;
 | 
			
		||||
$fullcalendar-toolbar-btn-padding: light.$input-btn-padding-y - 0.115 light.$input-btn-padding-x !default;
 | 
			
		||||
$fullcalendar-fc-popover-z-index: 1090 !default;
 | 
			
		||||
$fullcalendar-event-border-radius: light.$border-radius-sm !default;
 | 
			
		||||
$fullcalendar-today-background-light: light.rgba-to-hex(light.$gray-50, light.$rgba-to-hex-bg) !default;
 | 
			
		||||
$fullcalendar-today-background-dark: dark.rgba-to-hex(dark.$gray-50, dark.$rgba-to-hex-bg) !default;
 | 
			
		||||
 | 
			
		||||
// Calendar
 | 
			
		||||
.fc {
 | 
			
		||||
  .fc-scrollgrid-section {
 | 
			
		||||
    height: 0px;
 | 
			
		||||
  }
 | 
			
		||||
  a[data-navlink]:hover {
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid-slot {
 | 
			
		||||
    height: 4em !important;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timeGridWeek-view {
 | 
			
		||||
    .fc-timegrid-slot-minor {
 | 
			
		||||
      border-top-style: none;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timeGridDay-view {
 | 
			
		||||
    .fc-timegrid-slot-minor {
 | 
			
		||||
      border-top-style: solid;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fc-col-header-cell-cushion {
 | 
			
		||||
    padding-top: 8.7px !important;
 | 
			
		||||
    padding-bottom: 8.7px !important;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-toolbar {
 | 
			
		||||
    flex-wrap: wrap;
 | 
			
		||||
    .fc-prev-button,
 | 
			
		||||
    .fc-next-button {
 | 
			
		||||
      display: inline-block;
 | 
			
		||||
      background-color: transparent;
 | 
			
		||||
      border-color: transparent;
 | 
			
		||||
 | 
			
		||||
      &:hover,
 | 
			
		||||
      &:active,
 | 
			
		||||
      &:focus {
 | 
			
		||||
        background-color: transparent !important;
 | 
			
		||||
        border-color: transparent !important;
 | 
			
		||||
        box-shadow: none !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .fc-button {
 | 
			
		||||
      border-radius: light.$border-radius;
 | 
			
		||||
      &:not(.fc-next-button):not(.fc-prev-button) {
 | 
			
		||||
        padding: $fullcalendar-toolbar-btn-padding;
 | 
			
		||||
        &:active,
 | 
			
		||||
        &:focus {
 | 
			
		||||
          box-shadow: none !important ;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    > * > :not(:first-child) {
 | 
			
		||||
      margin-left: 0 !important;
 | 
			
		||||
      @include app-rtl(true) {
 | 
			
		||||
        margin-right: 0 !important;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-toolbar-chunk {
 | 
			
		||||
      display: flex;
 | 
			
		||||
      align-items: center;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-button-group {
 | 
			
		||||
      .fc-button {
 | 
			
		||||
        text-transform: capitalize;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & + div {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        flex-wrap: wrap;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .fc--button:empty,
 | 
			
		||||
    .fc-toolbar-chunk:empty {
 | 
			
		||||
      display: none;
 | 
			
		||||
    }
 | 
			
		||||
    .fc-sidebarToggle-button + div {
 | 
			
		||||
      margin-left: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  table.fc-scrollgrid {
 | 
			
		||||
    .fc-col-header {
 | 
			
		||||
      .fc-col-header-cell {
 | 
			
		||||
        border-left: none;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-view-harness {
 | 
			
		||||
    min-height: 650px;
 | 
			
		||||
    .fc-col-header-cell-cushion {
 | 
			
		||||
      padding-bottom: 3px;
 | 
			
		||||
      padding-top: 3px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // To remove border on weekday row
 | 
			
		||||
    .fc-scrollgrid-section-header > * {
 | 
			
		||||
      @include app-ltr(true) {
 | 
			
		||||
        border-inline-end-width: 0px;
 | 
			
		||||
      }
 | 
			
		||||
      @include app-rtl(true) {
 | 
			
		||||
        border-inline-start-width: 0px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-timegrid-event .fc-event-time {
 | 
			
		||||
      font-size: 0.6875rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-v-event .fc-event-title {
 | 
			
		||||
      font-size: $fullcalendar-event-font-size;
 | 
			
		||||
      padding-top: 0.2rem;
 | 
			
		||||
      font-weight: $fullcalendar-event-font-weight;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fc-timegrid-event .fc-event-main {
 | 
			
		||||
      padding: $fullcalendar-event-padding-y $fullcalendar-event-padding-x 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fc-daygrid-day-events {
 | 
			
		||||
    .fc-event,
 | 
			
		||||
    .fc-more-link {
 | 
			
		||||
      margin-inline: 0.5rem !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // To fix firefox thead border issue
 | 
			
		||||
  .fc-day-today {
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //! Fix: white color issue of event text
 | 
			
		||||
  .fc-h-event .fc-event-main,
 | 
			
		||||
  .fc-v-event .fc-event-main {
 | 
			
		||||
    color: inherit !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fc-daygrid-block-event .fc-event-time,
 | 
			
		||||
  .fc-daygrid-dot-event .fc-event-title {
 | 
			
		||||
    font-weight: $fullcalendar-event-font-weight;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fc-daygrid-body-natural {
 | 
			
		||||
    .fc-daygrid-day-events {
 | 
			
		||||
      margin-top: 0.94rem !important;
 | 
			
		||||
      margin-bottom: 0.94rem !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fc-view-harness {
 | 
			
		||||
    margin: 0 -1.5rem;
 | 
			
		||||
    .fc-daygrid-body {
 | 
			
		||||
      .fc-daygrid-day {
 | 
			
		||||
        .fc-daygrid-day-top {
 | 
			
		||||
          flex-direction: row;
 | 
			
		||||
          .fc-daygrid-day-number {
 | 
			
		||||
            float: left;
 | 
			
		||||
            padding: 0.5rem;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        .fc-daygrid-day-bottom .fc-daygrid-more-link {
 | 
			
		||||
          margin-top: 0.625rem;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .fc-event {
 | 
			
		||||
      font-size: $fullcalendar-event-font-size;
 | 
			
		||||
      font-weight: $fullcalendar-event-font-weight;
 | 
			
		||||
      padding: $fullcalendar-event-padding-y $fullcalendar-event-padding-x;
 | 
			
		||||
      border-radius: $fullcalendar-event-border-radius;
 | 
			
		||||
      border: 0;
 | 
			
		||||
      .fc-event-title {
 | 
			
		||||
        font-weight: light.$font-weight-medium;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .fc-daygrid-event-harness {
 | 
			
		||||
      // ! week & day events are using this style for all day only, not for other events
 | 
			
		||||
      .fc-event {
 | 
			
		||||
        &.private-event {
 | 
			
		||||
          background-color: transparent !important;
 | 
			
		||||
          border-color: transparent !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .fc-event .fc-daygrid-event-dot {
 | 
			
		||||
      display: none;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-daygrid-event-harness + .fc-daygrid-event-harness .fc-daygrid-event {
 | 
			
		||||
    margin-top: $fullcalendar-event-margin-top !important;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid {
 | 
			
		||||
    .fc-timegrid-divider {
 | 
			
		||||
      display: none;
 | 
			
		||||
    }
 | 
			
		||||
    .fc-timegrid-event {
 | 
			
		||||
      border-radius: 0px;
 | 
			
		||||
      box-shadow: none;
 | 
			
		||||
      padding-top: $fullcalendar-event-padding-x;
 | 
			
		||||
      .fc-event-time {
 | 
			
		||||
        font-size: inherit;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-daygrid-event-harness-abs .fc-event {
 | 
			
		||||
    margin-bottom: 0.625rem;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid-slot-label-frame {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid-axis-cushion,
 | 
			
		||||
  .fc-timegrid-slot-label-cushion {
 | 
			
		||||
    font-size: light.$font-size-sm;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid-axis-cushion {
 | 
			
		||||
    text-transform: capitalize;
 | 
			
		||||
    padding: 0.5rem 0.4375rem;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-timegrid-slot-label-cushion {
 | 
			
		||||
    text-transform: uppercase;
 | 
			
		||||
    padding: $fullcalendar-event-padding-x !important;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-list-day-cushion,
 | 
			
		||||
  .fc-list-table td {
 | 
			
		||||
    padding-inline: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
  .fc-popover {
 | 
			
		||||
    z-index: $fullcalendar-fc-popover-z-index !important;
 | 
			
		||||
    .fc-popover-header {
 | 
			
		||||
      padding: 0.566rem;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-list {
 | 
			
		||||
    .fc-list-table {
 | 
			
		||||
      border-bottom: 1px solid;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  &.fc-theme-standard {
 | 
			
		||||
    .fc-list {
 | 
			
		||||
      border: none;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .fc-day-other {
 | 
			
		||||
    .fc-daygrid-day-top {
 | 
			
		||||
      opacity: 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .fc {
 | 
			
		||||
      .fc-toolbar {
 | 
			
		||||
        .fc-prev-button,
 | 
			
		||||
        .fc-next-button {
 | 
			
		||||
          .fc-icon {
 | 
			
		||||
            color: light.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-col-header-cell-cushion {
 | 
			
		||||
        color: light.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
      &.fc-theme-standard .fc-list-day-cushion {
 | 
			
		||||
        background-color: $fullcalendar-today-background-light !important;
 | 
			
		||||
      }
 | 
			
		||||
      table.fc-scrollgrid {
 | 
			
		||||
        border-color: light.$border-color;
 | 
			
		||||
        .fc-col-header {
 | 
			
		||||
          tbody {
 | 
			
		||||
            border: none;
 | 
			
		||||
          }
 | 
			
		||||
          .fc-col-header-cell {
 | 
			
		||||
            border-color: light.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        td {
 | 
			
		||||
          border-color: light.$border-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-timegrid-axis-cushion {
 | 
			
		||||
        color: light.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
      .fc-timegrid-slot-label-cushion {
 | 
			
		||||
        color: light.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
      .private-event {
 | 
			
		||||
        .fc-event-time,
 | 
			
		||||
        .fc-event-title {
 | 
			
		||||
          color: light.$danger;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-day-today:not(.fc-col-header-cell) {
 | 
			
		||||
        background-color: $fullcalendar-today-background-light !important;
 | 
			
		||||
        .fc-popover-body {
 | 
			
		||||
          background-color: light.$card-bg !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .fc-popover {
 | 
			
		||||
        .fc-popover-header {
 | 
			
		||||
          background: light.$body-bg;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-list {
 | 
			
		||||
        .fc-list-table {
 | 
			
		||||
          th {
 | 
			
		||||
            border: 0;
 | 
			
		||||
            background: light.$body-bg;
 | 
			
		||||
          }
 | 
			
		||||
          .fc-list-event {
 | 
			
		||||
            cursor: pointer;
 | 
			
		||||
            &:hover {
 | 
			
		||||
              td {
 | 
			
		||||
                background-color: light.$gray-25;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            td {
 | 
			
		||||
              border-color: light.$border-color;
 | 
			
		||||
              color: light.$body-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          .fc-list-day {
 | 
			
		||||
            th {
 | 
			
		||||
              color: light.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          tbody > tr:first-child th {
 | 
			
		||||
            border-top: 1px solid light.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        .fc-list-empty {
 | 
			
		||||
          background-color: light.$body-bg;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Border color
 | 
			
		||||
      table,
 | 
			
		||||
      tbody,
 | 
			
		||||
      thead,
 | 
			
		||||
      tbody td {
 | 
			
		||||
        border-color: light.$border-color;
 | 
			
		||||
      }
 | 
			
		||||
      .fc-day-other {
 | 
			
		||||
        .fc-daygrid-day-top {
 | 
			
		||||
          color: light.$text-muted;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ? Style event here
 | 
			
		||||
    @each $color, $value in light.$theme-colors {
 | 
			
		||||
      // FC event
 | 
			
		||||
      @include light.bg-label-variant('.fc-event-#{$color}:not(.fc-list-event)', $value);
 | 
			
		||||
 | 
			
		||||
      // FC list event
 | 
			
		||||
      .fc-event-#{$color}.fc-list-event {
 | 
			
		||||
        .fc-list-event-dot {
 | 
			
		||||
          border-color: $value !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dark Style
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .fc {
 | 
			
		||||
      .fc-toolbar {
 | 
			
		||||
        .fc-prev-button,
 | 
			
		||||
        .fc-next-button {
 | 
			
		||||
          .fc-icon {
 | 
			
		||||
            color: dark.$headings-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        .fc-sidebarToggle-button {
 | 
			
		||||
          color: dark.$white;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-col-header-cell-cushion {
 | 
			
		||||
        color: dark.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
      &.fc-theme-standard .fc-list-day-cushion {
 | 
			
		||||
        background-color: $fullcalendar-today-background-dark !important;
 | 
			
		||||
      }
 | 
			
		||||
      .fc-timegrid-axis-cushion {
 | 
			
		||||
        color: dark.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
      .fc-timegrid-slot-label-cushion {
 | 
			
		||||
        color: dark.$headings-color;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      table.fc-scrollgrid {
 | 
			
		||||
        border-color: dark.$border-color;
 | 
			
		||||
        .fc-col-header {
 | 
			
		||||
          tbody {
 | 
			
		||||
            border: none;
 | 
			
		||||
          }
 | 
			
		||||
          .fc-col-header-cell {
 | 
			
		||||
            border-color: dark.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        td {
 | 
			
		||||
          border-color: dark.$border-color;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .private-event {
 | 
			
		||||
        .fc-event-time,
 | 
			
		||||
        .fc-event-title {
 | 
			
		||||
          color: dark.$danger;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .fc-day-today:not(.fc-col-header-cell) {
 | 
			
		||||
        background-color: $fullcalendar-today-background-dark !important;
 | 
			
		||||
        .fc-popover-body {
 | 
			
		||||
          background-color: dark.$card-bg !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .fc-divider {
 | 
			
		||||
        background: dark.$border-color;
 | 
			
		||||
        border-color: dark.$border-color;
 | 
			
		||||
      }
 | 
			
		||||
      .fc-popover {
 | 
			
		||||
        background-color: dark.$body-bg;
 | 
			
		||||
        border: 0;
 | 
			
		||||
 | 
			
		||||
        .fc-popover-header {
 | 
			
		||||
          background-color: dark.$light;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .fc-list {
 | 
			
		||||
        .fc-list-table {
 | 
			
		||||
          th {
 | 
			
		||||
            border: 0;
 | 
			
		||||
            background: dark.$body-bg;
 | 
			
		||||
          }
 | 
			
		||||
          .fc-list-event {
 | 
			
		||||
            cursor: pointer;
 | 
			
		||||
            &:hover {
 | 
			
		||||
              td {
 | 
			
		||||
                background-color: dark.$gray-50;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            td {
 | 
			
		||||
              border-color: dark.$border-color;
 | 
			
		||||
              color: dark.$body-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          .fc-list-day {
 | 
			
		||||
            th {
 | 
			
		||||
              color: dark.$headings-color;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          tbody > tr:first-child th {
 | 
			
		||||
            border-top: 1px solid dark.$border-color;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        .fc-list-empty {
 | 
			
		||||
          background-color: dark.$body-bg;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      table,
 | 
			
		||||
      .fc-timegrid-axis,
 | 
			
		||||
      tbody,
 | 
			
		||||
      thead,
 | 
			
		||||
      tbody td {
 | 
			
		||||
        border-color: dark.$border-color;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // FC day
 | 
			
		||||
      .fc-timegrid-axis-cushion.fc-scrollgrid-shrink-cushion {
 | 
			
		||||
        color: dark.$text-muted;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // FC table list disabled bg
 | 
			
		||||
      .fc-day-disabled {
 | 
			
		||||
        background-color: rgba(dark.$base, 0.16);
 | 
			
		||||
      }
 | 
			
		||||
      .fc-day-other {
 | 
			
		||||
        .fc-daygrid-day-top {
 | 
			
		||||
          color: dark.$text-muted;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // ? Style event here
 | 
			
		||||
    @each $color, $value in dark.$theme-colors {
 | 
			
		||||
      // FC event
 | 
			
		||||
      @include dark.bg-label-variant('.fc-event-#{$color}:not(.fc-list-event)', $value);
 | 
			
		||||
      .fc-event-#{$color}:not(.fc-list-event) {
 | 
			
		||||
        box-shadow: none;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // FC list event
 | 
			
		||||
      .fc-event-#{$color}.fc-list-event {
 | 
			
		||||
        .fc-list-event-dot {
 | 
			
		||||
          border-color: $value !important;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Media Queries
 | 
			
		||||
@include light.media-breakpoint-down(sm) {
 | 
			
		||||
  .fc {
 | 
			
		||||
    .fc-header-toolbar {
 | 
			
		||||
      .fc-toolbar-chunk + .fc-toolbar-chunk {
 | 
			
		||||
        margin-top: 1rem;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/hammer/hammer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/hammer/hammer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'hammerjs/hammer.js';
 | 
			
		||||
							
								
								
									
										11
									
								
								resources/assets/vendor/libs/jquery-timepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								resources/assets/vendor/libs/jquery-timepicker/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/_functions';
 | 
			
		||||
 | 
			
		||||
@mixin timepicker-theme($background, $color: null) {
 | 
			
		||||
  $color: if($color, $color, color-contrast($background));
 | 
			
		||||
 | 
			
		||||
  li.ui-timepicker-selected,
 | 
			
		||||
  .ui-timepicker-list .ui-timepicker-selected:hover {
 | 
			
		||||
    color: $color !important;
 | 
			
		||||
    background: $background !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import 'timepicker/jquery.timepicker';
 | 
			
		||||
							
								
								
									
										116
									
								
								resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,116 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
 | 
			
		||||
.ui-timepicker-wrapper {
 | 
			
		||||
  max-height: 10rem;
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
  margin: 0.125rem 0;
 | 
			
		||||
  background: light.$white;
 | 
			
		||||
  background-clip: padding-box;
 | 
			
		||||
  outline: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui-timepicker-list {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  padding: 0.125rem 0;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui-timepicker-duration {
 | 
			
		||||
  margin-left: 0.25rem;
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
    margin-right: 0.25rem;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui-timepicker-list li {
 | 
			
		||||
  padding: 0.25rem 0.75rem;
 | 
			
		||||
  margin: 0.125rem 0.875rem;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  border-radius: light.$dropdown-border-radius;
 | 
			
		||||
 | 
			
		||||
  &.ui-timepicker-disabled,
 | 
			
		||||
  &.ui-timepicker-selected.ui-timepicker-disabled {
 | 
			
		||||
    background: light.$white !important;
 | 
			
		||||
    cursor: default !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    .ui-timepicker-wrapper {
 | 
			
		||||
      padding: light.$dropdown-padding-y;
 | 
			
		||||
      z-index: light.$zindex-popover;
 | 
			
		||||
      background: light.$dropdown-bg;
 | 
			
		||||
      box-shadow: light.$card-box-shadow;
 | 
			
		||||
      border: light.$dropdown-border-width solid light.$dropdown-border-color;
 | 
			
		||||
 | 
			
		||||
      @include light.border-radius(light.$border-radius);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .ui-timepicker-list li {
 | 
			
		||||
      color: light.$dropdown-link-color;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background: light.$dropdown-link-hover-bg;
 | 
			
		||||
      }
 | 
			
		||||
      &:not(.ui-timepicker-selected) {
 | 
			
		||||
        .ui-timepicker-duration {
 | 
			
		||||
          color: light.$text-muted;
 | 
			
		||||
 | 
			
		||||
          .ui-timepicker-list:hover & {
 | 
			
		||||
            color: light.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .ui-timepicker-list li.ui-timepicker-disabled,
 | 
			
		||||
    .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
 | 
			
		||||
      background: light.$dropdown-bg !important;
 | 
			
		||||
      color: light.$dropdown-link-disabled-color !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    .ui-timepicker-wrapper {
 | 
			
		||||
      border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
 | 
			
		||||
      padding: dark.$dropdown-padding-y 0;
 | 
			
		||||
      z-index: dark.$zindex-popover;
 | 
			
		||||
      background: dark.$dropdown-bg;
 | 
			
		||||
      box-shadow: dark.$card-box-shadow;
 | 
			
		||||
 | 
			
		||||
      @include dark.border-radius(dark.$border-radius);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .ui-timepicker-list li {
 | 
			
		||||
      color: dark.$dropdown-link-color;
 | 
			
		||||
 | 
			
		||||
      &:hover {
 | 
			
		||||
        background: dark.$dropdown-link-hover-bg;
 | 
			
		||||
      }
 | 
			
		||||
      &:not(.ui-timepicker-selected) {
 | 
			
		||||
        .ui-timepicker-duration {
 | 
			
		||||
          color: dark.$text-muted;
 | 
			
		||||
 | 
			
		||||
          .ui-timepicker-list:hover & {
 | 
			
		||||
            color: dark.$text-muted;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .ui-timepicker-list li.ui-timepicker-disabled,
 | 
			
		||||
    .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
 | 
			
		||||
      color: dark.$dropdown-link-disabled-color !important;
 | 
			
		||||
      background: dark.$dropdown-bg !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								resources/assets/vendor/libs/jquery/jquery.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								resources/assets/vendor/libs/jquery/jquery.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
import jQuery from 'jquery/dist/jquery';
 | 
			
		||||
 | 
			
		||||
const $ = jQuery;
 | 
			
		||||
try {
 | 
			
		||||
  window.jQuery = window.$ = jQuery;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { jQuery, $ };
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/layers-2x.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/layers-2x.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/layers.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/layers.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 696 B  | 
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 2.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-icon.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-icon.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-shadow.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/assets/vendor/libs/leaflet/images/marker-shadow.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 618 B  | 
							
								
								
									
										19
									
								
								resources/assets/vendor/libs/leaflet/leaflet.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/assets/vendor/libs/leaflet/leaflet.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
import leaFlet from 'leaflet';
 | 
			
		||||
 | 
			
		||||
import markerIcon2x from 'leaflet/dist/images/marker-icon-2x.png';
 | 
			
		||||
import markerIcon from 'leaflet/dist/images/marker-icon.png';
 | 
			
		||||
import markerShadow from 'leaflet/dist/images/marker-shadow.png';
 | 
			
		||||
 | 
			
		||||
delete leaFlet.Icon.Default.prototype._getIconUrl;
 | 
			
		||||
 | 
			
		||||
leaFlet.Icon.Default.mergeOptions({
 | 
			
		||||
  iconRetinaUrl: markerIcon2x,
 | 
			
		||||
  iconUrl: markerIcon,
 | 
			
		||||
  shadowUrl: markerShadow
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.leaFlet = leaFlet;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { leaFlet };
 | 
			
		||||
							
								
								
									
										46
									
								
								resources/assets/vendor/libs/leaflet/leaflet.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								resources/assets/vendor/libs/leaflet/leaflet.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
@import '../../scss/_bootstrap-extended/include';
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'leaflet/dist/leaflet';
 | 
			
		||||
 | 
			
		||||
.leaflet-map {
 | 
			
		||||
  height: 400px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.leaflet-pane {
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RTL
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .leaflet-map {
 | 
			
		||||
    .leaflet-control-container {
 | 
			
		||||
      .leaflet-left {
 | 
			
		||||
        right: 0;
 | 
			
		||||
        left: unset;
 | 
			
		||||
        .leaflet-control-zoom,
 | 
			
		||||
        .leaflet-control-layers {
 | 
			
		||||
          margin-left: 0;
 | 
			
		||||
          margin-right: 10px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      .leaflet-right {
 | 
			
		||||
        left: 0;
 | 
			
		||||
        right: unset;
 | 
			
		||||
        .leaflet-control-zoom,
 | 
			
		||||
        .leaflet-control-layers {
 | 
			
		||||
          margin-left: 10px;
 | 
			
		||||
          margin-right: 0px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Map tooltip border radius
 | 
			
		||||
 | 
			
		||||
.leaflet-popup {
 | 
			
		||||
  .leaflet-popup-content-wrapper {
 | 
			
		||||
    border-radius: $border-radius;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/moment/moment.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/moment/moment.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import moment from 'moment/moment';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.moment = moment;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { moment };
 | 
			
		||||
							
								
								
									
										3
									
								
								resources/assets/vendor/libs/node-waves/node-waves.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								resources/assets/vendor/libs/node-waves/node-waves.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
import nodeWaves from 'node-waves/src/js/waves';
 | 
			
		||||
 | 
			
		||||
window.Waves = nodeWaves;
 | 
			
		||||
							
								
								
									
										4
									
								
								resources/assets/vendor/libs/node-waves/node-waves.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								resources/assets/vendor/libs/node-waves/node-waves.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
// Waves
 | 
			
		||||
// *******************************************************************************
 | 
			
		||||
 | 
			
		||||
@import 'node-waves/src/scss/waves';
 | 
			
		||||
							
								
								
									
										26
									
								
								resources/assets/vendor/libs/nouislider/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								resources/assets/vendor/libs/nouislider/_mixins.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
@mixin nouislider-variant($parent, $background) {
 | 
			
		||||
  #{$parent}.noUi-target {
 | 
			
		||||
    // If slider is not disabled
 | 
			
		||||
    &:not([disabled]) {
 | 
			
		||||
      background: rgba($background, 0.16);
 | 
			
		||||
      .noUi-connect {
 | 
			
		||||
        background: $background;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .noUi-handle {
 | 
			
		||||
        border-color: $background;
 | 
			
		||||
        &:hover {
 | 
			
		||||
          box-shadow: 0 0 0 8px rgba($background, 0.16);
 | 
			
		||||
        }
 | 
			
		||||
        &:active,
 | 
			
		||||
        &:focus {
 | 
			
		||||
          box-shadow: 0 0 0 13px rgba($background, 0.16);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin nouislider-theme($background) {
 | 
			
		||||
  @include nouislider-variant('', $background);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/nouislider/nouislider.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/nouislider/nouislider.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import noUiSlider from 'nouislider';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.noUiSlider = noUiSlider;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { noUiSlider };
 | 
			
		||||
							
								
								
									
										398
									
								
								resources/assets/vendor/libs/nouislider/nouislider.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										398
									
								
								resources/assets/vendor/libs/nouislider/nouislider.scss
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,398 @@
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include' as light;
 | 
			
		||||
@use '../../scss/_bootstrap-extended/include-dark' as dark;
 | 
			
		||||
@import 'nouislider/dist/nouislider';
 | 
			
		||||
@import '../../scss/_custom-variables/libs';
 | 
			
		||||
@import 'mixins';
 | 
			
		||||
 | 
			
		||||
$noUiSlider-handle-color: #fff !default;
 | 
			
		||||
$noUiSlider-handle-width: 1.375rem !default;
 | 
			
		||||
$noUiSlider-handle-height: 1.375rem !default;
 | 
			
		||||
$noUiSlider-bar-height: 0.375rem !default;
 | 
			
		||||
$noUiSlider-vertical-height: 13.125rem !default;
 | 
			
		||||
$noUiSlider-tick-size: 0.5rem !default;
 | 
			
		||||
$noUiSlider-tick-label-font-size: light.$font-size-sm !default;
 | 
			
		||||
 | 
			
		||||
.noUi-target {
 | 
			
		||||
  direction: ltr !important;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  border-width: 0;
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-target,
 | 
			
		||||
.noUi-target * {
 | 
			
		||||
  touch-action: none;
 | 
			
		||||
  user-select: none;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-connects {
 | 
			
		||||
  height: $noUiSlider-bar-height;
 | 
			
		||||
  border-radius: light.$border-radius-pill;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-base,
 | 
			
		||||
.noUi-connects {
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-horizontal .noUi-origin {
 | 
			
		||||
  height: 0;
 | 
			
		||||
 | 
			
		||||
  @include app-ltr {
 | 
			
		||||
    left: auto;
 | 
			
		||||
    right: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-vertical .noUi-origin {
 | 
			
		||||
  width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-handle {
 | 
			
		||||
  backface-visibility: hidden;
 | 
			
		||||
  outline: none !important;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
  border: none;
 | 
			
		||||
  transition: all 0.2s;
 | 
			
		||||
  border: 4px solid;
 | 
			
		||||
  background: #fff;
 | 
			
		||||
  &:before,
 | 
			
		||||
  &:after {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-touch-area {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-state-tap .noUi-connect,
 | 
			
		||||
.noUi-state-tap .noUi-origin {
 | 
			
		||||
  transition:
 | 
			
		||||
    top 0.3s,
 | 
			
		||||
    right 0.3s,
 | 
			
		||||
    bottom 0.3s,
 | 
			
		||||
    left 0.3s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-state-drag * {
 | 
			
		||||
  cursor: inherit !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Slider size and handle placement
 | 
			
		||||
 | 
			
		||||
.noUi-horizontal {
 | 
			
		||||
  height: $noUiSlider-bar-height;
 | 
			
		||||
  margin-bottom: 3rem;
 | 
			
		||||
  margin-top: 1.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-horizontal .noUi-handle {
 | 
			
		||||
  left: -($noUiSlider-handle-width * 0.5);
 | 
			
		||||
  width: $noUiSlider-handle-width;
 | 
			
		||||
  height: $noUiSlider-handle-height;
 | 
			
		||||
  top: ($noUiSlider-bar-height - $noUiSlider-handle-height) * 0.5;
 | 
			
		||||
 | 
			
		||||
  @include app-ltr {
 | 
			
		||||
    right: -($noUiSlider-handle-width * 0.5);
 | 
			
		||||
    left: auto;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-vertical {
 | 
			
		||||
  width: $noUiSlider-bar-height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-vertical .noUi-handle {
 | 
			
		||||
  bottom: -($noUiSlider-handle-height);
 | 
			
		||||
  width: $noUiSlider-handle-height;
 | 
			
		||||
  height: $noUiSlider-handle-width;
 | 
			
		||||
  right: ($noUiSlider-bar-height - $noUiSlider-handle-height) * 0.5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Styling
 | 
			
		||||
.noUi-target {
 | 
			
		||||
  border-radius: 10rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Handles and cursors
 | 
			
		||||
.noUi-draggable {
 | 
			
		||||
  cursor: ew-resize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-vertical .noUi-draggable {
 | 
			
		||||
  cursor: ns-resize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-handle {
 | 
			
		||||
  border-radius: 10rem;
 | 
			
		||||
  background: $noUiSlider-handle-color;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Disabled state
 | 
			
		||||
.noUi-target[disabled] {
 | 
			
		||||
  opacity: 0.45;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[disabled] .noUi-handle {
 | 
			
		||||
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[disabled].noUi-target,
 | 
			
		||||
[disabled].noUi-handle,
 | 
			
		||||
[disabled] .noUi-handle {
 | 
			
		||||
  cursor: not-allowed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Base
 | 
			
		||||
.noUi-pips,
 | 
			
		||||
.noUi-pips * {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-pips {
 | 
			
		||||
  color: #999;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Values
 | 
			
		||||
.noUi-value {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  font-size: $noUiSlider-tick-label-font-size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Markings
 | 
			
		||||
.noUi-marker {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Horizontal layout
 | 
			
		||||
.noUi-pips-horizontal {
 | 
			
		||||
  left: 0;
 | 
			
		||||
  top: 100%;
 | 
			
		||||
  padding: (($noUiSlider-handle-height - $noUiSlider-bar-height) * 0.5 + 0.375rem) 0 0 0;
 | 
			
		||||
  height: 5rem;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-value-horizontal {
 | 
			
		||||
  padding-top: 0.125rem;
 | 
			
		||||
  transform: translate(-50%, 50%);
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    transform: translate(50%, 50%);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-marker-horizontal.noUi-marker {
 | 
			
		||||
  height: $noUiSlider-tick-size;
 | 
			
		||||
  width: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .noUi-horizontal {
 | 
			
		||||
    .noUi-origin {
 | 
			
		||||
      left: 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Vertical layout
 | 
			
		||||
.noUi-pips-vertical {
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 100%;
 | 
			
		||||
  padding: 0 0 0 (($noUiSlider-handle-height - $noUiSlider-bar-height) * 0.5 + 0.375rem);
 | 
			
		||||
  height: 100%;
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    right: 100%;
 | 
			
		||||
    left: auto;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-value-vertical {
 | 
			
		||||
  padding-left: $noUiSlider-tick-size + 0.375rem;
 | 
			
		||||
  transform: translate(0, 50%);
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    right: 100%;
 | 
			
		||||
    padding-right: $noUiSlider-tick-size + 0.375rem;
 | 
			
		||||
    padding-left: 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@include app-rtl(false) {
 | 
			
		||||
  .noUi-marker-vertical {
 | 
			
		||||
    right: 100%;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-marker-vertical.noUi-marker {
 | 
			
		||||
  width: $noUiSlider-tick-size;
 | 
			
		||||
  height: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tooltips
 | 
			
		||||
.noUi-tooltip {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 0.25rem 0.5rem;
 | 
			
		||||
  border-radius: 0.25rem;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  line-height: 1;
 | 
			
		||||
  transition: transform 0.2s;
 | 
			
		||||
  &::after {
 | 
			
		||||
    content: '';
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    width: 0;
 | 
			
		||||
    height: 0;
 | 
			
		||||
    clear: both;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-horizontal .noUi-tooltip {
 | 
			
		||||
  bottom: 125%;
 | 
			
		||||
  left: 50%;
 | 
			
		||||
  transform: translate(-50%, -45%);
 | 
			
		||||
  &::after {
 | 
			
		||||
    content: '';
 | 
			
		||||
    left: 50%;
 | 
			
		||||
    transform: translateX(-50%);
 | 
			
		||||
    top: 1.25rem;
 | 
			
		||||
    border-left: 8px solid transparent;
 | 
			
		||||
    border-right: 8px solid transparent;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noUi-vertical .noUi-tooltip {
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  right: 125%;
 | 
			
		||||
  transform: translate(-15%, -52%);
 | 
			
		||||
 | 
			
		||||
  &::after {
 | 
			
		||||
    content: '';
 | 
			
		||||
    top: 14%;
 | 
			
		||||
    right: -5px;
 | 
			
		||||
    border-top: 8px solid transparent;
 | 
			
		||||
    border-bottom: 8px solid transparent;
 | 
			
		||||
    @include app-rtl {
 | 
			
		||||
      left: -14px;
 | 
			
		||||
      right: auto;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @include app-rtl {
 | 
			
		||||
    right: auto;
 | 
			
		||||
    left: 125%;
 | 
			
		||||
    transform: translate(15%, -52%);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light style
 | 
			
		||||
@if $enable-light-style {
 | 
			
		||||
  .light-style {
 | 
			
		||||
    $noUiSlider-default-bg: light.$gray-400;
 | 
			
		||||
    $noUiSlider-tick-label-color: light.$text-light;
 | 
			
		||||
    .noUi-target {
 | 
			
		||||
      .noUi-handle {
 | 
			
		||||
        box-shadow: light.$form-range-thumb-box-shadow;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .noUi-value {
 | 
			
		||||
      color: $noUiSlider-tick-label-color;
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-marker {
 | 
			
		||||
      background: $noUiSlider-tick-label-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .noUi-tooltip {
 | 
			
		||||
      font-size: light.$small-font-size;
 | 
			
		||||
      color: light.$tooltip-color;
 | 
			
		||||
      border: none;
 | 
			
		||||
      background: light.$tooltip-bg;
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-horizontal .noUi-tooltip {
 | 
			
		||||
      &::after {
 | 
			
		||||
        border-top: 8px solid light.$tooltip-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-vertical .noUi-tooltip {
 | 
			
		||||
      &::after {
 | 
			
		||||
        border-left: 8px solid light.$tooltip-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    @include app-rtl-style {
 | 
			
		||||
      .noUi-vertical .noUi-tooltip {
 | 
			
		||||
        &::after {
 | 
			
		||||
          border-right: 8px solid light.$tooltip-bg;
 | 
			
		||||
          border-left: 8px solid transparent;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @each $color, $value in light.$theme-colors {
 | 
			
		||||
      @if $color !=primary {
 | 
			
		||||
        @include nouislider-variant('.noUi-#{$color}', $value);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@if $enable-dark-style {
 | 
			
		||||
  .dark-style {
 | 
			
		||||
    $noUiSlider-default-bg: dark.$gray-400;
 | 
			
		||||
    $noUiSlider-tick-label-color: dark.$text-light;
 | 
			
		||||
    .noUi-target {
 | 
			
		||||
      .noUi-handle {
 | 
			
		||||
        box-shadow: dark.$form-range-thumb-box-shadow;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .noUi-value {
 | 
			
		||||
      color: $noUiSlider-tick-label-color;
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-marker {
 | 
			
		||||
      background: $noUiSlider-tick-label-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .noUi-tooltip {
 | 
			
		||||
      font-size: dark.$small-font-size;
 | 
			
		||||
      color: dark.$tooltip-color;
 | 
			
		||||
      border: none;
 | 
			
		||||
      background: dark.$tooltip-bg;
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-horizontal .noUi-tooltip {
 | 
			
		||||
      &::after {
 | 
			
		||||
        border-top: 8px solid dark.$tooltip-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    .noUi-vertical .noUi-tooltip {
 | 
			
		||||
      &::after {
 | 
			
		||||
        border-left: 8px solid dark.$tooltip-bg;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    @include app-rtl-style {
 | 
			
		||||
      .noUi-vertical .noUi-tooltip {
 | 
			
		||||
        &::after {
 | 
			
		||||
          border-right: 8px solid dark.$tooltip-bg;
 | 
			
		||||
          border-left: 8px solid transparent;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    @each $color, $value in dark.$theme-colors {
 | 
			
		||||
      @if $color !=primary {
 | 
			
		||||
        @include nouislider-variant('.noUi-#{$color}', $value);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import PerfectScrollbar from 'perfect-scrollbar/dist/perfect-scrollbar';
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  window.PerfectScrollbar = PerfectScrollbar;
 | 
			
		||||
} catch (e) {}
 | 
			
		||||
 | 
			
		||||
export { PerfectScrollbar };
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user