Untitled
unknown
plain_text
2 years ago
27 kB
8
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...