cnbu12oZsPUsXwMqS8ozdUYI5DesA4e6nbQsVzgG
Code Blogger Firebase (Database)
Sharing Code Blogger dengan Firebase (database)
Cara mudah menghubungkan Blog dengan Database, disini anda akan mempelajari memaksimalkan kekuatan Firebase dan Blogger

Project Pendataan Siswa Alumni bagian-2

hi, kali ini setelah beberapa minggu vakum, admin akan mencoba share kembali kelanjutan project Pendataan siswa alumni.

Langkah 2.
Membuat Create dan Read dan delete
buat halaman Tambah Data dan copy paste script berikut

disini kita sudah berhasil membuat data baru, dan menampilkan ya untuk control. dilengkapi dengan tombol delete. catatan penting dalam hal ini bahwa 1 user hanya boleh menginput 1 data alumni. sehingga diperlukan filter saat pembuatan Create data.

 
<div id="userListContainer">

  <!--Tambahkan kolom lain sesuai kebutuhan--><!--Data pengguna akan ditampilkan di sini--><table id="userListTable">

    <thead>

      <tr>

        <th>User ID</th>

        <th>Name</th>

        <th>Email</th>

        <th>Registration Date</th>

        

      </tr>

    </thead>

    <tbody id="userListBody">

      

    </tbody>

  </table>

</div>


<script>

 

  // Dapatkan referensi ke elemen tbody di tabel

  var userListBody = document.getElementById('userListBody');

  // Dapatkan data pengguna saat halaman dimuat

  firebase.auth().onAuthStateChanged(function (user) {

    if (user) {

      // Hapus data sebelumnya jika ada

      userListBody.innerHTML = '';

      // Tambahkan baris baru untuk setiap pengguna

      var newRow = userListBody.insertRow();

      newRow.insertCell().textContent = user.uid;

      newRow.insertCell().textContent = user.displayName || 'N/A';

      newRow.insertCell().textContent = user.email || 'N/A';

      // Dapatkan tanggal pertama kali terdaftar

      var creationTime = new Date(user.metadata.creationTime);

      newRow.insertCell().textContent = creationTime.toDateString();

      // Tambahkan kolom lain sesuai kebutuhan

      const displayName = user.displayName;

	  document.getElementById('namaUser').value = displayName;

  

   	  const email = user.email;

      document.getElementById('nomorUser').value = email;

    } else {

      // Pengguna tidak diotentikasi

     userListBody.innerHTML = '<tr><td colspan="4">User not authenticated. Please <a href="/p/melebu.html">Login first</a></td></tr>';
     // window.location.href = '/p/pasang-lowongan-kerja.html';

    }

  });

</script>

    <style>
        .custom-form {
            background-color: #ffffff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
            max-width: 600px;
            width: 100%;
            text-align: left;
        }

        .custom-form label {
            display: block;
            margin-bottom: 8px;
            color: #495057;
        }

        .custom-form input,
        .custom-form select,
        .custom-form textarea,
        .custom-form file {
            width: 100%;
            padding: 10px;
            margin-bottom: 16px;
            box-sizing: border-box;
            border: 1px solid #ced4da;
            border-radius: 10px;
        }

        .custom-form textarea {
            resize: vertical;
        }

        .custom-form button {
            background-color: #28a745;
            color: #ffffff;
            padding: 12px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }

        .custom-form button:hover {
            background-color: #218838;
        }

        /* Responsive Styling */
        @media only screen and (max-width: 600px) {
            .custom-form {
                padding: 15px;
            }
        }
    </style>

<form class="custom-form" id="addUserForm">
   <fieldset>
        <label>Nama</label>
        <input id="namaUser" name="name" required="" type="text" />
        <label>Email</label>
        <input id="nomorUser" name="email" readonly="" required="" type="email" />
        <label>Facebook (*wajib)</label>
        <input id="Facebook" name="Facebook" type="text" />
        <label>Instagram</label>
        <input id="Instagram" name="Instagram"  type="text" />
        <label>Alamat</label>
        <input id="Alamat" name="Alamat" required="" type="text" />
     	<label>Kuliah</label>
        <input id="Kuliah" name="Kuliah" type="text" />
     	<label>Pekerjaan</label>
        <input id="Pekerjaan" name="Pekerjaan" type="text" />
