src/resources/views/squads/show.blade.php

Summary

Maintainability
B
6 hrs
Test Coverage
@extends('web::layouts.grids.12')

@section('title', trans_choice('web::squads.squad', 0))
@section('page_header', trans_choice('web::squads.squad', 1))
@section('page_description', $squad->name)

@section('full')
  <div class="row">
    <div class="col-12">
      <div class="card">
        <div class="card-body">
          <h3>
            Summary
            @can('squads.edit', $squad)
              <div class="btn-group float-right" role="group">
                <a href="{{ route('squads.edit', $squad) }}" class="btn btn-sm btn-warning">
                  <i class="fas fa-edit"></i>
                  Edit
                </a>
                @can('squads.create')
                  <button type="submit" class="btn btn-sm btn-danger" form="delete-squad">
                    <i class="fas fa-trash-alt"></i>
                    Delete
                  </button>
                @endcan
              </div>
            @endcan
          </h3>

          <hr/>

          <div class="media mb-3">
            <img src="{{ $squad->logo }}" width="128" height="128" class="align-self-center mr-3" />
            <div class="media-body">
              <p>{!! $squad->description !!}</p>
            </div>
          </div>

          <h3>Metadata</h3>

          <hr/>

          <ul class="list-group list-group-horizontal flex-fill text-center">
            <li class="list-group-item flex-fill border-0">
              <i class="fas @if($squad->is_moderated) fa-check text-success @else fa-times text-danger @endif"></i> Moderated
            </li>
            <li class="list-group-item flex-fill border-0">
              <i class="fas @if($squad->is_moderator) fa-check text-success @else fa-times text-danger @endif"></i> Moderator
            </li>
            <li class="list-group-item flex-fill border-0">
              <i class="fas @if($squad->is_member) fa-check text-success @else fa-times text-danger @endif"></i> Member
            </li>
            <li class="list-group-item flex-fill border-0">
              <i class="fas @if($squad->is_candidate) fa-check text-success @else fa-times text-danger @endif"></i> Candidate
            </li>
          </ul>

          <ul class="list-group list-group-horizontal flex-fill text-center">
            <li class="list-group-item flex-fill border-0">
              Type
              @switch($squad->type)
                @case('hidden')
                  <span class="badge badge-dark">{{ ucfirst($squad->type) }}</span>
                  @break
                @case('auto')
                  <span class="badge badge-info">{{ ucfirst($squad->type) }}</span>
                  @break
                @default
                  <span class="badge badge-success">{{ ucfirst($squad->type) }}</span>
              @endswitch
            </li>
            <li class="list-group-item flex-fill border-0">
              @can('squads.show_members', $squad)
                Members <span class="badge badge-pill badge-light">{{ $squad->members_count }}</span>
              @endcan
            </li>
            <li class="list-group-item flex-fill border-0">
              Moderators <span class="badge badge-pill badge-warning">{{ $squad->moderators_count }}</span>
            </li>
            <li class="list-group-item flex-fill border-0">
            @can('squads.manage_candidates', $squad)
              @if($squad->type == 'manual')
                Candidates <span class="badge badge-pill badge-primary">{{ $squad->applications_count }}</span>
              @endif
            @endcan
            </li>
          </ul>

          <h3>Moderators</h3>

          <hr/>

          @foreach($squad->moderators->chunk(6) as $row)
            <div class="row mt-3">
              @foreach($row as $moderator)
                <div class="col-2">
                  @include('web::partials.character', ['character' => $moderator->main_character])
                  @can('squads.manage_moderators', $squad)
                    <form method="post" action="{{ route('squads.moderators.destroy', ['squad' => $squad, 'user' => $moderator]) }}" class="float-right">
                      {!! csrf_field() !!}
                      {!! method_field('DELETE') !!}
                      <button type="submit" class="btn btn-sm btn-danger">
                        <i class="fas fa-trash-alt"></i>
                        Remove
                      </button>
                    </form>
                  @endcan
                </div>
              @endforeach
            </div>
          @endforeach

          @can('squads.manage_moderators', $squad)
            <form method="post" action="{{ route('squads.moderators.store', $squad) }}" class="mt-3">
              {!! csrf_field() !!}
              <div class="row justify-content-end">
                <div class="col-4">
                  <div class="input-group input-group-sm">
                    <label for="squad-moderator" class="sr-only">User</label>
                    <select name="user_id" class="form-control input-sm" id="squad-moderator" style="width: 89%;"></select>
                    <span class="input-group-append">
                      <button class="btn btn-sm btn-success" type="submit">
                        <i class="fas fa-plus"></i> Add
                      </button>
                    </span>
                  </div>
                </div>
              </div>
            </form>
            <form method="post" action="{{ route('squads.destroy', $squad) }}" id="delete-squad">
              {!! csrf_field() !!}
              {!! method_field('DELETE') !!}
            </form>
          @endcan
        </div>
        @if($squad->type != 'auto' && auth()->user()->name !== 'admin')
          <div class="card-footer">
            @if($squad->is_member)
              <form method="post" action="{{ route('squads.members.leave', $squad) }}" id="form-leave">
                {!! csrf_field() !!}
                {!! method_field('DELETE') !!}
              </form>
              <button type="submit" class="btn btn-sm btn-danger float-right" form="form-leave">
                <i class="fas fa-sign-out-alt"></i> {{ trans('web::squads.leave') }}
              </button>
            @else
              @if($squad->is_candidate)
                <form method="post" action="{{ route('squads.applications.cancel', $squad) }}" id="form-cancel">
                  {!! csrf_field() !!}
                  {!! method_field('DELETE') !!}
                </form>
                <div class="text-right">
                  You have applied to this squad
                  @include('web::partials.date', ['datetime' => $squad->applications->where('user_id', auth()->user()->id)->first()->created_at])

                  <button type="submit" class="btn btn-sm btn-danger" form="form-cancel">
                    <i class="fas fa-times-circle"></i> {{ trans('web::squads.cancel') }}
                  </button>
                </div>
              @endif
              @if(! $squad->is_candidate && $squad->type == 'manual' && $squad->isEligible(auth()->user()))
                @if($squad->moderators->isEmpty())
                  <form method="post" action="{{ route('squads.applications.store', $squad) }}">
                    {!! csrf_field() !!}
                    <button type="submit" class="btn btn-sm btn-success float-right">
                      <i class="fas fa-sign-in-alt"></i> {{ trans('web::squads.join') }}
                    </button>
                  </form>
                @else
                  <button data-toggle="modal" data-target="#application-create" class="btn btn-sm btn-success float-right">
                    <i class="fas fa-sign-in-alt"></i> {{ trans('web::squads.join') }}
                  </button>
                @endif
              @endif
            @endif
          </div>
        @endif
      </div>
    </div>
  </div>

  @can('squads.manage_roles', $squad)
    <div class="row">
      <div class="col-12">
        <div class="card">
          <div class="card-header">
            <h3 class="card-title">Roles</h3>
          </div>
          <div class="card-body">
            <table class="table table-striped table-hover" id="roles-table">
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Description</th>
                  <th>Permissions</th>
                  <th>Action</th>
                </tr>
              </thead>
            </table>
          </div>
          <div class="card-footer">
            <form method="post" action="{{ route('squads.roles.store', $squad) }}" data-table="rolesTableBuilder" id="squad-role-form">
              {!! csrf_field() !!}
              <div class="row justify-content-end">
                <div class="col-4">
                  <div class="input-group input-group-sm">
                    <label for="squad-role" class="sr-only">Role</label>
                    <select name="role_id" class="form-control input-sm" id="squad-role" style="width: 88%;"></select>
                    <span class="input-group-append">
                      <button class="btn btn-sm btn-success" type="submit">
                        <i class="fas fa-plus"></i> Add
                      </button>
                    </span>
                  </div>
                </div>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
  @endcan

  @can('squads.show_members', $squad)
  <div class="row">
    <div class="col-12">
      <div class="card">
        <div class="card-header">
          <h3 class="card-title">Members</h3>
        </div>
        <div class="card-body">
          @can('squads.show_members', $squad)
            <table class="table table-striped table-hover" id="members-table">
              <thead>
                <tr>
                  <th>{{ trans_choice('web::squads.name', 1) }}</th>
                  <th>{{ trans_choice('web::squads.character', 0) }}</th>
                  <th>{{ trans('web::squads.member_since') }}</th>
                  <th>Action</th>
                </tr>
              </thead>
            </table>
          @endcan
          @cannot('squads.show_members', $squad)
            <p class="text-center">You are not member of that squad.</p>
          @endcannot
        </div>
        @can('squads.manage_members', $squad)
          <div class="card-footer">
            <form method="post" action="{{ route('squads.members.store', $squad) }}" data-table="dataTableBuilder" id="squad-member-form">
              {!! csrf_field() !!}
              <div class="row justify-content-end">
                <div class="col-4">
                  <div class="input-group input-group-sm">
                    <label for="squad-member" class="sr-only">User</label>
                    <select name="user_id" class="form-control input-sm" id="squad-member" style="width: 88%;"></select>
                    <span class="input-group-append">
                      <button class="btn btn-sm btn-success" type="submit">
                        <i class="fas fa-plus"></i> Add
                      </button>
                    </span>
                  </div>
                </div>
              </div>
            </form>
          </div>
        @endcan
      </div>
    </div>
  </div>
  @endcan

  @can('squads.manage_candidates', $squad)
    @if($squad->type == 'manual' && $squad->moderators->isNotEmpty())
      <div class="row">
        <div class="col-12">
          <div class="card">
            <div class="card-header">
              <h3 class="card-title">Candidates</h3>
            </div>
            <div class="card-body">
              <table class="table table-striped table-hover" id="candidates-table">
                <thead>
                  <tr>
                    <th>{{ trans_choice('web::squads.name', 1) }}</th>
                    <th>{{ trans_choice('web::squads.character', 0) }}</th>
                    <th>{{ trans('web::squads.applied_at') }}</th>
                    <th>Action</th>
                  </tr>
                </thead>
              </table>
            </div>
          </div>
        </div>
      </div>
    @endif
  @endcan

  @include('web::squads.modals.applications.create.application')
  @include('web::squads.modals.applications.read.application')

@endsection

@push('javascript')

  @include('web::includes.javascript.id-to-name')

  <script>
    window.LaravelDataTables = window.LaravelDataTables || {};

    ids_to_names();

    $('#squad-moderator')
        .select2({
            placeholder: 'Select a moderator to add to this Squad',
            ajax: {
                url: '{{ route('squads.moderators.lookup', $squad) }}',
                dataType: 'json',
                cache: true,
                processResults: function (data, params) {
                    return {
                        results: data.results
                    };
                }
            }
        });

    $('#squad-role')
      .select2({
          placeholder: 'Select a role to add to this Squad',
          ajax: {
              url: '{{ route('squads.roles.lookup', $squad) }}',
              dataType: 'json',
              cache: true,
              processResults: function (data, params) {
                  return {
                      results: data.results
                  };
              }
          }
      });

    $('#squad-member')
        .select2({
            placeholder: 'Select an user to add to this Squad',
            ajax: {
                url: '{{ route('squads.members.lookup', $squad) }}',
                dataType: 'json',
                cache: true,
                processResults: function (data, params) {
                    return {
                        results: data.results
                    };
                }
            }
        });

    $('#squad-member-form, #squad-role-form')
        .on('submit', function (e) {
            e.preventDefault();

            if (! $(this).find('select').val())
                return;

            var button = $(this).find('.btn-success');

            button.attr('disabled', true);
            button.find('i').remove();
            button.prepend('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true">');

            $(this).find('.btn-success i').addClass('spinner-border');

            $.ajax({
                data: $(this).serialize(),
                url: $(this).attr('action'),
                method: $(this).attr('method'),
            }).done(function () {
                $(this).find('select').empty().trigger('change');

                button.find('.spinner-border').remove();
                button.prepend('<i class="fas fa-plus">');
                button.removeAttr('disabled');

                switch (e.currentTarget.id) {
                    case 'squad-member-form':
                        window.LaravelDataTables.membersTableBuilder.ajax.reload();
                        break;
                    case 'squad-role-form':
                        window.LaravelDataTables.rolesTableBuilder.ajax.reload();
                        break;
                }
            });

            return false;
        });

    if (! $.fn.dataTable.isDataTable('#members-table')) {
        window.LaravelDataTables["membersTableBuilder"] = $('#members-table').DataTable({
            dom: 'Bfrtip',
            processing: true,
            serverSide: true,
            order: [[0, 'desc']],
            ajax: {
                url: '{{ route('squads.members.index', $squad) }}',
                type: 'POST',
                headers: {
                    'X-HTTP-Method-Override': 'GET'
                }
            },
            columns: [
                {data: "name", name: "name", title: "Name", "orderable": true, "searchable": true},
                {data: "characters", name: "characters", title: "Characters", "orderable": true, "searchable": true},
                {data: "member_since", name: "member_since", title: "Member Since", "orderable": false, "searchable": false},
                {defaultContent: "", data: "action", name: "action", title: "Action", "orderable": false, "searchable": false}
            ],
            "drawCallback": function() {
                $("[data-toggle=tooltip]").tooltip();
            }
        });
    }

    if (! $.fn.dataTable.isDataTable('#candidates-table')) {
        window.LaravelDataTables["candidatesTableBuilder"] = $('#candidates-table').DataTable({
            dom: 'Bfrtip',
            processing: true,
            serverSide: true,
            order: [[0, 'desc']],
            ajax: {
                url: '{{ route('squads.applications.index', $squad) }}',
                type: 'POST',
                headers: {
                    'X-HTTP-Method-Override': 'GET'
                }
            },
            columns: [
                {data: 'user.name', name: 'user.name'},
                {data: 'characters', name: 'characters'},
                {data: 'created_at', name: 'created_at'},
                {defaultContent: "", data: "action", name: "action", title: "Action", "orderable": false, "searchable": false}
            ],
            "drawCallback": function() {
                $("[data-toggle=tooltip]").tooltip();
            }
        });
    }

    if (! $.fn.dataTable.isDataTable('#roles-table')) {
        window.LaravelDataTables["rolesTableBuilder"] = $('#roles-table').DataTable({
            dom: 'Bfrtip',
            processing: true,
            serverSide: true,
            order: [[0, 'desc']],
            ajax: {
                url: '{{ route('squads.roles.show', $squad) }}',
                type: 'POST',
                headers: {
                    'X-HTTP-Method-Override': 'GET'
                }
            },
            columns: [
                {data: 'title', name: 'title'},
                {data: 'description', name: 'description'},
                {data: 'permissions', name: 'permissions'},
                {defaultContent: "", data: "action", name: "action", title: "Action", "orderable": false, "searchable": false}
            ]
        });
    }
  </script>
@endpush