Membuat Aplikasi CRUD di Ionic 6 dengan MySQL

Dalam pembuatan sebuah aplikasi, untuk mengolah sebuah data di database tak pernah luput yang dengan namanaya CRUD.

CRUD sendiri merupakan singkatan dari Create, Read, Update dan Delete.

Untuk lebih memahami penggunaan CRUD pada Ionic 6, kita akan mencoba membuat aplikasi note sederhana.

1. Membuat Database & Restful API

Sebelum membuat aplikasinya, pertama kita siapkan terlebih dahulu database dan API nya.

Buat database simple_note, kemudian buat tabel note dengan struktur seperti gambar di bawah

Struktur Database

Setelah database berhasil dibuat, sekarang kita buat Restful API-nya.

Disini saya akan membuatnya dengan PHP Native, kalian bebas membuat API dengan tools apapun atau dengan framework PHP jika tidak ingin menggunakan PHP Native. Disesuaikan saja kodingannya dengan ketentuan tools atau frameworknya yaa.

Jika kalian tidak menggunakan PHP Native untuk membuat Restful API. Kalian boleh langsung ke bagian 2 pada halaman ini. klik disini

Bagi yang ingin tetap mencoba menggunakan PHP Native siapkan direktori project kalian yang akan digunakan untuk menyimpan file Restful API nya.

Berikutnya kita buat file config.php yang digunakan untuk mengkonfigurasi koneksi ke database, lalu masukkan kodingan berikut dan simpan di direktori project API kalian

<?php
  $server="localhost";
  $user="root";
  $pass="";
  $db="simple_note";
 
  $mysqli=mysqli_connect($server,$user,$pass,$db);
?>

Sekarang buat file index.php dengan kodingan berikut dan simpan ke direktori project.

<?php
  //SET HEADER
  header('Access-Control-Allow-Origin: *');
  header("Access-Control-Allow-Headers: Origin, Content-Type, Authorization, Accept, X-Requested-with, x-xsrf-token");
  header("Access-Control-Allow-Credentials: true");
  header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
  header("Content-Type: application/json; charset=utf-8");
  
  //Config Database
  include('config.php');
  
  $postjson = json_decode(file_get_contents('php://input'), true);
  
  
  $METHOD = $_SERVER['REQUEST_METHOD'];
  
  
  if($METHOD==='GET'){
  
    if($_GET["id"]===''){ // JIKA ID KOSONG
  
      // EKSEKUSI QUERY
      $query = mysqli_query($mysqli,"SELECT * FROM note ORDER BY note_id DESC");
  
  
      if($query){ // JIKA QUERY BERHASIL DIEKSEKUSI
  
        $data = [];
        while($row = mysqli_fetch_assoc($query)){
          $data[] = $row;
        }
  
        echo json_encode(array(
          "result" => "success", 
          "data" => $data
        ));
  
      }else{ // JIKA QUERY GAGAL DIEKSEKUSI
  
        echo json_encode(array(
          "result" => "error",
          "message" => "Gagal mengambil data"
        ));
      }
  
    }else{ // JIKA ID TIDAK KOSONG
  
      $id = $_GET["id"];
  
      $query = mysqli_query($mysqli,"SELECT * FROM note where note_id='{$id}'");
  
  
      if(mysqli_num_rows($query) > 0){
  
        $row = mysqli_fetch_assoc($query);
  
        echo json_encode(array(
          "result" => "success",
          "data" => $row
        ));

      }else{
        echo json_encode(array(
          "result" => "error",
          "message" => "Tidak ada data ditemukan"
        ));
      }
    }
  }
  
  if($METHOD==='POST'){
  
    $note_title = mysqli_real_escape_string($mysqli,$postjson["note_title"]);
    $note_content = mysqli_real_escape_string($mysqli,$postjson["note_content"]);
  
  	// EKSEKUSI QUERY
    $query = mysqli_query($mysqli,"INSERT INTO note(note_title,note_content) VALUES('{$note_title}','{$note_content}')");
  
  
    if($query){ // JIKA QUERY BERHASIL DIEKSEKUSI
  
      $query_note_id = mysqli_query($mysqli,"SELECT LAST_INSERT_ID() as note_id");
  
      $note_id = mysqli_fetch_assoc($query_note_id)["note_id"];
  
      echo json_encode(array(
        "result" => "success",
        "message" => "Data berhasil disimpan",
        "data"  =>  [
          "note_id" => $note_id,
          "note_title" => $note_title,
          "note_content" => $note_content
        ]
      ));
  
    }else{ // JIKA QUERY GAGAL DIEKSEKUSI

      echo json_encode(array(
        "result" => "error",
        "message" => "Gagal menyimpan data"
      ));

    }
  }
  
  if($METHOD==='PUT'){
    $note_id = $_GET["id"];
    $note_title = mysqli_real_escape_string($mysqli,$postjson["note_title"]);
    $note_content = mysqli_real_escape_string($mysqli,$postjson["note_content"]);
  
  	// EKSEKUSI QUERY
    $query = mysqli_query($mysqli,"UPDATE note SET note_title='{$note_title}', note_content='{$note_content}' WHERE note_id='{  $note_id}'");  
  
  
    if($query){ // JIKA QUERY BERHASIL DIEKSEKUSI
  
      if(mysqli_affected_rows($mysqli)>0){ // JUMLAH ROW YANG TERUPDATE > 0

        echo json_encode(array(
          "result" => "success",
          "message" => "Data berhasil diubah"
        ));
      
      }else{
      
        echo json_encode(array(
          "result" => "error",
          "message" => "note id tidak terdaftar"
        ));
      
      }
    
    }else{ // JIKA QUERY GAGAL DIEKSEKUSI
    
  	  echo json_encode(array(
  	    "result" => "error",
  	     "message" => "Gagal merubah data"
  	  ));
    }
  }
  
  
  if($METHOD==='DELETE'){
    $note_id = $_GET["id"];
  
  	// EKSEKUSI QUERY
    $query = mysqli_query($mysqli,"DELETE FROM note WHERE note_id='{$note_id}'");
  
    if($query){ // JIKA QUERY BERHASIL DIEKSEKUSI

      echo json_encode(array(
        "result" => "success",
        "message" => "Data berhasil dihapus"
      ));
    
    }else{ // JIKA QUERY GAGAL DIEKSEKUSI

      echo json_encode(array(
        "result" => "error",
        "message" => "Gagal merubah data"
      ));
    
    }
  }

