👈🏻 Home

Create TodoApp Using Angular And Codeigniter (Include CRUD)

Howdy, pada kesempatan yang baik ini saya akan membuat sebuah dokumentasi mengenai pembuatan web app menggunakan angular + codeiginter 4 yang di dalamnya memuat operasi CRUD.

Sebagai sampel project, disini saya akan membuatnya dengan tema todoApp. Halaman yang akan dibuat adalah login dan todo, jadi user akan login terlebih dahulu dengan username dan password yang sudah ditentukan kemudian baru bisa masuk dan mengakses crud todoApp.

Saya sudah memecah project ini menjadi beberapa bagian supaya lebih mudah untuk dikerjakan:

  • Membuat front end (angular)
  • Membuat back end (codeigniter)
  • Integrasi front end dan back end

Oke let’s code…

Bagian 1 membuat front end (angular)

Untuk membuat front end kita mulai dari membuat beberapa halaman/component pada angular kemudian membuat tampilan atau UI desainnya.

1. Membuat component login dan todo

Komponen yang kita buat ini digunakan sebagai halaman utama aplikasi, untuk membuatnya masuk ke folder project, kemudian ketikkan perintah berikut:

ng g c login
ng g c todo

Maka akan tercipta dua buah folder untuk komponen login dan todo.

2. Menginstall material desain

Untuk membuat tampilan dari aplikasi, disini saya menggunakan material desain dari google. Untuk menggunakannya kita perlu menginstallnya dulu dengan perintah berikut.

ng add @angular/material

Kemudian buat folder material di dalam folder app, lalu di folder material tersebut kita buat sebuah file dengan nama material.ts untuk memasukkan beberapa komponen material angular, sesuaikan menjadi seperti ini.

import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatButtonModule } from '@angular/material/button';
import { MatInputModule } from '@angular/material/input';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MatSliderModule } from '@angular/material/slider';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatMenuModule } from '@angular/material/menu';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatListModule } from '@angular/material/list';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatCardModule } from '@angular/material/card';
import { MatStepperModule } from '@angular/material/stepper';
import { MatTabsModule } from '@angular/material/tabs';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { MatChipsModule } from '@angular/material/chips';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatDialogModule } from '@angular/material/dialog';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTableModule } from '@angular/material/table';
import { MatSortModule } from '@angular/material/sort';
import { MatPaginatorModule } from '@angular/material/paginator';

export const MaterialDesign = [
   MatCheckboxModule,
   MatCheckboxModule,
   MatButtonModule,
   MatInputModule,
   MatAutocompleteModule,
   MatDatepickerModule,
   MatFormFieldModule,
   MatRadioModule,
   MatSelectModule,
   MatSliderModule,
   MatSlideToggleModule,
   MatMenuModule,
   MatSidenavModule,
   MatToolbarModule,
   MatListModule,
   MatGridListModule,
   MatCardModule,
   MatStepperModule,
   MatTabsModule,
   MatExpansionModule,
   MatButtonToggleModule,
   MatChipsModule,
   MatIconModule,
   MatProgressSpinnerModule,
   MatProgressBarModule,
   MatDialogModule,
   MatTooltipModule,
   MatSnackBarModule,
   MatTableModule,
   MatSortModule,
   MatPaginatorModule
]

Kemudian buka app.module.ts dan tambahkan module material desain yang sudah kita buat.

...
...
// angular material design
import { MaterialDesign } from './material/material';

import { LoginComponent } from './login/login.component';
import { TodoComponent } from './todo/todo.component';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    TodoComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MaterialDesign,
  ],

..
..

Selengkapnya tentang material desain angular bisa dibaca di dokumentasi resminya https://material.angular.io/

Untuk penggunaan material pada angular sendiri pernah saya dokumentasikan di video Cara Menggunakan Material Desain Pada Angular

3. Mengatur routing

Untuk memudahkan navigasi antar halaman maka kita perlu untuk mengatur routingnya.

Buka app-routing.module.ts kemudian import LoginComponent dan TodoComponent lalu tambahkan objek route di dalam Routes sehingga menjadi seperti ini.

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component'
import { TodoComponent } from './todo/todo.component'


