'uncaught typeerror $(...).sortable is not a function laravel

I am Using jQuery UI sortable to make a playlist sortable and save the new position in database i have done the same code in php and jquery and it is working but when i am implementing the same code in laravel it is not working. I've followed the directions in the jQuery UI documentation but still I'm getting the error that .sortable is not a function. Here the layout code:

    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <title>Billboard.v.02</title>
        <!-- plugins:css -->
        <link rel="stylesheet" href="{{ asset('simple-line-icons/css/simple-line-icons.css') }}">
        <link rel="stylesheet" href="{{ asset('flag-icon-css/css/flag-icon.min.css') }}">
        <link rel="stylesheet" href="{{ asset('css/vendor.bundle.base.css') }}">
        <!-- endinject -->
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        <!-- <link rel="stylesheet" href="//code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css"> -->
        <!-- Plugin css for this page -->
        <link rel="stylesheet" href="{{ asset('select2/select2.min.css') }}">
        <link rel="stylesheet" href="{{ asset('select2-bootstrap-theme/select2-bootstrap.min.css') }}">
        <!-- End plugin css for this page -->
        <!-- inject:css -->
        <!-- endinject -->
        <!-- Layout styles -->
        <link rel="stylesheet" href="{{ asset('css/style.css') }}" />
        <link rel="shortcut icon" href="{{ asset('images/favicon.png') }}" />
        @yield('css')
    </head>

    <body>
        <div class="container-scroller">
            <!-- partial:../../partials/_navbar.html -->
            <nav class="navbar default-layout-navbar col-lg-12 col-12 p-0 fixed-top d-flex flex-row">
                <div class="navbar-brand-wrapper d-flex align-items-center">
                    <a class="navbar-brand brand-logo" href="{{ route('dashboard') }}">
                        <img src="{{ asset('images/logo.svg') }}" alt="logo" class="logo-dark" />
                    </a>
                    <a class="navbar-brand brand-logo-mini" href="#"><img src="{{ asset('images/logo-mini.svg') }}" alt="logo" /></a>
                </div>
                <div class="navbar-menu-wrapper d-flex align-items-center flex-grow-1">
                    <h5 class="mb-0 font-weight-medium d-none d-lg-flex">Welcome to xx dashboard!</h5>
                    <ul class="navbar-nav navbar-nav-right ml-auto">
                        <div class="ml-3 relative">
                    </div>
                        <li class="nav-item dropdown d-none d-xl-inline-flex user-dropdown">
                            <a class="nav-link dropdown-toggle" id="UserDropdown" href="#" data-toggle="dropdown" aria-expanded="false">
                            @if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
                                <img class="img-xs rounded-circle ml-2" src="{{ Auth::user()->profile_photo_url }}"> <span class="font-weight-normal">{{ Auth::user()->name }}</span>
                                @else
                                    <span class="inline-flex rounded-md">
                                        <button type="button" class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition">
                                            {{ Auth::user()->name }}

                                            <svg class="ml-2 -mr-0.5 h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
                                                <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
                                            </svg>
                                        </button>
                                    </span>
                                @endif
                            </a>
                            <div class="dropdown-menu dropdown-menu-right navbar-dropdown" aria-labelledby="UserDropdown">
                                <div class="dropdown-header text-center">
                                    @if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
                                    <img class="img-md rounded-circle" src="{{ Auth::user()->profile_photo_url }}" alt="Profile image">
                                    @endif
                                    <p class="mb-1 mt-3">{{ Auth::user()->name }}</p>
                                    <p class="font-weight-light text-muted mb-0">{{ Auth::user()->email }}</p>
                                </div>
                                <a class="dropdown-item" href="{{ route('profile.show') }}"><i class="dropdown-item-icon icon-user text-primary"></i> My Profile</a>
                                <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"><i class="dropdown-item-icon icon-power text-primary"></i>Sign Out</a>
                                <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                                    @csrf
                                </form>
                            </div>
                        </li>
                    </ul>
                    <button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button" data-toggle="offcanvas">
                        <span class="icon-menu"></span>
                    </button>
                </div>
            </nav>

            <div class="container-fluid page-body-wrapper">
                <nav class="sidebar sidebar-offcanvas" id="sidebar">
                    <ul class="nav">
                        <li class="nav-item nav-category">
                            <span class="nav-link">Dashboard</span>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('dashboard') }}">
                                <span class="menu-title">Dashboard</span>
                                <i class="icon-screen-desktop menu-icon"></i>
                            </a>
                        </li>
                        <li class="nav-item nav-category">
                            <span class="nav-link">Display</span>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('add.display') }}">
                                <span class="menu-title">Add Display</span>
                                <i class="icon-screen-desktop menu-icon"></i>
                            </a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('view.display') }}">
                                <span class="menu-title">All Display</span>
                                <i class="icon-screen-desktop menu-icon"></i>
                            </a>
                        </li>
                        <li class="nav-item nav-category"><span class="nav-link">Content</span></li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('view.media') }}">
                                <span class="menu-title">Media & Content</span>
                                <i class="icon-grid menu-icon"></i>
                            </a>
                        </li>
                        <li class="nav-item nav-category"><span class="nav-link">Playlist</span></li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('add.playlist') }}">
                                <span class="menu-title">Add Playlist</span>
                                <i class="icon-chart menu-icon"></i>
                            </a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('view.playlist') }}">
                                <span class="menu-title">All Playlist</span>
                                <i class="icon-chart menu-icon"></i>
                            </a>
                        </li>
                    </ul>
                </nav>

                <div class="main-panel">
                    @yield('content')
                    <footer class="footer">
                        <div class="d-sm-flex justify-content-center justify-content-sm-between">
                            <span class="text-muted d-block text-center text-sm-left d-sm-inline-block">Copyright © manikgoswami.com 2022</span>
                        </div>
                    </footer>
                </div>
            </div>
        </div>
        @yield('script')
        <!-- container-scroller -->
        <!-- plugins:js -->
        <script src="{{ asset('js/vendor.bundle.base.js') }}"></script>
        <!-- endinject -->
        <!-- Plugin js for this page -->
        <script src="{{ asset('select2/select2.min.js') }}"></script>
        <script src="{{ asset('typeahead.js/typeahead.bundle.min.js') }}"></script>
        <!-- End plugin js for this page -->
        <!-- inject:js -->
        <script src="{{ asset('js/off-canvas.js') }}"></script>
        <script src="{{ asset('js/misc.js') }}"></script>
        <!-- endinject -->
        <!-- Custom js for this page -->
        <script src="{{ asset('js/typeahead.js') }}"></script>
        <script src="{{ asset('js/select2.js') }}"></script>
        <!-- End custom js for this page -->
    </body>

    </html>