?>

Sekarang kita buat file .htaccess dan simpan di direktori.

RewriteEngine On
RewriteRule ^([0-9]+)?$ index.php?id=$1

2. Project Ionic

Setelah API telah disiapkan, sekarang waktunya kita membuat aplikasinya

2.1 Membuat Project

Pertama-tama jalankan perintah untuk membuat project ionic dan tunggu sampai prosesnya selesai.

ionic start simpleNote –-type=angular –-capacitor

Jika sudah selesai, masuk ke folder project nya

cd simpleNote

Berikutnya kita akan membuat 3 pages dan 1 service

  • Page home : sebagai halaman utama untuk menampilkan list note
  • Page detail : untuk menampilkan detail note, untuk metodenya menampilkan kita akan jadikan sebagai modal.
  • Page form-note : untuk create dan edit note, page ini nanti kita tampilkan dengan modal.
  • Service note : untuk mengakses Restful API

Mari jalankan perintah untuk membuat pages dan service nya

ionic g page modals/detail
ionic g page pages/home
ionic g page modals/form-note
ionic g service services/note

Lalu buka file app-routing.module.ts, ubah kodingannya sebagai berikut

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  },
  {
    path: 'detail',
    loadChildren: () => import('./modals/detail/detail.module').then( m => m.DetailPageModule)
  },
  {
    path: 'home',
    loadChildren: () => import('./pages/home/home.module').then( m => m.HomePageModule)
  },
  {
    path: 'form-note',
    loadChildren: () => import('./modals/form-note/form-note.module').then( m => m.FormNotePageModule)
  },
];

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

Untuk struktur folder dan file nya akan menjadi seperti berikut

  • app
    • modals
      • detail
        • detail.module.ts
        • detail.page.html
        • detail.page.scss
        • detail.page.spec.ts
        • detail.page.ts
        • detail-routing.module.ts
      • form-note
        • form-note.module.ts
        • form-note.page.html
        • form-note.page.scss
        • form-note.page.spec.ts
        • form-note.page.ts
        • form-note-routing.module.ts
    • pages
      • home
        • home.module.ts
        • home.page.html
        • home.page.scss
        • home.page.spec.ts
        • home.page.ts
        • home-routing.module.ts
    • services
      • note.service.spec.ts
      • note.service.ts
    • app.component.html
    • app.component.scss
    • app.component.spec.ts
    • app.component.ts
    • app.module.ts
    • app-routing.module.ts