const routes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  {
    path: '',
    redirectTo: 'login',
    pathMatch: 'full'
  },
  {
    path: 'todo',
    component: TodoComponent
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Jadi ketika path nya kosong misal localhost, maka akan redirect otomatis ke localhost/login.

4. Membuat desain UI halaman utama

Nah, dibagian ini saya akan membuat desain tampilan untuk halaman utama, login, dan juga todo.

Pertama buka app.component.html hapus semua kode yang ada kemudian tambahkan sebuah toolbar.

<mat-toolbar>
  <span>{{title}}</span>
</mat-toolbar>

<router-outlet></router-outlet>

router-outlet kita gunakan untuk menampung atau menampilkan halaman yang sudah kita routing.

Lanjut ke file login.component.html kita akan membuat tampilan form login sederhana, kodenya adalah berikut.

<div class="login-form-flex">
  <mat-card>
    <mat-form-field>
      <mat-label>Username</mat-label>
      <input matInput [(ngModel)]="data.username">
    </mat-form-field>
    <mat-form-field>
      <mat-label>Password</mat-label>
      <input type="password" matInput [(ngModel)]="data.password">
    </mat-form-field>
    <mat-card-actions>
      <div class="button-flex-container">
        <button mat-raised-button color="primary" (click)="masuk(data)">Login</button>
      </div>
    </mat-card-actions>
  </mat-card>
</div>

Jangan lupa tambahkan css pada login.component.css dengan kode css berikut.

.login-form-flex {
  display: flex;
  justify-content: center;
  margin-top: 160px;
}

.button-flex-container {
  display: flex;
  width: 100%;
  justify-content: flex-end;
}

mat-card {
  width: 30%;
}

mat-form-field {
  width: 100%;
}

Oiya, penting jangan lupa untuk menambahkan form module ke dalam app.module.ts supaya bisa memproses inputan pada form.

..
import { FormsModule } from '@angular/forms'
..
..
imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MaterialDesign,
    FormsModule
  ],

Selanjutnya buka file login.component.ts disini kita akan menambahkan data dan fungsi untuk login ke aplikasi todo, kita pakai logika if disini, dan ini kita buat sementara saja sebelum nantinya kita masuk ke bagain backend dan database, oke sesuaikan kodenya seperti ini.

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {

  constructor(
    public router: Router
  ) { }

  ngOnInit(): void {
  }
  data: any = {};
  masuk(data) {
    if ((data.username == 'admin') && (data.password == 'admin')) {
      this.router.navigate(['/todo']);
    }
  }
}

Sekarang tampilan halaman login menjadi seperti ini.

Kemudian kita lanjut mengatur tampilan halaman todo, buka todo.component.html kemudian tambahkan kode html berikut.

<div class="container">
  <button class="btn-tambah" mat-raised-button color="primary" (click)="buatKegiatan()">Add Activities</button>
  <mat-card>
    <mat-card-header>
      <mat-card-title>To Do List</mat-card-title>
    </mat-card-header>
    <mat-card-content>
      <mat-list>
        <mat-list-item>
          <img matListAvatar src="assets/todo.png" alt="...">
          <h3 matLine> UAS Tekweb Lanjut </h3>
          <p matLine>
            <span> Membuat aplikasi menggunakan angular dan codeigniter 4 yang memuat CRUD </span>
          </p>
          <p matLine>
            <span>Deadline : 28 juli 2020</span>
          </p>
          <button class="btn-edit" mat-raised-button color="accent">Edit</button>
          <button class="btn-selesai" mat-raised-button color="warn">Done</button>
        </mat-list-item>
      </mat-list>
    </mat-card-content>
  </mat-card>
</div>

Jangan lupa tambahkan css pada todo.component.css

.container {
  padding: 50px 100px 50px 100px;
}

.btn-tambah {
  margin-bottom: 20px;
}

.btn-edit {
  margin-right: 10px;
}

Maka hasilnya akan seperti ini

Selanjutnya kita akan membuat dialog untuk menambahkan data / kegiatan. Saya menggunakan komponen dialog material desain.

Sebelumnya buat dulu komponen baru untuk tambah data, ketikka perintah berikut.

ng g c tambah-data

