Untitled
unknown
plain_text
9 months ago
7.9 kB
58
Indexable
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:awesome_extensions/awesome_extensions.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
import 'package:render_metrics/render_metrics.dart';
import 'package:sporty_areaweb/model/modello_scheda.dart';
import 'package:sporty_areaweb/pages/Automations/widgets/hierarchy.dart';
import 'package:sporty_areaweb/pages/Main/menu_controller.dart';
import 'package:sporty_areaweb/pages/Settings/Parametri%20Azienda/settings_controllers.dart';
import 'package:sporty_areaweb/pages/Settings/utilita_controller.dart';
import 'package:sporty_areaweb/providers/activecampaign_provider.dart';
import 'package:sporty_areaweb/providers/auth_provider.dart';
import 'package:sporty_areaweb/utility/extensions.dart';
import 'package:sporty_areaweb/widgets/custom_text_form.dart';
import 'package:sporty_areaweb/widgets/custom_text_form_new.dart';
import 'package:sporty_areaweb/widgets/dialog_success.dart';
import 'package:sporty_areaweb/widgets/dialog_upload_image.dart';
import 'package:sporty_areaweb/widgets/dialog_yesno.dart';
import 'package:sporty_areaweb/widgets/left_bar_menu/custom_left_bar_menu_widget.dart';
import 'package:collection/collection.dart';
import 'package:sporty_areaweb/widgets/placeholder_height_widget.dart';
import 'package:sporty_areaweb/widgets/sporty_button.dart';
import 'package:uuid/uuid.dart';
import '../../../customs/custom_applications.dart';
import '../../../widgets/custom_future_builder.dart';
import 'package:fl_nodes/fl_nodes.dart';
class AutomationBuilderScreen extends StatefulWidget {
const AutomationBuilderScreen({
super.key,
required this.currentLocale,
required this.onLocaleChanged,
});
final Locale currentLocale;
final Function(String) onLocaleChanged;
@override
State<AutomationBuilderScreen> createState() =>
AutomationBuilderScreenState();
}
final bool isMobile = TargetPlatform.iOS == defaultTargetPlatform ||
TargetPlatform.android == defaultTargetPlatform
? true
: false;
class AutomationBuilderScreenState extends State<AutomationBuilderScreen> {
late final FlNodeEditorController
_nodeEditorController; // Controller for managing the node editor
@override
void initState() {
super.initState();
// Initialize the node editor controller with project management functionality
_nodeEditorController = FlNodeEditorController(
config: FlNodeEditorConfig(),
style: FlNodeEditorStyle(
decoration: BoxDecoration(
color: CustomApplication.backgroundColor,
),
gridStyle: FlGridStyle.basic(),
highlightAreaStyle: FlHighlightAreaStyle.basic()),
projectSaver: (jsonData) async {
if (kIsWeb)
return false; // Skip file saving on web (not supported by file_picker)
// Open a save file dialog to allow the user to save the project as JSON
final String? outputPath = await FilePicker.platform.saveFile(
dialogTitle: 'Save Project',
fileName: 'node_project.json',
type: FileType.custom,
allowedExtensions: ['json'],
);
// If a file path is selected, write the project data to the file
if (outputPath != null) {
final File file = File(outputPath);
await file.writeAsString(jsonEncode(jsonData));
return true;
} else {
return false; // Return false if saving was canceled
}
},
projectLoader: (isSaved) async {
// If there are unsaved changes, confirm whether the user wants to proceed
if (!isSaved) {
final bool? proceed = await showDialog<bool>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Unsaved Changes'),
content: const Text(
'You have unsaved changes. Do you want to proceed without saving?',
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('Cancel'),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('Proceed'),
),
],
);
},
);
if (proceed != true)
return null; // Cancel loading if user chooses not to proceed
}
// Open file picker to select a JSON project file
final FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['json'],
);
if (result == null) return null; // Return null if no file was selected
late final String fileContent;
// Handle file reading differently for web vs other platforms
if (kIsWeb) {
final byteData = result.files.single.bytes!;
fileContent = utf8.decode(byteData.buffer.asUint8List());
} else {
final File file = File(result.files.single.path!);
fileContent = await file.readAsString();
}
return jsonDecode(fileContent); // Return the parsed JSON data
},
projectCreator: (isSaved) async {
// If the project is not saved, ask the user whether to proceed
if (isSaved) return true;
final bool? proceed = await showDialog<bool>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Unsaved Changes'),
content: const Text(
'You have unsaved changes. Do you want to proceed without saving?',
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('Cancel'),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('Proceed'),
),
],
);
},
);
return proceed == true; // Return true if the user chooses to proceed
},
);
// Register data handlers and custom node definitions for the editor
// registerDataHandlers(_nodeEditorController);
// registerNodes(context, _nodeEditorController);
}
@override
void dispose() {
_nodeEditorController
.dispose(); // Dispose of the controller to free resources
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: FlNodeEditorWidget(
controller: _nodeEditorController,
contextMenuBuilder: (context, model) => [],
expandToParent: true,
overlay: () {
return [];
},
),
),
],
),
);
}
}Editor is loading...
Leave a Comment