2.2 Memasang HTTP Request

Berikutnya kita pasang plugin HTTP Request ke project kita. Sekarang buka file “app.module.ts” dan import plugin-nya sehingga kodingannya menjadi seperti berikut

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule, 
    IonicModule.forRoot(), 
    AppRoutingModule,
    HttpClientModule
  ],
  providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
  bootstrap: [AppComponent],
})
export class AppModule {}

2.3 Membuat Service

Sekarang kita mulai merubah kodingan untuk service pada project yang nanti akan berfungsi untuk melakukan pemanggilan ke API

Buka file “note.service.ts” di folder services, lalu ubah kodingannya menjadi seperti berikut

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

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

  server:string = "http://localhost/api/";

  constructor(
    public http: HttpClient
  ) { }


  getListNote(){
    return this.http.get(this.server+'note/');
  }

  getDetailNote(noteId){
    return this.http.get(this.server+'note/'+noteId);
  }

  addNote(noteTitle,noteContent){
    return this.http.post(this.server+'note/',{
      note_title:noteTitle,
      note_content:noteContent
    });
  }

  editNote(noteId,noteTitle,noteContent){
    return this.http.put(this.server+'note/'+noteId,{
      note_title:noteTitle,
      note_content:noteContent
    });
  }

  deleteNote(noteId){
    return this.http.delete(this.server+'note/'+noteId);
  }

}

Sedikit penjelasan dari kodingan di atas

Pada line 2 : berfungsi untuk memanggil atau mengimport plugin Http Request ke services kita.

Pada line 9 : merupakan variabel yang digunakan untuk menyimpan data URL API.

Pada kodingan service terdapat beberapa fungsi :
getListNote() : untuk menampilkan list dari note
getDetailNote(noteId) : untuk menampilkan detail dari note dengan argumen pertama id note-nya
addNote(noteTitle,noteContent) : untuk menambah note dengan argumen pertama judul dan kedua isi dari note.
editNote(noteId,noteTitle,noteContent) : untuk merubah data note dengan tiga argumen yaitu id note, judul dan isi note.
deleteNote(noteId) : untuk menghapus sebuah note dengan argumen id note

2.4 Menampilkan List Note

Setelah service berhasil kita buat, berikutnya kita akan mencoba membuat koding untuk menampilkan list dari note.

Sekarang buka file “home.page.ts” di folder pages/home.

Import plugin dan note service yang telah kita buat

import { NoteService } from '../../services/note.service';
import { ToastController} from '@ionic/angular';

Kita juga akan membuat variabel listsNote yang nantinya akan digunakan untuk menyimpan data list dari catatan

listsNote:any;

Pada constructor() kita definisikan seperti berikut

constructor(
  private noteService:NoteService,
  public toastCtrl:ToastController,
) { }

Lalu tambahkan kodingan untuk memanggil list note di function ionViewWillEnter() dan function presentToast() yang akan digunakan untuk menampilkan pesan error

ionViewWillEnter(){
  // MEMANGGIL API LIST NOTE
  this.noteService.getListNote().subscribe(
    res => {
      if(res["result"]=="success"){ // JIKA HASIL SUCCESS

        this.listsNote = res["data"];
      
      }else{ // JIKA HASIL ERROR
      
        this.presentToast(res["message"]);
      
      }
    },
    err => {
      console.log(err.error)
    }
  )
}

//FUNCTION PRESENT TOAST
async presentToast(a){
  const toast = await this.toastCtrl.create({
    message: a,
    duration: 1500
  });
  toast.present();
}

Dan untuk hasil kodingan home.page.ts akan menjadi seperti ini

import { Component, OnInit } from '@angular/core';
import { NoteService } from '../../services/note.service';
import { ToastController} from '@ionic/angular';
 

@Component({
  selector: 'app-home',
  templateUrl: './home.page.html',
  styleUrls: ['./home.page.scss'],
})
export class HomePage implements OnInit {

