Jaycent Gunawan Ongris
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    [![Build status](https://build.appcenter.ms/v0.1/apps/fe1e6724-e0e7-4de6-b655-9a7f1f5f74b8/branches/master/badge)](https://appcenter.ms) [![Pre-Release](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/pre-release.yml/badge.svg)](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/pre-release.yml) [![Release](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/release.yml/badge.svg)](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/release.yml) # Nutrious Mobile ## Nama Anggota Kelompok 1. Stelline Claudia - 2106700933 2. Dhafin Raditya Juliawan - 2106650304 3. Johannes Setiawan - 2106750345 4. Muhammad Faris Umar Rahman - 2106702402 5. Jaycent Gunawan Ongris - 2106750231 6. Annava Wisha Sikoko - 2106635493 ## Tautan APK [Link App Center](https://install.appcenter.ms/orgs/f02/apps/nutrious/distribution_groups/public)<br> [Link Release Github](https://github.com/JohannesSetiawan/nutrious-mobile/releases/tag/1.0.0%2B1) ## Deskripsi Aplikasi Aplikasi yang akan kami buat adalah Nutrious Mobile. Nutrious Mobile merupakan aplikasi *mobile* yang diadaptasi dari aplikasi [web](https://nutrious.up.railway.app/) yang telah kami buat sebelumnya. Aplikasi ini kami buat untuk mendukung penyelesaian isu kesehatan global sebagaimana yang dibahas oleh pemimpin-pemimpin dunia pada Konferensi G20. Spesifiknya, aplikasi ini berfokus pada permasalahan terkait bagaimana meningkatkan asupan gizi masyarakat untuk kualitas hidup yang lebih baik. Untuk mengimplementasikan hal ini, kami membuat beberapa fitur pada aplikasi ini yang bermanfaat bagi pengguna aplikasi itu sendiri maupun masyarakat secara umum. Fitur-fitur tersebut adalah *calorie tracker* untuk *tracking* kalori dari pengguna tiap harinya, *fundraising* untuk memberikan kesempatan kepada pengguna melakukan donasi kepada orang-orang yang membutuhkan, *food-sharing* untuk memberikan informasi terkait lokasi pembagian makanan kepada masyarakat jika ada pengguna yang ingin membagi makanan, *food recipe* untuk memberikan informasi terkait resep makanan sehat yang ditulis oleh pengguna, dan *blog* untuk memberikan informasi atau artikel terkait kesehatan dan gizi yang ditulis oleh pengguna. ## Daftar Fitur yang Diimplementasikan dan Kontrak Kinerja 1. Fitur Utama (Jaycent Gunawan Ongris)<br> Fitur ini terdiri dari halaman utama aplikasi, halaman *login*, halaman *dashboard* administrator, dan mengimplementasikan sistem autentikasi pada aplikasi. 2. Fundraising (Johannes Setiawan)<br> Fitur ini terdiri dari halaman daftar donasi yang dibuka, formulir untuk membuka donasi baru, dan formulir untuk berdonasi. Selain itu, *user* yang terverifikasi bisa melihat dan/atau menutup donasi yang dibukanya. 3. Food-Sharing (Annava Wisha Sikoko)<br> Fitur ini terdiri dari halaman daftar lokasi pembagian makanan yang ada, formulir untuk mendaftarkan lokasi pembagian makanan, serta fitur untuk menghapus dan mengedit lokasi pembagian makanan yang dibuat. 4. Calorie Tracker (Stelline Claudia)<br> Fitur ini terdiri dari halaman daftar kalori yang dikonsumsi dan dibakar, formulir untuk menambahkan kalori yang dikonsumsi, formulir untuk menambah kalori yang dibakar, fitur untuk menghapus daftar kalori, dan fitur untuk mengedit daftar kalori. 5. Food Recipe (Muhammad Faris Umar Rahman)<br> Fitur ini terdiri dari halaman yang berisi daftar resep makanan yang terdiri dari judul makanan, tanggal resep dibuat, nama pembuat resep, *ingredients* makanan, dan langkah-langkah pembuatan makanan. Resep makanan dapat ditambahkan dari oleh *user* melalui fitur *add recipe* yang tersedia. 6. Blog (Dhafin Raditya Juliawan)<br> Fitur ini terdiri dari halaman utama *blog post*, formulir untuk menambahkan *post* baru, fitur untuk menampilkan *post* dengan tag yang diinginkan oleh *user* dan fitur *upvote-downvote* sebuah *post*. ## Peran atau Aktor Pengguna Aplikasi Terdapat dua jenis pengguna pada aplikasi ini, yaitu admin dan pengguna biasa (*user*). Admin dapat melihat siapa saja user yang sudah terdaftar, donasi yang dibuka oleh *user*, dan pesan yang dikirimkan oleh *user*. Sementara itu, *user* terdiri dari dua jenis, yaitu *user* yang sudah terverifikasi dan *user* yang belum terverifikasi. Semua *user* yang sudah *logged in* ke dalam aplikasi dapat melakukan donasi, membuat *log* terkait aktivitas yang berhubungan dengan penambahan atau pembakaran kalori, melihat lokasi pembagian makanan, membagikan resep makanan sehat, membuat *blog*, dan melakukan *upvote* atau *downvote* pada *blog*. Sementara itu, untuk alasan keamanan, hanya *user* yang sudah terverifikasi saja yang dapat membuka penggalangan dana dan memberikan informasi terkait lokasi pembagian makanan. ## Alur Pengintegrasian dengan *Web Service* dari PTS 1. Fitur Utama <br> - Untuk sistem *login*, *user* akan memasukkan *username* dan *password* pada halaman yang tersedia. Selanjutnya, data terkait *username* dan *password* akan di-*pass* pada salah satu parameter *method* `login` yang disediakan oleh *package* `pbp_django_auth`. Data tersebut diteruskan ke URL `https://nutrious.up.railway.app/auth/login/` yang berisi fungsi `views` untuk *login* secara *asynchronous*. Fungsi tersebut akan menerapkan autentikasi terhadap *user* yang ingin *login* dan mengembalikan JSON berupa informasi dari *user* yang berhasil *login* atau *error message* jika *user* tidak berhasil *login*. Informasi yang didapatkan tersebut kemudian digunakan untuk menentukan apakah *role* *user* adalah admin atau pengguna biasa. Berdasarkan *role*-nya, *user* akan diarahkan ke *dashboard page* yang sesuai dengan *role* tersebut. - Untuk sistem *logout*, *user* cukup mengklik tombol `Log Out` yang ada pada *drawer*. Setelah itu, dilakukan pemanggilan terhadap *method* `logout` yang disediakan oleh *package* `pbp_django_auth`, dengan parameter URL `https://nutrious.up.railway.app/auth/logout/` yang berisi fungsi `views` untuk *logout*. Jika berhasil *logout*, fungsi akan mengembalikan JSON yang berisi *status message* dari operasi tersebut dan *user* akan diarahkan ke *page* `Login-Register`. - Untuk pengiriman *message* ke admin oleh pengguna biasa, pengguna tinggal memasukkan *message* yang ingin dikirim melalui kolom input yang telah disediakan. Setelah pengguna menekan tombol untuk kirim, data *message* yang dimasukkan oleh pengguna akan di-*pass* menjadi salah satu parameter *method* `post` yang disediakan oleh *package* `pbp_django_auth`. Data akan diteruskan ke URL `https://nutrious.up.railway.app/add-message/` yang berisi fungsi `views` untuk menambahkan *message* ke *database* secara *asynchronous*. - Untuk melihat daftar pengguna pada *dashboard* admin, dilakukan pengambilan data dari URL `https://nutrious.up.railway.app/json-user/` yang akan mengembalikan JSON berupa daftar pengguna beserta informasi yang terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu, akan dibuat *model class* `User` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk kemudian dikonversi menjadi *instance* dari `User`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder` dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of User`. Kemudian, `list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`. Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `User` dalam suatu `Container` yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari pengguna, `Container` tersebut dapat diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari pengguna, yaitu pada *widget* `UserDetail`. Ketika dilakukan *push* ke *widget* tersebut, data `id` dan `detail` di-*pass* ke *widget* tersebut, lalu `detail` akan diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut. - Untuk melihat daftar *fundraising* pada *dashboard* admin, dilakukan pengambilan data dari URL `https://nutrious.up.railway.app/donation/json-with-name/` yang akan mengembalikan JSON berupa daftar donasi beserta informasi yang terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu, akan dibuat *model class* `Fundraising` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk kemudian dikonversi menjadi *instance* dari `Fundraising`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder` dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of Fundraising`. Kemudian, `list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`. Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `Fundraising` dalam suatu `Container` yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari *fundraising*, `Container` tersebut dapat diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari *fundraising*, yaitu pada *widget* `FundraisingDetail`. Ketika dilakukan *push* ke *widget* tersebut, data `detail` akan di-*pass* ke *widget* tersebut, kemudian diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut. - Untuk melihat daftar *message* pada *dashboard* admin, dilakukan pengambilan data dari URL `https://nutrious.up.railway.app/json-message-name/` yang akan mengembalikan JSON berupa daftar *message* beserta informasi yang terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu, akan dibuat *model class* `Message` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk kemudian dikonversi menjadi *instance* dari `Message`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder` dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of Message`. Kemudian, `list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`. Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `Message` dalam suatu `Container` yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari *message*, `Container` tersebut dapat diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari *message*, yaitu pada *widget* `MessageDetail`. Ketika dilakukan *push* ke *widget* tersebut, data `detail` akan di-*pass* ke *widget* tersebut, kemudian diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut. 2. Fitur Donation/Fundraising <br> - `Donation List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchDonation` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/donation/json-verified/` yang akan mengembalikan data JSON berupa daftar donasi yang sudah diverifikasi oleh admin. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Fundraising` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah *clickable* `Container` yang menampilkan data nama donasi, pembuka donasi, dan jumlah donasi yang dibutuhkan. Saat diklik, halaman akan berpindah ke halaman detail dari `Container` donasi yang diklik. - `Open Donation`: Pada fitur ini, terdapat sebuah *form* yang dapat digunakan *user* terverifikasi untuk membuka donasi baru. Pada halaman ini, setelah *user* melakukan submisi *form* dan datanya sudah divalidasi, data yang dimasukkan akan dikirim sebagai *parameter* untuk fungsi *async* bernama `create` yang menerima *parameter* `request`, `name`, `description`, dan `amountNeeded`. Data-data tersebut akan dikirim ke URL `https://nutrious.up.railway.app/donation/add-donatee/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `name`, `description`, dan `amountNeeded` yang menjadi *argumen* untuk fungsi ini. Pengiriman data ke URL akan menyebabkan terbuatnya donasi baru dengan *user* yang melakukan pembukaan donasi sebagai pembuatnya. Donasi baru ini tidak akan muncul pada halaman `Donation List` karena belum terverifikasi. Akan tetapi, donasi baru ini akan tampil di halaman `Opened Donation List` dari *user* yang membuka donasi tersebut. - `Donate`: Pada fitur ini, yaitu pada halaman `Donation Detail`, terdapat sebuah *form* yang dapat diisi oleh *user* untuk melakukan donasi terhadap donasi yang detailnya ditampilkan di halaman tersebut. Pada saat *user* melakukan submisi *form* donasi tersebut, *request*, id dari donasi yang dipilih, beserta jumlah donasi yang dimasukkan ke dalam *form* akan masuk ke dalam sebuah fungsi *async* yang bernama donasi dengan parameter `request`, `id`, dan `amount`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/donation/donate/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari id donasi dan jumlah yang didonasikan oleh *user*. Pengiriman data tersebut akan menambahkan nilai `collectedFunds` dari *instance* donasi yang bersangkutan dengan nilai dari `amount` dan mengembalikan sebuah `JSON response` yang akan dikembalikan oleh fungsi `donate`. Setelah itu, halaman akan berpindah ke halaman `Donation List`. Saat kita melihat detail dari donasi yang baru saja kita *donate*, maka bisa dilihat nilai dari `Collected Funds` akan bertambah dan nilai `Remaining Amount` akan berkurang saat nilainya masih lebih besar dari nol. - `Opened Donation List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchDonation` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/donation/json-by-user/` yang akan mengembalikan data JSON berupa daftar donasi yang sudah dibuka oleh *user* yang melihat halaman `Opened Donation List` ini. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Fundraising` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah `Container` yang menampilkan data nama donasi, deskripsi donasi, jumlah donasi yang dibutuhkan, jumlah yang sudah terkumpul, status verifikasi (*verified* atau *not verified*), dan sebuah tombol untuk melakukan penutupan donasi. - `Close Donation`: Pada halaman `Opened Donation List`, saat *user* menekan tombol `Close Donation`, maka akan dilakukan pemanggilan fungsi `delete` dengan mengirimkan argumen berupa `request` dan `id` dari donasi yang ingin ditutup (donasi yang keterangannya ada dalam `Container` tempat tombol yang diklik). Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/donation/json-by-user/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari id donasi yang ingin ditutup oleh *user*. Pengiriman data tersebut akan menghapus data donasi dengan `id` yang sesuai sehingga data donasi tersebut tidak akan ditampilkan pada semua halaman. 3. Fitur Blog <br> - `Blog List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchBlog` yang ada pada folder `utils` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/blog/json/` yang akan mengembalikan data JSON berupa daftar blog yang tersedia pada database. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Blog` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek blog akan dimasukkan ke dalam sebuah card yang menampilkan judul blog, tanggal dibuat blog, tombol upvote downvote yang menampilkan nilainya, konten blog secara singkat, dan sebuah button "Read More" yang ketika di klik akan membukan halaman detail dari blog. - `Blog Detail`: Pada fitur ini, page akan menampilkan detail dari sebuah blog yaitu konten yang ditampilkan secara menyeluruh. Setelah user memencet button "Read More" pada page utama, akan dipassing data `snapshot.data![index]` ke constructor BlogListDetail. - `Create Blog`: Pada fitur ini, User akan ditampilkan *form* yang dapat digunakan *user* untuk membuat sebuah blog baru. Pada halaman ini, setelah *user* melakukan submisi *form* dan datanya sudah divalidasi, data yang dimasukkan akan dikirim sebagai *parameter* untuk fungsi *async* bernama `create` yang menerima *parameter* `request`, `title`, `tag`, dan `content`. Data-data tersebut akan dikirim ke URL `https://nutrious.up.railway.app/blog/add-post-flutter/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `title`, `tag`, dan `content` yang menjadi *argumen* untuk fungsi ini. Pengiriman data ke URL akan menyebabkan terbuatnya blog baru dengan *user* yang mengunggah sebagai pembuatnya. Setelah blog berhasil terunggah, maka blog akan muncul ke page utama dan user lain bisa membaca dan memberikan upvote atau downvote. - `Search Blog by Tag`: Pada fitur ini, akan ditampilkan berbagai macam tag yang tersedia dari seluruh blog yang ada pada database. Tag dari seluruh blog ini diambil dengan function fetchBlogTag() yang menggunakan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/blog/jsontag/`. Tag akan ditampilkan secara distinct dan tidak memiliki duplikat dan berada pada sebuah clickable container yang ketika di klik akan menampilkan blog yang sesuai dengan tag yang ingin dibaca oleh user dengan memanfaatkan method get dari url `https://nutrious.up.railway.app/blog/show-tag-flutter/<str:tag_yang_dicari>`. 4. Fitur Calorie Tracker * `Calorie List`: Pada halaman ini, akan dilakukan pengambilan data pada fungsi `fetchCalorie` dengan memanfaatkan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/calorietracker/show_jsonf/` yang akan mengembalikan data JSON berupa daftar calorie yang telah diinput oleh user. Data JSON yang dikembalikan akan dilakukan looping, kemudian dijadikan sebuah *instance* dari `Calorie` dan ditambahkan ke dalam sebuah list. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah *clickable* `Container` yang jika di *click* akan menampilkan detail informasi berupa waktu ditambahkannya kalori, berapa kalori yang dikonsumsi/dibakar, kategori (hanya untuk kalori yang dikonsumsi) beserta deskripsinya, dan juga ada sebuah tombol close yang jika ditekan maka akan kembali menampilkan halaman `Calorie List`. Pada halaman ini juga akan tercantum sebuah Button dengan tulisan *“Tap me to see your information”* yang jika ditekan akan menampilkan informasi mengenai total kalori yang sudah dikonsumsi, dibakar, dan akumulasi kalorinya dengan cara di-scroll. * `Add Calorie`: Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh *user* untuk menambahkan kalori yang sudah dikonsumsinya, kategori beserta deskripsinya. Data yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `create` dengan parameter `request`, `calorie`, `description`, `category`, `isIncreasing`, `date`, dan `time`. Untuk parameter `isIncreasing` akan diberi nilai true, sedangkan untuk nilai `date` dan `time` akan diperoleh dari `DateTime.now` yang diformat dengan `DateFormat` dengan memanfaatkan *package* `intl`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/calorief/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terbuatnya daftar kalori yang baru sesuai dengan data yang diinput oleh user. Setelah berhasil dibuat, maka data kalori baru tersebut tersebut akan muncul di halaman `Calorie List`. * `Reduce Calorie`: Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh user untuk menambahkan kalori yang sudah dibakarnya beserta dengan deskripsinya. Data yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `create` dengan parameter `request`, `calorie`, `description`, `category`, `isIncreasing`, `date`, dan `time`. Untuk parameter `isIncreasing` akan diberi nilai false, sedangkan untuk nilai `date` dan `time` akan diperoleh dari `DateTime.now` yang diformat dengan `DateFormat` dengan memanfaatkan *package* `intl`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/calorief/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terbuatnya daftar kalori yang baru sesuai dengan data yang diinput oleh user. Setelah berhasil dibuat, maka data kalori baru tersebut tersebut akan muncul di halaman `Calorie List`. * `Delete all` : Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan menyebabkan seluruh daftar kalori terhapus. *Button* yang ditekan akan memanggil fungsi *async* yang bernama `deleteAll` dengan parameter `request` dan `nothing`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/deleteAllf/` dengan *method* `post` dari *package* `pbp_django_auth`. Fungsi `deleteAll` memiliki parameter dengan nama `nothing` yang akan diisi string kosong karena sebenarnya tidak ada data yang ingin di-*passing*, akan tetapi method `post` menerima 2 parameter. * `Delete` : Fitur ini terdapat pada `Container` daftar kalori berupa *button* yang jika ditekan maka `container` beserta data kalorinya akan hilang. *Button* *delete* ini akan memanggil fungsi *async* yang bernama `delete` dengan parameter `request` dan `id`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/deletef/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `id` data kalori yang ingin dihapus oleh *user*. Pengiriman data tersebut akan menghapus data kalori dengan `id` yang sesuai sehingga data kalori tersebut tidak akan ditampilkan lagi pada halaman `Calorie List`. * `Edit` : Fitur ini terdapat pada `Container` daftar kalori berupa *button* yang jika ditekan maka kan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh user untuk mengedit data kalori yang sudah ditambahkannya sebelumnya. Data baru yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `editAddSavef` atau `editReduceSavef` sesuai dengan jenis kalorinya (apakah kalori yang dibakar atau dikonsumsi) dengan parameter `request`, `id`, `calorie`, `description`, dan `category` untuk `editAddSavef`, sedangkan untuk `editReduceSafef` dengan parameter `request`, `id`, `calorie`, dan `description`. Fungsi `editAddSavef` akan melakukan pengiriman data ke URL`https://nutrious.up.railway.app/calorietracker/edit_add_savef/` , sedangkan untuk `editReduceSavef` akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/edit_reduce_savef/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terubahnya data kalori sesuai dengan yang sudah diinput oleh user. Setelah berhasil diubah, maka data kalori yang diubah akan berubah di halaman `Calorie List`. 5. Fitur Food-Sharing * `Food-Sharing List`: Pada halaman ini, akan dilakukan pengambilan data JSON pada fungsi fetch `fetchFoodsharing` dengan menggunakan method `get` dari package `pbp_django_auth` dari url `https://nutrious.up.railway.app/foodsharing/show_jsonf` yang akan mengambilkan data JSON berupa daftar food sharing yang ditambahkan oleh semua pengguna terverifikasi. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data food-sharing. Setiap data tersebut akan dijadikan sebuah *instance* dari `Foodsharing` dan dimasukkan ke dalam suatu list. Selanjutnya, list akan dikembalikan oleh fungsi tersebuh untuk dilakukan loop dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek dari Foodsharing akan dimasukkan ke sebuah GFCard yang terdapat foto, lokasi food-sharing, deskripsi food-sharing, tanggal pembuatan, dan tanggal pembaharuan. * `Add Food-Sharing`: Fitur ini terdapat pada halaman Food-Sharing List berupa *button* yang akan dipindah ke halaman lain berupa form. Fitur ini hanya dapat digunakan oleh *user* yang telah terverfikasi untuk membuat postingan lokasi food-sharing. Setelah data input *user* divalidasi dan jika sudah valid maka akan dikirimkan ke fungsi async yang bernama `create` dengan parameter `request`, `img`, `location`, `description`, `date`,`update_date`. Untuk nilai `date` dan `update_date` memanfaatkan package `intl` untuk mengambil nilai Datetime.now dan memformatnya menggunakan DateFormat. Setelah itu, datanya akan dikirim ke URL `https://nutrious.up.railway.app/foodsharing/foodsharingf` dengan method `post` dari package `pbp_django_auth`. Pengiriman data ke URL menyebabkan terbuatnya data foodsharing baru. Setelah itu, daftar baru tersebut akan di tampilkan pada halaman `Food-Sharing List` * `Own Post`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi fetch `fetchFoodsharing` dengan menggunakan method `get` dari package `pbp_django_auth` dari url `https://nutrious.up.railway.app/foodsharing/show_json_by_user` yang akan mengambilkan data JSON berupa daftar food sharing yang ditambahkan oleh pengguna yang terverfikasi yang sedang login. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data food-sharing milik *user*. Setiap data tersebut akan dijadikan sebuah *instance* dari `Foodsharing` dan dimasukkan ke dalam suatu list. Selanjutnya, list akan dikembalikan oleh fungsi tersebuh untuk dilakukan loop dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek dari Foodsharing akan dimasukkan ke sebuah GFCard yang terdapat foto, lokasi food-sharing, deskripsi food-sharing, tanggal pembuatan, dan tanggal pembaharuan. * `Edit Post`: Fitur ini terdapat pada masing-masing *card* yang ada di `Own Post` berupa *button* *edit*. Ketika menekan *button* tersebut maka akan terbuka *form* yang menampilkan semua value sebelumnya dan *user* dapat menginput data baru. Setelah data input *user* divalidasi dan jika sudah valid maka akan dikirimkan ke fungsi *async* yang bernama `editAddSavef` dengan parameter `request`, `img`, `location`, `description`, dan `update_date`. Untuk nilai `update_date` memanfaatkan package `intl` untuk mengambil nilai Datetime.now dan memformatnya menggunakan DateFormat. Fungsi `editAddSavef` akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/foodsharing/edit_add_savef` dengan method `post` dari package `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terubahnya data sebelumnya, yang akan langsung ditampilkan pada halaman `Food-Sharing List`. * `Delete Post`: Fitur ini terdapat pada masing-masing *card* yang ada di `Own Post` berupa *button* *delete* yang jika ditekan data foodsharingnya akan hilang. Button dari `delete` ini akan memanggil fungsi *async* yang bernama `delete` dengan paramater `request` dan `id`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/foodsharing/deletef` dengan method `post` dari package `pbp_django_auth`. Method tersebut mengirim data berupa JSON yang terdiri dari `id` data foodsharing yang mau dihapus oleh *user*. Pengiriman data tersebut akan menghapus data foodsharing dengan id yang sesuai sehingga data tersebut tidak akan ditampilkan pada semua halaman. 6. Fitur Food Recipes * `Recipe List`: Ini merupakan fitur yang ditampilkan di halaman utama recipe, yaitu menampilkan resep resep yang sudah ditambahkan oleh pengguna. Fitur ini akan melaukan pengambilan data pada fungsi `fetcheCalorie` dengan memanfaatkan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/recipe/json/` * `Add Recipe`: Fitur ini terletak pada floating action button yang tersedia di halaman recipe page utama. Ketika button ditekan, fitur mengarahkan halaman ke halaman input form, yang dapat diisi pengguna. Form terdiri dari nama makanan, bahan-bahan makanan, dan langkah-langkah pembuatan makanan. Lalu fungsi tersebut akan melalukan pengiriman data ke URL `https://nutrious.up.railway.app/recipe/add-flutter/` dengan method `post` dari package `pbp_django_auth`

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully