Major Change Inputs & Co
This commit is contained in:
@@ -6,35 +6,41 @@ import 'package:oc_front/core/models/workspace_local.dart';
|
||||
import 'package:oc_front/core/services/perms_service.dart';
|
||||
import 'package:oc_front/core/services/specialized_services/workflow_service.dart';
|
||||
import 'package:oc_front/main.dart';
|
||||
import 'package:oc_front/models/resources/compute.dart';
|
||||
import 'package:oc_front/models/resources/data.dart';
|
||||
import 'package:oc_front/models/resources/processing.dart';
|
||||
import 'package:oc_front/models/resources/resources.dart';
|
||||
import 'package:oc_front/models/resources/storage.dart';
|
||||
import 'package:oc_front/models/resources/workflow.dart';
|
||||
import 'package:oc_front/models/response.dart';
|
||||
import 'package:oc_front/models/search.dart';
|
||||
import 'package:oc_front/models/workflow.dart';
|
||||
import 'package:oc_front/pages/abstract_page.dart';
|
||||
import 'package:oc_front/pages/shared.dart';
|
||||
import 'package:oc_front/widgets/dialog/shallow_creation.dart';
|
||||
import 'package:oc_front/widgets/forms/compute_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/data_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/processing_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/resource_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/scheduler_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/storage_forms.dart';
|
||||
import 'package:oc_front/widgets/forms/storage_processing_link_forms.dart';
|
||||
import 'package:oc_front/widgets/items/item_row.dart';
|
||||
import 'package:oc_front/widgets/inputs/shallow_dropdown_input.dart';
|
||||
|
||||
Dashboard dash = Dashboard(name: "");
|
||||
class WorkflowFactory implements AbstractFactory {
|
||||
@override GlobalKey getKey() { return key; }
|
||||
@override String? getSearch() { return ""; }
|
||||
@override void back(BuildContext context) { }
|
||||
static GlobalKey<WorkflowPageWidgetState> key = GlobalKey<WorkflowPageWidgetState>();
|
||||
@override bool searchFill() { return false; }
|
||||
@override Widget factory(GoRouterState state, List<String> args) {
|
||||
String? id;
|
||||
try { id = state.pathParameters[args.first];
|
||||
} catch (e) { }
|
||||
} catch (e) { /**/ }
|
||||
return WorkflowPageWidget(id: id);
|
||||
}
|
||||
@override void search(BuildContext context, bool special) { }
|
||||
}
|
||||
bool getAll = true;
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class WorkflowPageWidget extends StatefulWidget {
|
||||
String? id;
|
||||
WorkflowPageWidget ({ this.id }) : super(key: WorkflowFactory.key);
|
||||
@@ -55,19 +61,20 @@ final WorflowService _service = WorflowService();
|
||||
var e = item as AbstractItem;
|
||||
return Container(color: Colors.white, child: ItemRowWidget(low: true, contextWidth: 290, item: e));
|
||||
}
|
||||
Widget getArrowForms(ArrowPainter? arrow) {
|
||||
if (arrow == null) { return Container(); }
|
||||
var from = dash.getElement(arrow.fromID);
|
||||
var to = dash.getElement(arrow.toID);
|
||||
if ((from?.element?.getType() == "storage" && to?.element?.getType() == "processing")
|
||||
|| (from?.element?.getType() == "processing" && to?.element?.getType() == "storage")) {
|
||||
return StorageProcessingLinkFormsWidget( dash: dash, item: arrow);
|
||||
}
|
||||
return Container();
|
||||
}
|
||||
List<Widget> getForms(FlowData? obj, String id) {
|
||||
var objAbs = obj as AbstractItem?;
|
||||
if (objAbs == null) { return []; }
|
||||
List<Widget> res = [];
|
||||
if ( objAbs.topic == "processing") {
|
||||
res = [ProcessingFormsWidget(item: objAbs as ProcessingItem, dash: dash, elementID: id)];
|
||||
} else if ( objAbs.topic == "data" ) {
|
||||
res = [DataFormsWidget(item: objAbs as DataItem)];
|
||||
} else if ( objAbs.topic == "storage" ) {
|
||||
res = [StorageFormsWidget(item: objAbs as StorageItem)];
|
||||
} else if ( objAbs.topic == "compute" ) {
|
||||
res = [ComputeFormsWidget(item: objAbs as ComputeItem)];
|
||||
}
|
||||
List<Widget> res = [ ResourceFormsWidget(item: objAbs, dash: dash, elementID: id) ];
|
||||
return [ Wrap(
|
||||
alignment: WrapAlignment.center,
|
||||
children: [
|
||||
@@ -84,18 +91,20 @@ final WorflowService _service = WorflowService();
|
||||
Widget? getTopRight(FlowData? obj) {
|
||||
var objAbs = obj as AbstractItem?;
|
||||
if (objAbs == null) { return null; }
|
||||
if (objAbs.topic == "compute" ) {
|
||||
var compute = objAbs as ComputeItem;
|
||||
if (compute.technology == 0) {
|
||||
return Icon(FontAwesomeIcons.docker, size: 16);
|
||||
} else if (compute.technology == 1) {
|
||||
return Icon(FontAwesomeIcons.lifeRing, size: 16);
|
||||
} else if (compute.technology == 2) {
|
||||
return Icon(FontAwesomeIcons.cubes, size: 16);
|
||||
} else if (compute.technology == 3) {
|
||||
return Icon(FontAwesomeIcons.hardDrive, size: 16);
|
||||
} else if (compute.technology == 4) {
|
||||
return Icon(FontAwesomeIcons.v, size: 16);
|
||||
if (objAbs.topic == "compute") {
|
||||
var instance = objAbs as ComputeItem;
|
||||
if (instance.infrastructureEnum != null) {
|
||||
if (instance.infrastructureEnum == 0) {
|
||||
return Icon(FontAwesomeIcons.docker, size: 16);
|
||||
} else if (instance.infrastructureEnum == 1) {
|
||||
return Icon(FontAwesomeIcons.lifeRing, size: 16);
|
||||
} else if (instance.infrastructureEnum == 2) {
|
||||
return Icon(FontAwesomeIcons.cubes, size: 16);
|
||||
} else if (instance.infrastructureEnum == 3) {
|
||||
return Icon(FontAwesomeIcons.hardDrive, size: 16);
|
||||
} else if (instance.infrastructureEnum == 4) {
|
||||
return Icon(FontAwesomeIcons.v, size: 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -136,10 +145,11 @@ final WorflowService _service = WorflowService();
|
||||
}
|
||||
await _service.get(context, dash.id ?? "").then((value) async {
|
||||
if (value.data != null) {
|
||||
// ignore: use_build_context_synchronously
|
||||
await WorkspaceLocal.init(context, false);
|
||||
WorkspaceLocal.changeWorkspaceByName("${value.data?.name ?? ""}_workspace");
|
||||
dash.clear();
|
||||
dash.deserialize(value.data!.toDashboard());
|
||||
dash.deserialize(value.data!.toDashboard(), false);
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
dash.name = name;
|
||||
dash.shouldSave = true;
|
||||
@@ -149,26 +159,20 @@ final WorflowService _service = WorflowService();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> saveDash(String? id) async {
|
||||
if (id == null || !dash.isOpened || !dash.shouldSave
|
||||
|| !PermsService.getPerm(Perms.WORKFLOW_EDIT)) { return; }
|
||||
var datas = WorkspaceLocal.byTopic("data", true).where(
|
||||
(element) => dash.elements.map( (e) => e.element?.getID()).contains(element.id) );
|
||||
var compute = WorkspaceLocal.byTopic("compute", true).where(
|
||||
(element) => dash.elements.map( (e) => e.element?.getID()).contains(element.id) );
|
||||
var storage = WorkspaceLocal.byTopic("storage", true).where(
|
||||
(element) => dash.elements.map( (e) => e.element?.getID()).contains(element.id) );
|
||||
var computing = WorkspaceLocal.byTopic("processing", true).where(
|
||||
(element) => dash.elements.map( (e) => e.element?.getID()).contains(element.id) );
|
||||
var workflows = WorkspaceLocal.byTopic("workflows", true).where(
|
||||
(element) => dash.elements.map( (e) => e.element?.getID()).contains(element.id) );
|
||||
Future<void> saveDash(String? id, BuildContext? context) async {
|
||||
if (id == null || !dash.isOpened || !dash.shouldSave || !PermsService.getPerm(Perms.WORKFLOW_EDIT)) { return; }
|
||||
var datas = dash.elements.where( (e) => e.element?.serialize()["type"] == "data");
|
||||
var compute = dash.elements.where( (e) => e.element?.serialize()["type"] == "compute");
|
||||
var storage = dash.elements.where( (e) => e.element?.serialize()["type"] == "storage");
|
||||
var processing = dash.elements.where( (e) => e.element?.serialize()["type"] == "processing");
|
||||
var workflows = dash.elements.where( (e) => e.element?.serialize()["type"] == "workflow");
|
||||
var updateW = Workflow(
|
||||
name: dash.name,
|
||||
graph: Graph(),
|
||||
data: datas.map((e) => e.id).toSet().toList(),
|
||||
compute: compute.map((e) => e.id).toSet().toList(),
|
||||
storage: storage.map((e) => e.id).toSet().toList(),
|
||||
processing: computing.map((e) => e.id).toSet().toList(),
|
||||
processing: processing.map((e) => e.id).toSet().toList(),
|
||||
workflows: workflows.map((e) => e.id).toSet().toList(),
|
||||
);
|
||||
updateW.fromDashboard(dash.serialize());
|
||||
@@ -177,8 +181,8 @@ final WorflowService _service = WorflowService();
|
||||
item.position?.x = (item.position?.x ?? 0) + (item.width! / 2) + 7.5;
|
||||
item.position?.y = (item.position?.y ?? 0) + (item.height! / 2) + 7.5;
|
||||
for (var i in (updateW.graph?.links ?? [] as List<GraphLink>).where((element) => id == element.source?.id)) {
|
||||
i.source?.x = (i.source?.x ?? 0) + (item.width! / 2) + 7;
|
||||
i.source?.y = (i.source?.y ?? 0) + (item.width! / 2) + 7;
|
||||
i.source?.x = (i.source?.x ?? 0) + (item.width! / 2) + 7.5;
|
||||
i.source?.y = (i.source?.y ?? 0) + (item.width! / 2) + 7.5;
|
||||
}
|
||||
for (var i in (updateW.graph?.links ?? [] as List<GraphLink>).where((element) => id == element.destination?.id)) {
|
||||
i.destination?.x = (i.destination?.x ?? 0) + (item.width! / 2) + 7.5;
|
||||
@@ -187,31 +191,24 @@ final WorflowService _service = WorflowService();
|
||||
}
|
||||
updateW.graph?.zoom = dash.getZoomFactor();
|
||||
dash.addToHistory();
|
||||
await _service.put(context, id, updateW.serialize(), {}).then( (e) async {
|
||||
if (dash.addChange) {
|
||||
dash.addChange = false;
|
||||
await WorkspaceLocal.init(context, false);
|
||||
WorkspaceLocal.changeWorkspaceByName("${dash.name}_workspace");
|
||||
dash.selectedLeftMenuKey.currentState?.setState(() { });
|
||||
}
|
||||
});
|
||||
_service.put(null, id, updateW.serialize(), {}).then( (e) async {
|
||||
dash.applyInfos(updateW.graph?.getEnvToUpdate() ?? {}, updateW.toDashboard());
|
||||
if (dash.addChange) {
|
||||
dash.addChange = false;
|
||||
// ignore: use_build_context_synchronously
|
||||
await WorkspaceLocal.init(context, false);
|
||||
WorkspaceLocal.changeWorkspaceByName("${dash.name}_workspace");
|
||||
dash.selectedLeftMenuKey.currentState?.setState(() { });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
FlowData? transformToData(Map<String, dynamic> data) {
|
||||
var d = WorkspaceLocal.getItem(data["id"] ?? "", true);
|
||||
if (d == null) { return null; }
|
||||
d.model = ResourceModel().deserialize(data["resource_model"]);
|
||||
if (d.topic == "data") { return d as DataItem; }
|
||||
if (d.topic == "compute") { return d as ComputeItem; }
|
||||
if (d.topic == "storage") { return d as StorageItem; }
|
||||
if (d.topic == "processing") {
|
||||
d = d as ProcessingItem;
|
||||
if (data.containsKey("container")) {
|
||||
d.container = Containered().deserialize(data["container"]);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
if (d.topic == "workflows") { return d as WorkflowItem; }
|
||||
if (data["type"] == "data") { return DataItem().deserialize(data); }
|
||||
if (data["type"] == "compute") { return ComputeItem().deserialize(data); }
|
||||
if (data["type"] == "storage") { return StorageItem().deserialize(data); }
|
||||
if (data["type"] == "processing") { return ProcessingItem().deserialize(data); }
|
||||
if (data["type"] == "workflows") { return WorkflowItem().deserialize(data); }
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -249,12 +246,14 @@ final WorflowService _service = WorflowService();
|
||||
WorkspaceLocal.changeWorkspaceByName(p0.split("~")[1]);
|
||||
await dash.load!(p0);
|
||||
}
|
||||
dash.inDialog = false;
|
||||
dash.notifyListeners();
|
||||
},
|
||||
create: PermsService.getPerm(Perms.WORKFLOW_CREATE) ? (p0) async => await _service.post(context, p0, {}).then( (value) async {
|
||||
dash.clear();
|
||||
dash.id = value.data?.getID() ?? "";
|
||||
dash.name = value.data?.getName() ?? "";
|
||||
dash.inDialog = false;
|
||||
dash.notifyListeners();
|
||||
await WorkspaceLocal.init(context, true);
|
||||
dash.isOpened = true;
|
||||
@@ -288,26 +287,33 @@ final WorflowService _service = WorflowService();
|
||||
dash.midDashColor = midColor;
|
||||
dash.transformToData = transformToData;
|
||||
dash.infoItemWidget = getForms;
|
||||
dash.infoLinkWidget = getArrowForms;
|
||||
dash.infoWidget = getDashInfoForms;
|
||||
dash.widthOffset = 50;
|
||||
dash.arrowStyleRules = [
|
||||
(dash) {
|
||||
for (var arrow in dash.arrows) {
|
||||
var from = dash.elements.firstWhere((element) => arrow.fromID.contains(element.id)).element;
|
||||
var to = dash.elements.firstWhere((element) => arrow.toID.contains(element.id)).element;
|
||||
if ((from is ProcessingItem && to is ComputeItem) || (to is ProcessingItem && from is ComputeItem)) {
|
||||
arrow.params.color = Colors.orange;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else if ((from is ProcessingItem && to is StorageItem) || (to is ProcessingItem && from is StorageItem)) {
|
||||
arrow.params.color = redColor;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else if ((from is ProcessingItem && to is DataItem) || (to is ProcessingItem && from is DataItem)) {
|
||||
arrow.params.color = Colors.blue;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else {
|
||||
try {
|
||||
var from = dash.elements.firstWhere((element) => arrow.fromID.split("_")[0] == element.id).element;
|
||||
var to = dash.elements.firstWhere((element) => arrow.toID.split("_")[0] == element.id).element;
|
||||
if ((from is ProcessingItem && to is ComputeItem) || (to is ProcessingItem && from is ComputeItem)) {
|
||||
arrow.params.color = Colors.orange;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else if ((from is ProcessingItem && to is StorageItem) || (to is ProcessingItem && from is StorageItem)) {
|
||||
arrow.params.color = redColor;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else if ((from is ProcessingItem && to is DataItem) || (to is ProcessingItem && from is DataItem)) {
|
||||
arrow.params.color = Colors.blue;
|
||||
arrow.params.dashSpace = 2;
|
||||
arrow.params.dashWidth = 2;
|
||||
} else {
|
||||
arrow.params.color = Colors.black;
|
||||
arrow.params.dashSpace = 0;
|
||||
arrow.params.dashWidth = 0;
|
||||
}
|
||||
} catch (e) {
|
||||
arrow.params.color = Colors.black;
|
||||
arrow.params.dashSpace = 0;
|
||||
arrow.params.dashWidth = 0;
|
||||
@@ -319,32 +325,7 @@ final WorflowService _service = WorflowService();
|
||||
dash.saveRules = [
|
||||
(dash) {
|
||||
dash.error = null;
|
||||
if (dash.scheduleActive) {
|
||||
if (dash.elements.isEmpty || dash.elements.where((element) => element.element is ProcessingItem).isEmpty) {
|
||||
dash.error = "You need at least one processing element";
|
||||
dash.scheduleActive = false;
|
||||
}
|
||||
var processings = dash.elements.where((element) => element.element is ProcessingItem).map((e) => e.element as ProcessingItem);
|
||||
var computes = dash.elements.where((element) => element.element is ComputeItem).map((e) => e.element as ComputeItem);
|
||||
if (processings.length != computes.length) {
|
||||
dash.error = "You need the same number of processing and compute elements";
|
||||
dash.scheduleActive = false;
|
||||
}
|
||||
for (var p in processings) {
|
||||
var links = dash.arrows.where((element) => element.fromID.contains(p.getID()) || element.toID.contains(p.getID()));
|
||||
try {
|
||||
computes.firstWhere( (e) => links.first.toID.contains(e.getID()) || links.first.fromID.contains(e.getID()) );
|
||||
} catch (e) {
|
||||
dash.error = "You need to link each processing element to a compute element";
|
||||
dash.scheduleActive = false;
|
||||
}
|
||||
}
|
||||
if (dash.error != null) {
|
||||
print(dash.error);
|
||||
setState(() {});
|
||||
}
|
||||
return dash.scheduleActive;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user