  listsNote:any;

  constructor(
    private noteService:NoteService,
    public toastCtrl:ToastController
  ) { }

  ngOnInit() {
    
  }

  ionViewWillEnter(){
    // MEMANGGIL API LIST NOTE
    this.noteService.getListNote().subscribe(
      res => {
        if(res["result"]=="success"){ // JIKA HASIL SUCCESS

          this.listsNote = res["data"];
        
        }else{ // JIKA HASIL ERROR
        
          this.presentToast(res["message"]);
        
        }
      },
      err => {
        console.log(err.error)
      }
    )
  }

  //FUNCTION PRESENT TOAST
  async presentToast(a){
    const toast = await this.toastCtrl.create({
      message: a,
      duration: 1500
    });
    toast.present();
  }

}

Sekarang kita buat bagian tampilan untuk menampilkan list dari note, buka file home.page.html dan ubah kodenya menjadi seperti di bawah

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>Catatan</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>

	<ion-fab vertical="bottom" horizontal="end" slot="fixed">
    	<ion-fab-button (click)="modalFormNote()">
      		<ion-icon name="add-outline"></ion-icon>
    	</ion-fab-button>
  	</ion-fab>

  	<ion-list>
  		<ion-item-sliding *ngFor="let item of listsNote;let i = index">
		    <ion-item lines="full" (click)="modalDetail(i)">
		      	<ion-label>{{item.note_title}}</ion-label>
		    </ion-item>
		    <ion-item-options  side="end">
		      	<ion-item-option color="primary" (click)="modalFormNote(i)">Edit</ion-item-option>
		      	<ion-item-option color="danger" (click)="deleteNote(i)">Delete</ion-item-option>
		   	</ion-item-options>
		</ion-item-sliding>
  	</ion-list>
</ion-content>

Pada kodingan home.page.html terdapat function modalDetail() untuk melihat detail, modalFormNote() untuk menambah atau merubah note dan deleteNote() untuk menghapus note. Untuk sampai bagian ini, ketiga function tersebut belum menghasilkan efek apapun karena kita belum mendefinisikan functionya

Tampilan List Note

2.5 Menampilkan Detail Note

Jika sudah berhasil menampilkan list note, sekarang mari kita buat fungsi untuk menampilkan detail dari note.

Konsepnya saat kita tekan salah satu note maka akan menampilkan detailnya.

Tampilan Detail Note

Mari kita buka kembali file home.page.ts.

Import plugin Input untuk menerima inputan dari page induk dan modal untuk menampilkan detail sebagai modal.

Dan karena detail dipanggil sebagai modal dari page home, maka kita perlu mengimport page detail ke home

import { Component, OnInit, Input } from '@angular/core';
import { ToastController,  ModalController } from '@ionic/angular';
import { DetailPage } from  '../../modals/detail/detail.page';

Sekarang kita ubah bagian constructor()

constructor(
  private noteService:NoteService,
  public toastCtrl:ToastController,
  public modalCtrl:ModalController
) { }

Lalu tambahkan function modalDetail() untuk menampilkan detail note

// FUNCTION MODAL DETAIL
async modalDetail(i){
  const modal = await this.modalCtrl.create({
    component:DetailPage,
    componentProps:{
      dataNote:this.listsNote[i]
    }
  });

  return await modal.present();
}

parameter dataNote berisi value detail data note yang akan kita kirim ke page modal

Selanjutnya buka file detail.page.ts, lalu ubah kodingannya menjadi seperti berikut

import { Component, OnInit, Input } from '@angular/core';
import { ModalController } from '@ionic/angular';

@Component({
  selector: 'app-detail',
  templateUrl: './detail.page.html',
  styleUrls: ['./detail.page.scss'],
})
export class DetailPage implements OnInit {

  @Input() public dataNote:any;

  constructor(
    public modalCtrl:ModalController
  ) { }

  ngOnInit() {
    
  }

  //Tutup Modal
  async closeModal(data){
    await this.modalCtrl.dismiss(data);
  }

}

pada line 11 untuk mengambil data yang dikirimkan dari page home melalui modal

function closeModal() digunakan untuk menutup modal detail

