From ab3acf505c17c69467b6c592b43ddfda01be9857 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 9 Sep 2024 10:04:58 +0700 Subject: [PATCH 01/35] ADD: menambahkan change() ketika merubah field type yang sebelumnya error type already exsist --- .../migrations/2024_08_22_213619_add_type_das_navigation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2024_08_22_213619_add_type_das_navigation.php b/database/migrations/2024_08_22_213619_add_type_das_navigation.php index e6bec0016..11df775b9 100644 --- a/database/migrations/2024_08_22_213619_add_type_das_navigation.php +++ b/database/migrations/2024_08_22_213619_add_type_das_navigation.php @@ -16,7 +16,7 @@ public function up() { Schema::table('das_navigation', function (Blueprint $table) { - $table->tinyInteger('type')->default(0)->after('slug'); + $table->tinyInteger('type')->default(0)->after('slug')->change(); }); Navigation::where('url', 'like', '%profil/%')->update(['type' => MenuTipe::PROFIL]); From e17c7cc1e39b383f7bbacf86455d22275ea7302e Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 9 Sep 2024 10:06:59 +0700 Subject: [PATCH 02/35] ADD: menambahkan package doctrine/dbal dan meregistrasikan package doctrine/dbal agar mengenali perubahan tinyInteger saat menggunakan change(), karena Laravel secara default tidak mendukung perubahan tipe data seperti tinyInteger ketika menggunakan fitur change() --- app/Providers/AppServiceProvider.php | 20 ++++++++++++-------- composer.json | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 395f819d6..a25c30e1c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -44,6 +44,8 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; +use Doctrine\DBAL\Types\Type; +use Doctrine\DBAL\Platforms\AbstractPlatform; class AppServiceProvider extends ServiceProvider { @@ -52,9 +54,7 @@ class AppServiceProvider extends ServiceProvider * * @return void */ - public function register() - { - } + public function register() {} /** * Bootstrap any application services. @@ -75,6 +75,12 @@ public function boot() $this->blade(); $this->file(); } + + if (!Type::hasType('tinyinteger')) { + Type::addType('tinyinteger', 'Doctrine\DBAL\Types\SmallIntType'); + $platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform(); + $platform->markDoctrineTypeCommented(Type::getType('tinyinteger')); + } } protected function penduduk() @@ -104,8 +110,7 @@ protected function penduduk() }); Validator::extend('nik_exists', function ($attribute, $value, $parameters) { - $query = DB::table('das_penduduk')-> - where('nik', $value)->whereRaw("tanggal_lahir = '".$parameters[0]."'")->exists(); + $query = DB::table('das_penduduk')->where('nik', $value)->whereRaw("tanggal_lahir = '" . $parameters[0] . "'")->exists(); if ($query) { return true; @@ -115,8 +120,7 @@ protected function penduduk() }); Validator::extend('password_exists', function ($attribute, $value, $parameters) { - $query = DB::table('das_penduduk')-> - where('tanggal_lahir', $value)->whereRaw("nik = '".$parameters[0]."'")->exists(); + $query = DB::table('das_penduduk')->where('tanggal_lahir', $value)->whereRaw("nik = '" . $parameters[0] . "'")->exists(); if ($query) { return true; @@ -155,7 +159,7 @@ protected function config() config([ 'setting' => Cache::remember('setting', 24 * 60 * 60, function () { return Schema::hasTable('das_setting') - ? DB::table('das_setting') + ? DB::table('das_setting') ->get(['key', 'value']) ->keyBy('key') ->transform(function ($setting) { diff --git a/composer.json b/composer.json index 088cc7155..465d39bcc 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "bensampo/laravel-enum": "^6.0", "cocur/slugify": "4.2.0", "cviebrock/eloquent-sluggable": "^9.0", - "doctrine/dbal": "^2.9", + "doctrine/dbal": "^3.6", "guzzlehttp/guzzle": "^7.2", "hexadog/laravel-themes-manager": "^1.13", "jaybizzle/crawler-detect": "1.*", From 3c58da4c68858014595b524c544eafe9a438e83a Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 9 Sep 2024 10:37:40 +0700 Subject: [PATCH 03/35] UPDATE: menambah enum publikasi MenuTipe.php dan menambahkannya pada option tipe menu navigation --- app/Enums/MenuTipe.php | 9 +++++++++ resources/views/setting/navigation/form.blade.php | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/app/Enums/MenuTipe.php b/app/Enums/MenuTipe.php index f1c3f056e..1feaa980a 100644 --- a/app/Enums/MenuTipe.php +++ b/app/Enums/MenuTipe.php @@ -46,6 +46,7 @@ final class MenuTipe extends Enum public const STATISTIK = 3; public const POTENSI = 4; public const UNDUHAN = 5; + public const PUBLIKASI = 6; public const EKSTERNAL = 0; @@ -57,6 +58,7 @@ public static function all(): array self::STATISTIK => 'Statistik', self::POTENSI => 'Potensi', self::UNDUHAN => 'Unduhan', + self::PUBLIKASI => 'Publikasi', self::EKSTERNAL => 'Eksternal', ]; } @@ -103,4 +105,11 @@ public static function getUnduhan(): array 'dokumen' => 'Dokumen', ]; } + + public static function getPublikasi(): array + { + return [ + 'galeri' => 'Galeri', + ]; + } } diff --git a/resources/views/setting/navigation/form.blade.php b/resources/views/setting/navigation/form.blade.php index d6192e241..8c8d28aea 100644 --- a/resources/views/setting/navigation/form.blade.php +++ b/resources/views/setting/navigation/form.blade.php @@ -36,6 +36,12 @@ @endforeach + + @foreach (\App\Enums\MenuTipe::getPublikasi() as $key => $value) + + @endforeach + From 72da79d5da4335dd9893174a9e4b0fb7d6c95d63 Mon Sep 17 00:00:00 2001 From: misarianto Date: Wed, 11 Sep 2024 00:07:04 +0700 Subject: [PATCH 04/35] FIX: #1024 Tambahkan fitur modul galeri pada website OpenDK --- .../FrontEnd/PublikasiController.php | 79 +++++++ .../Controllers/Publikasi/AlbumController.php | 188 +++++++++++++++++ .../Publikasi/GaleriController.php | 192 ++++++++++++++++++ app/Http/Requests/AlbumRequest.php | 32 +++ app/Http/Requests/GaleriRequest.php | 34 ++++ app/Models/Album.php | 51 +++++ app/Models/Galeri.php | 55 +++++ app/Observers/AlbumObserver.php | 68 +++++++ app/Observers/GaleriObserver.php | 89 ++++++++ app/Providers/EventServiceProvider.php | 6 + .../2024_09_09_105521_create_albums_table.php | 35 ++++ ...2024_09_09_121409_create_galeris_table.php | 39 ++++ helpers/general_helper.php | 52 ++--- resources/views/forms/aksi.blade.php | 16 ++ resources/views/forms/lock-modal.blade.php | 30 +++ resources/views/forms/unlock-modal.blade.php | 30 +++ .../views/layouts/fragments/sidebar.blade.php | 18 ++ .../views/publikasi/album/_form.blade.php | 91 +++++++++ .../views/publikasi/album/create.blade.php | 25 +++ .../views/publikasi/album/edit.blade.php | 27 +++ .../views/publikasi/album/index.blade.php | 84 ++++++++ .../views/publikasi/galeri/_form.blade.php | 153 ++++++++++++++ .../views/publikasi/galeri/create.blade.php | 26 +++ .../views/publikasi/galeri/edit.blade.php | 27 +++ .../views/publikasi/galeri/index.blade.php | 86 ++++++++ routes/web.php | 43 ++++ 26 files changed, 1553 insertions(+), 23 deletions(-) create mode 100644 app/Http/Controllers/FrontEnd/PublikasiController.php create mode 100644 app/Http/Controllers/Publikasi/AlbumController.php create mode 100644 app/Http/Controllers/Publikasi/GaleriController.php create mode 100644 app/Http/Requests/AlbumRequest.php create mode 100644 app/Http/Requests/GaleriRequest.php create mode 100644 app/Models/Album.php create mode 100644 app/Models/Galeri.php create mode 100644 app/Observers/AlbumObserver.php create mode 100644 app/Observers/GaleriObserver.php create mode 100644 database/migrations/2024_09_09_105521_create_albums_table.php create mode 100644 database/migrations/2024_09_09_121409_create_galeris_table.php create mode 100644 resources/views/forms/lock-modal.blade.php create mode 100644 resources/views/forms/unlock-modal.blade.php create mode 100644 resources/views/publikasi/album/_form.blade.php create mode 100644 resources/views/publikasi/album/create.blade.php create mode 100644 resources/views/publikasi/album/edit.blade.php create mode 100644 resources/views/publikasi/album/index.blade.php create mode 100644 resources/views/publikasi/galeri/_form.blade.php create mode 100644 resources/views/publikasi/galeri/create.blade.php create mode 100644 resources/views/publikasi/galeri/edit.blade.php create mode 100644 resources/views/publikasi/galeri/index.blade.php diff --git a/app/Http/Controllers/FrontEnd/PublikasiController.php b/app/Http/Controllers/FrontEnd/PublikasiController.php new file mode 100644 index 000000000..95a1e9a62 --- /dev/null +++ b/app/Http/Controllers/FrontEnd/PublikasiController.php @@ -0,0 +1,79 @@ +with(['galeris'])->paginate(9); + + + $page_title = 'Galeri'; + + + return view('pages.publikasi.album', compact('page_title', 'albums')); + } + + public function galeri($slug) + { + Counter::count('publikasi.galeri'); + + $galeris = Galeri::status()->whereRelation('album', 'slug', $slug)->paginate(9); + // $album = Album::with(['galeris'])->where('slug', $slug)->first(); + + $page_title = 'Galeri'; + + + return view('pages.publikasi.galeri', compact('page_title', 'galeris')); + } + + public function galeri_detail($slug) + { + Counter::count('publikasi.galeri'); + + $galeri = Galeri::where('slug', $slug)->first(); + + $page_title = 'Galeri'; + + + return view('pages.publikasi.galeri_detail', compact('page_title', 'galeri')); + } +} diff --git a/app/Http/Controllers/Publikasi/AlbumController.php b/app/Http/Controllers/Publikasi/AlbumController.php new file mode 100644 index 000000000..5acad5529 --- /dev/null +++ b/app/Http/Controllers/Publikasi/AlbumController.php @@ -0,0 +1,188 @@ +ajax()) { + return DataTables::of(Album::all()) + ->addIndexColumn() + ->addColumn('aksi', function ($row) { + // $data['show_web'] = route('berita.detail', $row->slug); + + if (! auth()->guest()) { + $data['edit_url'] = route('publikasi.album.edit', $row->id); + $data['delete_url'] = route('publikasi.album.destroy', $row->id); + if ($row->status == 1) { + $data['unlock_url'] = route('publikasi.album.status', $row->id); + } else { + $data['lock_url'] = route('publikasi.album.status', $row->id); + } + $data['detail_url'] = route('publikasi.galeri.index', $row->id); + } + + return view('forms.aksi', $data); + }) + ->editColumn('status', function ($row) { + if ($row->status == 0) { + return 'Tidak Aktif'; + } else { + return 'Aktif'; + } + }) + ->editColumn('dibuat', function ($row) { + return format_datetime($row->created_at); + }) + ->rawColumns(['aksi', 'status', 'dibuat']) + ->make(true); + } + } + + public function create() + { + $page_title = 'Album'; + $page_description = 'Tambah Album'; + + return view('publikasi.album.create', compact('page_title', 'page_description')); + } + + public function show(Album $album) + { + $page_title = 'Album'; + $page_description = 'List Album'; + + return view('publikasi.album.detail', compact('album', 'page_title', 'page_description')); + } + + public function store(AlbumRequest $request) + { + try { + $input = $request->all(); + if ($request->hasFile('gambar')) { + $file = $request->file('gambar'); + $path = Storage::putFile('public/publikasi/album', $file); + + $input['gambar'] = $path; + // $input['gambar'] = substr($path, 15); + } + + Album::create($input); + + return redirect()->route('publikasi.album.index')->with('success', 'Album berhasil disimpan!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Simpan album gagal!'); + } + } + + public function status(Album $album) + { + + try { + $album->update([ + 'status' => $album->status == 1 ? 0 : 1 + ]); + + flash()->success(trans('general.active-success')); + + return redirect()->route('publikasi.album.index'); + } catch (\Exception $e) { + report($e); + flash()->success(trans('general.active-error')); + + return redirect()->route('publikasi.album.index'); + } + } + + public function edit(Album $album) + { + $page_title = 'Album'; + $page_description = 'Ubah Album'; + + return view('publikasi.album.edit', compact('album', 'page_title', 'page_description')); + } + + public function update(AlbumRequest $request, Album $album) + { + try { + $input = $request->all(); + + if ($request->hasFile('gambar')) { + $file = $request->file('gambar'); + $path = Storage::putFile('public/publikasi/album', $file); + + $input['gambar'] = $path; + // $input['gambar'] = substr($path, 15); + } + + $album->update($input); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Album gagal dihapus!'); + } + + return redirect()->route('publikasi.album.index')->with('success', 'Album berhasil diubah!'); + } + + public function destroy(Album $album) + { + try { + $album->delete(); + } catch (\Exception $e) { + report($e); + + return redirect()->route('publikasi.album.index')->with('error', 'Album gagal dihapus!'); + } + + return redirect()->route('publikasi.album.index')->with('success', 'Album sukses dihapus!'); + } +} diff --git a/app/Http/Controllers/Publikasi/GaleriController.php b/app/Http/Controllers/Publikasi/GaleriController.php new file mode 100644 index 000000000..4b67e2e0f --- /dev/null +++ b/app/Http/Controllers/Publikasi/GaleriController.php @@ -0,0 +1,192 @@ +id); + + return view('publikasi.galeri.index', compact('page_title', 'page_description', 'album')); + } + + public function getDataGaleri(Request $request, Album $album) + { + if ($request->ajax()) { + return DataTables::of(Galeri::where('album_id', $album->id)) + ->addIndexColumn() + ->addColumn('aksi', function ($row) { + // $data['show_web'] = route('berita.detail', $row->slug); + + if (! auth()->guest()) { + $data['edit_url'] = route('publikasi.galeri.edit', $row->id); + $data['delete_url'] = route('publikasi.galeri.destroy', $row->id); + if ($row->status == 1) { + $data['unlock_url'] = route('publikasi.galeri.status', $row->id); + } else { + $data['lock_url'] = route('publikasi.galeri.status', $row->id); + } + } + + return view('forms.aksi', $data); + }) + ->editColumn('status', function ($row) { + if ($row->status == 0) { + return 'Tidak Aktif'; + } else { + return 'Aktif'; + } + }) + ->editColumn('dibuat', function ($row) { + return format_datetime($row->created_at); + }) + ->rawColumns(['aksi', 'status', 'dibuat']) + ->make(true); + } + } + + public function create() + { + $page_title = 'Galeri'; + $page_description = 'Tambah Galeri'; + + return view('publikasi.galeri.create', compact('page_title', 'page_description')); + } + + public function store(GaleriRequest $request) + { + try { + $input = $request->all(); + + $imageNames = []; + if ($request->hasFile('gambar')) { + foreach ($request->file('gambar') as $file) { + $path = Storage::putFile('public/publikasi/galeri', $file); + + $imageNames[] = $path; + } + $input['gambar'] = $imageNames; + } + + $input['album_id'] = Session::get('album_id'); + + Galeri::create($input); + + return redirect()->route('publikasi.galeri.index', Session::get('album_id'))->with('success', 'Album berhasil disimpan!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Simpan album gagal!'); + } + } + + public function status(Galeri $galeri) + { + + try { + $galeri->update([ + 'status' => $galeri->status == 1 ? 0 : 1 + ]); + + flash()->success(trans('general.active-success')); + + return redirect()->route('publikasi.galeri.index', Session::get('album_id')); + } catch (\Exception $e) { + report($e); + flash()->success(trans('general.active-error')); + + return redirect()->route('publikasi.galeri.index', Session::get('album_id')); + } + } + + public function edit(Galeri $galeri) + { + $page_title = 'Galeri'; + $page_description = 'Ubah Galeri'; + + return view('publikasi.galeri.edit', compact('galeri', 'page_title', 'page_description')); + } + + public function update(GaleriRequest $request, Galeri $galeri) + { + try { + $input = $request->all(); + + $imageNames = []; + if ($request->hasFile('gambar')) { + foreach ($request->file('gambar') as $file) { + $path = Storage::putFile('public/publikasi/galeri', $file); + + $imageNames[] = $path; + } + $input['gambar'] = $imageNames; + } + + $input['link'] = $input['jenis'] == 'file' ? null : $input['link']; + + $galeri->update($input); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Galeri gagal dihapus!'); + } + + return redirect()->route('publikasi.galeri.index', Session::get('album_id'))->with('success', 'Galeri berhasil diubah!'); + } + + public function destroy(Galeri $galeri) + { + try { + $galeri->delete(); + } catch (\Exception $e) { + report($e); + + return redirect()->route('publikasi.galeri.index', Session::get('album_id'))->with('error', 'Galeri gagal dihapus!'); + } + + return redirect()->route('publikasi.galeri.index', Session::get('album_id'))->with('success', 'Galeri sukses dihapus!'); + } +} diff --git a/app/Http/Requests/AlbumRequest.php b/app/Http/Requests/AlbumRequest.php new file mode 100644 index 000000000..8d313ba6b --- /dev/null +++ b/app/Http/Requests/AlbumRequest.php @@ -0,0 +1,32 @@ + + */ + public function rules() + { + return [ + 'judul' => 'required|string|max:191', + 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:1024|valid_file', + 'status' => 'nullable', + ]; + } +} diff --git a/app/Http/Requests/GaleriRequest.php b/app/Http/Requests/GaleriRequest.php new file mode 100644 index 000000000..bed893553 --- /dev/null +++ b/app/Http/Requests/GaleriRequest.php @@ -0,0 +1,34 @@ + + */ + public function rules() + { + return [ + 'judul' => 'required|string|max:191', + 'jenis' => 'required', + 'link' => $this->input('jenis') == 'url' ? 'required|max:255' : 'nullable', + 'gambar.*' => $this->input('jenis') == 'url' ? 'nullable' : 'required|image|mimes:jpg,jpeg,png|max:1024', + 'status' => 'required', + ]; + } +} diff --git a/app/Models/Album.php b/app/Models/Album.php new file mode 100644 index 000000000..dfdf695c5 --- /dev/null +++ b/app/Models/Album.php @@ -0,0 +1,51 @@ + 'boolean', + ]; + + /** + * Return the sluggable configuration array for this model. + */ + public function sluggable(): array + { + return [ + 'slug' => [ + 'source' => 'judul', + ], + ]; + } + + // public function getThumbnailAttribute() + // { + // return $this->attributes['thumbnail'] ? Storage::disk('public')->url($this->attributes['thumbnail']) : null; + // } + + public function scopeStatus($query, $value = 1) + { + return $query->where('status', $value); + } + + public function galeris(): HasMany + { + return $this->hasMany(Galeri::class); + } +} diff --git a/app/Models/Galeri.php b/app/Models/Galeri.php new file mode 100644 index 000000000..ed1471db4 --- /dev/null +++ b/app/Models/Galeri.php @@ -0,0 +1,55 @@ + 'array', + 'status' => 'boolean', + ]; + + /** + * Return the sluggable configuration array for this model. + */ + public function sluggable(): array + { + return [ + 'slug' => [ + 'source' => 'judul', + ], + ]; + } + + // public function getGambarAttribute() + // { + // return $this->attributes['gambar'] ? Storage::url('publikasi/galeri/' . $this->attributes['gambar']) : null; + // } + + public function scopeStatus($query, $value = 1) + { + return $query->where('status', $value); + } + + public function Album(): BelongsTo + { + return $this->belongsTo(Album::class); + } +} diff --git a/app/Observers/AlbumObserver.php b/app/Observers/AlbumObserver.php new file mode 100644 index 000000000..4d4787c4b --- /dev/null +++ b/app/Observers/AlbumObserver.php @@ -0,0 +1,68 @@ +isDirty('gambar')) { + Storage::disk('public')->delete($album->getOriginal('gambar')); + } + } + + /** + * Handle the Album "deleted" event. + * + * @param \App\Models\Album $album + * @return void + */ + public function deleted(Album $album) + { + if (!is_null($album->gambar)) { + Storage::disk('public')->delete($album->gambar); + } + } + + /** + * Handle the Album "restored" event. + * + * @param \App\Models\Album $album + * @return void + */ + public function restored(Album $album) + { + // + } + + /** + * Handle the Album "force deleted" event. + * + * @param \App\Models\Album $album + * @return void + */ + public function forceDeleted(Album $album) + { + // + } +} diff --git a/app/Observers/GaleriObserver.php b/app/Observers/GaleriObserver.php new file mode 100644 index 000000000..cda8f5df4 --- /dev/null +++ b/app/Observers/GaleriObserver.php @@ -0,0 +1,89 @@ +isDirty('gambar')) { + // Ambil gambar lama dan baru dari database + $oldImages = $galeri->getOriginal('gambar'); + $newImages = $galeri->gambar; + + if (is_array($oldImages)) { + // Cari gambar yang ada di array lama tapi tidak ada di array baru + $deletedImages = array_diff($oldImages, $newImages); + + // Hapus setiap gambar yang sudah tidak ada di array baru + foreach ($deletedImages as $image) { + Storage::disk('public')->delete($image); + } + } + } + } + + /** + * Handle the Galeri "deleted" event. + * + * @param \App\Models\Galeri $galeri + * @return void + */ + public function deleted(Galeri $galeri) + { + // Decode JSON images array + $images = $galeri->gambar; + + if (is_array($images)) { + foreach ($images as $image) { + // Cek jika file ada + if (Storage::disk('public')->exists($image)) { + // Hapus file gambar dari storage + Storage::disk('public')->delete($image); + } + } + } + } + + /** + * Handle the Galeri "restored" event. + * + * @param \App\Models\Galeri $galeri + * @return void + */ + public function restored(Galeri $galeri) + { + // + } + + /** + * Handle the Galeri "force deleted" event. + * + * @param \App\Models\Galeri $galeri + * @return void + */ + public function forceDeleted(Galeri $galeri) + { + // + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 28dfe8de2..0295696f9 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -31,6 +31,10 @@ namespace App\Providers; +use App\Models\Album; +use App\Models\Galeri; +use App\Observers\AlbumObserver; +use App\Observers\GaleriObserver; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -56,6 +60,8 @@ class EventServiceProvider extends ServiceProvider */ public function boot() { + Album::observe(AlbumObserver::class); + Galeri::observe(GaleriObserver::class); } /** diff --git a/database/migrations/2024_09_09_105521_create_albums_table.php b/database/migrations/2024_09_09_105521_create_albums_table.php new file mode 100644 index 000000000..018651999 --- /dev/null +++ b/database/migrations/2024_09_09_105521_create_albums_table.php @@ -0,0 +1,35 @@ +bigIncrements('id'); + $table->string('judul'); + $table->text('gambar')->nullable(); + $table->boolean('status')->default(1)->comment('0=tidak aktif, 1=aktif'); + $table->string('slug')->unique(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('albums'); + } +}; diff --git a/database/migrations/2024_09_09_121409_create_galeris_table.php b/database/migrations/2024_09_09_121409_create_galeris_table.php new file mode 100644 index 000000000..67b739354 --- /dev/null +++ b/database/migrations/2024_09_09_121409_create_galeris_table.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->foreignIdFor(Album::class)->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->string('judul'); + $table->text('gambar')->nullable(); + $table->string('link')->nullable(); + $table->boolean('status')->default(1)->comment('0=tidak aktif, 1=aktif'); + $table->enum('jenis', ['file', 'url'])->default('file'); + $table->string('slug')->unique(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('galeris'); + } +}; diff --git a/helpers/general_helper.php b/helpers/general_helper.php index eb389067b..19ec81d05 100644 --- a/helpers/general_helper.php +++ b/helpers/general_helper.php @@ -35,6 +35,7 @@ use App\Models\Navigation; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Storage; use willvincent\Feeds\Facades\FeedsFacade; /** @@ -93,16 +94,16 @@ function permission_val($id, $permission) function upload_image($image, $file) { $extension = $image->getClientOriginalExtension(); - $path = public_path('uploads/'.$file.'/'); + $path = public_path('uploads/' . $file . '/'); if (! file_exists($path)) { File::makeDirectory($path, 0777, true); } - $name = time().uniqid(); + $name = time() . uniqid(); $img = Image::make($image->getRealPath()); - $img->save($path.$name.'.'.$extension); + $img->save($path . $name . '.' . $extension); - return $name.'.'.$extension; + return $name . '.' . $extension; } /** @@ -180,7 +181,7 @@ function random_color_part() function random_color() { - return random_color_part().random_color_part().random_color_part(); + return random_color_part() . random_color_part() . random_color_part(); } function years_list() @@ -309,6 +310,11 @@ function is_wajib_ktp($umur, $status_kawin) return $wajib_ktp; } +function isThumbnail($url = null, $img = '/img/no-image.png') +{ + return !empty($url) && Storage::disk('public')->exists($url) ? Storage::disk('public')->url($url) : asset($img); +} + function is_img($url = null, $img = '/img/no-image.png') { return asset($url != null && file_exists(public_path($url)) ? $url : $img); @@ -322,10 +328,10 @@ function is_logo($url = '', $file = '/img/logo.png') function is_user($url = null, $sex = 1, $pengurus = null) { if ($url && ! $pengurus) { - $url = 'storage/penduduk/foto/'.$url; + $url = 'storage/penduduk/foto/' . $url; } - $default = 'img/pengguna/'.(($sex == 2) ? 'wuser.png' : 'kuser.png'); + $default = 'img/pengguna/' . (($sex == 2) ? 'wuser.png' : 'kuser.png'); return is_img($url, $default); } @@ -333,7 +339,7 @@ function is_user($url = null, $sex = 1, $pengurus = null) function avatar($foto) { if ($foto) { - $foto = 'storage/user/'.$foto; + $foto = 'storage/user/' . $foto; } $default = 'bower_components/admin-lte/dist/img/user2-160x160.jpg'; @@ -362,21 +368,21 @@ function terbilang($angka) $terbilang = ''; if ($angka < 12) { - $terbilang = ' '.$baca[$angka]; + $terbilang = ' ' . $baca[$angka]; } elseif ($angka < 20) { - $terbilang = terbilang($angka - 10).' Belas'; + $terbilang = terbilang($angka - 10) . ' Belas'; } elseif ($angka < 100) { - $terbilang = terbilang($angka / 10).' Puluh'.terbilang($angka % 10); + $terbilang = terbilang($angka / 10) . ' Puluh' . terbilang($angka % 10); } elseif ($angka < 200) { - $terbilang = ' seratus'.terbilang($angka - 100); + $terbilang = ' seratus' . terbilang($angka - 100); } elseif ($angka < 1000) { - $terbilang = terbilang($angka / 100).' Ratus'.terbilang($angka % 100); + $terbilang = terbilang($angka / 100) . ' Ratus' . terbilang($angka % 100); } elseif ($angka < 2000) { - $terbilang = ' seribu'.terbilang($angka - 1000); + $terbilang = ' seribu' . terbilang($angka - 1000); } elseif ($angka < 1000000) { - $terbilang = terbilang($angka / 1000).' Ribu'.terbilang($angka % 1000); + $terbilang = terbilang($angka / 1000) . ' Ribu' . terbilang($angka % 1000); } elseif ($angka < 1000000000) { - $terbilang = terbilang($angka / 1000000).' Juta'.terbilang($angka % 1000000); + $terbilang = terbilang($angka / 1000000) . ' Juta' . terbilang($angka % 1000000); } return $terbilang; @@ -450,7 +456,7 @@ function scan_themes() $themes = \Hexadog\ThemesManager\Facades\ThemesManager::all(); foreach ($themes as $theme) { // akse agar symlink dibuat - \Hexadog\ThemesManager\Facades\ThemesManager::set($theme->getVendor().'/'.$theme->getName()); + \Hexadog\ThemesManager\Facades\ThemesManager::set($theme->getVendor() . '/' . $theme->getName()); \App\Models\Themes::UpdateOrCreate([ 'vendor' => $theme->getVendor(), 'name' => $theme->getName(), @@ -485,10 +491,10 @@ function getFeeds() { return cache()->remember('feeds_desa', 60 * 60, function () { $all_desa = DataDesa::websiteUrl()->get() - ->map(function ($desa) { - return $desa->website_url_feed; - })->all(); - + ->map(function ($desa) { + return $desa->website_url_feed; + })->all(); + $feeds = []; foreach ($all_desa as $desa) { $getFeeds = FeedsFacade::make($desa['website'], 5, true); @@ -503,7 +509,7 @@ function getFeeds() 'author' => $item->get_author()->get_name() ?? 'Administrator', 'title' => $item->get_title(), 'image' => get_tag_image($item->get_description()), - 'description' => strip_tags(substr(str_replace(['&', 'nbsp;', '[...]'], '', $item->get_description()), 0, 250).'[...]'), + 'description' => strip_tags(substr(str_replace(['&', 'nbsp;', '[...]'], '', $item->get_description()), 0, 250) . '[...]'), 'content' => $item->get_content(), ]; } @@ -512,4 +518,4 @@ function getFeeds() return $feeds ?? null; }); } -} \ No newline at end of file +} diff --git a/resources/views/forms/aksi.blade.php b/resources/views/forms/aksi.blade.php index f1974aad5..1577e3911 100644 --- a/resources/views/forms/aksi.blade.php +++ b/resources/views/forms/aksi.blade.php @@ -24,6 +24,22 @@ @endif + @if (isset($lock_url)) + + + + @endif + @if (isset($unlock_url)) + + + + @endif @if (isset($edit_url)) diff --git a/resources/views/forms/lock-modal.blade.php b/resources/views/forms/lock-modal.blade.php new file mode 100644 index 000000000..4128b1e46 --- /dev/null +++ b/resources/views/forms/lock-modal.blade.php @@ -0,0 +1,30 @@ + + diff --git a/resources/views/forms/unlock-modal.blade.php b/resources/views/forms/unlock-modal.blade.php new file mode 100644 index 000000000..8547f8a34 --- /dev/null +++ b/resources/views/forms/unlock-modal.blade.php @@ -0,0 +1,30 @@ + + diff --git a/resources/views/layouts/fragments/sidebar.blade.php b/resources/views/layouts/fragments/sidebar.blade.php index c207d2fcd..8776fb057 100644 --- a/resources/views/layouts/fragments/sidebar.blade.php +++ b/resources/views/layouts/fragments/sidebar.blade.php @@ -80,6 +80,24 @@ @endif + + @if ($user->hasrole(['super-admin', 'admin-kecamatan', 'administrator-website', 'kontributor-artikel'])) +
  • + Publikasi + + + + +
      + @role('super-admin|admin-kecamatan|administrator-website') +
    • + Album +
    • + @endrole +
    +
  • + @endif + @if (!$user->hasrole(['admin-komplain', 'kontributor-artikel']))
  • Data diff --git a/resources/views/publikasi/album/_form.blade.php b/resources/views/publikasi/album/_form.blade.php new file mode 100644 index 000000000..2e75bb2f2 --- /dev/null +++ b/resources/views/publikasi/album/_form.blade.php @@ -0,0 +1,91 @@ +
    +
    +
    + +
    +
    + + + {!! Form::text('judul', null, ['placeholder' => 'Judul Album', 'class' => 'form-control']) !!} + @if ($errors->has('judul')) + {{ $errors->first('judul') }} + @endif +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + {!! Form::file('gambar', ['placeholder' => 'Thumbnail', 'class' => 'form-control', 'id' => + 'file-album', 'accept' => 'jpg,jpeg,png']) !!} + @if ($errors->has('thumbnail')) + {{ $errors->first('thumbnail') }} + @endif + +
    + +
    + + + {!! Form::select('status', ['0' => 'Tidak Aktif', '1' => 'Aktif'], null, ['class' => + 'form-control']) !!} + @if ($errors->has('status')) + {{ $errors->first('status') }} + @endif +
    +
    + + +
    +
    +
    + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/publikasi/album/create.blade.php b/resources/views/publikasi/album/create.blade.php new file mode 100644 index 000000000..3fa272114 --- /dev/null +++ b/resources/views/publikasi/album/create.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + {!! Form::open(['url' => route('publikasi.album.store'), 'files' => true]) !!} + + @include('publikasi.album._form') + + {!! Form::close() !!} + +
    +@endsection \ No newline at end of file diff --git a/resources/views/publikasi/album/edit.blade.php b/resources/views/publikasi/album/edit.blade.php new file mode 100644 index 000000000..746f87786 --- /dev/null +++ b/resources/views/publikasi/album/edit.blade.php @@ -0,0 +1,27 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + {!! Form::model($album, ['route' => ['publikasi.album.update', $album->id], 'method' => 'put', 'id' => + 'form-album', 'files' => true]) !!} + + @include('flash::message') + @include('publikasi.album._form') + + {!! Form::close() !!} + +
    +@endsection \ No newline at end of file diff --git a/resources/views/publikasi/album/index.blade.php b/resources/views/publikasi/album/index.blade.php new file mode 100644 index 000000000..ef8f24710 --- /dev/null +++ b/resources/views/publikasi/album/index.blade.php @@ -0,0 +1,84 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + @include('partials.flash_message') + +
    +
    +  Tambah +
    +
    +
    + + + + + + + + + +
    AksiNama AlbumAktifDimuat pada
    +
    +
    +
    +
    +@endsection + +@include('partials.asset_datatables') + +@push('scripts') + +@include('forms.datatable-vertical') +@include('forms.delete-modal') +@include('forms.lock-modal') +@include('forms.unlock-modal') +@endpush \ No newline at end of file diff --git a/resources/views/publikasi/galeri/_form.blade.php b/resources/views/publikasi/galeri/_form.blade.php new file mode 100644 index 000000000..a775e014c --- /dev/null +++ b/resources/views/publikasi/galeri/_form.blade.php @@ -0,0 +1,153 @@ +
    +
    +
    + +
    +
    + + + {!! Form::text('judul', null, ['placeholder' => 'Judul Galeri', 'class' => 'form-control']) !!} + @if ($errors->has('judul')) + {{ $errors->first('judul') }} + @endif +
    +
    + + + {!! Form::select('jenis', ['file' => 'File', 'url' => 'Link'], null, ['class' => + 'form-control', 'id' => 'jenis']) !!} + + @if ($errors->has('jenis')) + {{ $errors->first('jenis') }} + @endif +
    +
    + + + {!! Form::text('link', null, ['class' => 'form-control']) !!} + + @if ($errors->has('link')) + {{ $errors->first('link') }} + @endif +
    +
    + + +
    + + @if(isset($galeri->gambar)) + @foreach ($galeri->gambar as $image) + + @endforeach + @endif +
    + + @if(isset($galeri->gambar) == false) + + @endif + + {!! Form::file('gambar[]', [ + 'placeholder' => 'Thumbnail', + 'class' => 'form-control', + 'id' => 'file-album', + 'accept' => 'jpg,jpeg,png', + 'multiple' => true, + ]) !!} + + @if ($errors->has('gambar')) + {{ $errors->first('gambar') }} + @endif +
    +
    +
    +
    + +
    +
    +
    +
    + + {!! Form::select('status', ['0' => 'Tidak Aktif', '1' => 'Aktif'], null, ['class' => + 'form-control']) !!} +
    +
    + + +
    +
    +
    + +@push('scripts') + +@endpush diff --git a/resources/views/publikasi/galeri/create.blade.php b/resources/views/publikasi/galeri/create.blade.php new file mode 100644 index 000000000..7365293d7 --- /dev/null +++ b/resources/views/publikasi/galeri/create.blade.php @@ -0,0 +1,26 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + {!! Form::open(['url' => route('publikasi.galeri.store'), 'files' => true]) !!} + + + @include('publikasi.galeri._form') + + {!! Form::close() !!} + +
    +@endsection \ No newline at end of file diff --git a/resources/views/publikasi/galeri/edit.blade.php b/resources/views/publikasi/galeri/edit.blade.php new file mode 100644 index 000000000..0bccc973a --- /dev/null +++ b/resources/views/publikasi/galeri/edit.blade.php @@ -0,0 +1,27 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + {!! Form::model($galeri, ['route' => ['publikasi.galeri.update', $galeri->id], 'method' => 'put', 'id' => + 'form-galeri', 'files' => true]) !!} + + @include('flash::message') + @include('publikasi.galeri._form') + + {!! Form::close() !!} + +
    +@endsection \ No newline at end of file diff --git a/resources/views/publikasi/galeri/index.blade.php b/resources/views/publikasi/galeri/index.blade.php new file mode 100644 index 000000000..d58b68ca3 --- /dev/null +++ b/resources/views/publikasi/galeri/index.blade.php @@ -0,0 +1,86 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + @include('partials.flash_message') + +
    + +
    +
    + + + + + + + + + +
    AksiNama AlbumAktifDimuat pada
    +
    +
    +
    +
    +@endsection + +@include('partials.asset_datatables') + +@push('scripts') + +@include('forms.datatable-vertical') +@include('forms.delete-modal') +@include('forms.lock-modal') +@include('forms.unlock-modal') +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index b775e9232..b0f57e491 100644 --- a/routes/web.php +++ b/routes/web.php @@ -50,6 +50,8 @@ use App\Http\Controllers\Setting\TipeRegulasiController; use App\Http\Controllers\Setting\JenisPenyakitController; use App\Http\Controllers\Setting\KategoriKomplainController; +use App\Http\Controllers\UploadTemporaryImage; +use App\Http\Controllers\UploadTemporaryImageController; /* |-------------------------------------------------------------------------- @@ -86,6 +88,12 @@ Route::get('{slug}', 'PageController@detailBerita')->name('berita.detail'); }); + Route::group(['prefix' => 'publikasi'], function () { + Route::get('galeri', 'PublikasiController@album')->name('publik.publikasi.album'); + Route::get('galeri/{slug}', 'PublikasiController@galeri')->name('publik.publikasi.galeri'); + Route::get('galeri/detail/{slug}', 'PublikasiController@galeri_detail')->name('publik.publikasi.galeri.detail'); + }); + Route::group(['prefix' => 'profil'], function () { Route::get('letak-geografis', 'ProfilController@LetakGeografis')->name('profil.letak-geografis'); Route::get('struktur-pemerintahan', 'ProfilController@StrukturPemerintahan')->name('profil.struktur-pemerintahan'); @@ -330,6 +338,41 @@ }); }); + /** + * Group Routing for Publikasi + */ + Route::namespace('\App\Http\Controllers\Publikasi')->group(function () { + Route::group(['prefix' => 'admin/publikasi', 'middleware' => ['role:administrator-website|super-admin|admin-kecamatan|kontributor-artikel']], function () { + // Album + Route::group(['prefix' => 'album'], function () { + Route::get('/', ['as' => 'publikasi.album.index', 'uses' => 'AlbumController@index']); + Route::get('create', ['as' => 'publikasi.album.create', 'uses' => 'AlbumController@create']); + Route::get('getdata', ['as' => 'publikasi.album.getdata', 'uses' => 'AlbumController@getDataAlbum']); + Route::post('store', ['as' => 'publikasi.album.store', 'uses' => 'AlbumController@store']); + Route::put('status/{album}', ['as' => 'publikasi.album.status', 'uses' => 'AlbumController@status']); + Route::put('show/{album}', ['as' => 'publikasi.album.show', 'uses' => 'AlbumController@show']); + Route::get('edit/{album}', ['as' => 'publikasi.album.edit', 'uses' => 'AlbumController@edit']); + Route::put('update/{album}', ['as' => 'publikasi.album.update', 'uses' => 'AlbumController@update']); + Route::delete('destroy/{album}', ['as' => 'publikasi.album.destroy', 'uses' => 'AlbumController@destroy']); + }); + + // Galeri + Route::group(['prefix' => 'galeri'], function () { + Route::get('create', ['as' => 'publikasi.galeri.create', 'uses' => 'GaleriController@create']); + Route::post('store', ['as' => 'publikasi.galeri.store', 'uses' => 'GaleriController@store']); + Route::get('/{album}', ['as' => 'publikasi.galeri.index', 'uses' => 'GaleriController@index']); + Route::get( + 'getdata/{album}', + ['as' => 'publikasi.galeri.getdata', 'uses' => 'GaleriController@getDatagaleri'] + ); + Route::put('status/{galeri}', ['as' => 'publikasi.galeri.status', 'uses' => 'GaleriController@status']); + Route::get('edit/{galeri}', ['as' => 'publikasi.galeri.edit', 'uses' => 'GaleriController@edit']); + Route::put('update/{galeri}', ['as' => 'publikasi.galeri.update', 'uses' => 'GaleriController@update']); + Route::delete('destroy/{galeri}', ['as' => 'publikasi.galeri.destroy', 'uses' => 'GaleriController@destroy']); + }); + }); + }); + /** * Group Routing for Data */ From 14f1c566a5c1784cb14bba4ebe19bad8732ab0ed Mon Sep 17 00:00:00 2001 From: misarianto Date: Wed, 18 Sep 2024 08:31:00 +0700 Subject: [PATCH 05/35] Used 'git add -f' to override .gitignore rules for the themes/opendk/default/ folder --- .../views/pages/publikasi/album.blade.php | 30 +++++++++++ .../views/pages/publikasi/galeri.blade.php | 54 +++++++++++++++++++ .../pages/publikasi/galeri_detail.blade.php | 53 ++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 themes/opendk/default/resources/views/pages/publikasi/album.blade.php create mode 100644 themes/opendk/default/resources/views/pages/publikasi/galeri.blade.php create mode 100644 themes/opendk/default/resources/views/pages/publikasi/galeri_detail.blade.php diff --git a/themes/opendk/default/resources/views/pages/publikasi/album.blade.php b/themes/opendk/default/resources/views/pages/publikasi/album.blade.php new file mode 100644 index 000000000..2ab895cc9 --- /dev/null +++ b/themes/opendk/default/resources/views/pages/publikasi/album.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.app') +@section('title', 'Galeri') +@section('content') +
    + @forelse ($albums as $item) +
    +
    +
    + {{ $item->slug }} +
    +
    +
    {{ $item->judul + }}
    +

     {{ format_date($item->created_at) + }} |  Administrator

    + + Selengkapnya +
    +
    +
    + @empty +
    +

    Tidak ada Album yang ditampilkan!

    +
    + @endforelse +
    + {{ $albums->links('vendor.pagination.bootstrap-4') }} +
    +
    +@endsection diff --git a/themes/opendk/default/resources/views/pages/publikasi/galeri.blade.php b/themes/opendk/default/resources/views/pages/publikasi/galeri.blade.php new file mode 100644 index 000000000..d7033fc70 --- /dev/null +++ b/themes/opendk/default/resources/views/pages/publikasi/galeri.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.app') +@section('title', 'Galeri') +@section('content') +
    + @forelse ($galeris as $item) + + @if ($item->jenis == 'file') + + +
    +
    +
    + {{ $item->slug }} +
    +
    +
    {{ $item->judul + }}
    +

     {{ format_date($item->created_at) + }} |  Administrator

    + + Selengkapnya +
    +
    +
    + + @else +
    +
    +
    + {{ $item->slug }} +
    +
    +
    {{ $item->judul + }}
    +

     {{ format_date($item->created_at) + }} |  Administrator

    + + Selengkapnya +
    +
    +
    + @endif + @empty +
    +

    Tidak ada galeri yang ditampilkan!

    +
    + @endforelse +
    + {{ $galeris->links('vendor.pagination.bootstrap-4') }} +
    +
    +@endsection diff --git a/themes/opendk/default/resources/views/pages/publikasi/galeri_detail.blade.php b/themes/opendk/default/resources/views/pages/publikasi/galeri_detail.blade.php new file mode 100644 index 000000000..7929305ab --- /dev/null +++ b/themes/opendk/default/resources/views/pages/publikasi/galeri_detail.blade.php @@ -0,0 +1,53 @@ +@extends('layouts.app') +@section('title', 'Galeri') + +@push('css') + +@endpush + +@section('content') +
    +
    +
    +
    +

    Galeri : {{ + strtoupper($galeri->judul) }}

    +
    +
    +
    + + + @foreach ($galeri->gambar as $item) +
    +
    + Image +
    +
    + @endforeach +
    +
    +
    +@endsection + +@push('scripts') +@include('forms.image-modal') +@endpush \ No newline at end of file From ce73032062f6d78d0ebbe4f9e5cafd062f635f53 Mon Sep 17 00:00:00 2001 From: Abah Roland <59082428+vickyrolanda@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:46:46 +0700 Subject: [PATCH 06/35] [ci skip] memutahirkan catatan rilis --- catatan_rilis.md | 1 + 1 file changed, 1 insertion(+) diff --git a/catatan_rilis.md b/catatan_rilis.md index 06a68971b..c8dee8c88 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -5,6 +5,7 @@ Terima kasih pada @uddinmtm telah ikut berkontribusi. #### FITUR 1. [#632](https://github.com/OpenSID/OpenDK/issues/632) Tambahkan fitur penanganan komentar dan balasan komentar pada halaman detail artikel. +2. [#1024](https://github.com/OpenSID/OpenDK/issues/1024) Tambahkan fitur modul galeri pada website OpenDK. #### BUG From 5e7a6c1ab17152e91e8db1b2220ccb8bd3584515 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:05:03 +0700 Subject: [PATCH 07/35] CREATE: membuat global share pada variabel yang sering di gunakan dan mendaftarkannya di kerne --- app/Http/Kernel.php | 1 + app/Http/Middleware/GlobalShareMiddleware.php | 173 ++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 app/Http/Middleware/GlobalShareMiddleware.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 3181fa323..bdf2323d8 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -66,6 +66,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\SecurityHeaders::class, + \App\Http\Middleware\GlobalShareMiddleware::class, ], 'api' => [ diff --git a/app/Http/Middleware/GlobalShareMiddleware.php b/app/Http/Middleware/GlobalShareMiddleware.php new file mode 100644 index 000000000..cd743aba5 --- /dev/null +++ b/app/Http/Middleware/GlobalShareMiddleware.php @@ -0,0 +1,173 @@ +profil = Profil::first(); + $this->umum = DataUmum::first(); + $this->nama_camat = Pengurus::status()->camat()->first(); + + // Pemeriksaan akun pengurus untuk alur pemeriksaan surat + $this->akun_camat = Pengurus::status()->akunCamat()->first(); + $this->akun_sekretaris = Pengurus::status()->akunSekretaris()->first(); + + if (! $this->akun_camat) { + SettingAplikasi::where('key', 'tte')->update(['value' => 0]); + SettingAplikasi::where('key', 'pemeriksaan_camat')->update(['value' => 0]); + } + + if (! $this->akun_sekretaris) { + SettingAplikasi::where('key', 'pemeriksaan_sekretaris')->update(['value' => 0]); + } + + // Tambahan global variabel di luar setting aplikasi + $this->sebutan_tambahan = [ + 'sebutan_camat' => Jabatan::where('jenis', JenisJabatan::Camat)->first()->nama, + 'sebutan_sekretaris' => Jabatan::where('jenis', JenisJabatan::Sekretaris)->first()->nama, + ]; + + // Global variabel setting aplikasi + $this->settings = SettingAplikasi::pluck('value', 'key'); + $this->settings = $this->settings->merge($this->sebutan_tambahan); + View::share('settings', $this->settings); + + if (in_array($this->profil->provinsi_id, [91, 92])) { + $this->sebutan_wilayah = 'Distrik'; + $this->sebutan_kepala_wilayah = 'Kepala Distrik'; + } else { + $this->sebutan_wilayah = 'Kecamatan'; + $this->sebutan_kepala_wilayah = 'Camat'; + } + + if ($this->settings['tte']) { + SettingAplikasi::where('key', 'pemeriksaan_camat')->update(['value' => 1]); + } + + $this->kirimTrack(); + + // TODO : Gunakan untuk semua pengaturan jika sudah tersedia + $this->browser_title = SettingAplikasi::where('key', 'judul_aplikasi')->first()->value ?? ucwords($this->sebutan_wilayah . ' ' . $this->profil->nama_kecamatan); + + $navdesa = DataDesa::all(); + $navpotensi = TipePotensi::orderby('nama_kategori', 'ASC')->get(); + $pengurus = Pengurus::status()->get(); + + + View::share([ + 'profil' => $this->profil, + 'sebutan_wilayah' => $this->sebutan_wilayah, + 'sebutan_kepala_wilayah' => $this->sebutan_kepala_wilayah, + 'browser_title' => $this->browser_title, + 'navdesa' => $navdesa, + 'navpotensi' => $navpotensi, + 'camat' => $this->nama_camat, + 'pengurus' => $pengurus->sortBy('jabatan.jenis'), + ]); + } + + return $next($request); + } + + protected function kirimTrack() + { + if (config('app.demo') == true) { // jika posisi demo, matikan tracking + return; + } + + if (cache()->get('track') != null && cache()->get('track') == date('Y m d')) { + return; + } + + $host_pantau = config('app.host_pantau'); + $data = [ + 'url' => url('/'), + 'versi' => config('app.version'), + 'jml_desa' => DataDesa::count(), + 'desa' => json_encode(DataDesa::select(['desa_id', 'nama', 'sebutan_desa', 'path', 'website'])->get()), + 'jumlahdesa_sinkronisasi' => DataDesa::count(), + 'jumlah_penduduk' => Penduduk::where('status_dasar', 1)->count(), + 'jumlah_keluarga' => Keluarga::count(), + 'peta_wilayah' => $this->umum->path ?? '[[[[]]]]', + 'batas_wilayah' => json_encode([ + 'bts_wil_utara' => $this->umum->bts_wil_utara, + 'bts_wil_timur' => $this->umum->bts_wil_timur, + 'bts_wil_selatan' => $this->umum->bts_wil_selatan, + 'bts_wil_barat' => $this->umum->bts_wil_barat, + ]), + 'sebutan_wilayah' => $this->sebutan_wilayah, + 'alamat' => $this->profil->alamat, + 'jumlah_bantuan' => Program::count(), + 'kode_kecamatan' => $this->profil->kecamatan_id, + 'kode_kabupaten' => $this->profil->kabupaten_id, + 'kode_provinsi' => $this->profil->provinsi_id, + 'nama_kecamatan' => $this->profil->nama_kecamatan, + 'nama_kabupaten' => $this->profil->nama_kabupaten, + 'nama_provinsi' => $this->profil->nama_provinsi, + 'nama_camat' => $this->nama_camat, + 'lat' => $this->umum->lat, + 'lng' => $this->umum->lng, + ]; + + try { + $response = Http::withHeaders([ + 'token' => config('app.token_pantau'), + ])->post($host_pantau . 'track/opendk?token=' . config('app.token_pantau'), $data); + cache()->put('track', date('Y m d'), 60 * 60 * 24); + + return; + } catch (Exception $e) { + Log::notice($e); + + return; + } + } +} From 09fb3c5e7ba1802eb3e562e5b021daa2c0912bc1 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:20:30 +0700 Subject: [PATCH 08/35] CREATE: membuat main layout baru untuk kebutuhan configurasi livewire --- resources/views/layouts/app.blade.php | 138 ++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 resources/views/layouts/app.blade.php diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 000000000..74e83d33c --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,138 @@ + + + + + + + {{ $page_title ?? config('app.name', 'Laravel') }} | {{ $browser_title }} + + + + + + + + + + + + + + @stack('css') + + + + + + + + + + + + + + + + @livewireStyles + + + + +
    + + + @include('layouts.fragments.header') + + @include('layouts.fragments.sidebar') + + +
    + {{ $slot }} +
    + + + + @include('layouts.fragments.footer') + + + @include('layouts.fragments.control_sidebar') +
    + + + + + + + + + + + + + + + {{-- alpine.js --}} + + @stack('scripts') + + + + +@livewireScripts + + + + From fde016ee07231d500ced0e2bab00217ccd59076a Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:21:32 +0700 Subject: [PATCH 09/35] ALTER: merubah arah layout ke app pada configurasi livewire --- config/livewire.php | 171 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 config/livewire.php diff --git a/config/livewire.php b/config/livewire.php new file mode 100644 index 000000000..26074abcf --- /dev/null +++ b/config/livewire.php @@ -0,0 +1,171 @@ + 'App\\Http\\Livewire', + + /* + |-------------------------------------------------------------------------- + | View Path + |-------------------------------------------------------------------------- + | + | This value sets the path for Livewire component views. This affects + | file manipulation helper commands like `artisan make:livewire`. + | + */ + + 'view_path' => resource_path('views/livewire'), + + /* + |-------------------------------------------------------------------------- + | Layout + |-------------------------------------------------------------------------- + | The default layout view that will be used when rendering a component via + | Route::get('/some-endpoint', SomeComponent::class);. In this case the + | the view returned by SomeComponent will be wrapped in "layouts.app" + | + */ + + 'layout' => 'layouts.app', + + /* + |-------------------------------------------------------------------------- + | Livewire Assets URL + |-------------------------------------------------------------------------- + | + | This value sets the path to Livewire JavaScript assets, for cases where + | your app's domain root is not the correct path. By default, Livewire + | will load its JavaScript assets from the app's "relative root". + | + | Examples: "/assets", "myurl.com/app". + | + */ + + 'asset_url' => null, + + /* + |-------------------------------------------------------------------------- + | Livewire App URL + |-------------------------------------------------------------------------- + | + | This value should be used if livewire assets are served from CDN. + | Livewire will communicate with an app through this url. + | + | Examples: "https://my-app.com", "myurl.com/app". + | + */ + + 'app_url' => null, + + /* + |-------------------------------------------------------------------------- + | Livewire Endpoint Middleware Group + |-------------------------------------------------------------------------- + | + | This value sets the middleware group that will be applied to the main + | Livewire "message" endpoint (the endpoint that gets hit everytime + | a Livewire component updates). It is set to "web" by default. + | + */ + + 'middleware_group' => 'web', + + /* + |-------------------------------------------------------------------------- + | Livewire Temporary File Uploads Endpoint Configuration + |-------------------------------------------------------------------------- + | + | Livewire handles file uploads by storing uploads in a temporary directory + | before the file is validated and stored permanently. All file uploads + | are directed to a global endpoint for temporary storage. The config + | items below are used for customizing the way the endpoint works. + | + */ + + 'temporary_file_upload' => [ + 'disk' => null, // Example: 'local', 's3' Default: 'default' + 'rules' => null, // Example: ['file', 'mimes:png,jpg'] Default: ['required', 'file', 'max:12288'] (12MB) + 'directory' => null, // Example: 'tmp' Default 'livewire-tmp' + 'middleware' => null, // Example: 'throttle:5,1' Default: 'throttle:60,1' + 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs. + 'png', + 'gif', + 'bmp', + 'svg', + 'wav', + 'mp4', + 'mov', + 'avi', + 'wmv', + 'mp3', + 'm4a', + 'jpg', + 'jpeg', + 'mpga', + 'webp', + 'wma', + ], + 'max_upload_time' => 5, // Max duration (in minutes) before an upload gets invalidated. + ], + + /* + |-------------------------------------------------------------------------- + | Manifest File Path + |-------------------------------------------------------------------------- + | + | This value sets the path to the Livewire manifest file. + | The default should work for most cases (which is + | "/bootstrap/cache/livewire-components.php"), but for specific + | cases like when hosting on Laravel Vapor, it could be set to a different value. + | + | Example: for Laravel Vapor, it would be "/tmp/storage/bootstrap/cache/livewire-components.php". + | + */ + + 'manifest_path' => null, + + /* + |-------------------------------------------------------------------------- + | Back Button Cache + |-------------------------------------------------------------------------- + | + | This value determines whether the back button cache will be used on pages + | that contain Livewire. By disabling back button cache, it ensures that + | the back button shows the correct state of components, instead of + | potentially stale, cached data. + | + | Setting it to "false" (default) will disable back button cache. + | + */ + + 'back_button_cache' => false, + + /* + |-------------------------------------------------------------------------- + | Render On Redirect + |-------------------------------------------------------------------------- + | + | This value determines whether Livewire will render before it's redirected + | or not. Setting it to "false" (default) will mean the render method is + | skipped when redirecting. And "true" will mean the render method is + | run before redirecting. Browsers bfcache can store a potentially + | stale view if render is skipped on redirect. + | + */ + + 'render_on_redirect' => false, + +]; From b572144d1b40d68ed0d5aa9cacda3e9f9363cd0c Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:24:18 +0700 Subject: [PATCH 10/35] ADD: menambahkan gambar logo dan stempel untuk format template kerjasama --- public/img/layanan/logo.png | Bin 0 -> 71746 bytes public/img/layanan/stempel.png | Bin 0 -> 53989 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/img/layanan/logo.png create mode 100644 public/img/layanan/stempel.png diff --git a/public/img/layanan/logo.png b/public/img/layanan/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ae306ed115f0132c993438cbe3738375fbcee6d7 GIT binary patch literal 71746 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 literal 0 HcmV?d00001 diff --git a/public/img/layanan/stempel.png b/public/img/layanan/stempel.png new file mode 100644 index 0000000000000000000000000000000000000000..51d62698b8befd3af1b01e32d6879fc0d0cb6dc6 GIT binary patch literal 53989 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
  • 2(?%slK$*nKhT{ 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 mfddB)95`^`z`@f80RIOq-Nw196||fH0000 Date: Mon, 14 Oct 2024 17:25:31 +0700 Subject: [PATCH 11/35] CREATE: membuat component check_connection, upload_file dan button menggunakan alpine.js --- resources/views/components/button.blade.php | 10 +++++++ .../components/check_connection.blade.php | 28 +++++++++++++++++++ .../views/components/upload-file.blade.php | 18 ++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 resources/views/components/button.blade.php create mode 100644 resources/views/components/check_connection.blade.php create mode 100644 resources/views/components/upload-file.blade.php diff --git a/resources/views/components/button.blade.php b/resources/views/components/button.blade.php new file mode 100644 index 000000000..c5777ac79 --- /dev/null +++ b/resources/views/components/button.blade.php @@ -0,0 +1,10 @@ +@props(['loading' => false]) + + \ No newline at end of file diff --git a/resources/views/components/check_connection.blade.php b/resources/views/components/check_connection.blade.php new file mode 100644 index 000000000..a49675bbf --- /dev/null +++ b/resources/views/components/check_connection.blade.php @@ -0,0 +1,28 @@ +
    + + +
    + {{ $slot }} +
    + +
    \ No newline at end of file diff --git a/resources/views/components/upload-file.blade.php b/resources/views/components/upload-file.blade.php new file mode 100644 index 000000000..929ea6927 --- /dev/null +++ b/resources/views/components/upload-file.blade.php @@ -0,0 +1,18 @@ +
    + +
    +
    + +
    +
    + @if ($errors->has($attributes->get('name'))) + + {{ $errors->first($attributes->get('name')) }} + + @endif +
    \ No newline at end of file From 40da85fd00566c1a9b42f02099c3cd916b049004 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:26:31 +0700 Subject: [PATCH 12/35] CREATE: membuat service untuk akses ke api layanan open desa --- app/Services/ApiService.php | 124 ++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 app/Services/ApiService.php diff --git a/app/Services/ApiService.php b/app/Services/ApiService.php new file mode 100644 index 000000000..d42411ed1 --- /dev/null +++ b/app/Services/ApiService.php @@ -0,0 +1,124 @@ +setting = json_decode(json_encode(SettingAplikasi::pluck('value', 'key')->toArray())); + + if (isset($this->setting->layanan_opendesa_token) == false) { + DB::table('das_setting')->insert([ + 'key' => 'layanan_opendesa_token', + 'value' => 0, + 'type' => 'input', + 'description' => 'Token pelanggan Layanan OpenDESA', + 'kategori' => 'pelanggan', + 'option' => '{}', + ]); + } + + $this->server = config('app.server_layanan'); + } + + public function register($data) + { + + $response = Http::withHeaders([ + 'X-Requested-With' => 'XMLHttpRequest', + ])->attach( + 'permohonan', + Storage::get($data['permohonan']), + 'dokumen-permohonan.pdf' + )->post("{$this->server}/api/v1/pelanggan/register-kecamatan", [ + 'user_id' => auth()->user()->id, + 'email' => email($data['email']), + 'kecamatan' => bilangan_titik($data['kecamatan_id']), + 'kontak_no_hp' => bilangan($data['kontak_no_hp']), + 'kontak_nama' => nama($data['kontak_nama']), + 'no_hp_pj' => bilangan($data['kontak_no_hp']), + 'nama_pj' => nama($data['kontak_nama']), + 'domain' => alamat_web($data['domain']), + 'status_langganan' => (int) $data['status_langganan_id'], + ]); + + if ($response->successful()) { + return [ + 'success' => true, + 'message' => 'Pendaftaran pelanggan berhasil.', + 'data' => $response->json(), + ]; + } elseif ($response->failed()) { + return [ + 'success' => false, + 'message' => 'Pendaftaran pelanggan gagal.', + 'error' => $response->json(), + ]; + } else { + return [ + 'success' => false, + 'message' => 'Terjadi masalah pada pendaftaran pelanggan.', + 'status' => $response->status(), + ]; + } + } + + public function terdaftar($kode_kecamatan) + { + $response = Http::withHeaders([ + 'Authorization' => 'Bearer ' . $this->setting->layanan_opendesa_token, + 'X-Requested-With' => 'XMLHttpRequest', + ])->post("{$this->server}/api/v1/pelanggan/terdaftar-kecamatan", [ + 'kecamatan_id' => $kode_kecamatan, + ]); + + if ($response->successful()) { + return [ + 'success' => true, + 'message' => 'Data berhasil diambil.', + 'data' => $response->json(), + ]; + } else { + + return [ + 'success' => false, + 'message' => $response->object()->message, + 'data' => $response->body(), + ]; + } + } + + public function getFormRegister() + { + $response = Http::withHeaders([ + 'Authorization' => 'Bearer ' . $this->setting->layanan_opendesa_token, + 'X-Requested-With' => 'XMLHttpRequest', + ])->get("{$this->server}/api/v1/pelanggan/form-register-kecamatan"); + + if ($response->successful()) { + return [ + 'success' => true, + 'message' => 'Data berhasil diambil.', + 'data' => $response->json(), + ]; + } + + return [ + 'success' => false, + 'message' => 'Gagal mengambil data.', + 'status' => $response->status(), + ]; + } +} From 5022dc8db2c6c83fa7f3057ced5c16bac777991a Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:27:28 +0700 Subject: [PATCH 13/35] CREATE: membuat template format kerjasama --- .../template/dokumen_kerjasama.blade.php | 438 ++++++++++++++++++ 1 file changed, 438 insertions(+) create mode 100644 resources/views/template/dokumen_kerjasama.blade.php diff --git a/resources/views/template/dokumen_kerjasama.blade.php b/resources/views/template/dokumen_kerjasama.blade.php new file mode 100644 index 000000000..2d9c2ffb3 --- /dev/null +++ b/resources/views/template/dokumen_kerjasama.blade.php @@ -0,0 +1,438 @@ + + + + + + + + KESEPAKATAN MENJADI DESA DIGITAL {{ strtoupper($kecamatan) }} + + + + + + + + + + +
    + + +

    + KESEPAKATAN KERJASAMA +

    +

    + ANTARA +

    +

    + PEMERINTAH KECAMATAN {{ strtoupper($kecamatan) }} +

    +

    + DENGAN +

    +

    + PERKUMPULAN DESA DIGITAL TERBUKA +

    +

    + +

    +

    + TENTANG +

    +

    + + PEMANFAATAN APLIKASI DAN LAYANAN {{ strtoupper($kecamatan) }} MENUJU DESA + CERDAS + +

    +

    + +

    +

    + NOMOR : {{ "{$random}/{$hari}/{$bulan}/{$tahun}" }}
    + NOMOR : {{ "14. {$random}/DDT/{$bulan}/{$tahun}" }} +

    +
    + +
    +

    + Pada hari ini, {{ $nama_hari }} Tanggal {{ $hari }} Bulan {{ + $nama_bulan }} Tahun {{ $nama_tahun }} + bertempat di {{ $alamat }}, yang bertandatangan di bawah ini : +

    + + + + + + + + + + + + + + + + + + + + + +
    +

    + {{ $nama_camat }} +

    +
    +

    + : +

    +
    +

    + Kepala Kecamatan {{ $nama_camat }} yang berkedudukan dan + berkantor di {{ $alamat }}, dalam hal ini bertindak + dalam jabatannya selanjutnya disebut PIHAK KESATU. +

    +
    +
    +

    + LUSIANTO, S.Kom., M.Si +

    +
    +

    + : +

    +
    +

    + Jabatan Ketua Umum Perkumpulan Desa Digital Terbuka, berkedudukan di Sekretariat Nasional + Perkumpulan Desa Digital Terbuka, Nagari Tanjung Haro Sikabu-kabu Padang panjang Kecamatan Luak + kabupaten Lima Puluh Kota Provinsi Sumatera Barat, dalam hal ini bertindak untuk atas nama + perkumpulan desa digital terbuka, selanjutnya disebut PIHAK KEDUA. +

    +
    +
    +

    + PIHAK KESATU + dan PIHAK KEDUA yang selanjutnya disebut sebagai PARA PIHAK sepakat mengadakan + Kerjasama yang saling + menguntungkan dalam rangka pemenuhan tugas dan fungsi untuk kemajuan Kecamatan + {{ $kecamatan }} mewujudkan Desa Digital melalui pemanfaatan aplikasi dan layanan yang + disediakan PIHAK KEDUA, dengan ketentuan sebagai berikut: +

    +

    +

    + PASAL 1
    + DASAR HUKUM +

    +
      +
    1. +

      + Undang-Undang Nomor 11 Tahun 2008 tentang Informasi dan Transaksi + Elektronik. +

      +
    2. +
    3. +

      + Undang Undang Nomor 14 Tahun 2008 tentang Keterbukaan Informasi Publik. +

      +
    4. +
    5. +

      + Undang-undang Nomor 25 Tahun 2009 tentang Pelayanan Publik. +

      +
    6. +
    7. +

      + Undang-Undang Nomor 6 Tahun 2014 tentang Desa. +

      +
    8. +
    9. +

      + Peraturan Pemerintah Nomor 43 Tahun 2014 tentang Peraturan Pelaksanaan + Undang-Undang Nomor 6 tahun 2014 tentang Desa (Lembaran Negara Republik + Indonesia Tahun 2014 Nomor 123, Tambahan Lembaran Negara Republik Indonesia + Nomor 5539) sebagaimana telah diubah dengan Peraturan Pemerintah Nomor 47 + Tahun 2015 tentang Perubahan Peraturan Pemerintah Nomor 43 Tahun 2014 + tentang Peraturan Pelaksanaan Undang Undang Nomor 6 tahun 2014 tentang + Desa. +

      +
    10. +
    11. +

      + Peraturan Menteri Dalam Negeri Republik Indonesia Nomor 96 Tahun 2017 + tentang Tata Cara Kerja Sama Desa di Bidang Pemerintahan. +

      +
    12. +
    13. +

      + Peraturan Menteri Dalam Negeri Republik Indonesia Nomor 20 Tahun 2018 + Tentang Pengelolaan Keuangan Desa. +

      +
    14. +
    15. +

      + Peraturan Lembaga Kebijakan Pengadaan Barang/Jasa Pemerintah Nomor 12 + Tahun 2019 tentang pedoman Penyusunan Tata Cara Pengadaan Barang/Jasa di + Desa. +

      +
    16. +
    17. +

      + Peraturan Menteri Desa, Pembangunan Daerah Tertinggi dan Transmigrasi + Republik Indonesia Nomor 21 Tahun 2020 tentang Pedoman Umum Pembangunan + Desa dan Pemberdayaan Masyarakat Desa. +

      +
    18. +
    +
    +

    + PASAL 2
    + MAKSUD DAN TUJUAN +

    +

    + PIHAK KESATU + bertujuan mewujudkan Kecamatan {{ $kecamatan }} menjadi Desa Digital menuju + Desa Cerdas. Untuk tujuan itu, PIHAK KESATU bermaksud + menggunakan aplikasi dan layanan yang disediakan {{ $kecamatan }}. +

    +

    + Maksud dan tujuan Kesepakatan Kerjasama ini adalah untuk saling mendukung dan + bersinergi dalam rangka mewujudkan pemerintahan desa yang transparan dan + efisien dengan menggunakan teknologi informasi dan komunikasi (ICT) untuk + meningkatkan kapasitas desa dalam rangka mewujudkan Desa Digital menuju + Desa Cerdas. +

    +
    +

    + PASAL 3
    + RUANG LINGKUP +

    +

    + Ruang lingkup Kesepakatan Kerjasama ini adalah pemanfaatan aplikasi dan + layanan yang disediakan {{ $kecamatan }}. +

    +

    +

    + PASAL 4
    + PELAKSANAAN +

    +
      +
    1. +

      + Pelaksanaan Kesepakatan Kerjasama ini adalah mewujudkan Desa Digital di Kecamatan {{ $kecamatan }} + dengan + memanfaatkan aplikasi dan + layanan yang disediakan PIHAK KEDUA. +

      +
    2. +
    3. +

      + Dengan berlakunya Kesepakatan Kerjasama ini, PIHAK KEDUA + akan menyediakan layanan {{ $kecamatan }} untuk dapat dimanfaatkan oleh PIHAK + KESATU, di mana + layanan + tersebut hanya tersedia bagi + desa yang telah bekerjasama sehingga terdaftar sebagai Desa Digital + {{ $kecamatan }}. +

      +
    4. +
    5. +

      + Untuk mewujudkan Desa Digital, PIHAK KESATU dapat + memanfaatkan dan memesan aplikasi dan layanan PIHAK KEDUA + sesuai ketentuan pemesanan dan penggunaan masing-masing aplikasi dan + layanan. +

      +
    6. +
    7. +

      + Terhadap pelaksanaan Kesepakatan Kerjasama ini sebagaimana dimaksud pada + ayat (1) akan dilakukan pemantauan dan evaluasi secara berkala oleh PARA PIHAK sebagai + laporan + dalam rangka mendukung + perencanaan program kerja sama selanjutnya. +

      +
    8. +
    +
    +

    + PASAL 5
    + JANGKA WAKTU +

    +
      +
    1. +

      + Kesepakatan Kerjasama berlaku terhitung sejak ditandatanganinya + Kesepakatan Kerjasama ini tanpa batas waktu. +

      +
    2. +
    3. +

      + Kesepakatan Kerjasama ini dapat diakhiri oleh PARA PIHAK + dengan pemberitahuan tertulis dari satu pihak kepada pihak yang lain. +

      +
    4. +
    +
    +

    + PASAL 6
    + PEMBIAYAAN +

    +

    + Kecamatan {{ $kecamatan }} akan berkontribusi dalam pembiayaan gotong-royong nasional + pengembangan dan penerapan aplikasi kelolaan {{ $kecamatan }} sesuai dengan + aplikasi dan layanan yang dimanfaatkan. Pembiayaan tersebut diturunkan + dalam perjanjian atau pemesanan terpisah yang disepakati PARA PIHAK untuk aplikasi dan layanan + yang + digunakan. +

    +
    +

    + PASAL 7
    + PENYELESAIAN PERSELISIHAN +

    +
      +
    1. +

      + Setiap perselisihan, pertentangan dan perbedaan pendapat yang timbul + sehubungan dengan Perjanjian ini akan diselesaikan terlebih dahulu secara + musyawarah dan mufakat oleh PARA PIHAK. +

      +
    2. +
    3. +

      + Apabila penyelesaian secara musyawarah tidak berhasil mencapai mufakat, + maka PARA PIHAK sepakat untuk menyerahkan penyelesaian + perselisihan tersebut melalui Pengadilan. +

      +
    4. +
    5. +

      + + Mengenai Perjanjian ini dan segala akibatnya, PARA PIHAK memilih kediaman hukum atau + domisili + yang tetap + dan umum di Kantor Pengadilan Negeri Kabupaten Lima Puluh Kota. +

      +
    6. +
    +

    +

    + PASAL 8
    + LAIN-LAIN +

    +
      +
    1. +

      + Pelaksanaan Kesepakatan Kerjasama ini tidak terpengaruh dengan terjadinya + pergantian kepemimpinan dari PARA PIHAK. +

      +
    2. +
    3. +

      + Dalam hal terjadi perubahan atau terdapat ketentuan yang belum diatur + dalam Kesepakatan Kerjasama ini dituangkan dalam bentuk addendum + atas persetujuan PARA PIHAK yang merupakan bagian tidak + terpisahkan dari Kesepakatan Kerjasama ini. +

      +
    4. +
    +
    +

    + PASAL 9
    + PENUTUP +

    +
      +
    1. +

      + Kesepakatan Kerjasama ini dibuat dalam rangkap 1 (satu) bermeterai cukup + dan ditandatangani basah oleh PIHAK KESATU dan tanda + tangan digital oleh PIHAK KEDUA. +

      +
    2. +
    3. +

      + Kesepakatan Kerjasama ini disampaikan untuk disepakati PIHAK KEDUA dengan diunggahnya + hasil + scan + Perjanjian ini + yang telah ditandatangani PIHAK KESATU sesuai ayat (1) + melalui fitur pendaftaran Desa Digital {{ $kecamatan }} yang disediakan di aplikasi + {{ $browser_title }}. PIHAK KEDUA secara resmi menyatakan persetujuan + dengan Kesepakatan Kerjasama ini dengan mengubah status pendaftaran menjadi + TERDAFTAR. +

      +
    4. +
    5. +

      + Setelah Kesepakatan Kerjasama ini dieksekusi, Kecamatan {{ $kecamatan }} akan resmi + terdaftar sebagai Desa Digital {{ $kecamatan }}, dan berhak mengakses aplikasi, + layanan dan kegiatan yang hanya tersedia bagi desa yang terdaftar sebagai + Desa Digital {{ $kecamatan }}. +

      +
    6. +
    7. +

      + Kesepakatan Kerjasama ini dibuat dengan semangat kerja sama yang baik, + untuk dipatuhi dan dilaksanakan oleh PARA PIHAK. +

      +
    8. +
    +
    + + + + + + + + + + + + + + + + + + + +
    +

    + +

    +
    + Kecamatan {{ $kecamatan }}, {{ $tanggal }} +
    +

    + PIHAK KESATU, +

    +
    +

    + PIHAK KEDUA, +

    +
    + +
    +

    + {{ $nama_camat }} +

    +
    +

    + LUSIANTO, S.Kom., M.Si +

    +
    + + + \ No newline at end of file From 0aaf15211dc2c52fec7fd2f7ec706b2952499338 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:32:41 +0700 Subject: [PATCH 14/35] CREATE: membuat fitur utama kerjasama menggunakan component livewire --- .../PendaftaranKerjasamaController.php | 34 ++ app/Http/Livewire/Components/Alert.php | 24 ++ .../Kerjasama/PendaftaranKerjasama.php | 131 ++++++++ .../views/livewire/components/alert.blade.php | 7 + .../pendaftaran_kerjasama/index.blade.php | 291 ++++++++++++++++++ 5 files changed, 487 insertions(+) create mode 100644 app/Http/Controllers/Kerjasama/PendaftaranKerjasamaController.php create mode 100644 app/Http/Livewire/Components/Alert.php create mode 100644 app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php create mode 100644 resources/views/livewire/components/alert.blade.php create mode 100644 resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php diff --git a/app/Http/Controllers/Kerjasama/PendaftaranKerjasamaController.php b/app/Http/Controllers/Kerjasama/PendaftaranKerjasamaController.php new file mode 100644 index 000000000..d48786773 --- /dev/null +++ b/app/Http/Controllers/Kerjasama/PendaftaranKerjasamaController.php @@ -0,0 +1,34 @@ +profil['nama_kecamatan']; + $data['logo'] = $this->profil['file_logo']; + $data['random'] = substr(str_shuffle('0123456789'), 0, 4); + $data['hari'] = $date->format('d'); + $data['nama_hari'] = ucwords(hari($date->getTimestamp())); + $data['nama_tanggal'] = ucwords(to_word($date->format('d'))); + $data['bulan'] = $date->format('m'); + $data['nama_bulan'] = ucwords(getBulan($date->format('m'))); + $data['tahun'] = $date->format('Y'); + $data['nama_tahun'] = ucwords(to_word($date->format('Y'))); + $data['nama_camat'] = strtoupper($this->profil['nama_camat']); + $data['alamat'] = $this->profil['alamat']; + $data['stempel'] = asset('img/layanan/stempel.png'); + $data['layanan_logo'] = asset('img/layanan/logo.png'); + + Carbon::setLocale('id'); + $data['tanggal'] = $date->translatedFormat('l, d F Y'); + + return view('template.dokumen_kerjasama', $data); + } +} diff --git a/app/Http/Livewire/Components/Alert.php b/app/Http/Livewire/Components/Alert.php new file mode 100644 index 000000000..104a00f21 --- /dev/null +++ b/app/Http/Livewire/Components/Alert.php @@ -0,0 +1,24 @@ +message = $message; + $this->alertType = $type; + } + + public function render() + { + return view('livewire.components.alert'); + } +} diff --git a/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php b/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php new file mode 100644 index 000000000..cc151cf15 --- /dev/null +++ b/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php @@ -0,0 +1,131 @@ +kecamatan_id = view()->shared('profil')->kecamatan_id; + + $this->domain = config('app.url'); + } + + public function render() + { + $apiService = new ApiService(); + $response = $apiService->terdaftar($this->kecamatan_id); + + if ($response['success']) { + + $this->status_registrasi_id = $response['data']['data']['status_langgaan_id']; + $this->pesan_terdaftar = $response['data']['message']; + + $this->response = $response['data']['data']; + } else { + + $apiService = new ApiService(); + $res_form = $apiService->getFormRegister(); + + if ($res_form['success']) { + $this->response = $res_form['data']['data']; + $this->status_langganan = $this->response['status_langganan']; + } + } + + return view('livewire.kerjasama.pendaftaran_kerjasama.index'); + } + + public function rules() + { + return [ + 'email' => 'required|email', + 'domain' => 'required', + 'kontak_nama' => 'required|min:5', + 'kontak_no_hp' => 'required', + 'kecamatan_id' => 'required', + 'permohonan' => 'required:mimes:pdf|max:1024', + ]; + } + + public function updated($propertyName) + { + $this->validateOnly($propertyName); + } + + public function register() + { + + $this->validate(); + + try { + + $ext = $this->permohonan->guessExtension(); + $name = "dokumen-permohonan.{$ext}"; + $path = $this->permohonan->storeAs('public/kecamatan/upload/dokumen', $name); + + $data = [ + 'email' => $this->email, + 'domain' => $this->domain, + 'kontak_nama' => $this->kontak_nama, + 'desa' => view()->shared('profil')->nama_kecamatan, + 'kontak_no_hp' => $this->kontak_no_hp, + 'kecamatan_id' => $this->kecamatan_id, + 'status_langganan_id' => $this->status_registrasi_id, + 'permohonan' => $path + ]; + + $apiService = new ApiService(); + $response = $apiService->register($data); + + if ($response['success']) { + + SettingAplikasi::where('key', 'layanan_opendesa_token')->update([ + 'value' => $response['data']['data']['token'] + ]); + + // kalo sudah berhasil panggil service daftar + $apiService = new ApiService(); + $res_terdaftar = $apiService->terdaftar($this->kecamatan_id); + if ($res_terdaftar['success']) { + $this->response = $res_terdaftar; + $this->emit('triggerAlert', $response['data']['message'], 'success'); + } else { + $this->emit('triggerAlert', $response['message'], 'success'); + } + } else { + $this->emit('triggerAlert', $response['error']['message'], 'danger'); + } + } catch (\Exception $e) { + $this->emit('triggerAlert', $e->getMessage(), 'danger'); + } + } +} diff --git a/resources/views/livewire/components/alert.blade.php b/resources/views/livewire/components/alert.blade.php new file mode 100644 index 000000000..dfc9e0db5 --- /dev/null +++ b/resources/views/livewire/components/alert.blade.php @@ -0,0 +1,7 @@ +
    + @if($message) +
    + {{ $alertType }} : {{ $message }} +
    + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php b/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php new file mode 100644 index 000000000..e9696fb05 --- /dev/null +++ b/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php @@ -0,0 +1,291 @@ +@push('css') + +@endpush +
    +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + + +
    + + +
    +
    +
    +

    Pendaftaran Kerjasama {{ $profil['nama_kecamatan'] }}

    +
    +
    +

    {{ $profil['nama_kecamatan'] }} (lembaga hukum dikukuhkan Keputusan Menteri Hukum dan Hak + Asasi + Manusia + Nomor AHU-0001417.AH.01.08.Tahun 2021) menyediakan aplikasi dan layanan yang memerlukan + kontribusi yang + perlu dianggarkan Desa. Untuk memenuhi peraturan pengadaan yang berlaku, Desa perlu memiliki + kerjasama + pengadaan dengan {{ $profil['nama_kecamatan'] }} sebelum dapat menggunakan aplikasi dan + layanan + {{ $profil['nama_kecamatan'] }} berbayar tersebut.

    +

    Gunakan fitur ini untuk mendaftarkan dan mengeksekusi kerjasama resmi dengan + {{ $profil['nama_kecamatan'] }}. Setelah Kesepakatan Kerjasama antara Desa dan + {{ $profil['nama_kecamatan'] }} berlaku, Desa akan + terdaftar sebagai Desa Digital {{ $profil['nama_kecamatan'] }} dan + berhak mengakses aplikasi dan layanan {{ $profil['nama_kecamatan'] }} berbayar dan + program-program + peningkatan desa digital lainnya.

    +

    Cetak dokumen Kesepakatan Kerjasama menggunakan tombol yang disediakan. Langkah untuk + melengkapi + pendaftaran adalah sebagai berikut:

    +

    +

      +
    1. Cetak dokumen Kesepakatan Kerjasama (Pada pengaturan cetak, Option : Headers and Footers + jangan di + centang).
    2. +
    3. Isi tanggal penandatanganan.
    4. +
    5. Tandatangani oleh Kades sebagai PIHAK KESATU di atas meterai Rp10.000
    6. +
    7. Scan dokumen yang telah ditandatangani.
    8. +
    9. Unggah hasil scan menggunakan form pendaftaran.
    10. +
    11. Simpan dokumen asli di arsip kantor desa.
    12. +
    13. Cek email inbox/pesan yang Anda gunakan untuk memverifikasi.
    14. +
    15. Setelah pendaftaran diverifikasi dan kerjasama diaktifkan oleh + {{ $profil['nama_kecamatan'] }}, + email pemberitahuan akan dikirim ke alamat email terdaftar.
    16. +
    +
    +
    + + @if ($status_langganan === 'menunggu verifikasi email') +
    +
    + +

    Status Registrasi

    +
    +
    +
    +
    Kami telah mengirim link verifikasi ke {{ $email }}
    Silahkan cek email + Anda + untuk memverifikasi, atau kirim ulang pendaftaran kerjasama menggunakan email aktif + untuk menerima + link verifikasi baru.
    +
    +
    +
    + +
    +
    + +

    Langkah-langkah melakukan pengecekan email untuk verifikasi +

    +
    +
    +
    1. Cek folder kotak masuk / inbox, jika ada, maka silahkan klik pesan tersebut lalu klik + tombol + verifikasi email.
    +
    2. Cek folder spam, jika ada, maka:
    + - Klik pesan lalu hapus label spam pada pesan tersebut.
    + - Setelah label spam dihapus, pesan akan masuk ke folder inbox.
    + - Selanjutnya cek folder inbox, dan silahkan klik pesan dan klik tombol verifikasi.
    +
    +
    3. Jika Anda tidak menerima pesan pada folder inbox dan folder spam, silahkan kirim + ulang + pendaftaran kerjasama menggunakan email aktif untuk menerima link verifikasi baru, + pastikan + email + sudah benar.
    +
    +
    +
    + @elseif ($status_langganan === 'menunggu verifikasi pendaftaran') +
    +
    + +

    Status Registrasi

    +
    +
    +
    +
    Dokumen permohonan kerjasama Desa anda sedang diperiksa oleh Pelaksana Layanan + {{ $profil['nama_kecamatan'] }}.
    +
    +
    +
    + @endif + + {{-- sudah terdaftar --}} + @if ($status_registrasi_id == 6) +
    +
    + +

    {{ $pesan_terdaftar }}

    +
    +
    +
    Rincian Pelanggan
    +
    + + + + + + + + + + + + + + + + + + + + + {{-- prettier-ignore-start --}} + + {{-- prettier-ignore-end --}} + + + + + + + + + + + + +
    ID Pelanggan:{{ $response['id'] }}
    Status Registrasi:{{ $response['status_langganan'] }}
    KODE {{ strtoupper($profil['nama_kecamatan']) }} : {{ $response['kecamatan_id']}}
    {{ strtoupper($profil['nama_kecamatan']) }} : {{ "Kecamatan {$profil['nama_kecamatan']}" }} +
    Domain Desa : {{ $response['domain'] }}
    Nama Kontak : {{ "{$response['nama_kontak']} | {$response['no_hp_kontak']}" }}
    +
    +
    +
    + @else + + + +
    +
    +

    Form Pendaftaran Kerjasama

    + Unduh Dokumen + Kerjasama +
    +
    +
    +
    + +
    + + + @if ($errors->has('email')) + {{ $errors->first('email') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('status_registrasi')) + {{ $errors->first('status_registrasi') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('kecamatan_id')) + {{ $errors->first('kecamatan_id') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('domain')) + {{ $errors->first('domain') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('kontak_nama')) + {{ $errors->first('kontak_nama') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('kontak_no_hp')) + {{ $errors->first('kontak_no_hp') }} + @endif +
    +
    +
    + +
    + + @if ($errors->has('permohonan')) + {{ $errors->first('permohonan') }} + @endif +
    +
    +
    + +
    +
    + @endif +
    + +
    + +
    + +
    From 6585810629dae847b94c909e394487baf310a66c Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:34:30 +0700 Subject: [PATCH 15/35] ADD: menambahkan route pendaftaran kerjasama --- routes/web.php | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/routes/web.php b/routes/web.php index 459822725..54887e14b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -53,6 +53,7 @@ use App\Http\Controllers\Setting\KategoriKomplainController; use App\Http\Controllers\UploadTemporaryImage; use App\Http\Controllers\UploadTemporaryImageController; +use Maatwebsite\Excel\Row; /* |-------------------------------------------------------------------------- @@ -94,7 +95,7 @@ Route::get('galeri/{slug}', 'PublikasiController@galeri')->name('publik.publikasi.galeri'); Route::get('galeri/detail/{slug}', 'PublikasiController@galeri_detail')->name('publik.publikasi.galeri.detail'); }); - + // Rute untuk kirim dan balas komentar artikel Route::post('comments/store', [PageController::class, 'kirimKomentar'])->name('comments.store'); Route::get('comments/modal', [PageController::class, 'modalKirimBalasan'])->name('comments.modal'); @@ -297,7 +298,7 @@ Route::post('update-status', ['as' => 'informasi.komentar-artikel.updateStatus', 'uses' => 'KomentarArtikelController@updateStatus']); Route::delete('destroy/{id}', ['as' => 'informasi.komentar-artikel.destroy', 'uses' => 'KomentarArtikelController@destroy']); }); - + // Form Dokumen Route::group(['prefix' => 'form-dokumen'], function () { @@ -388,6 +389,11 @@ }); }); + Route::group(['prefix' => 'kerjasama'], function () { + Route::get('/pendaftaran-kerjasama', \App\Http\Livewire\Kerjasama\PendaftaranKerjasama::class)->name('kerjasama.pendaftaran.kerjasama'); + Route::get('/template', [\App\Http\Controllers\Kerjasama\PendaftaranKerjasamaController::class, 'dokumen_template'])->name('kerjasama.pendaftaran.kerjasama.template'); + }); + /** * Group Routing for Data */ @@ -400,6 +406,18 @@ Route::get('success/{id}', ['as' => 'data.profil.success', 'uses' => 'ProfilController@success']); }); + // pendaftaran kerjasama + // Route::group(['prefix' => 'pendaftaran-kerjasama', 'excluded_middleware' => 'xss_sanitization', 'middleware' => ['role:super-admin|admin-kecamatan']], function () { + + // Route::get('/', ['as' => 'data.pendaftaran.kerjasama', 'uses' => 'PendaftaranKerjasamaController@index']); + + // Route::get('/terdaftar', ['as' => 'data.pendaftaran.kerjasama.terdaftar', 'uses' => 'PendaftaranKerjasamaController@terdaftar']); + // Route::get('/form', ['as' => 'data.pendaftaran.kerjasama.form', 'uses' => 'PendaftaranKerjasamaController@form']); + // Route::get('/dokumen_template', ['as' => 'data.pendaftaran.kerjasama.dokumen_template', 'uses' => 'PendaftaranKerjasamaController@dokumen_template']); + // Route::post('/register', ['as' => 'data.pendaftaran.kerjasama.register', 'uses' => 'PendaftaranKerjasamaController@register']); + // }); + + // Data Umum Route::group(['prefix' => 'data-umum', 'excluded_middleware' => 'xss_sanitization', 'middleware' => ['role:super-admin|data-kecamatan']], function () { Route::get('/', ['as' => 'data.data-umum.index', 'uses' => 'DataUmumController@index']); From 70a0ad34a9a138ed653e63bd532f508837ded05e Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:35:07 +0700 Subject: [PATCH 16/35] ADD: menambhkan beberapa fungsi kerjsama pada helper --- helpers/general_helper.php | 175 +++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/helpers/general_helper.php b/helpers/general_helper.php index 19ec81d05..6fa3777a2 100644 --- a/helpers/general_helper.php +++ b/helpers/general_helper.php @@ -519,3 +519,178 @@ function getFeeds() }); } } + + +// Email hanya boleh berisi karakter alpha, numeric, titik, strip dan Tanda et, +function email($str): ?string +{ + return preg_replace('/[^a-zA-Z0-9@\\.\\-]/', '', htmlentities($str)); +} + +function bilangan_titik($str): ?string +{ + return preg_replace('/[^0-9\.]/', '', strip_tags($str)); +} + +// website hanya boleh berisi karakter alpha, numeric, titik, titik dua dan garis miring +function alamat_web($str): ?string +{ + return preg_replace('/[^a-zA-Z0-9:\\/\\.\\-]/', '', htmlentities($str)); +} + +function bilangan($str) +{ + if ($str == null) { + return null; + } + + return preg_replace('/[^0-9]/', '', strip_tags($str)); +} + +// Nama hanya boleh berisi karakter alpha, spasi, titik, koma, tanda petik dan strip +function nama($str): ?string +{ + return preg_replace("/[^a-zA-Z '\\.,\\-]/", '', strip_tags($str)); +} + +// Kode Wilayah Dengan Titik +// Dari 5201142005 --> 52.01.14.2005 +function kode_wilayah($kode_wilayah): string +{ + $kode_prov_kab_kec = str_split(substr($kode_wilayah, 0, 6), 2); + $kode_desa = (strlen($kode_wilayah) > 6) ? '.' . substr($kode_wilayah, 6) : ''; + + return implode('.', $kode_prov_kab_kec) . $kode_desa; +} + +function hari($tgl): string +{ + $hari = [ + 0 => 'Minggu', + 1 => 'Senin', + 2 => 'Selasa', + 3 => 'Rabu', + 4 => 'Kamis', + 5 => 'Jumat', + 6 => 'Sabtu', + ]; + $dayofweek = date('w', strtotime($tgl)); + + return $hari[$dayofweek]; +} + + +/* + * ======================================= + * Rupiah terbilang + */ +function number_to_words($number, $nol_sen = true): string +{ + $before_comma = trim(to_word($number)); + $after_comma = trim(comma($number)); + $result = $before_comma . ($nol_sen ? '' : ' koma ' . $after_comma); + + return ucwords($result . ' Rupiah'); +} + +function to_word($number): string +{ + $words = ''; + $arr_number = [ + '', + 'satu', + 'dua', + 'tiga', + 'empat', + 'lima', + 'enam', + 'tujuh', + 'delapan', + 'sembilan', + 'sepuluh', + 'sebelas', + ]; + + $unit = ['', 'ribu', 'juta', 'milyar', 'triliun', 'kuadriliun', 'kuintiliun', 'sekstiliun', 'septiliun', 'oktiliun', 'noniliun', 'desiliun', 'undesiliun', 'duodesiliun', 'tredesiliun', 'kuatuordesiliun']; + + if (strpos($number, ',') === true) { + $parts = explode(',', $number); + $intPart = (int) $parts[0]; + $decimalPart = (int) $parts[1]; + + $words = to_word($intPart) . ' koma ' . to_word($decimalPart); + } else { + $number = (int) str_replace('.', '', $number); // Ubah menjadi integer untuk memastikan hanya bilangan bulat yang diproses + + if ($number < 12) { + $words = ' ' . $arr_number[$number]; + } elseif ($number < 20) { + $words = to_word($number - 10) . ' belas'; + } elseif ($number < 100) { + $words = to_word(intdiv($number, 10)) . ' puluh' . to_word($number % 10); + } elseif ($number < 200) { + $words = ' seratus' . to_word($number - 100); + } elseif ($number < 1000) { + $words = to_word(intdiv($number, 100)) . ' ratus' . to_word($number % 100); + } elseif ($number >= 1000 && $number < 2000) { + $words = ' seribu' . to_word($number - 1000); + } else { + for ($i = count($unit) - 1; $i >= 0; $i--) { + $divider = 10 ** (3 * $i); + if ($number < $divider) { + continue; + } + + $div = intdiv($number, $divider); + $mod = $number % $divider; + + $words = to_word($div) . ' ' . $unit[$i] . to_word($mod); + break; + } + } + } + + return $words; +} + +function comma($number): string +{ + $after_comma = stristr($number, ','); + $arr_number = [ + 'nol', + 'satu', + 'dua', + 'tiga', + 'empat', + 'lima', + 'enam', + 'tujuh', + 'delapan', + 'sembilan', + ]; + + $results = ''; + $length = strlen($after_comma); + $i = 1; + + while ($i < $length) { + $get = substr($after_comma, $i, 1); + $results .= ' ' . $arr_number[$get]; + $i++; + } + + return $results; +} + + +function bulan() +{ + return [1 => 'Januari', 2 => 'Februari', 3 => 'Maret', 4 => 'April', 5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Agustus', 9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Desember']; +} + +function getBulan(int $bln) +{ + $bulan = bulan(); + + return $bulan[$bln]; +} From 5b4eb3f9988c8416271e94d4f7895243716dbf07 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:35:52 +0700 Subject: [PATCH 17/35] ADD: menambahkan route kerjasama pada sidebar --- .../views/layouts/fragments/sidebar.blade.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/resources/views/layouts/fragments/sidebar.blade.php b/resources/views/layouts/fragments/sidebar.blade.php index ad8c85720..a477726f6 100644 --- a/resources/views/layouts/fragments/sidebar.blade.php +++ b/resources/views/layouts/fragments/sidebar.blade.php @@ -103,6 +103,23 @@
  • @endif + @if ($user->hasrole(['super-admin', 'admin-kecamatan', 'administrator-website'])) +
  • + Kerjasama + + + + + +
  • + @endif + @if (!$user->hasrole(['admin-komplain', 'kontributor-artikel']))
  • Data From c4df18f92da36881cd6bf19b167fbc3136a023d3 Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:39:14 +0700 Subject: [PATCH 18/35] ADD: menambahkan beberapa configurasi dan package livewire ke dalam project --- composer.json | 1 + config/app.php | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/composer.json b/composer.json index 01e52491f..8b7ca6a19 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,7 @@ "laravel/helpers": "^1.3", "laravel/ui": "^3.0", "laravelcollective/html": "^6.2", + "livewire/livewire": "^2.12", "maatwebsite/excel": "^3.1", "mews/captcha": "^3.2", "proengsoft/laravel-jsvalidation": "^4.4", diff --git a/config/app.php b/config/app.php index 6c45b3aaf..39dfd490b 100644 --- a/config/app.php +++ b/config/app.php @@ -57,6 +57,14 @@ 'host_pantau' => env('HOST_PANTAU', 'https://pantau.opensid.my.id/index.php/api/'), + /* + |-------------------------------------------------------------------------- + | Server Layanan + |-------------------------------------------------------------------------- + */ + + 'server_layanan' => env('SERVER_LAYANAN', 'https://layanan.opendesa.id'), + /* |-------------------------------------------------------------------------- | Token Pantau From cb7f63959b51b5fa8bcbcc67799bbea65c7fae6b Mon Sep 17 00:00:00 2001 From: misarianto Date: Mon, 14 Oct 2024 17:43:49 +0700 Subject: [PATCH 19/35] ALTER: membuat kondisi button disabled saat proses progres loading upload file berlangsung --- .../livewire/kerjasama/pendaftaran_kerjasama/index.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php b/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php index e9696fb05..8d96c1405 100644 --- a/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php +++ b/resources/views/livewire/kerjasama/pendaftaran_kerjasama/index.blade.php @@ -277,7 +277,7 @@ class="btn btn-success pull-right"> Unduh Dokumen + wire:click="register" @if(empty($permohonan)) disabled @endif> Simpan From 5621accc513d532f0e1eddfc04b7ee39aeb99f1f Mon Sep 17 00:00:00 2001 From: Ujang Sopiyan <40892039+ujgsp@users.noreply.github.com> Date: Mon, 21 Oct 2024 04:27:29 +0700 Subject: [PATCH 20/35] Tambahkan fitur kategori artikel (#1060) Co-authored-by: Abah Roland <59082428+vickyrolanda@users.noreply.github.com> --- .../Controllers/FrontEnd/PageController.php | 58 ++++-- .../Informasi/ArtikelController.php | 21 ++- .../Informasi/ArtikelKategoriController.php | 172 ++++++++++++++++++ app/Models/Artikel.php | 7 + app/Models/ArtikelKategori.php | 36 ++++ catatan_rilis.md | 1 + ..._112202_create_artikel_kategoris_table.php | 41 +++++ ...5_add_id_kategori_to_das_artikel_table.php | 40 ++++ .../views/informasi/artikel/_form.blade.php | 10 + .../views/informasi/artikel/index.blade.php | 28 +++ .../artikel_kategori/create.blade.php | 39 ++++ .../informasi/artikel_kategori/edit.blade.php | 39 ++++ .../informasi/artikel_kategori/form.blade.php | 15 ++ .../artikel_kategori/index.blade.php | 96 ++++++++++ .../views/layouts/fragments/sidebar.blade.php | 3 + routes/web.php | 17 ++ .../views/pages/berita/detail.blade.php | 10 +- .../views/pages/berita/index.blade.php | 12 +- 18 files changed, 617 insertions(+), 28 deletions(-) create mode 100644 app/Http/Controllers/Informasi/ArtikelKategoriController.php create mode 100644 app/Models/ArtikelKategori.php create mode 100644 database/migrations/2024_09_30_112202_create_artikel_kategoris_table.php create mode 100644 database/migrations/2024_10_03_113405_add_id_kategori_to_das_artikel_table.php create mode 100644 resources/views/informasi/artikel_kategori/create.blade.php create mode 100644 resources/views/informasi/artikel_kategori/edit.blade.php create mode 100644 resources/views/informasi/artikel_kategori/form.blade.php create mode 100644 resources/views/informasi/artikel_kategori/index.blade.php diff --git a/app/Http/Controllers/FrontEnd/PageController.php b/app/Http/Controllers/FrontEnd/PageController.php index 2a32e4049..466d92f33 100644 --- a/app/Http/Controllers/FrontEnd/PageController.php +++ b/app/Http/Controllers/FrontEnd/PageController.php @@ -54,7 +54,7 @@ public function index() return view('pages.index', [ 'page_title' => 'Beranda', 'cari' => null, - 'artikel' => Artikel::latest()->status()->paginate(config('setting.artikel_kecamatan_perhalaman') ?? 10), + 'artikel' => Artikel::with('kategori')->latest()->status()->paginate(config('setting.artikel_kecamatan_perhalaman') ?? 10), ]); } @@ -184,26 +184,28 @@ public function refresh_captcha() public function detailBerita($slug, Request $request) { // Temukan artikel berdasarkan slug - $artikel = Artikel::where('slug', $slug) - ->with(['comments' => function ($query) use ($request) { - // Ambil komentar yang di-approve atau yang milik user dari session - $userCommentIds = $request->session()->get('session_user_comments', []); - - // Ambil komentar utama (tanpa parent) yang di-approve atau yang dimiliki oleh user - $query->whereNull('comment_id') - ->where(function ($query) use ($userCommentIds) { + $artikel = Artikel::with(['kategori', 'comments' => function ($query) use ($request) { + // Ambil komentar yang di-approve atau yang milik user dari session + $userCommentIds = $request->session()->get('session_user_comments', []); + + // Ambil komentar utama (tanpa parent) yang di-approve atau yang dimiliki oleh user + $query->whereNull('comment_id') + ->where(function ($query) use ($userCommentIds) { + $query->where('status', 'enable') + ->orWhereIn('id', $userCommentIds); + }) + ->with(['replies' => function ($query) use ($userCommentIds) { + // Ambil balasan yang di-approve atau yang milik user + $query->where(function ($query) use ($userCommentIds) { $query->where('status', 'enable') ->orWhereIn('id', $userCommentIds); - }) - ->with(['replies' => function ($query) use ($userCommentIds) { - // Ambil balasan yang di-approve atau yang milik user - $query->where(function ($query) use ($userCommentIds) { - $query->where('status', 'enable') - ->orWhereIn('id', $userCommentIds); - }); - }]); - }]) - ->firstOrFail(); + }); + }]); + }]) + ->where('slug', $slug) + ->status() // Pastikan metode 'status' adalah query scope yang benar + ->firstOrFail(); + $page_title = $artikel->judul; $page_description = substr($artikel->isi, 0, 300) . ' ...'; @@ -324,4 +326,22 @@ public function eventDetail($slug) return view('pages.event.event_detail', compact('page_title', 'page_description', 'event')); } + + public function kategori($slug) + { + // Temukan kategori berdasarkan slug + $kategori = \App\Models\ArtikelKategori::where('slug', $slug)->firstOrFail(); + + // Ambil semua artikel yang termasuk dalam kategori tersebut + $berita_kategori = Artikel::with('kategori') + ->where('id_kategori', $kategori->id_kategori) + ->where('status', '1') + ->latest() + ->paginate(10); + + return view('pages.berita.kategori', [ + 'artikel' => $berita_kategori, + 'kategori' => $kategori, + ]); + } } diff --git a/app/Http/Controllers/Informasi/ArtikelController.php b/app/Http/Controllers/Informasi/ArtikelController.php index 602ed3508..1305d9e6c 100644 --- a/app/Http/Controllers/Informasi/ArtikelController.php +++ b/app/Http/Controllers/Informasi/ArtikelController.php @@ -34,6 +34,7 @@ use App\Http\Controllers\Controller; use App\Http\Requests\ArtikelRequest; use App\Models\Artikel; +use App\Models\ArtikelKategori; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Yajra\DataTables\DataTables; @@ -45,13 +46,17 @@ public function index() $page_title = 'Artikel'; $page_description = 'Daftar Artikel'; - return view('informasi.artikel.index', compact('page_title', 'page_description')); + $kategori = \App\Models\ArtikelKategori::get(); + + return view('informasi.artikel.index', compact('page_title', 'page_description','kategori')); } public function getDataArtikel(Request $request) { if ($request->ajax()) { - return DataTables::of(Artikel::all()) + // Mengambil data artikel beserta kategori + $data = Artikel::with('kategori')->get(); + return DataTables::of($data) ->addIndexColumn() ->addColumn('aksi', function ($row) { $data['show_web'] = route('berita.detail', $row->slug); @@ -63,6 +68,10 @@ public function getDataArtikel(Request $request) return view('forms.aksi', $data); }) + ->addColumn('kategori', function ($row) { + // Cek apakah artikel memiliki kategori + return $row->kategori ? $row->kategori->nama_kategori : '-'; + }) ->editColumn('status', function ($row) { if ($row->status == 0) { return 'Tidak Aktif'; @@ -83,7 +92,9 @@ public function create() $page_title = 'Artikel'; $page_description = 'Tambah Artikel'; - return view('informasi.artikel.create', compact('page_title', 'page_description')); + $kategori = ArtikelKategori::where('status', 'Ya')->pluck('nama_kategori', 'id_kategori'); // Mengambil nama kategori dan ID + + return view('informasi.artikel.create', compact('page_title', 'page_description', 'kategori')); } public function store(ArtikelRequest $request) @@ -112,7 +123,9 @@ public function edit(Artikel $artikel) $page_title = 'Artikel'; $page_description = 'Ubah Artikel'; - return view('informasi.artikel.edit', compact('artikel', 'page_title', 'page_description')); + $kategori = ArtikelKategori::where('status', 'Ya')->pluck('nama_kategori', 'id_kategori'); // Mengambil nama kategori dan ID + + return view('informasi.artikel.edit', compact('artikel', 'page_title', 'page_description', 'kategori')); } public function update(ArtikelRequest $request, Artikel $artikel) diff --git a/app/Http/Controllers/Informasi/ArtikelKategoriController.php b/app/Http/Controllers/Informasi/ArtikelKategoriController.php new file mode 100644 index 000000000..b950ac3bd --- /dev/null +++ b/app/Http/Controllers/Informasi/ArtikelKategoriController.php @@ -0,0 +1,172 @@ +page_title; + $page_description = 'Daftar Kategori'; + + return view('informasi.artikel_kategori.index', compact('page_title', 'page_description')); + } + + /* public function getDataKategori(Request $request) + { + if ($request->ajax()) { + $data = ArtikelKategori::get(); + + return DataTables::of($data) + ->addColumn('aksi', function ($row) { + if (!auth()->guest()) { + $data['edit_url'] = route('informasi.artikel-kategori.edit', $row->id_kategori); + $data['delete_url'] = route('informasi.artikel-kategori.destroy', $row->id_kategori); + } + + return view('forms.aksi', $data); + }) + ->rawColumns(['aksi']) //merender content column dalam bentuk html + ->make(true); + } + } */ + public function getDataKategori(Request $request) + { + if ($request->ajax()) { + // Ambil status dari request + $status = $request->input('status'); + + // Buat query dasar + $query = ArtikelKategori::query(); + + // Jika status bukan 'All', tambahkan filter berdasarkan status + if ($status && $status !== 'All') { + $query->where('status', $status); + } + + $data = $query->get(); + + return DataTables::of($data) + ->addColumn('aksi', function ($row) { + if (!auth()->guest()) { + $data['edit_url'] = route('informasi.artikel-kategori.edit', $row->id_kategori); + $data['delete_url'] = route('informasi.artikel-kategori.destroy', $row->id_kategori); + } + return view('forms.aksi', $data); + }) + ->editColumn('status', function ($row) { + if ($row->status == 'Ya') { + return 'Aktif'; + } else { + return 'Tidak'; + } + }) + ->rawColumns(['aksi', 'status']) + ->make(true); + } + } + + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $page_title = $this->page_title; + $page_description = 'Tambah ' . $this->page_title; + + return view('informasi.artikel_kategori.create', compact('page_title', 'page_description')); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $request->validate([ + 'nama_kategori' => "required|max:191", + 'status' => 'required', + ]); + + try { + ArtikelKategori::create($request->all()); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Kategori gagal ditambah!'); + } + + return redirect()->route('informasi.artikel-kategori.index')->with('success', 'Kategori berhasil ditambah!'); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + $kategori = ArtikelKategori::findOrFail($id); + $page_title = $this->page_title; + $page_description = 'Ubah '. $this->page_title; + + return view('informasi.artikel_kategori.edit', compact('page_title', 'page_description', 'kategori')); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + try { + ArtikelKategori::findOrFail($id)->update($request->all()); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Kategori gagal diubah!'); + } + + return redirect()->route('informasi.artikel-kategori.index')->with('success', 'Kategori berhasil diubah!'); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + try { + ArtikelKategori::findOrFail($id)->delete(); + } catch (\Exception $e) { + report($e); + + return redirect()->route('informasi.artikel-kategori.index')->with('error', 'Kategori gagal dihapus!'); + } + + return redirect()->route('informasi.artikel-kategori.index')->with('success', 'Kategori berhasil dihapus!'); + } +} diff --git a/app/Models/Artikel.php b/app/Models/Artikel.php index ace1f5343..0167c051c 100644 --- a/app/Models/Artikel.php +++ b/app/Models/Artikel.php @@ -44,6 +44,7 @@ class Artikel extends Model protected $table = 'das_artikel'; protected $fillable = [ + 'id_kategori', 'judul', 'gambar', 'isi', @@ -77,6 +78,12 @@ public function scopeStatus($query, $value = 1) return $query->where('status', $value); } + // Relasi ke ArtikelKategori (Many-to-One) + public function kategori() + { + return $this->belongsTo(ArtikelKategori::class, 'id_kategori'); + + } // Relasi dengan model Comment public function comments() { diff --git a/app/Models/ArtikelKategori.php b/app/Models/ArtikelKategori.php new file mode 100644 index 000000000..ed8a85140 --- /dev/null +++ b/app/Models/ArtikelKategori.php @@ -0,0 +1,36 @@ + [ + 'source' => 'nama_kategori', + ], + ]; + } + + // Relasi ke Artikel (One-to-Many) + public function artikels() + { + return $this->hasMany(Artikel::class, 'id_kategori'); + } +} diff --git a/catatan_rilis.md b/catatan_rilis.md index 865619252..0a4b86507 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,6 +6,7 @@ Terima kasih pada @uddinmtm telah ikut berkontribusi. 1. [#632](https://github.com/OpenSID/OpenDK/issues/632) Tambahkan fitur penanganan komentar dan balasan komentar pada halaman detail artikel. 2. [#1024](https://github.com/OpenSID/OpenDK/issues/1024) Tambahkan fitur modul galeri pada website OpenDK. +3. [#1026](https://github.com/OpenSID/OpenDK/issues/1026) Tambahkan menu kategori artikel. #### BUG diff --git a/database/migrations/2024_09_30_112202_create_artikel_kategoris_table.php b/database/migrations/2024_09_30_112202_create_artikel_kategoris_table.php new file mode 100644 index 000000000..bf4dc3900 --- /dev/null +++ b/database/migrations/2024_09_30_112202_create_artikel_kategoris_table.php @@ -0,0 +1,41 @@ +id('id_kategori'); + $table->string('nama_kategori'); + $table->string('slug')->unique(); + $table->enum('status', ['Ya', 'Tidak'])->default('Ya'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('das_artikel_kategori'); + } +}; diff --git a/database/migrations/2024_10_03_113405_add_id_kategori_to_das_artikel_table.php b/database/migrations/2024_10_03_113405_add_id_kategori_to_das_artikel_table.php new file mode 100644 index 000000000..85fec889b --- /dev/null +++ b/database/migrations/2024_10_03_113405_add_id_kategori_to_das_artikel_table.php @@ -0,0 +1,40 @@ +unsignedBigInteger('id_kategori')->nullable()->after('id'); + + // Menambahkan foreign key constraint + $table->foreign('id_kategori')->references('id_kategori')->on('das_artikel_kategori')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('das_artikel', function (Blueprint $table) { + // Drop foreign key constraint terlebih dahulu sebelum menghapus kolom + $table->dropForeign(['id_kategori']); + + // Menghapus kolom id_kategori + $table->dropColumn('id_kategori'); + }); + } +}; diff --git a/resources/views/informasi/artikel/_form.blade.php b/resources/views/informasi/artikel/_form.blade.php index b1e2a0371..270dbba6b 100644 --- a/resources/views/informasi/artikel/_form.blade.php +++ b/resources/views/informasi/artikel/_form.blade.php @@ -41,6 +41,16 @@ @endif + +
    + + + {!! Form::select('id_kategori', $kategori, null, ['class' => 'form-control']) !!} + @if ($errors->has('id_kategori')) + {{ $errors->first('id_kategori') }} + @endif +
    +
    diff --git a/resources/views/informasi/artikel/index.blade.php b/resources/views/informasi/artikel/index.blade.php index 48e4c020c..67321aa8a 100644 --- a/resources/views/informasi/artikel/index.blade.php +++ b/resources/views/informasi/artikel/index.blade.php @@ -21,12 +21,24 @@ @include('forms.btn-social', ['create_url' => route('informasi.artikel.create')])
    + +
    + + +
    +
    + @@ -58,6 +70,10 @@ class: 'text-center', data: 'judul', name: 'judul' }, + { + data: 'kategori', + name: 'kategori', + }, { data: 'status', name: 'status', @@ -85,6 +101,18 @@ class: 'text-center', [4, 'desc'] ] }); + + // Event listener untuk tombol filter + $('#filter-kategori').on('change', function() { + var filterValue = $(this).find(":selected").text(); + + // Filter DataTable berdasarkan kolom ke-3 (kolom "Kategori") + if (filterValue === 'Semua Kategori') { + data.search('').columns().search('').draw(); + } else { + data.column(2).search(filterValue).draw(); + } + }); }); @include('forms.datatable-vertical') diff --git a/resources/views/informasi/artikel_kategori/create.blade.php b/resources/views/informasi/artikel_kategori/create.blade.php new file mode 100644 index 000000000..bb40e5444 --- /dev/null +++ b/resources/views/informasi/artikel_kategori/create.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + +
    +
    +
    + + {!! Form::open(['route' => 'informasi.artikel-kategori.store', 'method' => 'post', 'id' => 'form-artikel-kategori', 'class' => 'form-horizontal form-label-left']) !!} + @include('layouts.fragments.error_message') + +
    + + @include('flash::message') + @include('informasi.artikel_kategori.form') + +
    + + {!! Form::close() !!} +
    +
    +
    +
    +@endsection diff --git a/resources/views/informasi/artikel_kategori/edit.blade.php b/resources/views/informasi/artikel_kategori/edit.blade.php new file mode 100644 index 000000000..5a236e6a7 --- /dev/null +++ b/resources/views/informasi/artikel_kategori/edit.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + +
    +
    +
    + + {!! Form::model($kategori, ['route' => ['informasi.artikel-kategori.update', $kategori->id_kategori], 'method' => 'put', 'id' => 'form-artikel-kategori', 'class' => 'form-horizontal form-label-left']) !!} + @include('layouts.fragments.error_message') + +
    + + @include('flash::message') + @include('informasi.artikel_kategori.form') + +
    + + {!! Form::close() !!} +
    +
    +
    +
    +@endsection diff --git a/resources/views/informasi/artikel_kategori/form.blade.php b/resources/views/informasi/artikel_kategori/form.blade.php new file mode 100644 index 000000000..e1a54a841 --- /dev/null +++ b/resources/views/informasi/artikel_kategori/form.blade.php @@ -0,0 +1,15 @@ +
    + + +
    + {!! Form::text('nama_kategori', null, ['placeholder' => 'Nama Kategori', 'class' => 'form-control', 'required' => true]) !!} +
    +
    +
    + +
    + {!! Form::select('status', ['Ya' => 'Aktif', 'Tidak' => 'Tidak Aktif'], null, ['class' => 'form-control']) !!} +
    +
    +
    + diff --git a/resources/views/informasi/artikel_kategori/index.blade.php b/resources/views/informasi/artikel_kategori/index.blade.php new file mode 100644 index 000000000..e1fe73f86 --- /dev/null +++ b/resources/views/informasi/artikel_kategori/index.blade.php @@ -0,0 +1,96 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? 'Page Title' }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + @include('partials.flash_message') + +
    +
    +  Tambah +
    +
    + +
    + + +
    + +
    +
    Aksi JudulKategori Status Tanggal Terbit
    + + + + + + + + +
    AksiNama KategoriSlugStatus
    +
    +
    + + +@endsection + +@include('partials.asset_datatables') + +@push('scripts') + + + @include('forms.datatable-vertical') + @include('forms.delete-modal') +@endpush diff --git a/resources/views/layouts/fragments/sidebar.blade.php b/resources/views/layouts/fragments/sidebar.blade.php index a477726f6..b185553b9 100644 --- a/resources/views/layouts/fragments/sidebar.blade.php +++ b/resources/views/layouts/fragments/sidebar.blade.php @@ -58,6 +58,9 @@
  • @endrole @role('super-admin|admin-kecamatan|administrator-website|kontributor-artikel') +
  • + Artikel Kategori +
  • Komentar Artikel
  • diff --git a/routes/web.php b/routes/web.php index 89861e1bf..ffaae2dc5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -85,6 +85,12 @@ Route::get('berita-desa', 'PageController@beritaDesa')->name('berita-desa'); Route::get('filter-berita-desa', 'PageController@filterFeeds')->name('filter-berita-desa'); + /* route kategori */ + // Redirect dari /kategori ke halaman home secara permanent + Route::redirect('kategori', '/', 301); + // kategori artikel aka berita dengan slug + Route::get('kategori/{slug}', 'PageController@kategori')->name('berita-kategori'); + Route::group(['prefix' => 'berita'], function () { Route::permanentRedirect('/', '/'); Route::get('{slug}', 'PageController@detailBerita')->name('berita.detail'); @@ -291,6 +297,17 @@ Route::get('getdata', ['as' => 'informasi.artikel.getdata', 'uses' => 'ArtikelController@getDataArtikel']); }); + // Route Artikel Kategori + Route::group(['prefix' => 'kategori'], function () { + Route::get('/', 'ArtikelKategoriController@index')->name('informasi.artikel-kategori.index'); + Route::get('getdata', 'ArtikelKategoriController@getDataKategori')->name('informasi.artikel-kategori.getdata'); + Route::get('create', 'ArtikelKategoriController@create')->name('informasi.artikel-kategori.create'); + Route::post('store', 'ArtikelKategoriController@store')->name('informasi.artikel-kategori.store'); + Route::get('edit/{id}', 'ArtikelKategoriController@edit')->name('informasi.artikel-kategori.edit'); + Route::put('update/{id}', 'ArtikelKategoriController@update')->name('informasi.artikel-kategori.update'); + Route::delete('destroy/{id}', 'ArtikelKategoriController@destroy')->name('informasi.artikel-kategori.destroy'); + }); + // Komentar Artikel Route::group(['prefix' => 'komentar-artikel', 'excluded_middleware' => 'xss_sanitization'], function () { Route::get('/', ['as' => 'informasi.komentar-artikel.index', 'uses' => 'KomentarArtikelController@index']); diff --git a/themes/opendk/default/resources/views/pages/berita/detail.blade.php b/themes/opendk/default/resources/views/pages/berita/detail.blade.php index e57c30e8e..7ea9a20b0 100644 --- a/themes/opendk/default/resources/views/pages/berita/detail.blade.php +++ b/themes/opendk/default/resources/views/pages/berita/detail.blade.php @@ -24,8 +24,14 @@

    {{ $artikel->judul }}

    -

     {{ format_date($artikel->created_at) }} |  Administrator

    +

    +  {{ format_date($artikel->created_at) }} |  +  Administrator + @if ($artikel->kategori) + | {{ $artikel->kategori->nama_kategori }} + @endif +

    +

    {!! $artikel->isi !!}


    diff --git a/themes/opendk/default/resources/views/pages/berita/index.blade.php b/themes/opendk/default/resources/views/pages/berita/index.blade.php index d73f623ac..5d45d2ac7 100644 --- a/themes/opendk/default/resources/views/pages/berita/index.blade.php +++ b/themes/opendk/default/resources/views/pages/berita/index.blade.php @@ -7,10 +7,16 @@ {{ $item->slug }}
    -
    {{ $item->judul }}
    -

     {{ format_date($item->created_at) }} |  Administrator

    +
    {{ $item->judul }}
    +

    +  {{ format_date($item->created_at) }} |  +  Administrator  + @if ($item->kategori) + | {{ $item->kategori->nama_kategori }} + @endif +

    {{ strip_tags(substr($item->isi, 0, 250)) }}...

    - Selengkapnya + Selengkapnya
    From f9f6acd05585f5639beeaee877b092db9a5fa2c5 Mon Sep 17 00:00:00 2001 From: Mis Arianto <40069708+misarianto@users.noreply.github.com> Date: Thu, 24 Oct 2024 01:18:07 +0700 Subject: [PATCH 21/35] fixed: Penambahan halaman menu dinamis pada halaman admin & penyesuaian halaman public #1025 (#1061) Co-authored-by: Abah Roland <59082428+vickyrolanda@users.noreply.github.com> --- .../Controllers/FrontEnd/PageController.php | 8 + app/Http/Controllers/FrontEndController.php | 2 + .../Informasi/ArtikelController.php | 4 +- .../Controllers/Setting/NavMenuController.php | 105 +++ .../Kerjasama/PendaftaranKerjasama.php | 22 +- app/Http/Requests/ArtikelRequest.php | 1 + app/Models/Artikel.php | 10 +- app/Models/Kategori.php | 40 ++ app/Models/NavMenu.php | 39 ++ app/Services/ApiService.php | 14 +- catatan_rilis.md | 8 +- ...17_10_31_165347_create_nav_menus_table.php | 37 + ...21_10_15_100729_create_kategoris_table.php | 33 + ...add_field_kategori_id_in_table_artikel.php | 33 + ...1813_add_field_type_in_table_nav_menus.php | 32 + .../2024_10_22_120555_add_menu_dinamis.php | 270 ++++++++ database/seeders/DatabaseSeeder.php | 1 + database/seeders/RefKategori.php | 66 ++ .../menu-editor/bootstrap-iconpicker.min.js | 11 + .../menu-editor/jquery-menu-editor-copy.jsxx | 571 ++++++++++++++++ .../menu-editor/jquery-menu-editor.js | 636 ++++++++++++++++++ .../views/informasi/artikel/_form.blade.php | 9 + .../views/layouts/fragments/sidebar.blade.php | 7 +- .../views/setting/nav_menu/field.blade.php | 155 +++++ .../views/setting/nav_menu/field.blade.phpx | 116 ++++ .../views/setting/nav_menu/index.blade.php | 197 ++++++ .../views/setting/nav_menu/index.blade.phpx | 186 +++++ routes/web.php | 8 + .../views/components/header.blade.php | 18 +- .../views/pages/berita/kategori.blade.php | 22 + 30 files changed, 2636 insertions(+), 25 deletions(-) create mode 100644 app/Http/Controllers/Setting/NavMenuController.php create mode 100644 app/Models/Kategori.php create mode 100644 app/Models/NavMenu.php create mode 100644 database/migrations/2017_10_31_165347_create_nav_menus_table.php create mode 100644 database/migrations/2021_10_15_100729_create_kategoris_table.php create mode 100644 database/migrations/2024_10_03_203704_add_field_kategori_id_in_table_artikel.php create mode 100644 database/migrations/2024_10_04_101813_add_field_type_in_table_nav_menus.php create mode 100644 database/migrations/2024_10_22_120555_add_menu_dinamis.php create mode 100644 database/seeders/RefKategori.php create mode 100644 public/bower_components/menu-editor/bootstrap-iconpicker.min.js create mode 100644 public/bower_components/menu-editor/jquery-menu-editor-copy.jsxx create mode 100644 public/bower_components/menu-editor/jquery-menu-editor.js create mode 100644 resources/views/setting/nav_menu/field.blade.php create mode 100644 resources/views/setting/nav_menu/field.blade.phpx create mode 100644 resources/views/setting/nav_menu/index.blade.php create mode 100644 resources/views/setting/nav_menu/index.blade.phpx create mode 100644 themes/opendk/default/resources/views/pages/berita/kategori.blade.php diff --git a/app/Http/Controllers/FrontEnd/PageController.php b/app/Http/Controllers/FrontEnd/PageController.php index 466d92f33..b1449ae55 100644 --- a/app/Http/Controllers/FrontEnd/PageController.php +++ b/app/Http/Controllers/FrontEnd/PageController.php @@ -41,6 +41,7 @@ use Illuminate\Support\Facades\Session; use willvincent\Feeds\Facades\FeedsFacade; use App\Http\Controllers\FrontEndController; +use App\Models\Kategori; use Jenssegers\Agent\Agent; class PageController extends FrontEndController @@ -181,6 +182,13 @@ public function refresh_captcha() return response()->json(['captcha' => captcha_img('mini')]); } + public function kategoriBerita($slug) + { + $kategori = Kategori::where('slug', $slug)->firstOrFail(); + $artikel = Artikel::whereRelation('kategori', 'slug', $slug)->paginate(9); + return view('pages.berita.kategori', compact('artikel', 'kategori')); + } + public function detailBerita($slug, Request $request) { // Temukan artikel berdasarkan slug diff --git a/app/Http/Controllers/FrontEndController.php b/app/Http/Controllers/FrontEndController.php index 94fc40525..19f747216 100644 --- a/app/Http/Controllers/FrontEndController.php +++ b/app/Http/Controllers/FrontEndController.php @@ -35,6 +35,7 @@ use App\Models\Slide; use App\Models\Navigation; use App\Models\MediaSosial; +use App\Models\NavMenu; use App\Models\SinergiProgram; use Illuminate\Support\Facades\View; @@ -49,6 +50,7 @@ public function __construct() 'events' => Event::getOpenEvents(), 'medsos' => MediaSosial::where('status', 1)->get(), 'navigations' => Navigation::with('childrens')->whereNull('parent_id')->where('status', 1)->orderBy('order', 'asc')->get(), + 'navmenus' => NavMenu::with('children')->whereNull('parent_id')->where('is_show', 1)->orderBy('order', 'asc')->get(), 'sinergi' => SinergiProgram::where('status', 1)->orderBy('urutan', 'asc')->get(), 'slides' => Slide::orderBy('created_at', 'DESC')->get(), ]); diff --git a/app/Http/Controllers/Informasi/ArtikelController.php b/app/Http/Controllers/Informasi/ArtikelController.php index 1305d9e6c..5fb4d15c9 100644 --- a/app/Http/Controllers/Informasi/ArtikelController.php +++ b/app/Http/Controllers/Informasi/ArtikelController.php @@ -137,7 +137,7 @@ public function update(ArtikelRequest $request, Artikel $artikel) $file = $request->file('gambar'); $path = Storage::putFile('public/artikel', $file); - Storage::delete('public/artikel/'.$artikel->getRawOriginal('gambar')); + Storage::delete('public/artikel/' . $artikel->getRawOriginal('gambar')); $input['gambar'] = substr($path, 15); } @@ -156,7 +156,7 @@ public function destroy(Artikel $artikel) { try { if ($artikel->delete()) { - Storage::delete('public/artikel/'.$artikel->getRawOriginal('gambar')); + Storage::delete('public/artikel/' . $artikel->getRawOriginal('gambar')); } } catch (\Exception $e) { report($e); diff --git a/app/Http/Controllers/Setting/NavMenuController.php b/app/Http/Controllers/Setting/NavMenuController.php new file mode 100644 index 000000000..2c2bd5e50 --- /dev/null +++ b/app/Http/Controllers/Setting/NavMenuController.php @@ -0,0 +1,105 @@ +whereNull('parent_id') + ->with(['children' => function ($q) { + $q->selectRaw("id, parent_id , name as text, url as href, target, is_show,type,'fa fa-list' as icon"); + }]) + ->orderBy('order') + ->get() + ->toArray(); + + $nav_menus = json_encode($menus); + + $sourceItem = [ + 'Halaman' => Artikel::cursor()->pluck('judul', 'link')->toArray(), + 'Kategori' => Kategori::cursor()->pluck('nama', 'link')->toArray(), + ]; + + return view('setting.nav_menu.index', compact('page_title', 'page_description', 'nav_menus', 'sourceItem')); + } + + + public function store(Request $request) + { + NavMenu::whereNotNull('id')->delete(); + try { + // hapus data lama lalu buat lagi + $json = json_decode($request->json_menu, 1); + + $this->loopTree($json); + + return redirect()->route('setting.navmenu.index')->with('success', 'Menu berhasil disimpan!'); + } catch (\Throwable $th) { + throw $th; + } + } + + private function loopTree(array $elements, $parentId = null) + { + $sequence = 1; + foreach ($elements as $element) { + $input = [ + 'name' => $element['text'], + 'url' => $element['href'], + 'target' => $element['target'], + 'type' => $element['type'], + 'is_show' => isset($element['is_show']) ? $element['is_show'] : 1, + 'order' => $sequence, + 'parent_id' => $parentId, + ]; + + $model = NavMenu::create($input); + + // Jika ada children, rekursi untuk menyimpan sub-menu + if (isset($element['children'])) { + $this->loopTree($element['children'], $model->id); + } + $sequence++; + } + } +} diff --git a/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php b/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php index cc151cf15..bfc5a8099 100644 --- a/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php +++ b/app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php @@ -2,11 +2,12 @@ namespace App\Http\Livewire\Kerjasama; -use App\Models\SettingAplikasi; -use App\Services\ApiService; -use Illuminate\Support\Facades\Storage; use Livewire\Component; +use App\Services\ApiService; use Livewire\WithFileUploads; +use App\Models\SettingAplikasi; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; class PendaftaranKerjasama extends Component { @@ -37,6 +38,21 @@ public function mount() $this->kecamatan_id = view()->shared('profil')->kecamatan_id; $this->domain = config('app.url'); + + // Ambil settings sebagai objek + $setting = (object) SettingAplikasi::pluck('value', 'key')->toArray(); + + // Periksa apakah 'layanan_opendesa_token' tidak ada + if (!property_exists($setting, 'layanan_opendesa_token')) { + DB::table('das_setting')->insert([ + 'key' => 'layanan_opendesa_token', + 'value' => 0, + 'type' => 'input', + 'description' => 'Token pelanggan Layanan OpenDESA', + 'kategori' => 'pelanggan', + 'option' => '{}', + ]); + } } public function render() diff --git a/app/Http/Requests/ArtikelRequest.php b/app/Http/Requests/ArtikelRequest.php index 177d05e9c..dcd809bd6 100644 --- a/app/Http/Requests/ArtikelRequest.php +++ b/app/Http/Requests/ArtikelRequest.php @@ -55,6 +55,7 @@ public function rules() return [ 'judul' => 'required|string|max:191', 'isi' => 'required', + 'kategori_id' => 'required', 'status' => 'required', 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:1024|valid_file', ]; diff --git a/app/Models/Artikel.php b/app/Models/Artikel.php index 0167c051c..0b2541053 100644 --- a/app/Models/Artikel.php +++ b/app/Models/Artikel.php @@ -31,10 +31,12 @@ namespace App\Models; +use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Storage; use Cviebrock\EloquentSluggable\Sluggable; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsTo; class Artikel extends Model { @@ -47,6 +49,7 @@ class Artikel extends Model 'id_kategori', 'judul', 'gambar', + 'kategori_id', 'isi', 'status', ]; @@ -65,7 +68,7 @@ public function sluggable(): array public function getGambarAttribute() { - return $this->attributes['gambar'] ? Storage::url('artikel/'.$this->attributes['gambar']) : null; + return $this->attributes['gambar'] ? Storage::url('artikel/' . $this->attributes['gambar']) : null; } public function getIsiAttribute() @@ -89,4 +92,9 @@ public function comments() { return $this->hasMany(Comment::class, 'das_artikel_id')->orderBy('created_at', 'desc'); } + + public function getLinkAttribute(): string + { + return Str::replaceFirst(url('/'), '', route('berita.detail', ['slug' => $this->slug])); + } } diff --git a/app/Models/Kategori.php b/app/Models/Kategori.php new file mode 100644 index 000000000..2988fe6b4 --- /dev/null +++ b/app/Models/Kategori.php @@ -0,0 +1,40 @@ + [ + 'source' => 'nama', + ], + ]; + } + + public function artikels(): HasMany + { + return $this->hasMany(Artikel::class, 'kategori_id'); + } + + public function getLinkAttribute(): string + { + return Str::replaceFirst(url('/'), '', route('berita.kategori', ['slug' => $this->slug])); + } +} diff --git a/app/Models/NavMenu.php b/app/Models/NavMenu.php new file mode 100644 index 000000000..b52eab2c1 --- /dev/null +++ b/app/Models/NavMenu.php @@ -0,0 +1,39 @@ + 'boolean' + ]; + + public function child(): HasMany + { + return $this->hasMany(NavMenu::class, 'parent_id', 'id'); + } + + public function children(): HasMany + { + return $this->hasMany(NavMenu::class, 'parent_id', 'id')->with(['children' => function ($q) { + return $q->selectRaw("id, parent_id , name as text, url as href, target, type, is_show,'fa fa-list' as icon"); + }]); + } +} diff --git a/app/Services/ApiService.php b/app/Services/ApiService.php index d42411ed1..ac6232806 100644 --- a/app/Services/ApiService.php +++ b/app/Services/ApiService.php @@ -17,18 +17,8 @@ class ApiService public function __construct() { - $this->setting = json_decode(json_encode(SettingAplikasi::pluck('value', 'key')->toArray())); - - if (isset($this->setting->layanan_opendesa_token) == false) { - DB::table('das_setting')->insert([ - 'key' => 'layanan_opendesa_token', - 'value' => 0, - 'type' => 'input', - 'description' => 'Token pelanggan Layanan OpenDESA', - 'kategori' => 'pelanggan', - 'option' => '{}', - ]); - } + // Ambil settings sebagai objek + $this->setting = (object) SettingAplikasi::pluck('value', 'key')->toArray(); $this->server = config('app.server_layanan'); } diff --git a/catatan_rilis.md b/catatan_rilis.md index 0a4b86507..da5f231e6 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -4,9 +4,11 @@ Terima kasih pada @uddinmtm telah ikut berkontribusi. #### FITUR -1. [#632](https://github.com/OpenSID/OpenDK/issues/632) Tambahkan fitur penanganan komentar dan balasan komentar pada halaman detail artikel. -2. [#1024](https://github.com/OpenSID/OpenDK/issues/1024) Tambahkan fitur modul galeri pada website OpenDK. -3. [#1026](https://github.com/OpenSID/OpenDK/issues/1026) Tambahkan menu kategori artikel. +1. [#632](https://github.com/OpenSID/OpenDK/issues/632) Penambahan fitur penanganan komentar dan balasan komentar pada halaman detail artikel. +2. [#1024](https://github.com/OpenSID/OpenDK/issues/1024) Penambahan fitur modul galeri pada website OpenDK. +3. [#1026](https://github.com/OpenSID/OpenDK/issues/1026) Penambahan menu kategori artikel. +4. [#1025](https://github.com/OpenSID/OpenDK/issues/1025) Penambahan menu dinamis pada halaman admin & penyesuaian halaman public. + #### BUG diff --git a/database/migrations/2017_10_31_165347_create_nav_menus_table.php b/database/migrations/2017_10_31_165347_create_nav_menus_table.php new file mode 100644 index 000000000..647326b34 --- /dev/null +++ b/database/migrations/2017_10_31_165347_create_nav_menus_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('url')->comment('bisa berisi link atau url'); + $table->enum('target', ['_self', '_blank', '_top'])->default('_self'); + $table->integer('parent_id')->nullable(); + $table->integer('order')->default(0); + $table->boolean('is_show')->default(true)->comment('Status ditampilkan'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('nav_menus'); + } +}; diff --git a/database/migrations/2021_10_15_100729_create_kategoris_table.php b/database/migrations/2021_10_15_100729_create_kategoris_table.php new file mode 100644 index 000000000..c58751790 --- /dev/null +++ b/database/migrations/2021_10_15_100729_create_kategoris_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('nama'); + $table->string('slug')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('kategoris'); + } +}; diff --git a/database/migrations/2024_10_03_203704_add_field_kategori_id_in_table_artikel.php b/database/migrations/2024_10_03_203704_add_field_kategori_id_in_table_artikel.php new file mode 100644 index 000000000..dea9ccb82 --- /dev/null +++ b/database/migrations/2024_10_03_203704_add_field_kategori_id_in_table_artikel.php @@ -0,0 +1,33 @@ +foreignIdFor(Kategori::class)->nullable()->after('judul')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('das_artikel', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2024_10_04_101813_add_field_type_in_table_nav_menus.php b/database/migrations/2024_10_04_101813_add_field_type_in_table_nav_menus.php new file mode 100644 index 000000000..fe1d35e28 --- /dev/null +++ b/database/migrations/2024_10_04_101813_add_field_type_in_table_nav_menus.php @@ -0,0 +1,32 @@ +enum('type', ['link', 'halaman', 'kategori', 'modul'])->default('modul')->after('target'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('nav_menus', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2024_10_22_120555_add_menu_dinamis.php b/database/migrations/2024_10_22_120555_add_menu_dinamis.php new file mode 100644 index 000000000..97a70fc47 --- /dev/null +++ b/database/migrations/2024_10_22_120555_add_menu_dinamis.php @@ -0,0 +1,270 @@ + 1, + 'name' => 'Beranda', + 'url' => '/', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 1, + 'is_show' => 1 + ], + [ + 'id' => 2, + 'name' => 'Publikasi', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 2, + 'is_show' => 1 + ], + [ + 'id' => 3, + 'name' => 'Galeri', + 'url' => '/publikasi/galeri', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 2, + 'order' => 1, + 'is_show' => 1 + ], + [ + 'id' => 4, + 'name' => 'Berita Desa', + 'url' => '/berita-desa', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 3, + 'is_show' => 1 + ], + [ + 'id' => 5, + 'name' => 'Profil', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 4, + 'is_show' => 1 + ], + [ + 'id' => 6, + 'name' => 'Sejarah', + 'url' => '/profil/sejarah', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 5, + 'order' => 1, + 'is_show' => 1 + ], + [ + 'id' => 7, + 'name' => 'Letak Geografis', + 'url' => '/profil/letak-geografis', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 5, + 'order' => 2, + 'is_show' => 1 + ], + [ + 'id' => 8, + 'name' => 'Struktur Pemerintahan', + 'url' => '/profil/struktur-pemerintahan', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 5, + 'order' => 3, + 'is_show' => 1 + ], + [ + 'id' => 9, + 'name' => 'Visi & Misi', + 'url' => '/profil/visi-misi', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 5, + 'order' => 4, + 'is_show' => 1 + ], + [ + 'id' => 10, + 'name' => 'Kategori Berita', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 5, + 'is_show' => 1 + ], + [ + 'id' => 11, + 'name' => 'Desa', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 6, + 'is_show' => 1 + ], + [ + 'id' => 12, + 'name' => 'Potensi', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 7, + 'is_show' => 1 + ], + [ + 'id' => 13, + 'name' => 'Statistik', + 'url' => '#', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 8, + 'is_show' => 1 + ], + [ + 'id' => 14, + 'name' => 'Penduduk', + 'url' => '/statistik/kependudukan', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 1, + 'is_show' => 1 + ], + [ + 'id' => 15, + 'name' => 'Pendidikan', + 'url' => '/statistik/pendidikan', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 2, + 'is_show' => 1 + ], + [ + 'id' => 16, + 'name' => 'Kesehatan', + 'url' => '/statistik/kesehatan', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 3, + 'is_show' => 1 + ], + [ + 'id' => 17, + 'name' => 'Program dan Bantuan', + 'url' => '/statistik/program-dan-bantuan', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 4, + 'is_show' => 1 + ], + [ + 'id' => 18, + 'name' => 'Anggaran dan Realisasi', + 'url' => '/statistik/anggaran-dan-realisasi', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 5, + 'is_show' => 1 + ], + [ + 'id' => 19, + 'name' => 'Anggaran Desa', + 'url' => '/statistik/anggaran-desa', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 13, + 'order' => 6, + 'is_show' => 1 + ], + [ + 'id' => 20, + 'name' => 'Unduhan', + 'url' => '/statistik/anggaran-desa', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => NULL, + 'order' => 9, + 'is_show' => 1 + ], + [ + 'id' => 21, + 'name' => 'Prosedur', + 'url' => '/unduhan/prosedur', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 20, + 'order' => 1, + 'is_show' => 1 + ], + [ + 'id' => 22, + 'name' => 'Regulasi', + 'url' => '/unduhan/regulasi', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 20, + 'order' => 2, + 'is_show' => 1 + ], + [ + 'id' => 23, + 'name' => 'Dokumen', + 'url' => '/unduhan/form-dokumen', + 'target' => '_self', + 'type' => 'modul', + 'parent_id' => 20, + 'order' => 3, + 'is_show' => 1 + ], + [ + 'id' => 24, + 'name' => 'FAQ', + 'url' => 'https://demodk.opendesa.id/faq', + 'target' => '_blank', + 'type' => 'link', + 'parent_id' => NULL, + 'order' => 10, + 'is_show' => 1 + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 1277e402c..e5dc0e3dd 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -47,6 +47,7 @@ public function run() DB::statement('SET FOREIGN_KEY_CHECKS=0;'); $this->call(RoleSpatieSeeder::class); + $this->call(RefKategori::class); $this->call(RefPekerjaanTableSeeder::class); $this->call(RefAgamaTableSeeder::class); $this->call(RefKawinTableSeeder::class); diff --git a/database/seeders/RefKategori.php b/database/seeders/RefKategori.php new file mode 100644 index 000000000..f0ea320a6 --- /dev/null +++ b/database/seeders/RefKategori.php @@ -0,0 +1,66 @@ + 'Kebijakan Publik', 'slug' => Str::slug('Kebijakan Publik')], + ['nama' => 'Hukum dan Regulasi', 'slug' => Str::slug('Hukum dan Regulasi')], + ['nama' => 'Pemerintahan Daerah', 'slug' => Str::slug('Pemerintahan Daerah')], + ['nama' => 'Politik dan Demokrasi', 'slug' => Str::slug('Politik dan Demokrasi')], + ['nama' => 'Pelayanan Publik', 'slug' => Str::slug('Pelayanan Publik')], + ['nama' => 'Keuangan dan Anggaran', 'slug' => Str::slug('Keuangan dan Anggaran')], + ['nama' => 'Reformasi Birokrasi', 'slug' => Str::slug('Reformasi Birokrasi')], + ['nama' => 'Pembangunan dan Infrastruktur', 'slug' => Str::slug('Pembangunan dan Infrastruktur')], + ['nama' => 'Keamanan dan Pertahanan', 'slug' => Str::slug('Keamanan dan Pertahanan')], + ['nama' => 'Lingkungan dan Energi', 'slug' => Str::slug('Lingkungan dan Energi')], + ['nama' => 'Hubungan Internasional', 'slug' => Str::slug('Hubungan Internasional')], + ['nama' => 'Pendidikan dan Kebudayaan', 'slug' => Str::slug('Pendidikan dan Kebudayaan')], + ['nama' => 'Kesejahteraan Sosial', 'slug' => Str::slug('Kesejahteraan Sosial')], + ['nama' => 'Tenaga Kerja dan Ketenagakerjaan', 'slug' => Str::slug('Tenaga Kerja dan Ketenagakerjaan')], + ['nama' => 'Kesehatan Masyarakat', 'slug' => Str::slug('Kesehatan Masyarakat')], + ]); + } +} diff --git a/public/bower_components/menu-editor/bootstrap-iconpicker.min.js b/public/bower_components/menu-editor/bootstrap-iconpicker.min.js new file mode 100644 index 000000000..8a3107e9f --- /dev/null +++ b/public/bower_components/menu-editor/bootstrap-iconpicker.min.js @@ -0,0 +1,11 @@ +/*!======================================================================== +* File: bootstrap-iconpicker.min.js v1.10.0 by @victor-valencia +* https://victor-valencia.github.com/bootstrap-iconpicker +* ======================================================================== +* Copyright 2013-2018 Victor Valencia Rico. +* Licensed under MIT license. +* https://github.com/victor-valencia/bootstrap-iconpicker/blob/master/LICENSE +* ======================================================================== +*/ + +!function($){"use strict";var Iconpicker=function(element,options){if("undefined"==typeof $.fn.popover||"undefined"==typeof $.fn.popover.Constructor.VERSION)throw new TypeError("Bootstrap iconpicker require Bootstrap popover");this.$element=$(element),this.options=$.extend({},Iconpicker.DEFAULTS,this.$element.data()),this.options=$.extend({},this.options,options)};Iconpicker.VERSION="1.10.0",Iconpicker.ICONSET_EMPTY={iconClass:"",iconClassFix:"",icons:[]},Iconpicker.ICONSET={_custom:null,elusiveicon:$.iconset_elusiveicon||Iconpicker.ICONSET_EMPTY,flagicon:$.iconset_flagicon||Iconpicker.ICONSET_EMPTY,fontawesome4:$.iconset_fontawesome_4||Iconpicker.ICONSET_EMPTY,fontawesome5:$.iconset_fontawesome_5||Iconpicker.ICONSET_EMPTY,glyphicon:$.iconset_glyphicon||Iconpicker.ICONSET_EMPTY,ionicon:$.iconset_ionicon||Iconpicker.ICONSET_EMPTY,mapicon:$.iconset_mapicon||Iconpicker.ICONSET_EMPTY,materialdesign:$.iconset_materialdesign||Iconpicker.ICONSET_EMPTY,octicon:$.iconset_octicon||Iconpicker.ICONSET_EMPTY,typicon:$.iconset_typicon||Iconpicker.ICONSET_EMPTY,weathericon:$.iconset_weathericon||Iconpicker.ICONSET_EMPTY},Iconpicker.DEFAULTS={align:"center",arrowClass:"btn-primary",arrowNextIconClass:"fas fa-arrow-right",arrowPrevIconClass:"fas fa-arrow-left",cols:4,icon:"",iconset:"fontawesome5",iconsetVersion:"lastest",header:!0,labelHeader:"{0} / {1}",footer:!0,labelFooter:"{0} - {1} of {2}",placement:"bottom",rows:4,search:!0,searchText:"Search icon",selectedClass:"btn-warning",unselectedClass:"btn-secondary"},Iconpicker.prototype.bindEvents=function(){var op=this.options,el=this;op.table.find(".btn-previous, .btn-next").off("click").on("click",function(e){if(e.preventDefault(),!$(this).hasClass("disabled")){var inc=parseInt($(this).val(),10);el.changeList(op.page+inc)}}),op.table.find(".btn-icon").off("click").on("click",function(e){e.preventDefault(),el.select($(this).val()),op.inline===!1?el.$element.popover("3.x"===$.fn.bsVersion()?"destroy":"dispose"):op.table.find("i[class$='"+$(this).val()+"']").parent().addClass(op.selectedClass)}),op.table.find(".search-control").off("keyup").on("keyup",function(){el.changeList(1)})},Iconpicker.prototype.changeList=function(page){this.filterIcons(),this.updateLabels(page),this.updateIcons(page),this.options.page=page,this.bindEvents()},Iconpicker.prototype.filterIcons=function(){var op=this.options,search=op.table.find(".search-control").val(),icons=[];if("lastest"!=op.iconsetVersion&&"undefined"!=typeof Iconpicker.ICONSET[op.iconset].allVersions?$.each(Iconpicker.ICONSET[op.iconset].allVersions,function(i,v){op.iconsetVersion==v.version&&(icons=v.icons)}):icons=Iconpicker.ICONSET[op.iconset].icons,""===search)op.icons=icons;else{var result=[];$.each(icons,function(i,v){v.toLowerCase().indexOf(search)>-1&&result.push(v)}),op.icons=result}},Iconpicker.prototype.removeAddClass=function(target,remove,add){return this.options.table.find(target).removeClass(remove).addClass(add),add},Iconpicker.prototype.reset=function(){this.updatePicker(),this.changeList(1)},Iconpicker.prototype.select=function(icon){var op=this.options,el=this.$element;op.selected=$.inArray(icon.replace(op.iconClassFix,""),op.icons),-1===op.selected&&(op.selected=0,icon=op.iconClassFix+op.icons[op.selected]),""!==icon&&op.selected>=0&&(op.icon=icon,op.inline===!1&&(el.find("input").val(icon),el.find("i").attr("class","").addClass(op.iconClass).addClass(icon)),icon===op.iconClassFix?el.trigger({type:"change",icon:"empty"}):(el.trigger({type:"change",icon:icon}),el.find("input").val(icon)),op.table.find("button."+op.selectedClass).removeClass(op.selectedClass))},Iconpicker.prototype.switchPage=function(icon){var op=this.options;if(op.selected=$.inArray(icon.replace(op.iconClassFix,""),op.icons),op.selected>=0){var page=Math.ceil((op.selected+1)/this.totalIconsPerPage());this.changeList(page)}""===icon?op.table.find("i."+op.iconClassFix).parent().addClass(op.selectedClass):op.table.find("i."+icon).parent().addClass(op.selectedClass)},Iconpicker.prototype.totalPages=function(){return Math.ceil(this.totalIcons()/this.totalIconsPerPage())},Iconpicker.prototype.totalIcons=function(){return this.options.icons.length},Iconpicker.prototype.totalIconsPerPage=function(){return 0===this.options.rows?this.options.icons.length:this.options.cols*this.options.rows},Iconpicker.prototype.updateArrows=function(page){var op=this.options,total_pages=this.totalPages();1===page?op.table.find(".btn-previous").addClass("disabled"):op.table.find(".btn-previous").removeClass("disabled"),page===total_pages||0===total_pages?op.table.find(".btn-next").addClass("disabled"):op.table.find(".btn-next").removeClass("disabled")},Iconpicker.prototype.updateIcons=function(page){var op=this.options,tbody=op.table.find("tbody").empty(),offset=(page-1)*this.totalIconsPerPage(),length=op.rows;0===op.rows&&(length=op.icons.length);for(var i=0;length>i;i++){for(var tr=$(""),j=0;j').hide();if(pos').show(),op.icon===v&&btn.addClass(op.selectedClass).addClass("btn-icon-selected")}tr.append($("").append(btn))}tbody.append(tr)}},Iconpicker.prototype.updateIconsCount=function(){var op=this.options;if(op.footer===!0){var icons_count=["",' ',' '," ",""];op.table.find("tfoot").empty().append(icons_count.join(""))}},Iconpicker.prototype.updateLabels=function(page){var op=this.options,total_icons=this.totalIcons(),total_pages=this.totalPages();op.table.find(".page-count").html(op.labelHeader.replace("{0}",0===total_pages?0:page).replace("{1}",total_pages));var offset=(page-1)*this.totalIconsPerPage(),total=page*this.totalIconsPerPage();op.table.find(".icons-count").html(op.labelFooter.replace("{0}",total_icons?offset+1:0).replace("{1}",total_icons>total?total:total_icons).replace("{2}",total_icons)),this.updateArrows(page)},Iconpicker.prototype.updatePagesCount=function(){var op=this.options;if(op.header===!0){for(var tr=$(""),i=0;i');if(0===i||i===op.cols-1){var arrow=['"];td.append(arrow.join("")),tr.append(td)}else 0===tr.find(".page-count").length&&(td.attr("colspan",op.cols-2).append(''),tr.append(td))}op.table.find("thead").empty().append(tr)}},Iconpicker.prototype.updatePicker=function(){var op=this.options;if(op.cols<4)throw"Iconpicker => The number of columns must be greater than or equal to 4. [option.cols = "+op.cols+"]";if(op.rows<0)throw"Iconpicker => The number of rows must be greater than or equal to 0. [option.rows = "+op.rows+"]";this.updatePagesCount(),this.updateSearch(),this.updateIconsCount()},Iconpicker.prototype.updateSearch=function(){var op=this.options,search=["",' ',' '," ",""];search=$(search.join("")),op.search===!0?search.show():search.hide(),op.table.find("thead").append(search)},Iconpicker.prototype.setAlign=function(value){this.$element.removeClass(this.options.align).addClass(value),this.options.align=value},Iconpicker.prototype.setArrowClass=function(value){this.options.arrowClass=this.removeAddClass(".btn-arrow",this.options.arrowClass,value)},Iconpicker.prototype.setArrowNextIconClass=function(value){this.options.arrowNextIconClass=this.removeAddClass(".btn-next > span",this.options.arrowNextIconClass,value)},Iconpicker.prototype.setArrowPrevIconClass=function(value){this.options.arrowPrevIconClass=this.removeAddClass(".btn-previous > span",this.options.arrowPrevIconClass,value)},Iconpicker.prototype.setCols=function(value){this.options.cols=value,this.reset()},Iconpicker.prototype.setFooter=function(value){var footer=this.options.table.find("tfoot");value===!0?footer.show():footer.hide(),this.options.footer=value},Iconpicker.prototype.setHeader=function(value){var header=this.options.table.find("thead");value===!0?header.show():header.hide(),this.options.header=value},Iconpicker.prototype.setIcon=function(value){this.select(value)},Iconpicker.prototype.setIconset=function(value){var op=this.options;$.isPlainObject(value)?(Iconpicker.ICONSET._custom=$.extend(Iconpicker.ICONSET_EMPTY,value),op.iconset="_custom"):Iconpicker.ICONSET.hasOwnProperty(value)?op.iconset=value:op.iconset=Iconpicker.DEFAULTS.iconset,op=$.extend(op,Iconpicker.ICONSET[op.iconset]),this.reset(),this.select(op.icon)},Iconpicker.prototype.setLabelHeader=function(value){this.options.labelHeader=value,this.updateLabels(this.options.page)},Iconpicker.prototype.setLabelFooter=function(value){this.options.labelFooter=value,this.updateLabels(this.options.page)},Iconpicker.prototype.setPlacement=function(value){this.options.placement=value},Iconpicker.prototype.setRows=function(value){this.options.rows=value,this.reset()},Iconpicker.prototype.setSearch=function(value){var search=this.options.table.find(".search-control");value===!0?search.show():search.hide(),search.val(""),this.changeList(1),this.options.search=value},Iconpicker.prototype.setSearchText=function(value){this.options.table.find(".search-control").attr("placeholder",value),this.options.searchText=value},Iconpicker.prototype.setSelectedClass=function(value){this.options.selectedClass=this.removeAddClass(".btn-icon-selected",this.options.selectedClass,value)},Iconpicker.prototype.setUnselectedClass=function(value){this.options.unselectedClass=this.removeAddClass(".btn-icon",this.options.unselectedClass,value)};var old=$.fn.iconpicker;$.fn.iconpicker=function(option,params){return this.each(function(){var $this=$(this),data=$this.data("bs.iconpicker"),options="object"==typeof option&&option;if(data||$this.data("bs.iconpicker",data=new Iconpicker(this,options)),"string"==typeof option){if("undefined"==typeof data[option])throw'Iconpicker => The "'+option+'" method does not exists.';data[option](params)}else{var op=data.options;op=$.extend(op,{inline:!1,page:1,selected:-1,table:$('
    ')});var name="undefined"!=typeof $this.attr("name")?'name="'+$this.attr("name")+'"':"";"BUTTON"===$this.prop("tagName")?($this.empty().append("").append('").append('').addClass("iconpicker "+("3.x"===$.fn.bsVersion()?"":"dropdown-toggle")),data.setIconset(op.iconset),$this.on("click",function(e){e.preventDefault(),$this.popover({animation:!1,trigger:"manual",html:!0,content:op.table,container:"body",placement:op.placement}).on("inserted.bs.popover",function(){var el=$this.data("bs.popover"),tip="3.x"===$.fn.bsVersion()?el.tip():$(el.getTipElement());tip.addClass("iconpicker-popover")}).on("shown.bs.popover",function(){data.switchPage(op.icon),data.bindEvents()}),$this.popover("show")})):(op.inline=!0,data.setIconset(op.iconset),$this.empty().append('").append(op.table).addClass("iconpicker").addClass(op.align),data.switchPage(op.icon),data.bindEvents())}})},$.fn.iconpicker.Constructor=Iconpicker,$.fn.iconpicker.noConflict=function(){return $.fn.iconpicker=old,this},$.fn.bsVersion=function(){return $.fn.popover.Constructor.VERSION.substr(0,2)+"x"},$(document).on("click","body",function(e){$(".iconpicker").each(function(){$(this).is(e.target)||0!==$(this).has(e.target).length||0!==$(".popover").has(e.target).length||$(this).popover("3.x"===$.fn.bsVersion()?"destroy":"dispose")})}),$('button[role="iconpicker"],div[role="iconpicker"]').iconpicker()}(jQuery); \ No newline at end of file diff --git a/public/bower_components/menu-editor/jquery-menu-editor-copy.jsxx b/public/bower_components/menu-editor/jquery-menu-editor-copy.jsxx new file mode 100644 index 000000000..1764bf11a --- /dev/null +++ b/public/bower_components/menu-editor/jquery-menu-editor-copy.jsxx @@ -0,0 +1,571 @@ +function MenuEditor(e, s) { + var t = $("#" + e).data("level", "0"), + l = { + labelEdit: '', + labelRemove: '', + textConfirmDelete: "Item ini akan dihapus, apakah anda yakin ?", + iconPicker: { + cols: 4, + rows: 4, + footer: !1, + iconset: "fontawesome5" + }, + maxLevel: -1, + listOptions: { + hintCss: { + border: "1px dashed #13981D" + }, + opener: { + as: "html", + close: '', + open: '', + openerCss: { + "margin-right": "10px", + float: "none" + }, + openerClass: "btn btn-success btn-xs" + }, + placeholderCss: { + "background-color": "gray" + }, + ignoreClass: "clickable", + listsClass: "pl-0", + listsCss: { + "padding-top": "10px" + }, + complete: function (e) { + return MenuEditor.updateButtons(t), t.updateLevels(0), !0 + }, + isAllowed: function (e, s, t) { + return v(e, t) + } + } + }; + $.extend(!0, l, s); + var n = null, + o = !0, + i = null, + r = null, + a = l.iconPicker, + c = (s = l.listOptions, $("#" + e + "_icon").iconpicker(a)); + + function d() { + i[0].reset(), (c = c.iconpicker(a)).iconpicker("setIcon", "empty"), r.attr("disabled", !0), n = null + } + + function p(e) { + return $("").addClass(e.classCss).addClass("clickable").attr("href", "#").html(e.text) + } + + function u() { + var e = $("
    ").addClass("btn-group pull-right"), + s = p({ + classCss: "btn btn-primary btn-xs btnEdit", // 'btn-sm' diubah menjadi 'btn-xs' untuk Bootstrap 3 + text: l.labelEdit + }), + t = p({ + classCss: "btn btn-danger btn-xs btnRemove", + text: l.labelRemove + }), + n = p({ + classCss: "btn btn-default btn-xs btnUp btnMove", + text: '' + }), + o = p({ + classCss: "btn btn-default btn-xs btnDown btnMove", + text: '' + }), + i = p({ + classCss: "btn btn-default btn-xs btnOut btnMove", + text: '' + }), + r = p({ + classCss: "btn btn-default btn-xs btnIn btnMove", + text: '' + }); + return e.append(n).append(o).append(r).append(i).append(s).append(t), e; +} + + + function f(e, s) { + var l = void 0 === s ? 0 : s, + n = 0 === l ? t : $("