classify admin
This commit is contained in:
127
resources/views/blog/create.blade.php
Normal file
127
resources/views/blog/create.blade.php
Normal file
@@ -0,0 +1,127 @@
|
||||
@extends('layouts.main')
|
||||
@section('title')
|
||||
{{__("Create Blogs")}}
|
||||
@endsection
|
||||
|
||||
@section('page-title')
|
||||
<div class="page-title">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6 order-md-1 order-last">
|
||||
<h4>@yield('title')</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<section class="section">
|
||||
<div class="buttons">
|
||||
<a class="btn btn-primary" href="{{ route('blog.index') }}">< {{__("Back to Blogs")}} </a>
|
||||
</div>
|
||||
<div class="row">
|
||||
<form action="{{ route('blog.store') }}" class="form-redirection" data-parsley-validate method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<div class="card">
|
||||
<div class="card-header">{{__("Add Blog")}}</div>
|
||||
<div class="card-body mt-3">
|
||||
<ul class="nav nav-tabs" id="languageTabs" role="tablist">
|
||||
@foreach($languages as $lang)
|
||||
<li class="nav-item" role="presentation">
|
||||
<a class="nav-link {{ $loop->first ? 'active' : '' }}" id="tab-{{ $lang->id }}" data-bs-toggle="tab" href="#lang-{{ $lang->id }}" role="tab">
|
||||
{{ $lang->name }}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<div class="tab-content mt-3">
|
||||
@foreach($languages as $lang)
|
||||
<div class="tab-pane fade {{ $loop->first ? 'show active' : '' }}" id="lang-{{ $lang->id }}" role="tabpanel">
|
||||
<div class="row">
|
||||
<input type="hidden" name="languages[]" value="{{ $lang->id }}">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label>{{ __("Title") }} ({{ $lang->name }})</label>
|
||||
<input type="text" name="title[{{ $lang->id }}]" class="form-control" data-parsley-required="true">
|
||||
</div>
|
||||
</div>
|
||||
@if($lang->id == 1)
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label>{{ __("Slug") }}</label>
|
||||
<input type="text" name="slug" class="form-control" data-parsley-required="true">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label>{{ __("Image") }}</label>
|
||||
<input type="file" name="image" class="form-control" data-parsley-required="true" accept=".jpg,.jpeg,.png">
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label>{{ __("Tags") }} ({{ $lang->name }})</label>
|
||||
<select id="tags[{{ $lang->id }}][]" name="tags[{{ $lang->id }}][]" data-tags="true" data-placeholder="{{__("Tags")}}" data-allow-clear="true" class="select2 col-12 w-100" multiple="multiple" data-parsley-required="true"></select>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
<label>{{ __("Description") }} ({{ $lang->name }})</label>
|
||||
<textarea name="blog_description[{{ $lang->id }}]" id="tinymce_editor_{{ $lang->id }}" class="tinymce_editor form-control" rows="5"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 text-end">
|
||||
<input type="submit" class="btn btn-primary" value="{{__("Save and Back")}}">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
@section('script')
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
tinymce.init({
|
||||
selector: '.tinymce_editor',
|
||||
height: 400,
|
||||
menubar: false,
|
||||
plugins: [
|
||||
'advlist autolink lists link charmap print preview anchor',
|
||||
'searchreplace visualblocks code fullscreen',
|
||||
'insertdatetime table paste code help wordcount'
|
||||
],
|
||||
toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat | code',
|
||||
setup: function (editor) {
|
||||
editor.on("change keyup", function () {
|
||||
editor.save(); // Ensure textarea is updated
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// If using Bootstrap 5 tabs, re-init TinyMCE when tab is shown (optional)
|
||||
const tabs = document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
tabs.forEach(tab => {
|
||||
tab.addEventListener('shown.bs.tab', () => {
|
||||
tinymce.execCommand('mceRemoveEditor', false, null);
|
||||
tinymce.init({
|
||||
selector: '.tinymce_editor',
|
||||
height: 400,
|
||||
menubar: false,
|
||||
plugins: 'lists link image table code',
|
||||
toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | bullist numlist | code'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
192
resources/views/blog/edit.blade.php
Normal file
192
resources/views/blog/edit.blade.php
Normal file
@@ -0,0 +1,192 @@
|
||||
@extends('layouts.main')
|
||||
@section('title')
|
||||
{{__("Edit Blogs")}}
|
||||
@endsection
|
||||
|
||||
@section('page-title')
|
||||
<div class="page-title">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6 order-md-1 order-last">
|
||||
<h4>@yield('title')</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<section class="section">
|
||||
<div class="buttons">
|
||||
<a class="btn btn-primary" href="{{ route('blog.index') }}">< {{__("Back to All Blogs")}} </a>
|
||||
</div>
|
||||
<div class="row">
|
||||
<form action="{{ route('blog.update', $blog->id) }}" method="POST" data-parsley-validate enctype="multipart/form-data">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
<input type="hidden" name="edit_data" value={{ $blog->id }}>
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header">{{__("Edit Blogs")}}</div>
|
||||
<div class="card-body mt-3">
|
||||
{{-- <div class="row">
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="form-group mandatory">
|
||||
<label for="title" class="mandatory form-label">{{ __('Title') }}</label>
|
||||
<input type="text" name="title" id="title" class="form-control" data-parsley-required="true" value="{{ $blog->title }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="form-group mandatory">
|
||||
<label for="slug" class="form-label">{{ __('Slug') }} <small>{{__('(English Only)')}}</small></label>
|
||||
<input type="text" name="slug" id="slug" class="form-control" data-parsley-required="true" value="{{$blog->slug}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="form-group mandatory">
|
||||
<label for="Field Name" class="mandatory form-label">{{ __('Image') }}</label>
|
||||
<div class="cs_field_img ">
|
||||
<input type="file" name="image" class="image" style="display: none" accept=" .jpg, .jpeg, .png, .svg">
|
||||
<img src="{{ empty($blog->image) ? asset('assets/img_placeholder.jpeg') : $blog->image }}" alt="" class="img preview-image" id="">
|
||||
<div class='img_input'>{{__("Browse File")}}</div>
|
||||
</div>
|
||||
<div class="input_hint"> {{__("Icon (use 256 x 256 size for better view)")}}</div>
|
||||
<div class="img_error" style="color:#DC3545;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 col-12">
|
||||
<div class="form-group mandatory">
|
||||
<label for="tags" class="mandatory form-label">{{ __('Tags') }}</label>
|
||||
<select id="tags" name="tags[]" data-tags="true" data-placeholder="{{__("Tags")}}" data-allow-clear="true" class="select2 col-12 w-100" multiple="multiple" data-parsley-required="true">
|
||||
@foreach ($blog->tags as $tag)
|
||||
<option value="{{ $tag }}" selected>{{ $tag }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 col-12">
|
||||
<label for="tinymce_editor" class="mandatory form-label">{{ __('Description') }}</label>
|
||||
<textarea name="blog_description" id="tinymce_editor" class="form-control" cols="10" rows="4">{{ $blog->description }}</textarea>
|
||||
</div>
|
||||
|
||||
</div> --}}
|
||||
<ul class="nav nav-tabs" id="languageTabs" role="tablist">
|
||||
@foreach($languages as $lang)
|
||||
<li class="nav-item" role="presentation">
|
||||
<a class="nav-link {{ $loop->first ? 'active' : '' }}" data-bs-toggle="tab" href="#lang-{{ $lang->id }}">
|
||||
{{ $lang->name }}
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<div class="tab-content mt-3">
|
||||
@foreach($languages as $lang)
|
||||
@php
|
||||
$isEnglish = $lang->id == 1;
|
||||
$trans = isset($translations) ? ($translations[$lang->id] ?? null) : null;
|
||||
@endphp
|
||||
<div class="tab-pane fade {{ $loop->first ? 'show active' : '' }}" id="lang-{{ $lang->id }}">
|
||||
<input type="hidden" name="languages[]" value="{{ $lang->id }}">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label>{{ __("Title") }} ({{ $lang->name }})</label>
|
||||
<input type="text" name="title[{{ $lang->id }}]" class="form-control"
|
||||
value="{{ $isEnglish ? ($blog->title ?? '') : ($trans->title ?? '') }}">
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label>{{ __("Slug") }}</label>
|
||||
<input type="text" name="slug" class="form-control"
|
||||
value="{{ $isEnglish ? ($blog->slug ?? '') : '' }}" {{ !$isEnglish ? 'disabled' : '' }}>
|
||||
@if(!$isEnglish)
|
||||
<small class="text-danger">{{ __("This field can be added in English only.") }}</small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label>{{ __("Image") }}</label>
|
||||
@if($isEnglish && isset($blog))
|
||||
<img src="{{ $blog->image }}" alt="Image" style="max-height: 100px;" class="mb-2 d-block">
|
||||
@endif
|
||||
<input type="file" name="image" class="form-control" {{ !$isEnglish ? 'disabled' : '' }} accept=".jpg,.jpeg,.png">
|
||||
@if(!$isEnglish)
|
||||
<small class="text-danger">{{ __("This field can be added in English only.") }}</small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label>{{ __("Tags") }}</label>
|
||||
<select name="tags[{{ $lang->id }}][]" data-tags="true" data-placeholder="{{__("Tags")}}" data-allow-clear="true"
|
||||
class="select2 col-12 w-100" multiple="multiple">
|
||||
@php
|
||||
$selectedTags = old("tags.$lang->id", $isEnglish ? ($blog->tags ?? []) : ($trans->tags ?? []));
|
||||
@endphp
|
||||
|
||||
@foreach($selectedTags as $tag)
|
||||
<option selected value="{{ $tag }}">{{ $tag }}</option>
|
||||
@endforeach
|
||||
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12">
|
||||
<label>{{ __("Description") }}</label>
|
||||
<textarea name="blog_description[{{ $lang->id }}]" id="tinymce_editor_{{ $lang->id }}" class="tinymce_editor form-control" rows="5">{{ old("description.$lang->id", $isEnglish ? ($blog->description ?? '') : ($trans->description ?? '')) }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 text-end">
|
||||
<input type="submit" class="btn btn-primary" value="{{__("Save and Back")}}">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
@section('js')
|
||||
<script !src="">
|
||||
$('#category_id').val("{{$blog->category_id}}")
|
||||
</script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
tinymce.init({
|
||||
selector: '.tinymce_editor',
|
||||
height: 400,
|
||||
menubar: false,
|
||||
plugins: [
|
||||
'advlist autolink lists link charmap print preview anchor',
|
||||
'searchreplace visualblocks code fullscreen',
|
||||
'insertdatetime table paste code help wordcount'
|
||||
],
|
||||
toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat | code',
|
||||
setup: function (editor) {
|
||||
editor.on("change keyup", function () {
|
||||
editor.save(); // Ensure textarea is updated
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// If using Bootstrap 5 tabs, re-init TinyMCE when tab is shown (optional)
|
||||
const tabs = document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
tabs.forEach(tab => {
|
||||
tab.addEventListener('shown.bs.tab', () => {
|
||||
tinymce.execCommand('mceRemoveEditor', false, null);
|
||||
tinymce.init({
|
||||
selector: '.tinymce_editor',
|
||||
height: 400,
|
||||
menubar: false,
|
||||
plugins: 'lists link image table code',
|
||||
toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | bullist numlist | code'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
57
resources/views/blog/index.blade.php
Normal file
57
resources/views/blog/index.blade.php
Normal file
@@ -0,0 +1,57 @@
|
||||
@extends('layouts.main')
|
||||
@section('title')
|
||||
{{__("Blogs")}}
|
||||
@endsection
|
||||
|
||||
@section('page-title')
|
||||
<div class="page-title">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-12 col-md-6">
|
||||
<h4 class="mb-0">@yield('title')</h4>
|
||||
</div>
|
||||
<div class="col-12 col-md-6 d-flex justify-content-end">
|
||||
@can('blog-create')
|
||||
<a class="btn btn-primary" href="{{ route('blog.create') }}">+ {{__("Add blog")}} </a>
|
||||
@endcan
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<section class="section">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless table-striped translatable-table" aria-describedby="mydesc"
|
||||
id="table_list" data-toggle="table" data-url="{{ route('blog.show', $category->id ?? 0) }}"
|
||||
data-click-to-select="true" data-side-pagination="server" data-pagination="true"
|
||||
data-page-list="[5, 10, 20, 50, 100, 200,500,2000]" data-search="true" data-search-align="right"
|
||||
data-toolbar="#toolbar" data-show-columns="true" data-show-refresh="true"
|
||||
data-trim-on-search="false" data-responsive="true" data-sort-name="id"
|
||||
data-sort-order="desc" data-pagination-successively-size="3" data-query-params="queryParams"
|
||||
data-table="blogs" data-use-row-attr-func="true" data-mobile-responsive="true"
|
||||
data-escape="true"
|
||||
data-show-export="false" data-export-options='{"fileName": "blog-list","ignoreColumn": ["operate"]}' data-export-types="['pdf','json', 'xml', 'csv', 'txt', 'sql', 'doc', 'excel']">
|
||||
<thead class="thead-dark">
|
||||
<tr>
|
||||
<th scope="col" data-field="id" data-align="center" data-sortable="true">{{ __('ID') }}</th>
|
||||
<th scope="col" data-field="title" data-align="center" data-sortable="true">{{ __('Title') }}</th>
|
||||
<th scope="col" data-field="slug" data-align="center" data-sortable="true">{{ __('Slug') }}</th>
|
||||
<th scope="col" data-field="description" data-align="center" data-escape="false" data-formatter="truncateDescription">{{ __('Description') }}</th>
|
||||
<th scope="col" data-field="image" data-align="center" data-formatter="imageFormatter">{{ __('Image') }}</th>
|
||||
<th scope="col" data-field="tags" data-align="center">{{ __('Tags') }}</th>
|
||||
<th scope="col" data-field="created_at" data-align="center">{{ __('Date') }}</th>
|
||||
@can(['blog-update', 'blog-delete'])
|
||||
<th scope="col" data-escape="false" data-field="operate">{{ __('Action') }}</th>
|
||||
@endcan
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user