berikutnya kita buka file detail.page.html dan ubah kodingannya

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>{{dataNote.note_title}}</ion-title>
    <ion-buttons slot="end" (click)="closeModal()">
      	<ion-button>
        	<ion-icon name="close-outline"></ion-icon>
      	</ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content>
	<ion-card>
		<ion-card-content>
			<div [innerHTML]="dataNote.note_content"></div>
		</ion-card-content>
	</ion-card>
</ion-content>

2.6 Tambah Data Note

Pada bagian ini kita akan membuat form untuk menambahkan note.

Untuk tampilannya kita akan buat seperti ini

Tampilan Form Note

Dari gambar di atas pada bagian form content kita akan buat dengan CKEditor.

Pertama kita install terlebih dahulu plugin CKEditor.

npm install –save @ckeditor/ckeditor5-angular

Berikutnya kita install editor build nya CKEditor yang classic

npm install –save @ckeditor/ckeditor5-build-classic

*Documentation CKEditor kalian dapat mengakses disini https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/frameworks/angular.html

Sebelum mulai membuat tampilan form, kita kembali dulu ke file home.page.ts import form-note dan tambahkan function modalFormNote() untuk menampilkan detail note lalu simpan.

import { FormNotePage } from  '../../modals/form-note/form-note.page';
// FUNCTION MODAL TAMBAH NOTE
async modalFormNote(){
  
  const modal = await this.modalCtrl.create({
    component:FormNotePage
  });

  // KETIKA MODAL DI TUTUP
  modal.onWillDismiss().then(dataReturned => {
    
    if(dataReturned.data){
      // TAMBAHKAN NOTE KE ARRAY PALING DEPAN
      this.listsNote.unshift(dataReturned.data);
    }
    
  });

  return await modal.present();
}

Setelah menambahkan function modalFormNote() dan telah menginstall plugin CKEditor, berikutnya buka file form-note.module.ts lalu kita import plugin CKEditor

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';

import { IonicModule } from '@ionic/angular';

import { FormNotePageRoutingModule } from './form-note-routing.module';

import { FormNotePage } from './form-note.page';
import { CKEditorModule } from '@ckeditor/ckeditor5-angular';

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    FormNotePageRoutingModule,
    CKEditorModule
  ],
  declarations: [FormNotePage]
})
export class FormNotePageModule {}

Jika sudah diimport, buka file form-note.page.ts, lalu ubah kodingannya menjadi seperti berikut

import { Component, OnInit } from '@angular/core';
import { ModalController, ToastController, LoadingController } from '@ionic/angular';
import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import { NoteService } from '../../services/note.service';

@Component({
  selector: 'app-form-note',
  templateUrl: './form-note.page.html',
  styleUrls: ['./form-note.page.scss'],
})
export class FormNotePage implements OnInit {

  noteId:any;
  noteTitle:string = "";
  noteContent:any;

  public Editor = ClassicEditor;

  constructor(
    public modalCtrl:ModalController,
    private noteService:NoteService,
    public toastCtrl:ToastController,
    public loadCtrl:LoadingController
  ) { }

  ngOnInit() {
  }

  // MENYIMPNAN FORM NOTE
  async saveNote(){
    const loading = await this.loadCtrl.create({
      message: 'Please wait'
    });

    await loading.present();

    await this.noteService.addNote(this.noteTitle,this.noteContent
    ).subscribe(
      res => {
        console.log(res);
        if(res["result"]=="success"){
          this.closeModal({
            note_id:res["data"]["note_id"],
            note_title:this.noteTitle,
            note_content:this.noteContent
          },"add")
        }

        this.presentToast(res["message"]);

        loading.dismiss();
      },
      err => {
        console.log(err);

        loading.dismiss();
      }
    );
  }

  async presentToast(a){
    const toast = await this.toastCtrl.create({
      message: a,
      duration: 1500
    });
    toast.present();
  }

  //Tutup Modal
  async closeModal(data=null,role=null){
    await this.modalCtrl.dismiss(data,role);
  }

}