Setelah terbentuk filenya, buka tambah-data.component.html dan tambahkan kode berikut untuk mengatur tampilannya.

<h3 mat-dialog-title>Add New Activities</h3>
<div mat-dialog-content>
  <mat-form-field style="width: 100%;">
    <mat-label>Title</mat-label>
    <input matInput>
  </mat-form-field>

  <mat-form-field style="width: 100%;">
    <mat-label>Description</mat-label>
    <input matInput>
  </mat-form-field>

  <mat-form-field style="width: 100%;">
    <mat-label>Deadline</mat-label>
    <input matInput>
  </mat-form-field>
</div>
<mat-dialog-actions>
  <span class="spacer"></span>
  <button mat-button mat-dialog-close>Cancel</button>
  <button mat-raised-button color="primary" [mat-dialog-close]="true">Save</button>
</mat-dialog-actions>

Karena kita akan menampilkan dialog, maka buka app.module.ts dan tambahkan entryComponents berikut.

entryComponents: [
    TambahDataComponent
  ]

Next, pada todo.component.ts tambahkan kode berikut.

import { Component, OnInit } from '@angular/core';
//import modul dialog
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
//import halaman dialog yang sudah dibuat pada tahap sebelumnya
import { TambahDataComponent } from '../tambah-data/tambah-data.component';

@Component({
  selector: 'app-todo',
  templateUrl: './todo.component.html',
  styleUrls: ['./todo.component.css']
})
export class TodoComponent implements OnInit {

  constructor(
    public dialog: MatDialog //menambahkan variabel dialog
  ) { }

  ngOnInit(): void {
  }

  //fungsi untuk menampilkan dialog penambahan alamat baru
  buatKegiatan() {
    const dialogRef = this.dialog.open(TambahDataComponent, {
      width: '450px',
    });
    dialogRef.afterClosed().subscribe(result => {
      console.log('Dialog ditutup');
    });
  }

}

Fungsi buatKegiatan() berfungsi untuk menampilkan dialog tambah-data yang sudah kita buat, sehingga tampilannya menjadi seperti ini.

Tips : Jangan panik ketika ketemu error, tetap tenang, cari solusinya, di googling banyak tinggal ketik errornya nanti muncul tuh stackoverflow atau forum angular/Ci. Error mengajarkan kita untuk belajar memecahkan masalah.

Bagian 2 membuat back end (codeigniter 4)

Pada bagian yang kedua ini saya akan membuat bagian back end dari aplikasi yang akan memuat CRUD. Saya akan menggunakan codeigniter 4 sebagai back end. Oke let’s cekidot..

5. Install codeigniter 4

Pertama download dulu coigniter 4 di https://codeigniter.com/download

Kemudian extract hasil download tersebut dan ganti nama foldernya menjadi ci4_restApi

Silahkan buka project rest api tersebut ke dalam kode editor favorit kalian. Untuk menjalankan project codeigniter, masuk dulu ke folder projectnya lalu klik kanan open terminal or cmd dan ketikkan perintah php spark serve

Jangan lupa untuk mengganti CI_ENVIRONMENT = production menjadi CI_ENVIRONMENT = development pada file .env (jika namanya env ubah menjadi .env)

Untuk lebih jelasnya saya pernah membuat video instalasi, bisa diliat pada Cara Install Codeigniter 4

6. Koneksi ke database

Sebelumnya silahkan buat databasenya terlebih dahulu, disini saya membuat database dengan nama rest_ci4 lalu di dalamnya saya buat sebuah tabel dengan nama todo yang memiliki 4 kolom(id[auto increment], judul, deskripsi, jadwal_selesai) jangan lupa juga untuk isi datanya.

Kemudian buka file .env dan cari bagian database lalu uncomment dan sesuaikan menjadi seperti ini.

database.default.hostname = 127.0.0.1
database.default.database = rest_ci4
database.default.username = root
database.default.password = 
database.default.DBDriver = MySQLi

Sesuaikan nama database kalian jika berbeda.

7. Membuat Model

Pada folder Models silahkan buat file baru dengan nama Mtodo.php kemudian isi dengan kode berikut.

<?php

namespace App\Models;

use CodeIgniter\Model;