Here is my code:

                                            @section('css')
    <style>
        .contenthide{
            display: none;
        }
        .contentbody{
            height: 400px;
            padding: 10px;
            background: #ECF0F4;
            margin-top: 10px;
            overflow-y: scroll;
        }
        .contentbodyform1{
            height: 400px;
            padding: 10px;
            background: #ECF0F4;
            margin-top: 10px;
            overflow-y: scroll;
        }
        .contentbodyform2{
            height: 10px;
            padding: 10px;
            background: #fff;
            margin-top: 10px;
        }
        .actionbody{
            margin-top: 10px;
            padding-top: 15px;
            padding-left: 400px;
            padding-bottom: 64px;
        }
        .contentcard{
            width: 100px;
            height: 100px;
            margin: 5px;
            padding: 5px;
        }
        .imgcard{
            position: relative;
        }
        .imgcheck:checked{
            /* border: 1px solid blue; */
            z-index: 99;
        }
        /* .imgcheck:checked .imgcheck:parent{
            border: 1px solid #0D6EFD;
        } */
        .imgcard:hover .imgcheck{
            z-index: 99;
        }
        .imgcheck{
            position: absolute;
            top: 2px;
            left: 2px;
            z-index: -1;
            margin: 0 !important;
        }
        .plsc{
        background: #CCE5FF;
        height: 90px;
        }
        .plcolclass{
        padding-top: 32px;
        }
        .plcolinclass{
        padding-top: 26px;
        }    
    </style>
    <style>
        .op{
        border: 1px solid #bdc4cc;
            font-family: "Open Sans", sans-serif;
            font-size: 0.8125rem;
            width: 64px;
        }
        input[type="file"] {
        display: block;
        }
        .imageThumb {
        max-height: 75px;
        border: 2px solid;
        padding: 1px;
        cursor: pointer;
        }
        .pip {
        display: inline-block;
        margin: 10px 10px 0 0;
        }
    </style>
    @endsection

    @extends('layouts.master')
    @section('content')
    <div class="content-wrapper">
        <div class="page-header">
            <h3 class="page-title"> Add {{$playlist->name}} Content </h3>
            <nav aria-label="breadcrumb">
                <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="{{ route('dashboard') }}">Dashboard</a></li>
                <li class="breadcrumb-item"><a href="{{ route('view.playlist') }}">All Playlist</a></li>
                <li class="breadcrumb-item active" aria-current="page"> Create {{$playlist->name}} Content </li>
                </ol>
            </nav>
        </div>
        <div class="row">
            <div class="col-md-12 grid-margin stretch-card">
                <div class="card">
                    <div class="card-body">
                        @if (session('msgsuccess'))
                        @if(session('msgsuccess')!=NULL)
                        <div class="alert alert-success alert-dismissible fade show" role="alert">
                            {{ session('msgsuccess') }}
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                                <span aria-hidden="true">&times;</span>
                            </button>
                        </div>
                        @endif
                        @endif
                        @if (session('msgfail'))
                        @if(session('msgfail')!=NULL)
                        @foreach(session('msgfail') as $msg)
                        <!-- arrayIsEmpty -->
                        <div class="alert alert-danger alert-dismissible fade show" role="alert">
                            {{ $msg }}
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                                <span aria-hidden="true">&times;</span>
                            </button>
                        </div>
                        @endforeach
                        @endif
                        @endif
                        <div class="row">
                            <div class="col-6">
                                <ul class="nav nav-tabs">
                                    <li class="active"><a id="imagetab" href="#imagediv" data-href="" class="card-title">Image</a></li>
                                    <li><a id="Videotab" href="#videodiv" data-href="" class="card-title">Video</a></li>
                                    <!-- <li><a id="webtab" href="#webdiv" data-href="" class="card-title">Web</a></li> -->
                                </ul>
                                <div class="row">
                                    <div class="col">
                                        <div id="imagediv" class="row">
                                        <div id="imagedivbody" class="contentbody d-flex flex-wrap">

                                        </div>
                                        </div>
                                        <div id="videodiv" class="contenthide">
                                            <div id="videodivbody" class="contentbody d-flex flex-wrap">

                                            </div>
                                        </div>
                                        <!-- <div id="webdiv" class="contenthide">
                                        <div class="contentbody">
                                            web
                                        </div>
                                        </div> -->
                                    </div>
                                </div>
                            </div>
                            <div class="col-6">
                                <h4>{{$playlist->name}}</h4>
                                <div>
                                    <input type="text" value="{{$playlist->name}}">
                                    <input name="currentplaylistid" id="currentplaylistid" type="text" value="{{$playlist->id}}" hidden>
                                </div>
                                <form id="playlistcontentform" action="{{ route('test.images') }}" method="POST">
                                @csrf
                                <table id="playlistcontent" class="table table-stripped table-hovered">
                                    <thead>
                                        <th>Playlist Content</th>
                                    </thead>
                                    <tbody>
                                        
                                    </tbody>
                                </table>
                                <!-- <div id="playlistcontentdiv" class="contentbodyform1 d-flex flex-wrap">
                                    
                                </div> -->
                                <div class="contentbodyform2">
                                    <button id="" type="submit" class="btn btn-danger mr-2">add</button>
                                </div>
                                </form>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection

Here is my js

    @section('script')
    <script src="http://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
    <script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('table tbody').sortable({
                update: function (event, ui) {
                    $(this).children().each(function (index) {
                        if ($(this).attr('data-position') != (index+1)) {
                            $(this).attr('data-position', (index+1)).addClass('updated');
                        }
                    });

                    saveNewPositions();
                }
            });
        });

        function saveNewPositions() {
            var positions = [];
            $('.updated').each(function () {
                positions.push([$(this).attr('data-index'), $(this).attr('data-position')]);
                $(this).removeClass('updated');
            });

            $.ajax({
                url: 'index.php',
                method: 'POST',
                dataType: 'text',
                data: {
                    update: 1,
                    positions: positions
                }, success: function (response) {
                    console.log(response);
                }
            });
        }
    </script>
    <script>
        function imagecontent()
        {
            var div = $('#imagedivbody');
            div.empty();

            var id= {{$playlist->id}};

            var imgui = "{{ route('get.images'), ':id'}}";
            imgui = imgui.replace(':id', id);
            $.getJSON(imgui, function(data){
                $.each( data, function( key, value ) {
                    div.append(`
                    <div class="contentcard">
                        <div class="imgcard">
                            <img class="w-100 h-100 imgtagvalue" src="{{ asset('`+value.path+`/`+value.code+`') }}" alt="" data-id="`+value.id+`">
                        </div>
                    </div>
                    `);
                });
            });
        }

        function videocontent()
        {
            var div = $('#videodivbody');
            div.empty();

            var id= {{$playlist->id}};
            if(id==null)
            {
                var vdui = "{{ route('get.videos') }}"
            }
            else
            {
                var vdui = "{{ route('get.videos'), ':id'}}"
                vdui = vdui.replace(':id', id);
            }
            
            $.getJSON(vdui, function(data){
                $.each( data, function( key, value ) {
                    div.append(`
                    <div class="contentcard">
                        <div class="imgcard videotagvalue" data-id="`+value.id+`">
                            <video width="100" height="100" controls>
                                <source src="{{ asset('`+value.path+`/`+value.code+`') }}" type="video/mp4">
                                Your browser does not support the video tag.
                            </video>
                        </div>
                    </div>
                    `);
                });
            });
        }

        function ajaxfun(formdata)
        {
            var ref = $('#playlistcontentdiv');
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $.ajax({
                type: "POST",
                url: "{{ route('add.playlist_content') }}",
                data: formdata,
                contentType: false,
                processData: false,
                success: function(result) {
                    ref.empty();
                    playlistcontent({{$playlist->id}});
                }
            });
        }

        function playlistcontent(id)
        {
            var ref = $('table tbody');
            ref.empty();
            var yui = "{{ route('view.playlist_content', ':id') }}";
            yui = yui.replace(':id', id);

            $.getJSON(yui, function(data) {
                $.each(data, function(key, val){
                    if(val.type=='image')
                    {
                        ref.append(`
                        <tr><td data-index="`+val.id+`" data-position="`+val.slno+`">
                        `+val.name+`
                        </td></tr>
                        `);
                    }
                    else if(val.type=='video')
                    {
                        ref.append(`
                        <tr><td data-index="`+val.id+`" data-position="`+val.slno+`">
                        `+val.name+`
                        </td></tr>
                        `);
                    }
                });
            });
        }

        playlistcontent({{$playlist->id}});

        imagecontent();

        var imagediv= $('#imagediv');
        var videodiv= $('#videodiv');
        var webdiv= $('#webdiv');

        $(document).on('click', '#imagetab', function(e){
            e.preventDefault();
            
            if(!(videodiv.hasClass('contenthide')))
            {
                videodiv.addClass('contenthide');
            }
            if(!(webdiv.hasClass('contenthide')))
            {
                webdiv.addClass('contenthide');
            }
            if((imagediv.hasClass('contenthide')))
            {
                imagediv.removeClass('contenthide');
            }

        });

        $(document).on('click','.imgtagvalue', function(e){
            console.log($(this).attr('data-id'));
            var playlist_id = $('#currentplaylistid').val();
            var cid = $(this).attr('data-id');
            var parent = $(this).parent();
            var gparent = parent.parent();
            gparent.attr('hidden',true);

            formdata = new FormData();
            formdata.append("playlist_id", playlist_id);
            formdata.append("content_id", cid);
            formdata.append("content_duration", '10');
            formdata.append("content_type", 'image');

            ajaxfun(formdata);
        });

        $(document).on('click', '#deleteimagebtn', function(e){
            e.preventDefault();
            var items = [];
            $("input[name='hulk[]']:checked").each(function(){items.push($(this).val());});
            console.log(items);
        });

        $(document).on('click','.videotagvalue', function(e){
            console.log($(this).attr('data-id'));
            var playlist_id = $('#currentplaylistid').val();
            var cid = $(this).attr('data-id');
            var src = $(this).children();
            var pathsrc = src.children();
            var parent = $(this).parent();
            parent.attr('hidden',true);
            var ref = $('#playlistcontentdiv');

            formdata = new FormData();
            formdata.append("playlist_id", playlist_id);
            formdata.append("content_id", cid);
            formdata.append("content_duration", '10');
            formdata.append("content_type", 'video');

            ajaxfun(formdata);
        });

        // $(document).on('click', '#addimagebtn', function(e){
        //   e.preventDefault();
        //   console.log($('input[name=contentduration]').val());
        // });

        $(document).on('click', '#Videotab', function(e){
            e.preventDefault();

            if(!(webdiv.hasClass('contenthide')))
            {
                webdiv.addClass('contenthide');
            }
            if(!(imagediv.hasClass('contenthide')))
            {
                imagediv.addClass('contenthide');
            }
            if((videodiv.hasClass('contenthide')))
            {
                videodiv.removeClass('contenthide');
            }

            videocontent();
        });

        $(document).on('click', '.delete_content', function(e){
            e.preventDefault();
            var ref = $('#playlistcontentdiv');
            var manik = $(this).attr('data-href');
            var id = $(this).attr('data-id');
            manik = manik.replace(':id', id);
            console.log(id);

            $.getJSON(manik, function(data) {
                console.log(data)
                ref.empty();
                playlistcontent({{$playlist->id}});
            });
        });

    </script>
    @endsection

can any one tell me what i am doing wrong?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source