Untitled
unknown
plain_text
2 years ago
27 kB
7
Indexable
import 'package:firebase_database/firebase_database.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; class AddClass extends StatefulWidget { const AddClass({super.key}); @override State<AddClass> createState() => _ModulState(); } class _ModulState extends State<AddClass> { DatabaseReference _database = FirebaseDatabase.instance.ref().child('classes'); // LoginPage _session = LoginPage(); late List<dynamic> dataList; // late List<dynamic> filteredList; @override void initState() { super.initState(); dataList = []; _database = FirebaseDatabase.instance.ref().child('classes'); _database.onValue.listen((DatabaseEvent event) { if (event.snapshot.value != null) { setState(() { // Retrieve the text data and convert it to a list of strings Map<dynamic, dynamic>? dataMap = event.snapshot.value as Map<dynamic, dynamic>?; dataList = dataMap?.values.toList() ?? []; }); } }); } // _showDialog(String title, String description, String category, String logo, // String level, double rate, String color, String price) { // showDialog( // context: context, // builder: (BuildContext context) { // _addItem(title, description, category, logo, level, rate, color, price); // return CustomDialog2(context); // }, // ); // } String selectedValue = 'Option 1'; List<String> options = ['Option 1', 'Option 2', 'Option 3', 'Option 4']; String selectedValue1 = 'Option 1'; List<String> options1 = ['Option 1', 'Option 2', 'Option 3', 'Option 4']; @override Widget build(BuildContext context) { String title = ''; String description = ''; String category = ''; String logo = ''; String level = ''; String registered = '0'; double rate = 0; String color = ''; String price = ''; // dynamic levelList = widget._databaseCat; return Scaffold( body: ListView( shrinkWrap: true, children: [ Column( children: <Widget>[ Row(children: [ Expanded( child: Padding( padding: const EdgeInsets.only(bottom: 35), child: Container( padding: const EdgeInsets.only( top: 50, ), alignment: Alignment.center, child: Text( 'Add Class', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontWeight: FontWeight.bold, fontSize: 25, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), ), ]), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Title', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.only(left: 10, top: 5, bottom: 5), child: TextField( onChanged: (value) { title = value; }, decoration: InputDecoration( border: InputBorder.none, hintText: 'HTML Expert', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle(fontWeight: FontWeight.bold)), ), ), ), ), ), const SizedBox( height: 10, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Category', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.only(left: 10, top: 5, bottom: 5), child: TextField( onChanged: (value) { category = value; }, decoration: InputDecoration( border: InputBorder.none, hintText: 'HTML', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle(fontWeight: FontWeight.bold)), ), ), ), ), ), const SizedBox( height: 10, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Description', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, height: 180, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: TextField( onChanged: (value) { description = value; }, maxLines: null, decoration: InputDecoration( border: InputBorder.none, hintText: 'Enter your description', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 13, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), ), ), const SizedBox( height: 10, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Level', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.only(left: 10, top: 5, bottom: 5), child: TextField( onChanged: (value) { level = value; }, decoration: InputDecoration( border: InputBorder.none, hintText: 'Beginner', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle(fontWeight: FontWeight.bold)), ), ), ), ), ), const SizedBox( height: 10, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Price', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, height: 50, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Text( 'RP.', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 15, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), Expanded( child: Padding( padding: const EdgeInsets.only(right: 10), child: TextField( onChanged: (value) { price = value; }, textAlign: TextAlign.right, // inputFormatters: [ // FilteringTextInputFormatter.digitsOnly, // CurrencyInputFormatter(), // ], keyboardType: TextInputType.number, maxLines: 1, decoration: InputDecoration( border: InputBorder.none, hintText: '12000', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 15, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), ), ], ), ), ), const SizedBox( height: 10, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Color', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.only(left: 10, top: 5, bottom: 5), child: TextField( onChanged: (value) { color = value; }, decoration: InputDecoration( border: InputBorder.none, hintText: 'blue', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle(fontWeight: FontWeight.bold)), ), ), ), ), ), const SizedBox( height: 15, ), Padding( padding: const EdgeInsets.only( left: 20, bottom: 7, ), child: Align( alignment: Alignment.topLeft, child: Text( 'Logo', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 31, 30, 30), ), ), ), ), ), Padding( padding: const EdgeInsets.only( left: 25, top: 10, right: 25, ), child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.only(left: 10, top: 5, bottom: 5), child: TextField( onChanged: (value) { logo = value; }, decoration: InputDecoration( border: InputBorder.none, hintText: 'c++', hintStyle: GoogleFonts.quicksand( textStyle: const TextStyle(fontWeight: FontWeight.bold)), ), ), ), ), ), const SizedBox( height: 15, ), Padding( padding: const EdgeInsets.all(10.0), child: Align( alignment: Alignment.center, child: GestureDetector( onTap: () { // Fungsi yang akan dijalankan saat container "Start" di klik }, child: Padding( padding: const EdgeInsets.only( right: 25, ), child: Container( alignment: Alignment.center, width: 150, height: 50, decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: const Color.fromARGB(255, 45, 44, 44), boxShadow: [ BoxShadow( color: const Color.fromARGB(255, 117, 116, 116) .withOpacity(0.5), spreadRadius: 4, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: TextButton( onPressed: () { _addItem(title, description, category, logo, level, registered, rate, color, price); showDialog( context: context, builder: (BuildContext) { return CustomDialog2(context); }); }, // () { // setState(() { // showDialog( // context: context, // builder: (BuildContext context) { // _addItem(title, description, category, logo, // level, rate, color, price); // return CustomDialog2(context); // }, // ); // }); // }, child: Text( 'Add Class', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 198, 197, 197), ), ), ), ), ), ), ), ), ), ), const SizedBox( height: 20, ) ], ) ], ), ); } Future<void> _addItem( String title, String description, String category, String logo, String level, String registered, double rate, String color, String price) async { DatabaseReference classItem = await FirebaseDatabase.instance.ref().child('classes'); classItem = await _database.push(); await classItem.set({ 'title': title, 'description': description, 'category': category, 'logo': '../assets/' + logo + '.png', 'level': level, 'registered': int.parse(registered), 'rate': rate, 'color': color, 'price': int.parse(price), 'id_kelas': classItem.key.toString() }); } Widget CustomDialog2(BuildContext context) { return AlertDialog( title: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Add Class Success', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 15, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 33, 32, 32), ), ), ), ], ), // tambahkan konten atau widget lain yang diinginkan di dalam AlertDialog // misalnya TextField untuk mengedit kelas content: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ Image.asset('assets/centang.png'), const SizedBox( height: 10, ) ], ), actions: [ TextButton( onPressed: () { // logika untuk menyimpan perubahan Navigator.of(context).pop(); // menutup dialog setelah menyimpan }, child: Padding( padding: const EdgeInsets.only(bottom: 15), child: Container( width: double.infinity, height: 30, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: const Color.fromARGB(255, 55, 53, 53), ), child: Align( alignment: Alignment.center, child: Text( 'Done', style: GoogleFonts.quicksand( textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color.fromARGB(255, 191, 188, 188), ), ), ), ), ), ), ), ], ); } } class CurrencyInputFormatter extends TextInputFormatter { final NumberFormat _format = NumberFormat.currency(locale: 'en_US', symbol: '', decimalDigits: 0); @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue) { if (newValue.selection.baseOffset == 0) { return newValue; } final int value = int.parse(newValue.text); final String newText = _format.format(value).toString(); return newValue.copyWith( text: newText, selection: TextSelection.collapsed(offset: newText.length), ); } }
Editor is loading...