</fieldset>
<fieldset>
  <label>NISN (*10 digit)</label>
  <input id="NISN" name="NISN" required="" type="text" />
    <label>Nama Ibu Kandung (*wajib)</label>
  <input id="Ibu" name="Ibu" required="" type="text" />*mis SITI SAIDAH (tidak akan ditampilkan) dibutuhkan admin untuk pengecekan ke Valid an data di https://nisn.data.kemdikbud.go.id/<br><br>
  
  <label>Tahun Lulus (*mis 2023)</label>
  <input id="Tahun" name="Tahun" required="" type="text" />
  <label>Kelas (*mis IPA 4)</label>
  <input id="Kelas" name="Kelas" required="" type="text" />
        
  <label>Foto (*wajib)</label>
        <input type="file" id="imageFile" required="" accept="image/*">
  <label>Pesan / Kesan (*wajib)</label>
        <textarea id="description" placeholder="Enter description" required=""></textarea>
       
</fieldset>

  <button type="submit">Tambah Data Alumni</button>
      </form>



  
  

<h2>Managemen Data</h2>

<table border="1" id="user-table">
  <tbody><tr>
    <th>Email</th>
    <th>Nama</th>
    <th>Approval</th>
  </tr>
</tbody></table>



<script>
  // Dapatkan data pengguna saat halaman dimuat
firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
        // Hapus data sebelumnya jika ada
        userListBody.innerHTML = '';

        // Tambahkan baris baru untuk setiap pengguna
        var newRow = userListBody.insertRow();
        newRow.insertCell().textContent = user.uid;
        newRow.insertCell().textContent = user.displayName || 'N/A';
        newRow.insertCell().textContent = user.email || 'N/A';

        // Dapatkan tanggal pertama kali terdaftar
        var creationTime = new Date(user.metadata.creationTime);
        newRow.insertCell().textContent = creationTime.toDateString();

        // Tambahkan kolom lain sesuai kebutuhan
        const displayName = user.displayName;
        document.getElementById('namaUser').value = displayName;

        const email = user.email;
        document.getElementById('nomorUser').value = email;

        // Panggil fungsi untuk menampilkan data pengguna dari Firestore
        displayUserData(email); // Panggil fungsi displayUserData di sini
    } else {
        // Pengguna tidak diotentikasi, arahkan ke halaman login
        //window.location.href = '/p/pasang-lowongan-kerja.html';
    }
});

  const addUserForm = document.getElementById('addUserForm');
const imageFileInput = document.getElementById('imageFile');