class Mtodo extends Model
{
   protected $table = 'todo';

   public function getTodo($id = false)
   {
      if ($id === false) {
         return $this->findAll();
      } else {
         return $this->getWhere(['id' => $id])->getRowArray();
      }
   }
}

Fungsi getTodo akan kita gunakan untuk mengambil data di dalam tabel, jika id nya kosong maka semua data akan ditampilkan, namun jika id nya ada maka akan ditampilkan data berdasarkan id.

8. Membuat controller

Pada folder Controllers buat sebuah file dengan nama Todo.php yang akan kita jadikan sebagai controllernya. Setelah itu sesuaikan kodenya menjadi seperti berikut.

<?php

namespace App\Controllers;

use App\Models\Mtodo;
use CodeIgniter\RESTful\ResourceController;

class Todo extends ResourceController
{
   protected $format = 'json';
   protected $modelName = 'use App\Models\Mtodo';

   public function __construct()
   {
      $this->mtodo = new Mtodo();
   }

   public function index()
   {
      $mtodo = $this->mtodo->getTodo();

      foreach ($mtodo as $row) {
         $mtodo_all[] = [
            'id' => intval($row['id']),
            'judul' => $row['judul'],
            'deskripsi' => $row['deskripsi'],
            'jadwal_selesai' => $row['jadwal_selesai'],
         ];
      }

      return $this->respond($mtodo_all, 200);
   }
}

Disini kita menggunakan ResourceController sebagai parent dari controller yang memuat berbagai macam fungsi seperti edit, delete, dll. yang akan mempermudah kita dalam membuat CRUD.

Kemudian variabel $format bertugas untuk mengatur format data yang ditampilkan dalam hal ini adalaj JSON. Saya juga membuat objek $mtodo agar bisa mengakses fungsi yang ada di dalam model Mtodo.php.

9. Mengatur resources todo

Buka file Routes.php kemdudian tambahkan kode berikut ini dibawah $routes->get('/', 'Home::index'); sehingga menjadi seperti berikut.

$routes->get('/', 'Home::index');
$routes->resource('todo');

Kode diatas berfungsi untuk menangani resource controller.

10. Membuat fungsi tambah data

Buka file Mtodo.php dan tambahkan fungsi berikut ini.

public function insertTodo($data)
   {
      $query = $this->db->table($this->table)->insert($data);
      if ($query) {
         return true;
      } else {
         return false;
      }
   }

Fungsi insertData berfungsi untuk melakukan insert/menambah data ke dalam database.

Kemudian buka controller Todo.php dan tambahkan juga fungsi create untuk memanggil fungsi yang ada pada model sehingga bisa menambah data.

public function create()
   {
      $judul = $this->request->getPost('judul');
      $deskripsi = $this->request->getPost('deskripsi');
      $jadwal_selesai = $this->request->getPost('jadwal_selesai');

      $data = [
         'judul' => $judul,
         'deskripsi' => $deskripsi,
         'jadwal_selesai' => $jadwal_selesai
      ];

      $simpan = $this->mtodo->insertTodo($data);

      if ($simpan == true) {
         $output = [
            'status' => 200,
            'message' => 'Berhasil menyimpan data',
            'data' => ''
         ];
         return $this->respond($output, 200);
      } else {
         $output = [
            'status' => 400,
            'message' => 'Gagal menyimpan data',
            'data' => ''
         ];
         return $this->respond($output, 400);
      }
   }

11. Menambahkan fungsi show dan edit

Masih di controller Todo.php tambahkan kode berikut.

public function show($id = null)
   {
      $mtodo = $this->mtodo->getTodo($id);

      if (!empty($mtodo)) {
         $output = [
            'id' => intval($mtodo['id']),
            'judul' => $mtodo['judul'],
            'deskripsi' => $mtodo['deskripsi'],
            'jadwal_selesai' => $mtodo['jadwal_selesai'],
         ];

         return $this->respond($output, 200);
      } else {
         $output = [
            'status' => 400,
            'message' => 'Data tidak ditemukan',
            'data' => ''
         ];

         return $this->respond($output, 400);
      }
   }

   public function edit($id = null)
   {
      $mtodo = $this->mtodo->getTodo($id);

      if (!empty($mtodo)) {
         $output = [
            'id' => intval($mtodo['id']),
            'judul' => $mtodo['judul'],
            'deskripsi' => $mtodo['deskripsi'],
            'jadwal_selesai' => $mtodo['jadwal_selesai'],
         ];

         return $this->respond($output, 200);
      } else {
         $output = [
            'status' => 400,
            'message' => 'Data tidak ditemukan',
            'data' => ''
         ];
         return $this->respond($output, 400);
      }
   }

