diff --git a/lib/core/services/specialized_services/logs_service.dart b/lib/core/services/specialized_services/logs_service.dart index 0156392..2e297f3 100644 --- a/lib/core/services/specialized_services/logs_service.dart +++ b/lib/core/services/specialized_services/logs_service.dart @@ -16,6 +16,7 @@ class LogsService extends AbstractService { if (p == "start" || p == "end") { continue; } v.add("$p=\"${params[p]}\""); } + print("${subPath}query_range?query={${v.join(", ")}}&start=${params["start"].toString().substring(0, 10)}&end=${params["end"].toString().substring(0, 10)}"); return service.get("${subPath}query_range?query={${v.join(", ")}}&start=${params["start"].toString().substring(0, 10)}&end=${params["end"].toString().substring(0, 10)}", false, context); } diff --git a/lib/core/services/specialized_services/workflow_execution_service.dart b/lib/core/services/specialized_services/workflow_execution_service.dart index 9b7ef51..28ba243 100644 --- a/lib/core/services/specialized_services/workflow_execution_service.dart +++ b/lib/core/services/specialized_services/workflow_execution_service.dart @@ -11,6 +11,7 @@ class WorkflowExecutionService extends AbstractService { @override String subPath = "/"; @override Future> search(BuildContext? context, List words, Map params) { + print("${subPath}search/${words.join("/")}"); return service.get("${subPath}search/${words.join("/")}", false, context); } diff --git a/lib/pages/datacenter.dart b/lib/pages/datacenter.dart index c3bce47..7d12c27 100644 --- a/lib/pages/datacenter.dart +++ b/lib/pages/datacenter.dart @@ -32,49 +32,7 @@ class ComputePageWidgetState extends State { List titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "MISSED"]; @override Widget build(BuildContext context) { - return FutureBuilder( - future: widget._service.search(context, [ - "${widget.start.year}-${widget.start.month > 9 ? widget.start.month : "0${widget.start.month}"}-${widget.start.day > 9 ? widget.start.day : "0${widget.start.day}"}", - "${widget.end.year}-${widget.end.month > 9 ? widget.end.month : "0${widget.end.month}"}-${widget.end.day > 9 ? widget.end.day : "0${widget.end.day}"}"], {}), - builder: (ctx, as) { - Map> data = {}; - if (as.hasData && as.data!.data != null) { - for (var element in as.data!.data!.executions) { - if (element.executionData == null) { continue; } - DateTime dateTime = DateTime.parse(element.executionData!); - DateTime date = DateTime(dateTime.year, dateTime.month, dateTime.day); - var str = "${date.toIso8601String()}Z"; - if (data[str] == null) { data[str] = []; } - data[str]!.add(element); - data[str]!.sort((a, b) => DateTime.parse(a.executionData!).compareTo(DateTime.parse(b.executionData!))); - } - } GlobalKey k = GlobalKey(); - for (var da in data.keys) { - for (var exec in data[da]!) { - String start = ""; - String end = ""; - try { - if (exec.endDate != null && exec.endDate != "") { - var startD = DateTime.parse(exec.executionData!); - var endD = DateTime.parse(exec.endDate!); - var diff = endD.difference(startD); - if (diff.inDays < 30) { - var rest = ((30 - diff.inDays) ~/ 2) - 1; - start = (startD.subtract(Duration(days: rest)).microsecondsSinceEpoch).toString(); - end = (endD.add(Duration(days: rest)).microsecondsSinceEpoch).toString(); - } else { - start = (startD.microsecondsSinceEpoch).toString(); - end = (startD.add( const Duration(days: 29)).microsecondsSinceEpoch).toString(); - } - } else { - start = (DateTime.parse(exec.executionData!).subtract( const Duration(days: 14)).microsecondsSinceEpoch).toString(); - end = (DateTime.parse(exec.executionData!).add( const Duration(days: 14)).microsecondsSinceEpoch).toString(); - } - } catch(e) { /* */ } - k.currentState?.setState(() { k.currentState?.widget.loading = true; }); - } - } return Column( children: [ Container( color: lightColor, height: 50, width: getMainWidth(context), @@ -211,8 +169,7 @@ class ComputePageWidgetState extends State { ) ])) ), - ScheduleWidget( key: k, data: data, start: widget.start, end : widget.end, isList: widget.isList, isBox: false) + ScheduleWidget( service: widget._service, key: k, start: widget.start, end : widget.end, isList: widget.isList, isBox: false) ]); - }); } } \ No newline at end of file diff --git a/lib/pages/scheduler.dart b/lib/pages/scheduler.dart index 5199632..1e2701d 100644 --- a/lib/pages/scheduler.dart +++ b/lib/pages/scheduler.dart @@ -2,10 +2,8 @@ import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart' as intl; import 'package:go_router/go_router.dart'; -import 'package:oc_front/core/services/specialized_services/logs_service.dart'; import 'package:oc_front/core/services/specialized_services/workflow_execution_service.dart'; import 'package:oc_front/main.dart'; -import 'package:oc_front/models/workflow.dart'; import 'package:oc_front/pages/abstract_page.dart'; import 'package:oc_front/widgets/sheduler_items/schedule.dart'; @@ -29,70 +27,10 @@ class SchedulerPageWidget extends StatefulWidget { } class SchedulerPageWidgetState extends State { List colors = [Colors.blue, Colors.orange, redColor, Colors.green, redColor]; - List titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "MISSED"]; + List titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "FORGOTTEN"]; @override Widget build(BuildContext context) { - return FutureBuilder( - future: widget._service.search(context, [ - "${widget.start.year}-${widget.start.month > 9 ? widget.start.month : "0${widget.start.month}"}-${widget.start.day > 9 ? widget.start.day : "0${widget.start.day}"}", - "${widget.end.year}-${widget.end.month > 9 ? widget.end.month : "0${widget.end.month}"}-${widget.end.day > 9 ? widget.end.day : "0${widget.end.day}"}"], {}), - builder: (ctx, as) { - Map> data = {}; - if (as.hasData && as.data!.data != null) { - for (var element in as.data!.data!.executions) { - if (element.executionData == null) { continue; } - DateTime dateTime = DateTime.parse(element.executionData!); - DateTime date = DateTime(dateTime.year, dateTime.month, dateTime.day); - var str = "${date.toIso8601String()}Z"; - if (data[str] == null) { data[str] = []; } - data[str]!.add(element); - data[str]!.sort((a, b) => DateTime.parse(a.executionData!).compareTo(DateTime.parse(b.executionData!))); - } - } GlobalKey k = GlobalKey(); - for (var da in data.keys) { - for (var exec in data[da]!) { - String start = ""; - String end = ""; - try { - if (exec.endDate != null && exec.endDate != "") { - var startD = DateTime.parse(exec.executionData!); - var endD = DateTime.parse(exec.endDate!); - var diff = endD.difference(startD); - if (diff.inDays < 30) { - var rest = ((30 - diff.inDays) ~/ 2) - 1; - start = (startD.subtract(Duration(days: rest)).microsecondsSinceEpoch).toString(); - end = (endD.add(Duration(days: rest)).microsecondsSinceEpoch).toString(); - } else { - start = (startD.microsecondsSinceEpoch).toString(); - end = (startD.add( const Duration(days: 29)).microsecondsSinceEpoch).toString(); - } - } else { - start = (DateTime.parse(exec.executionData!).subtract( const Duration(days: 14)).microsecondsSinceEpoch).toString(); - end = (DateTime.parse(exec.executionData!).add( const Duration(days: 14)).microsecondsSinceEpoch).toString(); - } - } catch(e) { /* */ } - k.currentState?.setState(() { k.currentState?.widget.loading = true; }); - LogsService().search(context, [], { - "workflow_execution_id": exec.id, - "start": start, - "end": end - }).then((value) { - if (value.data != null) { - var d = value.data!; - for( var r in d.result) { - for (var element in r.logs) { - element.level = r.level; - exec.logs ??= []; - exec.logs!.add(element); - } - exec.logs?.sort((a, b) => a.timestamp!.compareTo(b.timestamp!)); - } - } - k.currentState?.setState(() { k.currentState?.widget.loading = false; }); - }); - } - } return Column( children: [ Container( color: lightColor, height: 50, width: getMainWidth(context), @@ -229,8 +167,7 @@ class SchedulerPageWidgetState extends State { ) ])) ), - ScheduleWidget( key: k, data: data, start: widget.start, end : widget.end, isList: widget.isList, ) + ScheduleWidget( service: widget._service, key: k, start: widget.start, end : widget.end, isList: widget.isList, ) ]); - }); } } diff --git a/lib/pages/shared.dart b/lib/pages/shared.dart index 9be9297..1a4e074 100644 --- a/lib/pages/shared.dart +++ b/lib/pages/shared.dart @@ -339,7 +339,7 @@ class WorkspaceSharedPageWidgetState extends State { List items = []; for (var w in data) { List badges = []; - if (widget.type == CollaborativeAreaType.peer && w.getID( + if (w is Peer && w.getID( ) == CollaborativeAreaLocal.workspaces[CollaborativeAreaLocal.current ?? ""]?.rule?.creator) { badges.add(Padding( padding: const EdgeInsets.only(left: 5), child: Icon(Icons.star, color: Colors.orange.shade300 ))); } else if (widget.type == CollaborativeAreaType.workspace) { diff --git a/lib/widgets/logs.dart b/lib/widgets/logs.dart index cee2de2..e9c7201 100644 --- a/lib/widgets/logs.dart +++ b/lib/widgets/logs.dart @@ -2,28 +2,76 @@ import 'package:alert_banner/exports.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:json_string/json_string.dart'; -import 'package:oc_front/core/sections/header/header.dart'; +import 'package:oc_front/core/services/specialized_services/logs_service.dart'; import 'package:oc_front/main.dart'; import 'package:oc_front/models/logs.dart'; +import 'package:oc_front/models/workflow.dart'; import 'package:oc_front/widgets/dialog/alert.dart'; class LogsWidget extends StatefulWidget { - final List items; String? level; String search = ""; - LogsWidget ({ Key? key, this.search = "", required this.items, this.level }): super(key: key); + + WorkflowExecution? exec; + LogsWidget ({ Key? key, this.search = "", this.level, this.exec }): super(key: key); @override LogsWidgetState createState() => LogsWidgetState(); } + class LogsWidgetState extends State { @override Widget build(BuildContext context) { - List itemRows = widget.items.where((element) => (element.message?.toLowerCase().contains(widget.search.toLowerCase()) ?? true) - && (widget.level?.contains(element.level ?? "") ?? true) ).map((e) => LogWidget(item: e)).toList(); - return Stack( children: [ - SingleChildScrollView( child: itemRows.isEmpty ? - Container( height: getMainHeight(context) - 100, - child: const Center( child: Text("no log registered", style: TextStyle(color: Colors.grey, fontSize: 25 ),))) - : Column( children: [...itemRows, Container(height: 50,) ] ) ), - ]); + if (widget.exec == null) { + return Container(); + } else { + String start = ""; + String end = ""; + try { + if (widget.exec!.endDate != null && widget.exec!.endDate != "") { + var startD = DateTime.parse(widget.exec!.executionData!); + var endD = DateTime.parse(widget.exec!.endDate!); + var diff = endD.difference(startD); + if (diff.inDays < 30) { + var rest = ((30 - diff.inDays) ~/ 2) - 1; + start = (startD.subtract(Duration(days: rest)).microsecondsSinceEpoch).toString(); + end = (endD.add(Duration(days: rest)).microsecondsSinceEpoch).toString(); + } else { + start = (startD.microsecondsSinceEpoch).toString(); + end = (startD.add( const Duration(days: 29)).microsecondsSinceEpoch).toString(); + } + } else { + start = (DateTime.parse(widget.exec!.executionData!).subtract( const Duration(days: 14)).microsecondsSinceEpoch).toString(); + end = (DateTime.parse(widget.exec!.executionData!).add( const Duration(days: 14)).microsecondsSinceEpoch).toString(); + } + } catch(e) { /* */ } + return FutureBuilder(future: LogsService().search(context, [], { + "workflow_execution_id": widget.exec!.id, + "start": start, + "end": end + }), builder: (a, b) { + Future.delayed(const Duration(minutes: 1), () { + setState(() {}); + }); + List logs = []; + if (b.data != null && b.data!.data != null) { + var d = b.data!.data!; + for( var r in d.result) { + for (var element in r.logs) { + element.level = r.level; + logs.add(element); + } + logs.sort((a, b) => a.timestamp!.compareTo(b.timestamp!)); + } + } + List itemRows = logs.where((element) => (element.message?.toLowerCase().contains(widget.search.toLowerCase()) ?? true) + && (widget.level?.contains(element.level ?? "") ?? true) ).map((e) => LogWidget(item: e)).toList(); + return Stack( children: [ + SingleChildScrollView( child: itemRows.isEmpty ? + Container( height: getMainHeight(context) - 100, + child: const Center( child: Text("no log registered", style: TextStyle(color: Colors.grey, fontSize: 25 ),))) + : Column( children: [...itemRows, Container(height: 50,) ] ) ), + ]); + }); + } + } } diff --git a/lib/widgets/sheduler_items/schedule.dart b/lib/widgets/sheduler_items/schedule.dart index 01384d3..e8631b3 100644 --- a/lib/widgets/sheduler_items/schedule.dart +++ b/lib/widgets/sheduler_items/schedule.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_box_transform/flutter_box_transform.dart'; +import 'package:oc_front/core/services/specialized_services/abstract_service.dart'; +import 'package:oc_front/core/services/specialized_services/booking_service.dart'; import 'package:oc_front/main.dart'; -import 'package:oc_front/models/logs.dart'; import 'package:oc_front/models/workflow.dart'; import 'package:oc_front/widgets/logs.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; @@ -16,13 +17,14 @@ class ScheduleWidget extends StatefulWidget { DateTime end; bool isDayPlanner = true; bool loading = true; - Map> data; bool isList = true; bool isBox = true; - ScheduleWidget ({ super.key, required this.data, required this.start, required this.end, + AbstractService service; + ScheduleWidget ({ super.key, required this.start, required this.end, required this.service, this.isBox =true, this.isList = true, this.loading = false}); @override ScheduleWidgetState createState() => ScheduleWidgetState(); } + String? selected; String? selectedReal; class ScheduleWidgetState extends State { @@ -37,184 +39,204 @@ class ScheduleWidgetState extends State { } @override Widget build(BuildContext context) { - bool isInfo = getMainWidth(context) <= 600 && selected != null && widget.isBox; - double w = selected != null && widget.isBox ? getMainWidth(context) - menuSize : getMainWidth(context); - List children = []; - if (selected != null) { - for (var wf in widget.data[selected!] ?? ([])) { - DateTime d2 = DateTime.parse(wf.executionData!).toLocal(); - children.add( InkWell( - onTap: () => setState(() { selectedReal = wf.executionData; }), - child: Container( margin: const EdgeInsets.all(10), - decoration: BoxDecoration( - border: Border.all(color: selectedReal != null && selectedReal == wf.executionData ? lightColor : Colors.transparent, width: 2), - borderRadius: BorderRadius.circular(4), color: Colors.white + return FutureBuilder( + future: widget.service.search(context, [ + "${widget.start.year}-${widget.start.month > 9 ? widget.start.month : "0${widget.start.month}"}-${widget.start.day > 9 ? widget.start.day : "0${widget.start.day}"}", + "${widget.end.year}-${widget.end.month > 9 ? widget.end.month : "0${widget.end.month}"}-${widget.end.day > 9 ? widget.end.day : "0${widget.end.day}"}"], {}), + builder: (ctx, as) { + Future.delayed(const Duration(minutes: 1), () { + setState(() {}); + }); + Map> data = {}; + if (as.hasData && as.data!.data != null) { + for (var element in as.data!.data!.executions) { + if (element.executionData == null) { continue; } + DateTime dateTime = DateTime.parse(element.executionData!); + DateTime date = DateTime(dateTime.year, dateTime.month, dateTime.day); + var str = "${date.toIso8601String()}Z"; + if (data[str] == null) { data[str] = []; } + data[str]!.add(element); + data[str]!.sort((a, b) => DateTime.parse(a.executionData!).compareTo(DateTime.parse(b.executionData!))); + } + } + bool isInfo = getMainWidth(context) <= 600 && selected != null && widget.isBox; + double w = selected != null && widget.isBox ? getMainWidth(context) - menuSize : getMainWidth(context); + List children = []; + if (selected != null) { + for (var wf in data[selected!] ?? ([])) { + DateTime d2 = DateTime.parse(wf.executionData!).toLocal(); + children.add( InkWell( + onTap: () => setState(() { selectedReal = wf.executionData; }), + child: Container( margin: const EdgeInsets.all(10), + decoration: BoxDecoration( + border: Border.all(color: selectedReal != null && selectedReal == wf.executionData ? lightColor : Colors.transparent, width: 2), + borderRadius: BorderRadius.circular(4), color: Colors.white + ), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Row(children: [ + Container( width: 10, height: 10, + decoration: BoxDecoration( + color: colors[(wf.status ?? 1) - 1], + borderRadius: BorderRadius.circular(4), + ), + ), + SizedBox( width: (menuSize - 160), + child: Padding( + padding: const EdgeInsets.only(left: 20), + child: Text(wf.name?.toUpperCase() ?? "", overflow: TextOverflow.ellipsis, + style: const TextStyle(color: Colors.black, fontSize: 12, fontWeight: FontWeight.w500)), + )), + SizedBox( + child: Padding( + padding: const EdgeInsets.only(left: 20), + child: Text("${d2.hour > 9 ? d2.hour : "0${d2.hour}"}:${d2.minute > 9 ? d2.minute : "0${d2.minute}"}:${d2.second > 9 ? d2.second : "0${d2.second}"}", overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 15, + color: Colors.grey, fontWeight: FontWeight.w500)))) + ]) + )) + )); + } + + } + String? selectedID; + WorkflowExecution? sel; + if (selectedReal != null) { + try { + sel = data[selected!]!.firstWhere((element) => element.executionData == selectedReal); + selectedID = sel.id; + } catch(e) { /* */ } + } + menuSize = isInfo ? getMainWidth(context) : (menuSize > getMainWidth(context) / 2 ? getMainWidth(context) / 2 : menuSize); + Rect rect = Rect.fromCenter( center: MediaQuery.of(context).size.center(Offset.zero), + width: selected != null ? menuSize : 0, height: (getMainHeight(context) - 50) > 0 ? (getMainHeight(context) - 50) : 0); + return Row( children: [ + isInfo ? Container() : SizedBox( width: w, + child: widget.isList ? SchedulerItemWidget(data: data, parent: this, focusedDay: getFocusedDay(), width: w) + : SchedulerCalendarWidget(data: data, start: widget.start, + end: widget.end, parent: this, focusedDay: getFocusedDay(),) ), - child: Container( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), - child: Row(children: [ - Container( width: 10, height: 10, - decoration: BoxDecoration( - color: colors[(wf.status ?? 1) - 1], - borderRadius: BorderRadius.circular(4), - ), - ), - SizedBox( width: (menuSize - 160), - child: Padding( - padding: const EdgeInsets.only(left: 20), - child: Text(wf.name?.toUpperCase() ?? "", overflow: TextOverflow.ellipsis, - style: const TextStyle(color: Colors.black, fontSize: 12, fontWeight: FontWeight.w500)), - )), - SizedBox( - child: Padding( - padding: const EdgeInsets.only(left: 20), - child: Text("${d2.hour > 9 ? d2.hour : "0${d2.hour}"}:${d2.minute > 9 ? d2.minute : "0${d2.minute}"}:${d2.second > 9 ? d2.second : "0${d2.second}"}", overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 15, - color: Colors.grey, fontWeight: FontWeight.w500)))) - ]) - )) - )); - } - - } - List logs = []; - String? selectedID; - if (selectedReal != null) { - try { - var sel = widget.data[selected!]!.firstWhere((element) => element.executionData == selectedReal); - selectedID = sel.id; - logs = sel.logs ?? []; - } catch(e) { /* */ } - } - menuSize = isInfo ? getMainWidth(context) : (menuSize > getMainWidth(context) / 2 ? getMainWidth(context) / 2 : menuSize); - Rect rect = Rect.fromCenter( center: MediaQuery.of(context).size.center(Offset.zero), - width: selected != null ? menuSize : 0, height: (getMainHeight(context) - 50) > 0 ? (getMainHeight(context) - 50) : 0); - return Row( children: [ - isInfo ? Container() : SizedBox( width: w, - child: widget.isList ? SchedulerItemWidget(data: widget.data, parent: this, focusedDay: getFocusedDay(), width: w) - : SchedulerCalendarWidget(data: widget.data, start: widget.start, - end: widget.end, parent: this, focusedDay: getFocusedDay(),) - ), - !widget.isBox ? Container() : fork.TransformableBox( - rect: rect, constraints: BoxConstraints( - maxWidth: isInfo ? getMainWidth(context) : (selected != null ? getMainWidth(context) / 2 : 0), - minWidth: selected != null ? 300 : 0), - handleTapSize: 1, handleTapLeftSize: 0, allowFlippingWhileResizing: false, draggable: false, flip: null, - resizeModeResolver: () => ResizeMode.freeform, - visibleHandles: const {HandlePosition.left}, - enabledHandles: const {HandlePosition.left}, - clampingRect: Offset.zero & MediaQuery.sizeOf(context), - handleAlignment: HandleAlignment.inside, - onChanged: (result, event) { setState(() { menuSize = result.rect.width; }); }, - contentBuilder: (context, rect, flip) { return Container( - height: getMainHeight(context) - 50, - width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0), - color: midColor, - child: Column( - children: [ - Row( children: [ - InkWell( onTap: () => setState(() { widget.isDayPlanner = true; }), - child: Tooltip( message: "day planning", child: - Container( height: 50, width: (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / (selectedReal != null ? 2 : 1 ), - alignment: Alignment.center, - decoration: BoxDecoration( - color: widget.isDayPlanner ? Colors.grey : Colors.transparent, - border: Border(bottom: BorderSide(color: Colors.grey.shade400), right: BorderSide(color: Colors.grey.shade400))), - child: Icon(Icons.calendar_today_outlined, color: widget.isDayPlanner ? Colors.white : Colors.grey), - ) - )), - InkWell( onTap: () => setState(() { widget.isDayPlanner = false; }), - child: Tooltip( message: "monitor task", child: - Container( height: 50, width: selectedReal == null ? 0 : ( - (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / 2), - alignment: Alignment.center, - decoration: BoxDecoration( - color: !widget.isDayPlanner ? Colors.grey : Colors.transparent, - border: Border(bottom: BorderSide(color: Colors.grey.shade400)) - ), - child: Icon(Icons.monitor_heart_outlined, size: 25, - color: !widget.isDayPlanner ? Colors.white : Colors.grey), - ) - )) - ]), - SizedBox( width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0), height: getMainHeight(context) - (!widget.isDayPlanner && !widget.loading ? 150 : 100 ), - child: Stack( children: [ - SingleChildScrollView( child: Column( - mainAxisAlignment: children.isEmpty || widget.loading ? MainAxisAlignment.center : MainAxisAlignment.start, - children: [ - ...( widget.isDayPlanner ? children : ( selectedID != null ? [ - widget.loading ? const SpinKitCircle(color: Colors.white,) : LogsWidget(items: logs, search: search, level: level) - ] : [])), - children.isEmpty ? Container( height: 100, alignment: Alignment.center, child: const Text("No event found", style: TextStyle(color: Colors.grey, fontSize: 20))) : Container() - ]), - ) ]) + !widget.isBox ? Container() : fork.TransformableBox( + rect: rect, constraints: BoxConstraints( + maxWidth: isInfo ? getMainWidth(context) : (selected != null ? getMainWidth(context) / 2 : 0), + minWidth: selected != null ? 300 : 0), + handleTapSize: 1, handleTapLeftSize: 0, allowFlippingWhileResizing: false, draggable: false, flip: null, + resizeModeResolver: () => ResizeMode.freeform, + visibleHandles: const {HandlePosition.left}, + enabledHandles: const {HandlePosition.left}, + clampingRect: Offset.zero & MediaQuery.sizeOf(context), + handleAlignment: HandleAlignment.inside, + onChanged: (result, event) { setState(() { menuSize = result.rect.width; }); }, + contentBuilder: (context, rect, flip) { return Container( + height: getMainHeight(context) - 50, + width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0), + color: midColor, + child: Column( + children: [ + Row( children: [ + InkWell( onTap: () => setState(() { widget.isDayPlanner = true; }), + child: Tooltip( message: "day planning", child: + Container( height: 50, width: (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / (selectedReal != null ? 2 : 1 ), + alignment: Alignment.center, + decoration: BoxDecoration( + color: widget.isDayPlanner ? Colors.grey : Colors.transparent, + border: Border(bottom: BorderSide(color: Colors.grey.shade400), right: BorderSide(color: Colors.grey.shade400))), + child: Icon(Icons.calendar_today_outlined, color: widget.isDayPlanner ? Colors.white : Colors.grey), + ) + )), + InkWell( onTap: () => setState(() { widget.isDayPlanner = false; }), + child: Tooltip( message: "monitor task", child: + Container( height: 50, width: selectedReal == null ? 0 : ( + (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / 2), + alignment: Alignment.center, + decoration: BoxDecoration( + color: !widget.isDayPlanner ? Colors.grey : Colors.transparent, + border: Border(bottom: BorderSide(color: Colors.grey.shade400)) + ), + child: Icon(Icons.monitor_heart_outlined, size: 25, + color: !widget.isDayPlanner ? Colors.white : Colors.grey), + ) + )) + ]), + SizedBox( width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0), height: getMainHeight(context) - (!widget.isDayPlanner && !widget.loading ? 150 : 100 ), + child: Stack( children: [ + SingleChildScrollView( child: Column( + mainAxisAlignment: children.isEmpty || widget.loading ? MainAxisAlignment.center : MainAxisAlignment.start, + children: [ + ...( widget.isDayPlanner ? children : ( selectedID != null ? [ + widget.loading ? const SpinKitCircle(color: Colors.white,) : LogsWidget(exec: sel, search: search, level: level) + ] : [])), + children.isEmpty ? Container( height: 100, alignment: Alignment.center, child: const Text("No event found", style: TextStyle(color: Colors.grey, fontSize: 20))) : Container() + ]), + ) ]) + ), + !widget.isDayPlanner && !widget.loading ? + Row( children: [ + Container( + width: 150, + height: 50, + decoration: BoxDecoration( + border: Border(left: BorderSide(color: midColor)), + ), + child: DropdownButtonFormField( + isExpanded: true, + value: level, + style: const TextStyle(fontSize: 12), + hint: const Text("by level...", style: TextStyle(fontSize: 12)), + decoration: InputDecoration( + filled: true, + focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.zero, + borderSide: BorderSide(color: lightColor, width: 0), + ), + fillColor: Colors.white, + contentPadding: const EdgeInsets.only(left: 30, right: 30, top: 10, bottom: 30), + enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.zero, + borderSide: BorderSide(color: midColor, width: 0), + ), + border: OutlineInputBorder( borderRadius: BorderRadius.zero, + borderSide: BorderSide(color: midColor, width: 0)), + ), + items: [ + DropdownMenuItem(value: "debug,warning,error,info", child: Row( children: [ Container( width: 10, height: 15, color: Colors.grey), Text(" all", style: TextStyle(fontSize: 12, color: Colors.black)) ])), + DropdownMenuItem(value: "debug", child: Row( children: [ Container( width: 10, height: 15, color: Colors.blue), Text(" debug", style: TextStyle(fontSize: 12, color: Colors.black)) ])), + DropdownMenuItem(value: "warning", child: Row( children: [ Container( width: 10, height: 15, color: Colors.orange), Text(" warning", style: TextStyle(fontSize: 12, color: Colors.black)) ])), + DropdownMenuItem(value: "error", child: Row( children: [ Container( width: 10, height: 15, color: redColor), Text(" error", style: TextStyle(fontSize: 12, color: Colors.black)) ])), + DropdownMenuItem(value: "info", child: Row( children: [ Container( width: 10, height: 15, color: Colors.green), Text(" info", style: TextStyle(fontSize: 12, color: Colors.black)) ])), + ], + onChanged: (value) { + setState(() { + level = value; + }); + })), + Container( + width: menuSize - 150, + height: 50, + decoration: BoxDecoration( + border: Border(left: BorderSide(color: midColor)), + ), + child: TextField( + onChanged: (value) { setState(() { + search = value; + });}, + style: const TextStyle(fontSize: 12), + decoration: const InputDecoration( + hintText: "by logs...", + fillColor: Colors.white, + filled: true, + contentPadding: EdgeInsets.symmetric(horizontal: 30), + hintStyle: TextStyle( + color: Colors.black, + fontSize: 12, + fontWeight: FontWeight.w300 + ), + border: InputBorder.none + ) + )) ] + ) : Container( ), + ], ), - !widget.isDayPlanner && !widget.loading ? - Row( children: [ - Container( - width: 150, - height: 50, - decoration: BoxDecoration( - border: Border(left: BorderSide(color: midColor)), - ), - child: DropdownButtonFormField( - isExpanded: true, - value: level, - style: const TextStyle(fontSize: 12), - hint: const Text("by level...", style: TextStyle(fontSize: 12)), - decoration: InputDecoration( - filled: true, - focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.zero, - borderSide: BorderSide(color: lightColor, width: 0), - ), - fillColor: Colors.white, - contentPadding: const EdgeInsets.only(left: 30, right: 30, top: 10, bottom: 30), - enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.zero, - borderSide: BorderSide(color: midColor, width: 0), - ), - border: OutlineInputBorder( borderRadius: BorderRadius.zero, - borderSide: BorderSide(color: midColor, width: 0)), - ), - items: [ - DropdownMenuItem(value: "debug,warning,error,info", child: Row( children: [ Container( width: 10, height: 15, color: Colors.grey), Text(" all", style: TextStyle(fontSize: 12, color: Colors.black)) ])), - DropdownMenuItem(value: "debug", child: Row( children: [ Container( width: 10, height: 15, color: Colors.blue), Text(" debug", style: TextStyle(fontSize: 12, color: Colors.black)) ])), - DropdownMenuItem(value: "warning", child: Row( children: [ Container( width: 10, height: 15, color: Colors.orange), Text(" warning", style: TextStyle(fontSize: 12, color: Colors.black)) ])), - DropdownMenuItem(value: "error", child: Row( children: [ Container( width: 10, height: 15, color: redColor), Text(" error", style: TextStyle(fontSize: 12, color: Colors.black)) ])), - DropdownMenuItem(value: "info", child: Row( children: [ Container( width: 10, height: 15, color: Colors.green), Text(" info", style: TextStyle(fontSize: 12, color: Colors.black)) ])), - ], - onChanged: (value) { - setState(() { - level = value; - }); - })), - Container( - width: menuSize - 150, - height: 50, - decoration: BoxDecoration( - border: Border(left: BorderSide(color: midColor)), - ), - child: TextField( - onChanged: (value) { setState(() { - search = value; - });}, - style: const TextStyle(fontSize: 12), - decoration: const InputDecoration( - hintText: "by logs...", - fillColor: Colors.white, - filled: true, - contentPadding: EdgeInsets.symmetric(horizontal: 30), - hintStyle: TextStyle( - color: Colors.black, - fontSize: 12, - fontWeight: FontWeight.w300 - ), - border: InputBorder.none - ) - )) ] - ) : Container( ), - ], - ), - ); }) - ]); + ); }) + ]); + }); } } \ No newline at end of file