// Menambahkan event listener pada form tambah user untuk menambah data user baru
addUserForm.addEventListener('submit', async (e) => {
    e.preventDefault(); // Mencegah form untuk melakukan submit default
	const imageFile = imageFileInput.files[0];
  	const email = addUserForm.nomorUser.value;
  	const nama = addUserForm.namaUser.value;
    const description = addUserForm.description.value;
    const Facebook = addUserForm.Facebook.value;
    const Instagram = addUserForm.Instagram.value;
    const Alamat = addUserForm.Alamat.value;
    const NISN = addUserForm.NISN.value;
    const Ibu = addUserForm.Ibu.value;
    const Tahun = addUserForm.Tahun.value;
    const Kelas = addUserForm.Kelas.value;
    const Kuliah = addUserForm.Kuliah.value;
    const Pekerjaan = addUserForm.Pekerjaan.value;
	const resizedImage = await resizeImage(imageFile, 600, 600);

        // Upload resized image to Firebase Storage
        const storageRef = storage.ref();
        const imageRef = storageRef.child(imageFile.name);
        const uploadTaskSnapshot = await imageRef.put(resizedImage);

        // Get download URL for the image
        const imageUrl = await uploadTaskSnapshot.ref.getDownloadURL();
    

    const user = firebase.auth().currentUser;
    if (!user) {
        alert('Anda harus login terlebih dahulu untuk mengirim data.');
        return;
    }

    try {
        // Melakukan pengecekan apakah email sudah ada di dalam database sebelumnya
        const snapshot = await firestore.collection("users").where("email", "==", email).get();

        if (!snapshot.empty) {
            // Email sudah ada di dalam database, maka hentikan penyimpanan data dan tampilkan pesan
            alert('Email ini sudah terdaftar. Data tidak dapat disimpan.');
            return;
        }

        // Email belum ada di dalam database, maka simpan data user baru ke Firestore
        await firestore.collection("users").add({
		    description : description,
    		email : email,
          	nama : nama,
    		Facebook : Facebook,
    		Instagram : Instagram,
    		Alamat : Alamat,
    		NISN : NISN,
    		Ibu : Ibu,
    		Tahun : Tahun,
    		Kelas : Kelas,
    		imageUrl: imageUrl,
          	Kuliah: Kuliah,
            Pekerjaan: Pekerjaan,
            Approval: 'Yes',
            createdAt: firebase.firestore.FieldValue.serverTimestamp()
        });

        alert('Data berhasil disimpan.');
    } catch (error) {
        console.error('Terjadi kesalahan:', error);
        alert('Terjadi kesalahan. Data tidak dapat disimpan.');
    }
});

// Fungsi untuk menampilkan data pengguna dari Firestore
function displayUserData(email) {
    // Mendapatkan referensi tabel pengguna
    const userTable = document.getElementById('user-table');

    // Menampilkan data pengguna dari Firestore ke dalam tabel
    firestore.collection("users").where("email", "==", email).onSnapshot((querySnapshot) => {
        // Mengosongkan isi tabel sebelum menampilkan data baru
        //userTable.innerHTML = '';

        querySnapshot.forEach((doc) => {
            const userData = doc.data();
            const row = `<tr>
                            <td>${userData.email}</td>
                            <td>${userData.nama}</td>
                            <td>${userData.Approval}</td>
                            <td>
                                <button onclick="deleteData('${doc.id}')">Delete</button>
                            </td>
                        </tr>`;
            userTable.innerHTML += row; // Menambahkan baris ke dalam tabel
        });
        // Menambahkan baris tambahan setelah tabel
const newRow = "<tr><td colspan='5'>daftar menjadi Admin <a href='/p/pendaftaran-admin.html'>klik disini</a></td></tr>";
userTable.innerHTML += newRow;
    });
}

  
  