Kode diatas bergungsi untuk manampilkan detail dari data berdasarkan id.

12. Menambah fungsi update

Buka file model Mtodo.php kemudian tambahkan fungsi updateTodo untuk melakukan update pada data.

public function updateTodo($data, $id)
   {
      return $this->db->table($this->table)->update($data, ['id' => $id]);
   }

Kemudian bukan file Todo.php dan tambahkan fungsi update berikut.

public function update($id = null)
   {
      // menangkap data dari method PUT, DELETE
      $data = $this->request->getRawInput();

      // cek data berdasarkan id
      $mtodo = $this->mtodo->getTodo($id);

      //cek todo
      if (!empty($mtodo)) {
         // update data
         $updateTodo = $this->mtodo->updateTodo($data, $id);

         $output = [
            'status' => true,
            'data' => '',
            'message' => 'sukses melakukan update'
         ];

         return $this->respond($output, 200);
      } else {
         $output = [
            'status' => false,
            'data' => '',
            'message' => 'gagal melakukan update'
         ];

         return $this->respond($output, 400);
      }
   }

Jangan lupa simpan hasilnya.

13. Menambahkan fungsi delete

Terakhir kita tambahkan fungsi untuk menghapus data, buka Mtodo.php dan tambahkan fungsi deleteTodo berikut.

public function deleteTodo($id)
   {
      return $this->db->table($this->table)->delete(['id' => $id]);
   }

Kemudian pada controllernya tambahkan fungsi delete.

public function delete($id = null)
   {
      // cek data berdasarkan id
      $mtodo = $this->mtodo->getTodo($id);

      //cek todo
      if (!empty($mtodo)) {
         // delete data
         $deleteTodo = $this->mtodo->deleteTodo($id);

         $output = [
            'status' => true,
            'data' => '',
            'message' => 'sukses hapus data'
         ];

         return $this->respond($output, 200);
      } else {
         $output = [
            'status' => false,
            'data' => '',
            'message' => 'gagal hapus data'
         ];

         return $this->respond($output, 400);
      }
   }

Jangan lupa di save.

14. Testing

Untuk mengecek apakah rest api yang sudah kita buat berjalan dengan baik, kita bisa cek menggunakan aplikasi postman. Jika belum punya silahkan download (https://www.postman.com/downloads/) kemudian install seperti biasa.

Setelah postman di install, silahkan buka.

Jangan lupa untuk menjalankan server CI terlebih dahulu dengan perintah php spark serve.

Kemudian tulisankan localhost:8080/todo dengan method GET, maka hasilnya akan seperti ini.

Bisa diliat bahwa data sudah bisa kita tampilkan dengan format JSON. Kita juga bisa melakukan create, update, dan delete data dengan mengganti methodnya dan sesuaikan url nya.

Bagian 3 integrasi angular dan codeigniter

Setelah sebelumnya kita sudah membuat front end angular untuk tampilan dan backend codeigniter untuk rest apinya. Sekarang kita akan melakukan integrasi atau menggabungkan keduanya sehingga menghasilkan aplikasi todo yang memuat operasi CRUD dengan data yang disimpan pada database.

Oke masih semangat ? let’s code again…

15. Koneksi ke rest api

Sekarang kita akan coba untuk melakukan koneksi antara angular dengan rest api yang sudah kita buat.

Karena kita masih menggunakan local server, maka perlu disediakan web server lokal dan yang akan kita gunakan adalah xampp. Oke langsung saja start xampp kalian.

Kemudian pindahkan projek rest api yang sudah dibuat ke dalam folder htdocs di xampp kalian dan ganti namanya menjadi rest-api sehingga menjadi seperti ini.

Lalu tambahkan module http client ke dalam app.module.ts.

// koneksi http
import { HttpClientModule } from '@angular/common/http';
..
..
imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MaterialDesign,
    FormsModule,
    HttpClientModule
  ],
