Autoload yay
This commit is contained in:
parent
d522a44029
commit
2ceab090fd
@ -16,6 +16,7 @@ class LogsService extends AbstractService<LogsResult> {
|
|||||||
if (p == "start" || p == "end") { continue; }
|
if (p == "start" || p == "end") { continue; }
|
||||||
v.add("$p=\"${params[p]}\"");
|
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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ class WorkflowExecutionService extends AbstractService<WorkflowExecutions> {
|
|||||||
@override String subPath = "/";
|
@override String subPath = "/";
|
||||||
|
|
||||||
@override Future<APIResponse<WorkflowExecutions>> search(BuildContext? context, List<String> words, Map<String, dynamic> params) {
|
@override Future<APIResponse<WorkflowExecutions>> search(BuildContext? context, List<String> words, Map<String, dynamic> params) {
|
||||||
|
print("${subPath}search/${words.join("/")}");
|
||||||
return service.get("${subPath}search/${words.join("/")}", false, context);
|
return service.get("${subPath}search/${words.join("/")}", false, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,49 +32,7 @@ class ComputePageWidgetState extends State<ComputePageWidget> {
|
|||||||
List<String> titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "MISSED"];
|
List<String> titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "MISSED"];
|
||||||
|
|
||||||
@override Widget build(BuildContext context) {
|
@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<String, List<WorkflowExecution>> 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<ScheduleWidgetState> k = GlobalKey<ScheduleWidgetState>();
|
GlobalKey<ScheduleWidgetState> k = GlobalKey<ScheduleWidgetState>();
|
||||||
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: [
|
return Column( children: [
|
||||||
Container( color: lightColor,
|
Container( color: lightColor,
|
||||||
height: 50, width: getMainWidth(context),
|
height: 50, width: getMainWidth(context),
|
||||||
@ -211,8 +169,7 @@ class ComputePageWidgetState extends State<ComputePageWidget> {
|
|||||||
)
|
)
|
||||||
]))
|
]))
|
||||||
),
|
),
|
||||||
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)
|
||||||
]);
|
]);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,10 +2,8 @@ import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart' as intl;
|
import 'package:intl/intl.dart' as intl;
|
||||||
import 'package:go_router/go_router.dart';
|
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/core/services/specialized_services/workflow_execution_service.dart';
|
||||||
import 'package:oc_front/main.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/pages/abstract_page.dart';
|
||||||
import 'package:oc_front/widgets/sheduler_items/schedule.dart';
|
import 'package:oc_front/widgets/sheduler_items/schedule.dart';
|
||||||
|
|
||||||
@ -29,70 +27,10 @@ class SchedulerPageWidget extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
class SchedulerPageWidgetState extends State<SchedulerPageWidget> {
|
class SchedulerPageWidgetState extends State<SchedulerPageWidget> {
|
||||||
List<Color> colors = [Colors.blue, Colors.orange, redColor, Colors.green, redColor];
|
List<Color> colors = [Colors.blue, Colors.orange, redColor, Colors.green, redColor];
|
||||||
List<String> titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "MISSED"];
|
List<String> titles = ["SCHEDULED", "RUNNING", "FAILURE", "SUCCESS", "FORGOTTEN"];
|
||||||
|
|
||||||
@override Widget build(BuildContext context) {
|
@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<String, List<WorkflowExecution>> 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<ScheduleWidgetState> k = GlobalKey<ScheduleWidgetState>();
|
GlobalKey<ScheduleWidgetState> k = GlobalKey<ScheduleWidgetState>();
|
||||||
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: [
|
return Column( children: [
|
||||||
Container( color: lightColor,
|
Container( color: lightColor,
|
||||||
height: 50, width: getMainWidth(context),
|
height: 50, width: getMainWidth(context),
|
||||||
@ -229,8 +167,7 @@ class SchedulerPageWidgetState extends State<SchedulerPageWidget> {
|
|||||||
)
|
)
|
||||||
]))
|
]))
|
||||||
),
|
),
|
||||||
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, )
|
||||||
]);
|
]);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -339,7 +339,7 @@ class WorkspaceSharedPageWidgetState extends State<WorkspaceSharedPageWidget> {
|
|||||||
List<Widget> items = [];
|
List<Widget> items = [];
|
||||||
for (var w in data) {
|
for (var w in data) {
|
||||||
List<Widget> badges = [];
|
List<Widget> badges = [];
|
||||||
if (widget.type == CollaborativeAreaType.peer && w.getID(
|
if (w is Peer && w.getID(
|
||||||
) == CollaborativeAreaLocal.workspaces[CollaborativeAreaLocal.current ?? ""]?.rule?.creator) {
|
) == CollaborativeAreaLocal.workspaces[CollaborativeAreaLocal.current ?? ""]?.rule?.creator) {
|
||||||
badges.add(Padding( padding: const EdgeInsets.only(left: 5), child: Icon(Icons.star, color: Colors.orange.shade300 )));
|
badges.add(Padding( padding: const EdgeInsets.only(left: 5), child: Icon(Icons.star, color: Colors.orange.shade300 )));
|
||||||
} else if (widget.type == CollaborativeAreaType.workspace) {
|
} else if (widget.type == CollaborativeAreaType.workspace) {
|
||||||
|
@ -2,28 +2,76 @@ import 'package:alert_banner/exports.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:json_string/json_string.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/main.dart';
|
||||||
import 'package:oc_front/models/logs.dart';
|
import 'package:oc_front/models/logs.dart';
|
||||||
|
import 'package:oc_front/models/workflow.dart';
|
||||||
import 'package:oc_front/widgets/dialog/alert.dart';
|
import 'package:oc_front/widgets/dialog/alert.dart';
|
||||||
|
|
||||||
class LogsWidget extends StatefulWidget {
|
class LogsWidget extends StatefulWidget {
|
||||||
final List<Log> items;
|
|
||||||
String? level;
|
String? level;
|
||||||
String search = "";
|
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();
|
@override LogsWidgetState createState() => LogsWidgetState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class LogsWidgetState extends State<LogsWidget> {
|
class LogsWidgetState extends State<LogsWidget> {
|
||||||
@override Widget build(BuildContext context) {
|
@override Widget build(BuildContext context) {
|
||||||
List<LogWidget> itemRows = widget.items.where((element) => (element.message?.toLowerCase().contains(widget.search.toLowerCase()) ?? true)
|
if (widget.exec == null) {
|
||||||
&& (widget.level?.contains(element.level ?? "") ?? true) ).map((e) => LogWidget(item: e)).toList();
|
return Container();
|
||||||
return Stack( children: [
|
} else {
|
||||||
SingleChildScrollView( child: itemRows.isEmpty ?
|
String start = "";
|
||||||
Container( height: getMainHeight(context) - 100,
|
String end = "";
|
||||||
child: const Center( child: Text("no log registered", style: TextStyle(color: Colors.grey, fontSize: 25 ),)))
|
try {
|
||||||
: Column( children: [...itemRows, Container(height: 50,) ] ) ),
|
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<Log> 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<LogWidget> 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,) ] ) ),
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_box_transform/flutter_box_transform.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/main.dart';
|
||||||
import 'package:oc_front/models/logs.dart';
|
|
||||||
import 'package:oc_front/models/workflow.dart';
|
import 'package:oc_front/models/workflow.dart';
|
||||||
import 'package:oc_front/widgets/logs.dart';
|
import 'package:oc_front/widgets/logs.dart';
|
||||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
@ -16,13 +17,14 @@ class ScheduleWidget extends StatefulWidget {
|
|||||||
DateTime end;
|
DateTime end;
|
||||||
bool isDayPlanner = true;
|
bool isDayPlanner = true;
|
||||||
bool loading = true;
|
bool loading = true;
|
||||||
Map<String, List<WorkflowExecution>> data;
|
|
||||||
bool isList = true;
|
bool isList = true;
|
||||||
bool isBox = true;
|
bool isBox = true;
|
||||||
ScheduleWidget ({ super.key, required this.data, required this.start, required this.end,
|
AbstractService<WorkflowExecutions> service;
|
||||||
|
ScheduleWidget ({ super.key, required this.start, required this.end, required this.service,
|
||||||
this.isBox =true, this.isList = true, this.loading = false});
|
this.isBox =true, this.isList = true, this.loading = false});
|
||||||
@override ScheduleWidgetState createState() => ScheduleWidgetState();
|
@override ScheduleWidgetState createState() => ScheduleWidgetState();
|
||||||
}
|
}
|
||||||
|
|
||||||
String? selected;
|
String? selected;
|
||||||
String? selectedReal;
|
String? selectedReal;
|
||||||
class ScheduleWidgetState extends State<ScheduleWidget> {
|
class ScheduleWidgetState extends State<ScheduleWidget> {
|
||||||
@ -37,184 +39,204 @@ class ScheduleWidgetState extends State<ScheduleWidget> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override Widget build(BuildContext context) {
|
@override Widget build(BuildContext context) {
|
||||||
bool isInfo = getMainWidth(context) <= 600 && selected != null && widget.isBox;
|
return FutureBuilder(
|
||||||
double w = selected != null && widget.isBox ? getMainWidth(context) - menuSize : getMainWidth(context);
|
future: widget.service.search(context, [
|
||||||
List<Widget> children = [];
|
"${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}"}",
|
||||||
if (selected != null) {
|
"${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}"}"], {}),
|
||||||
for (var wf in widget.data[selected!] ?? (<WorkflowExecution>[])) {
|
builder: (ctx, as) {
|
||||||
DateTime d2 = DateTime.parse(wf.executionData!).toLocal();
|
Future.delayed(const Duration(minutes: 1), () {
|
||||||
children.add( InkWell(
|
setState(() {});
|
||||||
onTap: () => setState(() { selectedReal = wf.executionData; }),
|
});
|
||||||
child: Container( margin: const EdgeInsets.all(10),
|
Map<String, List<WorkflowExecution>> data = {};
|
||||||
decoration: BoxDecoration(
|
if (as.hasData && as.data!.data != null) {
|
||||||
border: Border.all(color: selectedReal != null && selectedReal == wf.executionData ? lightColor : Colors.transparent, width: 2),
|
for (var element in as.data!.data!.executions) {
|
||||||
borderRadius: BorderRadius.circular(4), color: Colors.white
|
if (element.executionData == null) { continue; }
|
||||||
),
|
DateTime dateTime = DateTime.parse(element.executionData!);
|
||||||
child: Container(
|
DateTime date = DateTime(dateTime.year, dateTime.month, dateTime.day);
|
||||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
var str = "${date.toIso8601String()}Z";
|
||||||
child: Row(children: [
|
if (data[str] == null) { data[str] = []; }
|
||||||
Container( width: 10, height: 10,
|
data[str]!.add(element);
|
||||||
decoration: BoxDecoration(
|
data[str]!.sort((a, b) => DateTime.parse(a.executionData!).compareTo(DateTime.parse(b.executionData!)));
|
||||||
color: colors[(wf.status ?? 1) - 1],
|
}
|
||||||
borderRadius: BorderRadius.circular(4),
|
}
|
||||||
),
|
bool isInfo = getMainWidth(context) <= 600 && selected != null && widget.isBox;
|
||||||
),
|
double w = selected != null && widget.isBox ? getMainWidth(context) - menuSize : getMainWidth(context);
|
||||||
SizedBox( width: (menuSize - 160),
|
List<Widget> children = [];
|
||||||
child: Padding(
|
if (selected != null) {
|
||||||
padding: const EdgeInsets.only(left: 20),
|
for (var wf in data[selected!] ?? (<WorkflowExecution>[])) {
|
||||||
child: Text(wf.name?.toUpperCase() ?? "", overflow: TextOverflow.ellipsis,
|
DateTime d2 = DateTime.parse(wf.executionData!).toLocal();
|
||||||
style: const TextStyle(color: Colors.black, fontSize: 12, fontWeight: FontWeight.w500)),
|
children.add( InkWell(
|
||||||
)),
|
onTap: () => setState(() { selectedReal = wf.executionData; }),
|
||||||
SizedBox(
|
child: Container( margin: const EdgeInsets.all(10),
|
||||||
child: Padding(
|
decoration: BoxDecoration(
|
||||||
padding: const EdgeInsets.only(left: 20),
|
border: Border.all(color: selectedReal != null && selectedReal == wf.executionData ? lightColor : Colors.transparent, width: 2),
|
||||||
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,
|
borderRadius: BorderRadius.circular(4), color: Colors.white
|
||||||
style: const TextStyle(fontSize: 15,
|
),
|
||||||
color: Colors.grey, fontWeight: FontWeight.w500))))
|
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<Log> logs = [];
|
String? selectedID;
|
||||||
String? selectedID;
|
WorkflowExecution? sel;
|
||||||
if (selectedReal != null) {
|
if (selectedReal != null) {
|
||||||
try {
|
try {
|
||||||
var sel = widget.data[selected!]!.firstWhere((element) => element.executionData == selectedReal);
|
sel = data[selected!]!.firstWhere((element) => element.executionData == selectedReal);
|
||||||
selectedID = sel.id;
|
selectedID = sel.id;
|
||||||
logs = sel.logs ?? [];
|
} catch(e) { /* */ }
|
||||||
} catch(e) { /* */ }
|
}
|
||||||
}
|
menuSize = isInfo ? getMainWidth(context) : (menuSize > getMainWidth(context) / 2 ? getMainWidth(context) / 2 : menuSize);
|
||||||
menuSize = isInfo ? getMainWidth(context) : (menuSize > getMainWidth(context) / 2 ? getMainWidth(context) / 2 : menuSize);
|
Rect rect = Rect.fromCenter( center: MediaQuery.of(context).size.center(Offset.zero),
|
||||||
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);
|
||||||
width: selected != null ? menuSize : 0, height: (getMainHeight(context) - 50) > 0 ? (getMainHeight(context) - 50) : 0);
|
return Row( children: [
|
||||||
return Row( children: [
|
isInfo ? Container() : SizedBox( width: w,
|
||||||
isInfo ? Container() : SizedBox( width: w,
|
child: widget.isList ? SchedulerItemWidget(data: data, parent: this, focusedDay: getFocusedDay(), width: w)
|
||||||
child: widget.isList ? SchedulerItemWidget(data: widget.data, parent: this, focusedDay: getFocusedDay(), width: w)
|
: SchedulerCalendarWidget(data: data, start: widget.start,
|
||||||
: SchedulerCalendarWidget(data: widget.data, start: widget.start,
|
end: widget.end, parent: this, focusedDay: getFocusedDay(),)
|
||||||
end: widget.end, parent: this, focusedDay: getFocusedDay(),)
|
),
|
||||||
),
|
!widget.isBox ? Container() : fork.TransformableBox(
|
||||||
!widget.isBox ? Container() : fork.TransformableBox(
|
rect: rect, constraints: BoxConstraints(
|
||||||
rect: rect, constraints: BoxConstraints(
|
maxWidth: isInfo ? getMainWidth(context) : (selected != null ? getMainWidth(context) / 2 : 0),
|
||||||
maxWidth: isInfo ? getMainWidth(context) : (selected != null ? getMainWidth(context) / 2 : 0),
|
minWidth: selected != null ? 300 : 0),
|
||||||
minWidth: selected != null ? 300 : 0),
|
handleTapSize: 1, handleTapLeftSize: 0, allowFlippingWhileResizing: false, draggable: false, flip: null,
|
||||||
handleTapSize: 1, handleTapLeftSize: 0, allowFlippingWhileResizing: false, draggable: false, flip: null,
|
resizeModeResolver: () => ResizeMode.freeform,
|
||||||
resizeModeResolver: () => ResizeMode.freeform,
|
visibleHandles: const {HandlePosition.left},
|
||||||
visibleHandles: const {HandlePosition.left},
|
enabledHandles: const {HandlePosition.left},
|
||||||
enabledHandles: const {HandlePosition.left},
|
clampingRect: Offset.zero & MediaQuery.sizeOf(context),
|
||||||
clampingRect: Offset.zero & MediaQuery.sizeOf(context),
|
handleAlignment: HandleAlignment.inside,
|
||||||
handleAlignment: HandleAlignment.inside,
|
onChanged: (result, event) { setState(() { menuSize = result.rect.width; }); },
|
||||||
onChanged: (result, event) { setState(() { menuSize = result.rect.width; }); },
|
contentBuilder: (context, rect, flip) { return Container(
|
||||||
contentBuilder: (context, rect, flip) { return Container(
|
height: getMainHeight(context) - 50,
|
||||||
height: getMainHeight(context) - 50,
|
width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0),
|
||||||
width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0),
|
color: midColor,
|
||||||
color: midColor,
|
child: Column(
|
||||||
child: Column(
|
children: [
|
||||||
children: [
|
Row( children: [
|
||||||
Row( children: [
|
InkWell( onTap: () => setState(() { widget.isDayPlanner = true; }),
|
||||||
InkWell( onTap: () => setState(() { widget.isDayPlanner = true; }),
|
child: Tooltip( message: "day planning", child:
|
||||||
child: Tooltip( message: "day planning", child:
|
Container( height: 50, width: (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / (selectedReal != null ? 2 : 1 ),
|
||||||
Container( height: 50, width: (isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0)) / (selectedReal != null ? 2 : 1 ),
|
alignment: Alignment.center,
|
||||||
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.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(
|
decoration: BoxDecoration(
|
||||||
border: Border(left: BorderSide(color: midColor)),
|
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: TextField(
|
child: Icon(Icons.monitor_heart_outlined, size: 25,
|
||||||
onChanged: (value) { setState(() {
|
color: !widget.isDayPlanner ? Colors.white : Colors.grey),
|
||||||
search = value;
|
)
|
||||||
});},
|
))
|
||||||
style: const TextStyle(fontSize: 12),
|
]),
|
||||||
decoration: const InputDecoration(
|
SizedBox( width: isInfo ? getMainWidth(context) : (selected != null ? menuSize : 0), height: getMainHeight(context) - (!widget.isDayPlanner && !widget.loading ? 150 : 100 ),
|
||||||
hintText: "by logs...",
|
child: Stack( children: [
|
||||||
fillColor: Colors.white,
|
SingleChildScrollView( child: Column(
|
||||||
filled: true,
|
mainAxisAlignment: children.isEmpty || widget.loading ? MainAxisAlignment.center : MainAxisAlignment.start,
|
||||||
contentPadding: EdgeInsets.symmetric(horizontal: 30),
|
children: [
|
||||||
hintStyle: TextStyle(
|
...( widget.isDayPlanner ? children : ( selectedID != null ? [
|
||||||
color: Colors.black,
|
widget.loading ? const SpinKitCircle(color: Colors.white,) : LogsWidget(exec: sel, search: search, level: level)
|
||||||
fontSize: 12,
|
] : [])),
|
||||||
fontWeight: FontWeight.w300
|
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)),
|
||||||
),
|
),
|
||||||
border: InputBorder.none
|
child: DropdownButtonFormField(
|
||||||
)
|
isExpanded: true,
|
||||||
)) ]
|
value: level,
|
||||||
) : Container( ),
|
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( ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
); })
|
||||||
|
]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user