Berikutnya mari kita buat untuk kodingan tampilannya, buka file form-note.page.html lalu ubah kodingannya seperti berikut

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>Catatan</ion-title>
    <ion-buttons slot="end" (click)="closeModal(null)">
      	<ion-button>
        	<ion-icon name="close-outline"></ion-icon>
      	</ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content padding>
	<ion-input type="text" [(ngModel)]="noteId" style="display: none;"></ion-input>
	<ion-card>
		<ion-card-content>
			<ion-item-group>
				<ion-label>Title</ion-label>
				<ion-input type='text' [(ngModel)]="noteTitle"></ion-input>
			</ion-item-group>
			<ion-item-group>
				<ion-label>Content</ion-label>
				<ckeditor [editor]="Editor" [(ngModel)]="noteContent" style="height: 500px;" [config]="{toolbar : ['heading','|','bold', 'italic','underline','|','NumberedList','BulletedList','Blockquote']}"></ckeditor>
			</ion-item-group>

			<ion-button expand="block" color="primary" (click)="saveNote()">
				Save
			</ion-button>
		</ion-card-content>
	</ion-card>
</ion-content>

2.7 Ubah Data Note

Setelah berhasil menambah data, pada bagian ini kita akan mencoba merubah data dari note.

Untuk merubah data kita akan menggunakan function modalFromNote() dan page form-note yang sama digunakan untuk menambah data

kita akan edit beberapa kodingannya. Silahkan buka kembali file home.page.ts, lalu ubah bagian function modalFormNote() menjadi seperti di bawah ini

// FUNCTION MODAL TAMBAH  DAN UBAH NOTE
  async modalFormNote(i=null){
    let data = i==null ? null : this.listsNote[i];

    const modal = await this.modalCtrl.create({
      component:FormNotePage,
      componentProps:{
        dataNote:data
      }
    });

    // KETIKA MODAL DI TUTUP
    modal.onWillDismiss().then(dataReturned => {
      
      if(dataReturned.role=="add"){ // JIKA DIDAPAT DARI ADD DATA

        this.listsNote.unshift(dataReturned.data);
      
      }else if(dataReturned.role=="edit"){ // JIKA DIDAPAT DARI EDIT DATA
      
        this.listsNote[i] = dataReturned.data
      
      }
      
    });

    return await modal.present();
  }

Berikutnya buka file form-note.page.ts, lalu ubah kodingannya menjadi seperti berikut

import { Component, OnInit, Input } from '@angular/core';
import { ModalController, ToastController, LoadingController } from '@ionic/angular';
import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import { NoteService } from '../../services/note.service';

@Component({
  selector: 'app-form-note',
  templateUrl: './form-note.page.html',
  styleUrls: ['./form-note.page.scss'],
})
export class FormNotePage implements OnInit {

  @Input() public dataNote:any;
  noteId:any;
  noteTitle:string = "";
  noteContent:any;

  public Editor = ClassicEditor;

  constructor(
    public modalCtrl:ModalController,
    private noteService:NoteService,
    public toastCtrl:ToastController,
    public loadCtrl:LoadingController
  ) { }

  ngOnInit() {
  }

  ionViewWillEnter(){
    if(this.dataNote===null){
      this.noteId = "";
    }else{
      this.noteId = this.dataNote.note_id;
      this.noteTitle = this.dataNote.note_title;
      this.noteContent = this.dataNote.note_content;
    }
  }

  // MENYIMPNAN FORM NOTE
  async saveNote(){
    const loading = await this.loadCtrl.create({
      message: 'Please wait'
    });

    await loading.present();

    await this.noteService.addNote(this.noteTitle,this.noteContent
    ).subscribe(
      res => {
        console.log(res);
        if(res["result"]=="success"){
          this.closeModal({
            note_id:res["data"]["note_id"],
            note_title:this.noteTitle,
            note_content:this.noteContent
          },"add")
        }

        this.presentToast(res["message"]);

        loading.dismiss();
      },
      err => {
        console.log(err);

        loading.dismiss();
      }
    );
  }

  // MERUBAH FORM NOTE
  async updateNote(noteId){
    const loading = await this.loadCtrl.create({
      message: 'Please wait'
    });

    await loading.present();

    await this.noteService.editNote(noteId,this.noteTitle,this.noteContent
    ).subscribe(
      res => {
        console.log(res);
        if(res["result"]=="success"){
          this.closeModal({
            note_id:this.noteId,
            note_title:this.noteTitle,
            note_content:this.noteContent
          },"edit")
        }

        this.presentToast(res["message"]);

        loading.dismiss();
      },
      err => {
        console.log(err);
        
        loading.dismiss();
      }
    );
  }