..
..

Selanjutnya buat api service pada angular dengan perintah berikut.

ng g service api

Maka akan terbentuk dua file yaitu api.service.ts dan api.service.spec.ts. Di dalam file api.service.ts tambahkan dan sesuaikan kodenya sehingga menjadi seperti ini.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private http: HttpClient) { }
  apiUrl: any = 'http://localhost/rest-api/public/todo';

  baca() {
    return this.http.get(this.apiUrl);
  }
}

apiUrl merupakan base url dari rest api yang sudah kita buat yang di dalamnya bisa mengakses fungsi CRUD, sedangkan fungsi baca() merupakan sebuah fungsi yang akan kita gunakan untuk membaca data dari api.

Kemudian buka file todo.component.ts dan tambah dan sesauikan kodenya menjadi seperti ini.

// api service
import { ApiService } from '../api.service'; // import apiservice

@Component({
  selector: 'app-todo',
  templateUrl: './todo.component.html',
  styleUrls: ['./todo.component.css']
})
export class TodoComponent implements OnInit {

  constructor(
    public dialog: MatDialog, //menambahkan variabel dialog
    public api: ApiService
  ) {
    this.getData()
  }

  todo: any = []
  getData() {
    this.api.baca().subscribe(res => {
      this.todo = res
    })
  }
...
...

fungsi getData() kita gunakan untuk mengambil atau membaca data dari api ke aplikasi angular yang kita buat.

Jalankan aplikasi angular dengan perintah ng s --o kemudian cek konsole (f12) dan pada menu network kemudian todo dan seharusnya data sudah berhasil ditampilkan seperti berikut ini.

16. Menampilkan data ke user interface

Setelah front end dan backend berhasil kita integrasikan, sekarang kita tinggal menampilkan datanya ke dalam user interface yang sudah kita buat.

Buka file todo.component.html dan sesuaikan kode yang ada menjadi seperti berikut.

<div class="container">
  <button class="btn-tambah" mat-raised-button color="primary" (click)="buatKegiatan()">Add Activities</button>
  <mat-card>
    <mat-card-header>
      <mat-card-title>To Do List</mat-card-title>
    </mat-card-header>
    <mat-card-content>
      <mat-list>
        <mat-list-item *ngFor="let item of todo">
          <img matListAvatar src="assets/todo.png" alt="...">
          <h3 matLine> {{item.judul}} </h3>
          <p matLine>
            <span> {{item.deskripsi}} </span>
          </p>
          <p matLine>
            <span>Deadline : {{item.jadwal_selesai}}</span>
          </p>
          <button class="btn-edit" mat-raised-button color="accent">Edit</button>
          <button class="btn-selesai" mat-raised-button color="warn">Done</button>
        </mat-list-item>
      </mat-list>
    </mat-card-content>
  </mat-card>
</div>

Kita melakukan perulangan di dalam list item tersebut sehingga hasilnya menjadi seperti ini.

17. Membuat fungsi insert data

Buka file api.service.ts kemudian tambahkan fungsi simpan() dengan method http post untuk membuat data baru, sehingga fungsinya seperti berikut.

simpan(data: any) {
    console.log(data)
    return this.http.post(this.apiUrl, data)
  }

Fungsi diatas akan memanggil method create yang sudah dibuat pada codeigniter 4 karena menggunakan ResourceController sebagai parent dari controller dalam pembuatan rest. Ada juga method show, edit, dan delete.

Lalu buka `tambah-data.component.ts dan sesuaikan kodenya menjadi seperti berikut.

import { Component, OnInit, Inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { ApiService } from '../api.service';

@Component({
  selector: 'app-tambah-data',
  templateUrl: './tambah-data.component.html',
  styleUrls: ['./tambah-data.component.css']
})
export class TambahDataComponent implements OnInit {

  data: any = {}
  constructor(
    public api: ApiService,
    public dialogRef: MatDialogRef<TambahDataComponent>,
    @Inject(MAT_DIALOG_DATA) public itemData: any
  ) {
    if (itemData != null) {
      this.data = itemData;
    }
  }

  ngOnInit(): void {
  }

  insert(data) {
      this.api.simpan(data).subscribe(res => {
        this.dialogRef.close(true)
      })
  }
}

Saya menambahkan fungsi insert untuk memanggil api dan melakukan penambahan data sesaui method pada api.

Sekarang buka tambah-data.component.html kemudian tambahkan ngModel dan juga onclick sehingga menjadi seperti ini.

<h3 mat-dialog-title>Add New Activities</h3>
<div mat-dialog-content>
  <mat-form-field style="width: 100%;">
    <mat-label>Title</mat-label>
    <input matInput [(ngModel)]="data.judul">
  </mat-form-field>

  <mat-form-field style="width: 100%;">
    <mat-label>Description</mat-label>
    <input matInput [(ngModel)]="data.deskripsi">
  </mat-form-field>

  <mat-form-field style="width: 100%;">
    <mat-label>Deadline</mat-label>
    <input matInput [(ngModel)]="data.jadwal_selesai">
  </mat-form-field>
</div>
<mat-dialog-actions>
  <span class="spacer"></span>
  <button mat-button mat-dialog-close>Cancel</button>
  <button mat-raised-button color="primary" [mat-dialog-close]="true" (click)="insert(data)">Save</button>
</mat-dialog-actions>

18. Membuat fungsi edit data

Buka kembali file api.service.ts dan tambahkan fungsi ubah seperti berikut.

ubah(data) {
    return this.http.put(this.apiUrl + '/' + data.id, data)
  }

Fungsi diatas akan melakukan edit data sesuai dengan id data dan kita menggunakan method put.

Lalu tambahkan fungsi editTodo pada file todo.component.ts untuk memunculkan dialog edit.

//fungsi untuk menampilkan dialog edit data
  editTodo(data) {
    const dialogRef = this.dialog.open(TambahDataComponent, {
      width: '450px',
      data: data
    });
    dialogRef.afterClosed().subscribe(res => {
      this.getData() // menampilkan data setelah diperbarui
    });
  }

Dan jangan lupa di todo.component.html tambahkan trigger click pada button edit seperti ini.

<button class="btn-edit" mat-raised-button color="accent" (click)="editTodo(item)">Edit</button>

Selanjutnya buka tambah-data.component.ts dan sesuaikan fungsi insert menjadi seperti berikut.

insert(data) {
    if (data.id == undefined) {
      this.api.simpan(data).subscribe(res => {
        this.dialogRef.close(true)
      })
    } else {
      this.api.ubah(data).subscribe(res => {
        this.dialogRef.close(true)
      })
    }
  }

Oke jadi ketika id nya kosong maka insert data baru, namun ketika idnya ada maka akan di update sesaui id.

19. Membuat fungsi hapus data

Buka lagi file api.service.ts dan tambahkan fungs hapus dengan method delete by id seperti berikut.

hapus(id) {
    return this.http.delete(this.apiUrl + '/' + id)
  }

Terakhir di todo.component.ts tambahkan fungsi hapusTodo dengan paramter id sehingga seperti ini.

//fungsi untuk menghapus data
  hapusTodo(id) {
    console.log('data dihapus')
    this.api.hapus(id).subscribe(res => {
      this.getData()
    })
  }

Dan tambahkan trigger onclick pada button hapus di file todo.component.html

<button class="btn-selesai" mat-raised-button color="warn" (click)="hapusTodo(item.id)">Done</button>

Kode diatas berfungsi untuk menghapus data berdasarkan id nya.

20. Penutup

Selamat kita sudah menyelesaikan project membuat aplikasi menggunakan angular sebagai front end dan codeigniter 4 sebagai back end. Tetap semangat, stay coding and stay awesome.

Untuk hasilnya seperti berikut.

Halaman login :

Ketika login berhasil masuk ke halaman todo yang membuat CRUD :

Tambah data :

Edit data :

Hapus data :

“The only way to learn a new programming language is by writing programs in it.”

Source code : To Do App Github



fyn

Terima kasih sudah membaca semoga bermanfaat 🤗


Written with ❤️ -