import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_fast_forms/flutter_fast_forms.dart'; import 'package:get/get.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:tuuli_app/api_controller.dart'; import 'package:tuuli_app/models/table_column_definition.dart'; const typeToNameMatcher = { SerialPrimaryColumnDefinition: "Serial ID", TextColumnDefinition: "Text", BooleanColumnDefinition: "Boolean", TimestampColumnDefinition: "Date/Time", DoubleColumnDefinition: "Double", IntegerColumnDefinition: "Integer", UserRefColumnDefinition: "User reference", AssetRefColumnDefinition: "Asset reference", }; class CreateTableController extends GetxController { final _tableName = "".obs; String get tableName => _tableName.value; set tableName(String value) => _tableName.value = value; final _columnsDefinition = [].obs; List get columnsDefinition => _columnsDefinition; Future createTable() async { try { final resp = await ApiController.to.apiClient.createTable( tableName: tableName, columnsDefinition: _columnsDefinition.map((e) => e.def).toList(growable: false), ); final respData = resp.data; if (respData == null) { throw Exception("No data in response"); } Get.back(result: true); } on DioError catch (e) { final respData = e.response?.data; if (respData != null) { Get.snackbar( "Error trying to update tables access", "${respData['error']}", ); } else { Get.snackbar( "Error trying to update tables access", "$e", ); } } catch (e) { Get.snackbar( "Error trying to update tables access", "$e", ); } } Future createNewColumn() async { final columnName = "".obs; final columnType = "".obs; final columnIsUnique = false.obs; final confirm = await Get.dialog( AlertDialog( title: const Text("Create new column"), content: Wrap( runSpacing: 16, children: [ FastTextField( name: "ColumnName", decoration: const InputDecoration( labelText: "Column name", border: OutlineInputBorder(), ), initialValue: columnName.value, onChanged: (value) => columnName.value = value ?? "", ), FastDropdown( name: "ColumnTypes", hint: const Text("Select column type"), items: typeToNameMatcher.keys.toList(growable: false), itemsBuilder: (items, field) => items .map( (e) => DropdownMenuItem( value: e, child: Text(typeToNameMatcher[e]!), ), ) .toList(), onChanged: (value) => columnType.value = typeToNameMatcher[value] ?? "", ), FastCheckbox( name: "ColumnIsUnique", titleText: "Is Unique", initialValue: false, onChanged: (value) => columnIsUnique.value = value!, ), ], ), actions: [ TextButton( onPressed: () { Get.back(result: false); }, child: const Text('Close'), ), TextButton( onPressed: () { Get.back(result: true); }, child: const Text('Create'), ), ], ), ); if (confirm != true) return; TableColumnDefinition? ct; switch (columnType.value) { case "Serial ID": ct = SerialPrimaryColumnDefinition( columnName: columnName.value, ); break; case "Text": ct = TextColumnDefinition( columnName: columnName.value, isUnique: columnIsUnique.value, ); break; case "Boolean": ct = BooleanColumnDefinition( columnName: columnName.value, isUnique: columnIsUnique.value, ); break; case "Date/Time": ct = TimestampColumnDefinition( columnName: columnName.value, isUnique: columnIsUnique.value, ); break; case "Double": ct = DoubleColumnDefinition( columnName: columnName.value, isUnique: columnIsUnique.value, ); break; case "Integer": ct = IntegerColumnDefinition( columnName: columnName.value, isUnique: columnIsUnique.value, ); break; case "User reference": ct = UserRefColumnDefinition( columnName: columnName.value, ); break; case "Asset reference": ct = AssetRefColumnDefinition( columnName: columnName.value, ); break; } if (ct == null) return; _columnsDefinition.add(ct); } void removeColumn(TableColumnDefinition e) { _columnsDefinition.remove(e); } } class CreateTableDialog extends GetView { const CreateTableDialog({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return AlertDialog( title: const Text('Creating new table'), content: Column( children: [ TextField( decoration: const InputDecoration( labelText: "Table name", border: OutlineInputBorder(), ), onChanged: (value) => controller.tableName = value, ), const Divider(), Obx( () => ListView( children: controller.columnsDefinition .map( (e) => ListTile( title: Text(e.columnName), subtitle: Text(e.def), trailing: IconButton( onPressed: () => controller.removeColumn(e), icon: const Icon(Icons.delete), ), ), ) .toList(), ).expanded(), ), const Divider(), [ ElevatedButton( onPressed: () => controller.createNewColumn(), child: const Text("Create column"), ).expanded() ].toRow(), ], ).constrained(width: Get.width * 0.9, height: Get.height * 0.9), actions: [ TextButton( onPressed: () { Get.back(); }, child: const Text('Close'), ), Obx( () => TextButton( onPressed: controller.columnsDefinition.isEmpty ? null : () => controller.createTable(), child: const Text('Create'), ), ), ], ); } static Future show() async { Get.lazyPut(() => CreateTableController()); return Get.dialog( const CreateTableDialog(), barrierDismissible: false, ); } }