  async presentToast(a){
    const toast = await this.toastCtrl.create({
      message: a,
      duration: 1500
    });
    toast.present();
  }

  //Tutup Modal
  async closeModal(data=null,role=null){
    await this.modalCtrl.dismiss(data,role);
  }

}

Sekarang kita ubah juga bagian tampilan formnya, buka file form-note.page.html. ubah kodingannya menjadi seperti berikut

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>Catatan</ion-title>
    <ion-buttons slot="end" (click)="closeModal(null)">
      	<ion-button>
        	<ion-icon name="close-outline"></ion-icon>
      	</ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content padding>
	<ion-input type="text" [(ngModel)]="noteId" style="display: none;"></ion-input>
	<ion-card>
		<ion-card-content>
			<ion-item-group>
				<ion-label>Title</ion-label>
				<ion-input type='text' [(ngModel)]="noteTitle"></ion-input>
			</ion-item-group>
			<ion-item-group>
				<ion-label>Content</ion-label>
				<ckeditor [editor]="Editor" [(ngModel)]="noteContent" style="height: 500px;" [config]="{toolbar : ['heading','|','bold', 'italic','underline','|','NumberedList','BulletedList','Blockquote']}"></ckeditor>
			</ion-item-group>

			<ion-button expand="block" color="primary" (click)="saveNote()" *ngIf="noteId==''">
				Save
			</ion-button>
			<ion-button expand="block" color="primary" (click)="updateNote(noteId)" *ngIf="noteId!=''">
				Update
			</ion-button>
		</ion-card-content>
	</ion-card>
</ion-content>

Tampilan Edit Note

2.8 Hapus Data Note

Pada bagian terakhir ini kita akan membuat kodingan untuk menghapus note.

sekarang buka file home.page.ts, lalu import plugin AlertController dan LoadingController

import { AlertController, LoadingController } from '@ionic/angular';

Pada bagian constructor() ubah menjadi seperti ini

constructor(
    private noteService:NoteService,
    public toastCtrl:ToastController,
    public modalCtrl:ModalController,
    public alertCtrl:AlertController,
    public loadCtrl:LoadingController
  ) { }

Tambahkan function deleteNote() dan prosesDelete() seperti di bawah

// FUNCTION CONFIRM DELETE NOTE
async deleteNote(i){
  // MEMBUAT ALERT PROMPT
  const alert = await this.alertCtrl.create({
    header: 'Delete',
    message: 'Hapus Catatan ?',
    buttons: [
      {
        text:"Tidak"
      },
      {
        text:"Iya",
        role:"iya"
      }
    ]
  });

  // RUNNING ALERT
  await alert.present();

  // SETELAH ALERT DITUTUP
  await alert.onDidDismiss().then(res => {
    if(res.role=="iya"){ // JIKA BUTTON YANG DITEKAN = "IYA"
      this.prosesDelete(i);
    }
  });
}

// FUNCTION ACTION DELETE NOTE
async prosesDelete(i){
  // MEMBUAT LOADING
  const loading = await this.loadCtrl.create({
    message: 'Please wait'
  });

  // TAMPILKAN LOADING
  await loading.present();

  // MENGIRIM ID NOTE YANG INGIN DIHAPUS KE API
  await this.noteService.deleteNote(this.listsNote[i]["note_id"]).subscribe(
    res => {

      if(res["result"]=="success"){ // JIKA HASIL KE API SUCCESS
      
        this.listsNote.splice(i,1); // HAPUS DATA NOTE DARI ARRAY
      
      }

      // TAMPILKAN PESAN
      this.presentToast(res["message"]);
     
      // SEMBUNYIKAN LOADING
      loading.dismiss();
    },
    err => {
      console.log(err.error)
    
      // SEMBUNYIKAN LOADING
      loading.dismiss();
    }
  );
}

Kodingan di atas, function deleteNote() digunakan untuk menampilkan verifikasi apakah note benar-benar ingin dihapus.

Jika Ya, maka akan dijalankan function prosesDelete() yang berfungsi untuk menghapus note

Tampilan Delete Note

Akhirnya pembuat CRUD Aplikasi note telah selesai kita buat. Untuk kodingan lengkapnya kalian bisa cek disini yaa

About the Author: amoe

You May Also Like

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *