137 lines
5.5 KiB
Dart
137 lines
5.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:oc_front/models/response.dart';
|
|
import 'package:oc_front/pages/shared.dart';
|
|
class ShallowTextInputWidget extends StatefulWidget {
|
|
double? width;
|
|
SharedWorkspaceType type = SharedWorkspaceType.workspace;
|
|
Future<void> Function(Map<String,dynamic>)? load;
|
|
Future<void> Function(String)? loadStr;
|
|
Future<void> Function(String)? remove;
|
|
bool Function(String?)? canLoad;
|
|
bool Function(String?)? canRemove;
|
|
void Function(String?)? change;
|
|
String? current;
|
|
String? compare;
|
|
|
|
IconData? iconLoad;
|
|
IconData? iconRemove;
|
|
|
|
String? hint;
|
|
|
|
String? tooltipLoad;
|
|
String? tooltipRemove;
|
|
|
|
Color? filled;
|
|
Color? hintColor;
|
|
Color? color;
|
|
List<ShallowTextInputWidget> forms = [];
|
|
|
|
String? attr;
|
|
|
|
ShallowTextInputWidget ({ Key? key, this.width, this.current, this.attr,
|
|
this.iconLoad, this.iconRemove, this.hint, this.forms = const [], this.loadStr,
|
|
this.tooltipLoad = "", this.tooltipRemove = "",
|
|
this.filled, this.hintColor, this.color,
|
|
required this.type, this.canLoad, this.canRemove, this.load, this.remove, this.change }): super(key: key);
|
|
@override ShallowTextInputWidgetState createState() => ShallowTextInputWidgetState();
|
|
|
|
Map<String, dynamic> serialize() {
|
|
Map<String, dynamic> map = { "name" : current };
|
|
for (var form in forms) {
|
|
if (form.attr == null) {
|
|
continue;
|
|
}
|
|
map[form.attr!] = form.current;
|
|
}
|
|
return map;
|
|
}
|
|
|
|
bool validate() {
|
|
return canLoad == null ? true : canLoad!(current);
|
|
}
|
|
}
|
|
class ShallowTextInputWidgetState extends State<ShallowTextInputWidget> {
|
|
bool validForms() {
|
|
for (var form in widget.forms) {
|
|
if (!form.validate()) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@override Widget build(BuildContext context) {
|
|
var t = widget.type == SharedWorkspaceType.workspace ? "workspace" : (widget.type == SharedWorkspaceType.workflow ? "workflow" : "peer");
|
|
return Row( children: [
|
|
Tooltip( message: widget.hint ?? "current $t", child:
|
|
Theme(
|
|
data: Theme.of(context).copyWith(
|
|
canvasColor: Colors.grey.shade300,
|
|
),
|
|
child: Container( height: 50, width: (widget.width ?? MediaQuery.of(context).size.width) - (widget.load == null ? 0 : 50) - (widget.remove == null ? 0 : 50),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
),
|
|
child: TextFormField(
|
|
onChanged: (value) {
|
|
setState(() {
|
|
widget.current = value;
|
|
if (widget.change != null) {
|
|
widget.change!(value);
|
|
}
|
|
});
|
|
},
|
|
initialValue: widget.current,
|
|
style: TextStyle(color: widget.color ?? Colors.black, fontSize: 15),
|
|
decoration: InputDecoration(
|
|
filled: true,
|
|
border: InputBorder.none,
|
|
focusedBorder: InputBorder.none,
|
|
disabledBorder: InputBorder.none,
|
|
enabledBorder: InputBorder.none,
|
|
fillColor: widget.filled ?? Colors.white,
|
|
hintText: widget.hint ?? "enter $t ${widget.attr ?? "name"}...",
|
|
contentPadding: const EdgeInsets.only(left: 30, right: 30, top: 18, bottom: 18),
|
|
hintStyle: TextStyle(color: widget.hintColor ??const Color.fromARGB(255, 85, 44, 44), fontSize: 14)),
|
|
),
|
|
))),
|
|
widget.load == null && widget.loadStr == null ? Container() : Tooltip(
|
|
message: widget.tooltipLoad ?? "add $t",
|
|
child:InkWell(
|
|
mouseCursor: SystemMouseCursors.click,
|
|
onTap: () async {
|
|
if (widget.canLoad == null || !widget.canLoad!(widget.current) || !validForms()
|
|
|| (widget.load == null && widget.loadStr == null) || widget.current == null) {
|
|
return;
|
|
}
|
|
if (widget.loadStr != null) {
|
|
await widget.loadStr!(widget.current!);
|
|
} else {
|
|
await widget.load!(widget.serialize());
|
|
}
|
|
setState(() { });
|
|
},
|
|
child: Container( width: 50,height: 50,
|
|
color: Colors.black,
|
|
child: Icon( widget.iconLoad ?? Icons.add, color: widget.current == null || !validForms()
|
|
|| widget.canLoad == null || !widget.canLoad!(widget.current) ? Colors.grey : Colors.white)
|
|
)
|
|
)
|
|
),
|
|
widget.remove == null ? Container() : Tooltip(
|
|
message: widget.tooltipRemove ?? "refresh entry",
|
|
child: InkWell( mouseCursor: SystemMouseCursors.click,
|
|
onTap: () async {
|
|
if (widget.canRemove == null || !widget.canRemove!(widget.current) || widget.remove == null || widget.current == null) {
|
|
return;
|
|
}
|
|
await widget.remove!(widget.current!);
|
|
setState(() { });
|
|
},
|
|
child: Container( width: 50,height: 50,
|
|
decoration: BoxDecoration(color: Colors.black, border: Border(left: BorderSide(color: Colors.grey.shade300))),
|
|
child: Icon(widget.iconRemove ?? Icons.delete, color: widget.current == null || widget.canRemove == null || !widget.canRemove!(widget.current) ? Colors.grey : Colors.white)) )
|
|
),
|
|
]);
|
|
}
|
|
} |