// Fungsi untuk melakukan update data
function updateData(userId, nama, Facebook, Instagram, Alamat, Kuliah, Pekerjaan, NISN, Ibu, Tahun, Kelas, description) {
    // Prompt the user to input new values for each field
    const updatedNama = prompt("Masukkan nama baru:", nama) || nama;
    const updatedFacebook = prompt("Masukkan Facebook baru:", Facebook) || Facebook;
    const updatedInstagram = prompt("Masukkan Instagram baru:", Instagram) || Instagram;
    const updatedAlamat = prompt("Masukkan Alamat baru:", Alamat) || Alamat;
    const updatedNISN = prompt("Masukkan NISN baru:", NISN) || NISN;
    const updatedIbu = prompt("Masukkan Ibu baru:", Ibu) || Ibu;
    const updatedTahun = prompt("Masukkan Tahun baru:", Tahun) || Tahun;
    const updatedKelas = prompt("Masukkan Kelas baru:", Kelas) || Kelas;
    const updatedKuliah = prompt("Masukkan Kuliah baru:", Kuliah) || Kuliah;
    const updatedPekerjaan = prompt("Masukkan Pekerjaan baru:", Pekerjaan) || Pekerjaan;
    const updateddescription = prompt("Masukkan Moto baru:", description) || description;

    // Update the Firestore document with the new values
    firestore.collection("users").doc(userId).update({
        nama: updatedNama,
        description: updateddescription,
        Facebook: updatedFacebook,
        Instagram: updatedInstagram,
        Alamat: updatedAlamat,
        NISN: updatedNISN,
        Ibu: updatedIbu,
        Tahun: updatedTahun,
        Kelas: updatedKelas,
        Kuliah: updatedKuliah,
        Pekerjaan: updatedPekerjaan,
        Approval: 'Yes', // Assuming this field should be updated
        createdAt: firebase.firestore.FieldValue.serverTimestamp() // Assuming this field should be updated
    })
    .then(() => {
        console.log("Document successfully updated!");
    })
    .catch((error) => {
        console.error("Error updating document: ", error);
        alert('Terjadi kesalahan saat memperbarui data.');
    });
}
  
  
// Fungsi untuk melakukan delete data beserta file dari storage
async function deleteData(docId) {
    try {
        // Dapatkan dokumen dari Firestore
        const docRef = firestore.collection("users").doc(docId);
        const doc = await docRef.get();

        // Periksa apakah dokumen ada
        if (!doc.exists) {
            console.error("Dokumen tidak ditemukan!");
            return;
        }

        // Dapatkan data dari dokumen
        const data = doc.data();
        const imageUrl = data.imageUrl;

        // Menampilkan imageUrl di log sebelum digunakan
        console.log("imageUrl:", imageUrl);

        // Konfirmasi pengguna
        if (confirm("Apakah Anda yakin ingin menghapus data ini?")) {
            // Hapus dokumen dari Firestore
            await docRef.delete();
            console.log("Dokumen berhasil dihapus dari Firestore!");

            // Check if the imageUrl is valid
            if (imageUrl) {
                // Get a reference to the file in Firebase Storage
                const storageRef = storage.refFromURL(imageUrl);

                // Delete the file from Firebase Storage
                await storageRef.delete();
                console.log("File successfully deleted from Firebase Storage!");
            } else {
                console.error("Invalid imageUrl!");
            }
        }
    } catch (error) {
        console.error("Error deleting data and file:", error);
    }
}

  // Function to resize image
function resizeImage(file, maxWidth, maxHeight) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(event) {
            const img = new Image();
            img.src = event.target.result;
            img.onload = function() {
                let width = img.width;
                let height = img.height;

                if (width > height) {
                    if (width > maxWidth) {
                        height *= maxWidth / width;
                        width = maxWidth;
                    }
                } else {
                    if (height > maxHeight) {
                        width *= maxHeight / height;
                        height = maxHeight;
                    }
                }

                const canvas = document.createElement('canvas');
                canvas.width = width;
                canvas.height = height;

                const ctx = canvas.getContext('2d');
                ctx.drawImage(img, 0, 0, width, height);

                canvas.toBlob((blob) => {
                    resolve(blob);
                }, file.type);
            };
        };
        reader.onerror = function(error) {
            reject(error);
        };
    });
}

</script>
 
Code diatas hanya dapat di akses dengan cara login terlebih dahulu

Dan SELESAI
code diatas akan menyimpan data alumni ke databaae users dan image akan disimpan di storage
ketika tombol delete di klik maka database dan image akan dihapus.
jangan lupa untuk mengubah Rule di firestore dan storage nya. dengan code dibawah ini.


 
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Aturan untuk koleksi "users"
    match /users/{document=**} {
      // Allow create, update, and delete only if user is authenticated
      allow create, update, delete: if request.auth != null;
      // Allow read for everyone
      allow read;
      // Deny all other write operations
      allow write: if false;
    }

    // Aturan untuk koleksi "users"
    match /admin/{document=**} {
      allow create: if request.auth != null;
      allow read, update, delete: if request.auth != null;
    }

  }
}
 
dan untuk Sorage ubah rule menjadi

  rules_version = '2';

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write, delete: if request.auth != null;
    }
  }
}
   
untuk menggunakan halaman demo anda harus login dahulu di website tujuan

Post a Comment