feat: news

This commit is contained in:
myuqinurrohman 2025-02-27 13:25:13 +07:00
parent 3ff970391c
commit 298092be84
29 changed files with 814 additions and 70 deletions

View File

@ -2,6 +2,7 @@
use Hashids\Hashids;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
// Template
@ -11,9 +12,9 @@
// }
if (! function_exists('store_file')) {
function store_file($file, $path, $disk = 'public')
function store_file($file = null, $path, $disk = 'public')
{
if (isset($file)) {
if ($file && $file instanceof \Illuminate\Http\UploadedFile) {
$randomFilename = Str::random(35).time().'.'.$file->getClientOriginalExtension();
$originalFileName = Str::slug(pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)).'.'.$file->getClientOriginalExtension();
@ -34,6 +35,19 @@ function store_file($file, $path, $disk = 'public')
}
}
if (! function_exists('delete_file')) {
function delete_file($path)
{
if (File::exists(storage_path($path))) {
File::delete(storage_path($path));
return true;
} else {
return false;
}
}
}
if (!function_exists('get_role_name')) {
function get_role_name($role = null) {

View File

@ -33,12 +33,12 @@ public function store(ClassificationRequest $request){
if($createdClassification){
return redirect()->back()->with('success-status', 'Berhasil menambahkan klasifikasi.');
}else{
return redirect()->back()->with('failed-status', 'Gagal menambahkan klasifikasi');
return redirect()->back()->with('failed-status', 'Gagal menambahkan klasifikasi.');
}
}
public function edit($id){
$classification = Classification::find(decrypt_id($id));
$classification = Classification::findOrFail(decrypt_id($id));
return view('dashboard.classifications.edit', [
'title' => 'Ubah Klasifikasi',
@ -51,13 +51,13 @@ public function update(ClassificationRequest $request, $id){
$validatedData['slug'] = Str::slug($validatedData['name']);
$validatedData['enhancer_id'] = Auth::id();
$classification = Classification::find(decrypt_id($id));
$classification = Classification::findOrFail(decrypt_id($id));
$updatedClassification = $classification->update($validatedData);
if($updatedClassification){
return redirect()->back()->with('success-status', 'Berhasil mengubah klasifikasi.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah klasifikasi');
return redirect()->back()->with('failed-status', 'Gagal mengubah klasifikasi.');
}
}
@ -76,7 +76,7 @@ public function destroy($id){
$classification->delete();
return response()->json(['message' => 'Berhasil menghapus klasifikasi']);
return response()->json(['message' => 'Berhasil menghapus klasifikasi.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus klasifikasi.'], 500);
}

View File

@ -5,6 +5,7 @@
use App\Http\Controllers\Controller;
use App\Models\Classification;
use App\Models\GovernmentAgency;
use App\Models\News;
use App\Models\SubClassification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
@ -185,4 +186,64 @@ public function governmentAgency(Request $request){
return response()->json(['error' => 'Unauthorized'], 401);
}
public function news(Request $request){
if ($request->ajax()) {
$data = News::all();
return DataTables::of($data)
->addIndexColumn()
->addColumn('title', function ($data) {
return shorten_text($data->title, 50);
})
->addColumn('link', function ($data) {
if ($data->link != null) {
return '<a href="'.$data->link.'" target="_blank">'.$data->link.'</a>';
}else{
return '<span class="badge bg-secondary" style="display:inline-block;font-size:0.8rem;">Tidak ada link</span>';
}
})
->addColumn('category', function ($data) {
if ($data->category == '0') {
return '<span class="badge bg-primary" style="display:inline-block;font-size:0.8rem;">Berita</span>';
}else{
return '<span class="badge bg-success" style="display:inline-block;font-size:0.8rem;">Pengumuman</span>';
}
})
->addColumn('action', function ($data) {
$showUrl = route('dashboard.news.show', ['id' => encrypt_id($data->id)]);
$editUrl = route('dashboard.news.edit', ['id' => encrypt_id($data->id)]);
$deleteUrl = route('dashboard.news.destroy', ['id' => encrypt_id($data->id)]);
$dropdown = '<div class="dropdown" style="display:flex; justify-content:center;">
<a class="dropdown-toggle btn btn-icon btn-light" data-bs-toggle="dropdown"><em class="icon ni ni-more-v"></em></a>
<div class="dropdown-menu dropdown-menu-end">
<ul class="link-list-opt">
<li><a href="'.$showUrl.'"><em class="icon ni ni-eye"></em><span>Detail</span></a></li>';
if (is_role([1])) {
$dropdown .= '<li><a href="'.$editUrl.'"><em class="icon ni ni-edit"></em><span>Ubah</span></a></li>';
}
if (is_role([1])) {
$dropdown .= '<li><a href="javascript:void(0);" onclick="deleteItem(\''.$deleteUrl.'\', \'Apakah Anda yakin ingin menghapus berita '.$data->title.'? Item ini akan dihapus secara permanen!\')"><em class="icon ni ni-trash"></em><span>Hapus</span></a></li>';
}
$dropdown .= '</ul>
</div>
</div>';
return $dropdown;
})
->rawColumns(['link', 'category', 'action'])
->make(true);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
}

View File

@ -38,7 +38,7 @@ public function store(GovernmentAgencyRequest $request){
}
public function edit($id){
$governmentAgency = GovernmentAgency::find(decrypt_id($id));
$governmentAgency = GovernmentAgency::findOrFail(decrypt_id($id));
return view('dashboard.government-agencies.edit',[
'title' => 'Ubah OPD',

View File

@ -0,0 +1,97 @@
<?php
namespace App\Http\Controllers\Dashboard;
use App\Http\Controllers\Controller;
use App\Http\Requests\NewsRequest;
use App\Models\News;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
class NewsController extends Controller
{
public function index(){
return view('dashboard.news.index', [
'title' => 'Berita'
]);
}
public function create(){
return view('dashboard.news.create', [
'title' => 'Tambah Berita'
]);
}
public function store(NewsRequest $request){
$validatedData = $request->validated();
$validatedData['image'] = store_file($validatedData['image'], '/uploads/news', 'public')['randomFileName'];
$validatedData['slug'] = Str::slug($validatedData['title']);
$validatedData['author_id'] = Auth::id();
$createdNews = News::create($validatedData);
if($createdNews){
return redirect()->back()->with('success-status', 'Berhasil menambahkan berita.');
}else{
return redirect()->back()->with('failed-status', 'Gagal menambahkan berita.');
}
}
public function edit($id){
$news = News::findOrFail(decrypt_id($id));
return view('dashboard.news.edit', [
'title' => 'Ubah Berita',
'news' => $news
]);
}
public function update(NewsRequest $request, $id){
$validatedData = $request->validated();
$news = News::findOrFail(decrypt_id($id));
if($request->has('image')){
delete_file('app/public/uploads/news/'.$news->image);
$validatedData['image'] = store_file($validatedData['image'], '/uploads/news', 'public')['randomFileName'];
}else{
$validatedData['image'] = $news->image;
}
$validatedData['slug'] = Str::slug($validatedData['title']);
$validatedData['author_id'] = Auth::id();
$news = News::findOrFail(decrypt_id($id));
$updatedNews = $news->update($validatedData);
if($updatedNews){
return redirect()->back()->with('success-status', 'Berhasil mengubah berita.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah berita.');
}
}
public function show($id){
$news = News::findOrFail(decrypt_id($id));
return view('dashboard.news.show', [
'title' => 'Detail Berita',
'news' => $news
]);
}
public function destroy($id){
try {
$news = News::findOrFail(decrypt_id($id));
delete_file('app/public/uploads/news/'.$news->image);
$news->delete();
return response()->json(['message' => 'Berhasil menghapus berita.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus berita.'], 500);
}
}
}

View File

@ -50,12 +50,12 @@ public function store(SubClassificationRequest $request){
if($createdSubClassification){
return redirect()->back()->with('success-status', 'Berhasil menambahkan sub klasifikasi.');
}else{
return redirect()->back()->with('failed-status', 'Gagal menambahkan sub klasifikasi');
return redirect()->back()->with('failed-status', 'Gagal menambahkan sub klasifikasi.');
}
}
public function edit($id){
$subClassification = SubClassification::find(decrypt_id($id));
$subClassification = SubClassification::findOrFail(decrypt_id($id));
return view('dashboard.sub-classifications.edit', [
'title' => 'Ubah Sub Klasifikasi',
@ -69,13 +69,13 @@ public function update(SubClassificationRequest $request, $id){
$validatedData['slug'] = Str::slug($validatedData['name']);
$validatedData['enhancer_id'] = Auth::id();
$subClassification = SubClassification::find(decrypt_id($id));
$subClassification = SubClassification::findOrFail(decrypt_id($id));
$updatedSubClassification = $subClassification->update($validatedData);
if($updatedSubClassification){
return redirect()->back()->with('success-status', 'Berhasil mengubah sub klasifikasi.');
}else{
return redirect()->back()->with('failed-status', 'Gagal mengubah sub klasifikasi');
return redirect()->back()->with('failed-status', 'Gagal mengubah sub klasifikasi.');
}
}
@ -94,7 +94,7 @@ public function destroy($id){
$subClassification->delete();
return response()->json(['message' => 'Berhasil menghapus sub klasifikasi']);
return response()->json(['message' => 'Berhasil menghapus sub klasifikasi.']);
} catch (\Exception $e) {
return response()->json(['message' => 'Gagal menghapus sub klasifikasi.'], 500);
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
class NewsRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return Auth::check() && is_role(['1']);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
$rules = [
'title' => ['required' , 'max:200'],
'content' => ['required'],
'link' => ['nullable', 'url'],
'tag' => ['nullable'],
'category' => ['required', 'in:0,1'],
];
if($this->isMethod('post')){
$rules['image'] = ['required', 'image', 'mimes:png,jpg,jpeg', 'max:4096'];
}else if($this->isMethod('put')){
$rules['image'] = ['nullable', 'image', 'mimes:png,jpg,jpeg', 'max:4096'];
}
return $rules;
}
public function messages(): array
{
return [
'title.required' => 'Judul harus diisi.',
'title.max' => 'Judul tidak boleh lebih dari 200 karakter.',
'content.required' => 'Konten harus diisi.',
'link.url' => 'Harus link valid.',
'category.required' => 'Kategori harus dipilih.',
'category.in' => 'Kategori harus bernilai berita atau pengumuman.',
'image.required' => 'Gambar wajib diunggah.',
'image.image' => 'File yang diunggah harus berupa gambar.',
'image.mimes' => 'Format gambar yang diperbolehkan adalah PNG, JPG, atau JPEG.',
'image.max' => 'Ukuran gambar tidak boleh lebih dari 4MB.',
];
}
}

21
app/Models/News.php Normal file
View File

@ -0,0 +1,21 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class News extends Model
{
protected $table = 'news';
protected $fillable = [
'title',
'slug',
'content',
'image',
'link',
'tag',
'category',
'author_id'
];
}

View File

@ -14,7 +14,7 @@ public function up(): void
Schema::create('classifications', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug');
$table->string('slug')->unique();;
$table->text('description')->nullable();
$table->enum('status', ['0', '1'])->default('0');
$table->unsignedBigInteger('enhancer_id');

View File

@ -14,7 +14,7 @@ public function up(): void
Schema::create('sub_classifications', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug');
$table->string('slug')->unique();;
$table->text('description')->nullable();
$table->enum('status', ['0', '1'])->default('0');
$table->unsignedBigInteger('classification_id');

View File

@ -14,7 +14,7 @@ public function up(): void
Schema::create('government_agencies', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug');
$table->string('slug')->unique();;
$table->string('short_name')->nullable();
$table->text('location')->nullable();
$table->text('description')->nullable();

View File

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('news', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->text('content');
$table->string('image');
$table->string('link')->nullable();
$table->string('tag')->nullable();
$table->enum('category', ['0', '1'])->default('0');
$table->unsignedBigInteger('author_id');
$table->foreign('author_id')->references('id')->on('users');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('news');
}
};

View File

@ -0,0 +1,17 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class NewsSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//
}
}

View File

@ -74,3 +74,9 @@ .description-content{
border-radius: 0.4rem;
}
.news-content{
background-color: #F5F6FA;
/* border: 1px solid #DBDFEA; */
padding: 0.7rem;
border-radius: 0.4rem;
}

View File

@ -90,46 +90,72 @@
NioApp.Quill = function () {
var _basic = '.quill-basic';
$(document).ready(function () {
var _basic = '.quill-basic';
if ($(_basic).exists()) {
$(_basic).each(function () {
var toolbarOptions = [['bold', 'italic', 'underline', 'strike'], // toggled buttons
['blockquote', 'code-block'], [{
'list': 'ordered'
}, {
'list': 'bullet'
}], [{
'script': 'sub'
}, {
'script': 'super'
}], // superscript/subscript
[{
'indent': '-1'
}, {
'indent': '+1'
}], // outdent/indent
[{
'header': [1, 2, 3, 4, 5, 6]
}], [{
'color': []
}, {
'background': []
}], // dropdown with defaults from theme
[{
'font': []
}], [{
'align': []
}], ['clean'] // remove formatting button
];
var quill = new Quill(this, {
modules: {
toolbar: toolbarOptions
},
theme: 'snow'
});
if ($( _basic ).length) {
$( _basic ).each(function () {
var toolbarOptions = [
['bold', 'italic', 'underline', 'strike'],
['blockquote', 'code-block'],
[{
'list': 'ordered'
}, {
'list': 'bullet'
}],
[{
'script': 'sub'
}, {
'script': 'super'
}],
[{
'indent': '-1'
}, {
'indent': '+1'
}],
[{
'header': [1, 2, 3, 4, 5, 6]
}],
[{
'color': []
}, {
'background': []
}],
[{
'font': []
}],
[{
'align': []
}],
['clean']
];
var quill = new Quill(this, {
modules: {
toolbar: toolbarOptions
},
theme: 'snow'
});
// Debugging Quill untuk melihat apakah editor sudah diinisialisasi dengan benar
console.log(quill);
// Menangani saat form disubmit
$('#myForm').on('submit', function(event) {
// Ambil konten HTML dari Quill editor
var quillValue = quill.root.innerHTML;
// Set konten Quill ke dalam input hidden
$('#richEeditorValue').val(quillValue);
// Debugging untuk memeriksa apakah nilai sudah diset
console.log("Quill content before submit: ", quillValue);
});
});
}
});
}
var _minimal = '.quill-minimal';

View File

@ -41,8 +41,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!!old('description')!!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!old('description')!!}</textarea>
</div>
</div>
</div>

View File

@ -42,8 +42,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!! $classification->description !!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!$classification->description!!}</textarea>
</div>
</div>
</div>

View File

@ -52,8 +52,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!!old('description')!!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!old('description')!!}</textarea>
</div>
</div>
</div>

View File

@ -53,8 +53,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!!$governmentAgency->description!!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!$governmentAgency->description!!}</textarea>
</div>
</div>
</div>

View File

@ -0,0 +1,101 @@
@include('partials.dashboard.head')
@include('partials.dashboard.sidebar', ['page' => 'news'])
@include('partials.dashboard.header')
<!-- content @s -->
<div class="nk-content ">
<div class="container-fluid">
<div class="nk-content-inner">
<div class="nk-content-body">
<div class="nk-block nk-block-lg">
<div class="card card-bordered card-preview">
<div class="card-inner">
<div class="card-head">
<h5 class="card-title">{{$title}}</h5>
</div>
@foreach ($errors->all() as $item)
{{$item}}
@endforeach
<form action="{{route('dashboard.news.store')}}" method="post" enctype="multipart/form-data">
@csrf
<div class="row g-4">
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="title">Judul<span class="required-input">*</span></label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('title') border-danger @enderror" id="title" name="title" placeholder="Masukan judul" value="{{old('title')}}">
</div>
@error('title')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="link">Link</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('link') border-danger @enderror" id="link" name="link" placeholder="Masukan link" value="{{old('link')}}">
</div>
@error('link')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label">Kategori<span class="required-input">*</span></label>
<div class="form-control-wrap">
<select class="form-select js-select2" name="category">
<option value="0" {{old('category') == '0' ? 'selected' : ''}}>Berita</option>
<option value="1" {{old('category') == '1' ? 'selected' : ''}}>Pengumuman</option>
</select>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="tag">Tag</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('tag') border-danger @enderror" id="tag" name="tag" placeholder="Masukan tag" value="{{old('tag')}}">
</div>
@error('tag')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="image">Gambar<span class="required-input">*</span></label>
<div class="form-control-wrap">
<input type="file" class="form-control @error('image') border-danger @enderror" id="image" name="image" accept="image/*">
</div>
@error('image')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label class="form-label" for="phone-no-1">Konten<span class="required-input">*</span></label>
<div class="form-control-wrap">
<textarea class="tinymce-basic form-control" name="content">{!!old('content')!!}</textarea>
</div>
</div>
</div>
<div class="col-12">
<hr>
<div class="form-group d-flex justify-content-end">
<a href="{{route('dashboard.news.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
<button type="submit" class="btn btn-md btn-primary">Tambahkan</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- content @e -->
@include('partials.dashboard.footer', ['rich_editor' => true])

View File

@ -0,0 +1,102 @@
@include('partials.dashboard.head')
@include('partials.dashboard.sidebar', ['page' => 'news'])
@include('partials.dashboard.header')
<!-- content @s -->
<div class="nk-content ">
<div class="container-fluid">
<div class="nk-content-inner">
<div class="nk-content-body">
<div class="nk-block nk-block-lg">
<div class="card card-bordered card-preview">
<div class="card-inner">
<div class="card-head">
<h5 class="card-title">{{$title}}</h5>
</div>
@foreach ($errors->all() as $item)
{{$item}}
@endforeach
<form action="{{route('dashboard.news.update', ['id' => encrypt_id($news->id)])}}" method="post" enctype="multipart/form-data">
@csrf
@method('put')
<div class="row g-4">
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="title">Judul<span class="required-input">*</span></label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('title') border-danger @enderror" id="title" name="title" placeholder="Masukan judul" value="{{$news->title}}">
</div>
@error('title')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="link">Link</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('link') border-danger @enderror" id="link" name="link" placeholder="Masukan link" value="{{$news->link}}">
</div>
@error('link')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label">Kategori<span class="required-input">*</span></label>
<div class="form-control-wrap">
<select class="form-select js-select2" name="category">
<option value="0" {{$news->category == '0' ? 'selected' : ''}}>Berita</option>
<option value="1" {{$news->category == '1' ? 'selected' : ''}}>Pengumuman</option>
</select>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="tag">Tag</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('tag') border-danger @enderror" id="tag" name="tag" placeholder="Masukan tag" value="{{$news->tag}}">
</div>
@error('tag')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="image">Gambar<span class="required-input">*</span></label>
<div class="form-control-wrap">
<input type="file" class="form-control @error('image') border-danger @enderror" id="image" name="image" accept="image/*">
</div>
@error('image')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label class="form-label" for="phone-no-1">Konten<span class="required-input">*</span></label>
<div class="form-control-wrap">
<textarea class="tinymce-basic form-control" name="content">{!!$news->content!!}</textarea>
</div>
</div>
</div>
<div class="col-12">
<hr>
<div class="form-group d-flex justify-content-end">
<a href="{{route('dashboard.news.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
<button type="submit" class="btn btn-md btn-primary">Simpan</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- content @e -->
@include('partials.dashboard.footer', ['rich_editor' => true])

View File

@ -0,0 +1,63 @@
@include('partials.dashboard.head')
@include('partials.dashboard.sidebar', ['page' => 'news'])
@include('partials.dashboard.header')
<!-- content @s -->
<div class="nk-content ">
<div class="container-fluid">
<div class="nk-content-inner">
<div class="nk-content-body">
<div class="nk-block-head nk-block-head-sm">
<div class="nk-block-between">
<div class="nk-block-head-content">
<h3 class="nk-block-title page-title">{{$title}}</h3>
</div><!-- .nk-block-head-content -->
<div class="nk-block-head-content">
<div class="toggle-wrap nk-block-tools-toggle">
<a href="#" class="btn btn-icon btn-trigger toggle-expand me-n1" data-target="pageMenu"><em class="icon ni ni-more-v"></em></a>
<div class="toggle-expand-content" data-content="pageMenu">
<ul class="nk-block-tools g-3">
{{-- <li>
<div class="drodown">
<a href="#" class="dropdown-toggle btn btn-white btn-dim btn-outline-light" data-bs-toggle="dropdown"><em class="d-none d-sm-inline icon ni ni-calender-date"></em><span><span class="d-none d-md-inline">Last</span> 30 Days</span><em class="dd-indc icon ni ni-chevron-right"></em></a>
<div class="dropdown-menu dropdown-menu-end">
<ul class="link-list-opt no-bdr">
<li><a href="#"><span>Last 30 Days</span></a></li>
<li><a href="#"><span>Last 6 Months</span></a></li>
<li><a href="#"><span>Last 1 Years</span></a></li>
</ul>
</div>
</div>
</li> --}}
<li class="nk-block-tools-opt"><a href="{{route('dashboard.news.create')}}" class="btn btn-primary"><em class="icon ni ni-plus"></em><span>Tambah</span></a></li>
</ul>
</div>
</div>
</div><!-- .nk-block-head-content -->
</div><!-- .nk-block-between -->
</div><!-- .nk-block-head -->
<div class="nk-block nk-block-lg">
<div class="card card-bordered card-preview">
<div class="card-inner">
<div class="table-responsive">
<table class="table table-striped table-bordered nowrap" id="newsTable" border="1">
<thead>
<tr>
<th style="width: 10% !important;">No</th>
<th>Judul</th>
<th>Link</th>
<th>Kategori</th>
<th>Tag</th>
<th style="width: 10% !important;"></th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- content @e -->
@include('partials.dashboard.footer' ,['datatable' => 'news'])

View File

@ -0,0 +1,108 @@
@include('partials.dashboard.head')
@include('partials.dashboard.sidebar', ['page' => 'news'])
@include('partials.dashboard.header')
<!-- content @s -->
<div class="nk-content ">
<div class="container-fluid">
<div class="nk-content-inner">
<div class="nk-content-body">
<div class="nk-block nk-block-lg">
<div class="card card-bordered card-preview">
<div class="card-inner">
<div class="card-head">
<h5 class="card-title">{{$title}}</h5>
</div>
@foreach ($errors->all() as $item)
{{$item}}
@endforeach
<form action="{{route('dashboard.news.update', ['id' => encrypt_id($news->id)])}}" method="post" enctype="multipart/form-data">
@csrf
@method('put')
<div class="row g-4">
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="title">Judul</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('title') border-danger @enderror" id="title" name="title" placeholder="Masukan judul" value="{{$news->title}}" readonly>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="link">Link</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('link') border-danger @enderror" id="link" name="link" placeholder="Masukan link" value="{{$news->link}}" readonly>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="link">Kategori</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('link') border-danger @enderror" id="link" name="link" placeholder="Masukan link" value="{{$news->category === '0' ? 'Berita' : 'Pengumuman'}}" readonly>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="tag">Tag</label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('tag') border-danger @enderror" id="tag" name="tag" placeholder="Masukan tag" value="{{$news->tag}}" readonly>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="form-label" for="image">Gambar<span class="required-input">*</span></label>
<div class="form-control-wrap">
<a href="javascript:void(0);" data-bs-toggle="modal" data-bs-target="#modalDefault" class="btn btn-info">Lihat gambar</a>
</div>
@error('image')
<span class="validation-error">{{$message}}</span>
@enderror
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label class="form-label" for="phone-no-1">Konten<span class="required-input">*</span></label>
<div class="form-control-wrap">
<div class="news-content">{!! $news->content !!}</div>
</div>
</div>
</div>
<div class="col-12">
<hr>
<div class="form-group d-flex justify-content-end">
<a href="{{route('dashboard.news.index')}}" class="btn btn-white btn-dim btn-outline-light mx-2"><span>Kembali</span></a>
<a href="{{route('dashboard.news.edit', ['id' => encrypt_id($news->id)])}}" class="btn btn-warning"><span>Ubah</span></a>
</div>
</div>
<div class="modal fade" tabindex="-1" id="modalDefault">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Preview</h5>
<a href="#" class="close" data-bs-dismiss="modal" aria-label="Close">
<em class="icon ni ni-cross"></em>
</a>
</div>
<div class="modal-body">
<img src="{{asset('storage/uploads/news/'. $news->image)}}" alt="preview">
</div>
{{-- <div class="modal-footer bg-light">
<span class="sub-text">Modal Footer Text</span>
</div> --}}
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- content @e -->
@include('partials.dashboard.footer', ['rich_editor' => true])

View File

@ -19,7 +19,7 @@
<div class="form-group">
<label class="form-label" for="name">Nama Sub Klasifikasi<span class="required-input">*</span></label>
<div class="form-control-wrap">
<input type="text" class="form-control @error('name') border-danger @enderror" id="name" name="name" placeholder="Masukan nama sub klasifikasi" value="{{old('name')}}">
<input type="text" class="form-control @error('name') border-danger @enderror" id="name" name="name" placeholder="Masukan nama klasifikasi" value="{{old('name')}}">
</div>
@error('name')
<span class="validation-error">{{$message}}</span>
@ -59,8 +59,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!!old('description')!!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!old('description')!!}</textarea>
</div>
</div>
</div>

View File

@ -54,8 +54,7 @@
<div class="form-group">
<label class="form-label" for="phone-no-1">Deskripsi</label>
<div class="form-control-wrap">
<div class="summernote-minimal">{!!$subClassification->description!!}</div>
<input type="hidden" name="description" id="richEeditorValue">
<textarea class="tinymce-basic form-control" name="description">{!!$subClassification->description!!}</textarea>
</div>
</div>
</div>

View File

@ -90,3 +90,28 @@
});
</script>
@endif
@if ($datatable === 'news')
<script>
$(document).ready(function() {
$('#newsTable').DataTable({
processing: true,
serverSide: true,
ajax: '{{ route('dashboard.news.data') }}',
columns: [
{ data: 'DT_RowIndex', name: 'DT_RowIndex', orderable: false, searchable: false },
{ data: 'title', name: 'title' },
{ data: 'link', name: 'link' },
{ data: 'category', name: 'category' },
{ data: 'tag', name: 'tag' },
{ data: 'action', name: 'action', orderable: false, searchable: false },
{ data: 'id', name: 'id', orderable: true, searchable: false, visible: false },
],
language: datatableLanguage,
autoWidth: false,
order: [[1, 'desc']],
lengthMenu: [[10, 25, 50, 100, -1], ['Tampilkan 10 data', 'Tampilkan 25 data', 'Tampilkan 50 data', 'Tampilkan 100 data', 'Tampilkan semua']]
});
});
</script>
@endif

View File

@ -60,8 +60,8 @@
@endif
@if (isset($rich_editor))
<link rel="stylesheet" href="{{asset('assets/dashboard/css/editors/summernote.css?ver=3.0.3')}}">
<script src="{{asset('assets/dashboard/js/libs/editors/summernote.js?ver=3.0.3')}}"></script>
<link rel="stylesheet" href="{{asset('assets/dashboard/css/editors/tinymce.css?ver=3.0.3')}}">
<script src="{{asset('assets/dashboard/js/libs/editors/tinymce.js?ver=3.0.3')}}"></script>
<script src="{{asset('assets/dashboard/js/editors.js?ver=3.0.3')}}"></script>
@endif
</body>

View File

@ -67,7 +67,7 @@
<h6 class="overline-title text-primary-alt">Kelola</h6>
</li><!-- .nk-menu-item -->
<li class="nk-menu-item">
<a href="javascript:void(0);" class="nk-menu-link">
<a href="{{route('dashboard.news.index')}}" class="nk-menu-link {{$page === 'news' ? 'active-page' : ''}}">
<span class="nk-menu-icon"><em class="icon ni ni-article"></em></span>
<span class="nk-menu-text">Berita</span>
</a>

View File

@ -4,6 +4,7 @@
use App\Http\Controllers\Dashboard\ClassificationController;
use App\Http\Controllers\Dashboard\DatatableController;
use App\Http\Controllers\Dashboard\GovernmentAgencyController;
use App\Http\Controllers\Dashboard\NewsController;
use App\Http\Controllers\Dashboard\OverviewController;
use App\Http\Controllers\Dashboard\SubClassificationController;
use Illuminate\Support\Facades\Route;
@ -73,5 +74,19 @@
Route::get('/data', [DatatableController::class, 'governmentAgency'])->name('data');
});
Route::prefix('news')->name('news.')->group(function(){
Route::controller(NewsController::class)->group(function(){
Route::get('/', 'index')->name('index');
Route::get('/create', 'create')->name('create');
Route::post('/', 'store')->name('store');
Route::get('/{id}/show', 'show')->name('show');
Route::get('/{id}/edit', 'edit')->name('edit');
Route::put('/{id}', 'update')->name('update');
Route::delete('/{id}', 'destroy')->name('destroy');
});
Route::get('/data', [DatatableController::class, 'news'])->name('data');
});
});
});