Stream<S> eventPipe(
PublishSubject<E> events,
- Stream<S> pipeInto(E event),
+ Stream<S> Function(E event) pipeInto,
) {
return events.asyncExpand(pipeInto);
}
BuiltList<PveAccessUserTokenModel> getTokensFromUserList(
List<PveAccessUserModel> users) {
final tokens = [];
- users.forEach((user) {
+ for (var user in users) {
if (user.tokens?.isNotEmpty ?? false) {
- user.tokens!.forEach((t) {
+ for (var t in user.tokens!) {
tokens.add(t.rebuild((tb) => tb..userid = user.userid));
- });
+ }
}
- });
+ }
return BuiltList.from(tokens);
}
}
}
}
}
-
- @override
- void dispose() {
- super.dispose();
- }
}
//EVENTS
extends ProxmoxBaseBloc<PveClusterStatusEvent, PveClusterStatusState> {
final ProxmoxApiClient apiClient;
final PveClusterStatusState init;
+ @override
PveClusterStatusState get initialState => init;
Timer? updateTimer;
PveClusterStatusBloc({required this.apiClient, required this.init});
+ @override
Stream<PveClusterStatusState> processEvents(
PveClusterStatusEvent event) async* {
if (event is UpdateClusterStatus) {
@override
Stream<GuestIdSelectorState> eventPipe(
PublishSubject<PveGuestIdSelectorEvent> events,
- Stream<GuestIdSelectorState> pipeInto(PveGuestIdSelectorEvent event),
+ Stream<GuestIdSelectorState> Function(PveGuestIdSelectorEvent event)
+ pipeInto,
) {
return events
.debounceTime(const Duration(milliseconds: 150))
final PveLxcOverviewState init;
Timer? updateTimer;
+ @override
PveLxcOverviewState get initialState => init;
PveLxcOverviewBloc({
}
}
+ @override
Stream<PveLxcOverviewState> processEvents(PveLxcOverviewEvent event) async* {
if (event is UpdateLxcStatus) {
final status =
}
Stream<PveMigrateState> checkQemuPreconditons() async* {
- final _qPreconditions = await (apiClient.getMigratePreconditions(
+ final qPreconditions0 = await (apiClient.getMigratePreconditions(
latestState.nodeID,
guestID,
migrationTarget: latestState.targetNodeID,
) as FutureOr<PveNodesQemuMigrate?>);
var preconditions = <PveMigrateCondition>[];
- if (_qPreconditions == null) {
+ if (qPreconditions0 == null) {
preconditions.add(PveMigrateCondition((b) => b
..severity = PveMigrateSeverity.warning
..message = "Couldn't get migration preconditions from API!"));
yield latestState.rebuild((b) => b..preconditions.replace(preconditions));
}
- final qPreconditions = _qPreconditions!;
- qPreconditions.localDisks!.forEach((d) {
+ final qPreconditions = qPreconditions0!;
+ for (var d in qPreconditions.localDisks!) {
var disk = d.asMap;
if (disk['cdrom'] == 1) {
if (disk['volid'].contains('vm-$guestID-cloudinit')) {
..message =
"Can't live migrate VM with local cloudinit disk, use shared storage instead"));
} else {
- return;
+ continue;
}
} else {
preconditions.add(PveMigrateCondition((b) => b
..message =
"Migration with local disk might take long: ${Renderers.formatSize(disk['size'])}"));
}
- });
+ }
preconditions.sort((a, b) => a.severity.name.compareTo(b.severity.name));
final PveQemuOverviewState init;
Timer? updateTimer;
+ @override
PveQemuOverviewState get initialState => init;
PveQemuOverviewBloc({
}
}
+ @override
Stream<PveQemuOverviewState> processEvents(
PveQemuOverviewEvent event) async* {
if (event is UpdateQemuStatus) {
yield latestState.rebuild((b) => b..isBlank = false);
if (event is LoadTasks) {
- var nodeTaskResponse;
+ NodeTasksResponse nodeTaskResponse;
yield latestState.rebuild((b) => b..isLoading = true);
nodeTaskResponse = await getNodeTasks(latestState);
..events.add(PollResources());
}
if (state is Unauthenticated) {
- Provider.of<PveResourceBloc>(context, listen: false)
- ..apiClient = null;
+ Provider.of<PveResourceBloc>(context, listen: false).apiClient = null;
}
},
child: MaterialApp(
import 'package:built_collection/built_collection.dart';
import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
return BottomNavigationBar(
type: BottomNavigationBarType.fixed,
backgroundColor: light ? Colors.white : ProxmoxColors.greyShade40,
- items: [
- const BottomNavigationBarItem(
+ items: const [
+ BottomNavigationBarItem(
icon: Icon(Icons.dashboard),
label: "Dashboard",
),
- const BottomNavigationBarItem(
+ BottomNavigationBarItem(
icon: Icon(Icons.developer_board),
label: "Resources",
),
- const BottomNavigationBarItem(
+ BottomNavigationBarItem(
icon: Icon(Icons.supervised_user_circle),
label: "Access",
),
- const BottomNavigationBarItem(
+ BottomNavigationBarItem(
icon: Icon(Icons.logout),
label: "Sites",
),
var aggrCpuUsage = 0.0;
var aggrMemUsage = 0.0;
var aggrMem = 0.0;
- nodes.forEach((element) {
+ for (var element in nodes) {
aggrCpuUsage +=
(element.cpu ?? 0) * (element.maxcpu ?? 0);
aggrCpus += element.maxcpu ?? 0;
aggrMemUsage += element.mem ?? 0;
aggrMem += element.maxmem ?? 0;
- });
+ }
final cpuUsagePercent =
((aggrCpuUsage / aggrCpus) * 100).toStringAsFixed(2);
final memUsagePercent =
onChanged: (filter) =>
rBloc.events.add(FilterResources(nameFilter: filter)),
),
- actions: <Widget>[const AppBarFilterIconButton()],
+ actions: const <Widget>[AppBarFilterIconButton()],
),
body: ListView.separated(
itemCount: fResources.length,
resource: resource,
);
}
- if (listWidget != null) {
- if (otherCategory(fResources, index)) {
- return Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Padding(
- padding: const EdgeInsets.all(12.0),
- child: Text(
- resource.type.toUpperCase(),
- style: const TextStyle(
- fontSize: 18,
- fontWeight: FontWeight.bold,
- ),
+ if (otherCategory(fResources, index)) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(12.0),
+ child: Text(
+ resource.type.toUpperCase(),
+ style: const TextStyle(
+ fontSize: 18,
+ fontWeight: FontWeight.bold,
),
),
- listWidget,
- ],
- );
- } else {
- return listWidget;
- }
+ ),
+ listWidget,
+ ],
+ );
+ } else {
+ return listWidget;
}
-
- return const ListTile(
- title: Text('Unkown resource type'),
- );
},
),
bottomNavigationBar: const PveMobileBottomNavigationbar(),
}
bool otherCategory(List<PveClusterResourcesModel> fResources, index) {
- var previous;
+ PveClusterResourcesModel? previous;
if (index > 0) {
previous = fResources[index - 1];
}
final current = fResources[index];
- return previous == null || previous.type != current.type;
+ return previous?.type != current.type;
}
}
class _AppbarSearchTextFieldState extends State<AppbarSearchTextField> {
late TextEditingController _controller;
+ @override
void initState() {
super.initState();
_controller = TextEditingController();
}
+ @override
void dispose() {
_controller.dispose();
super.dispose();
isScrollable: true,
labelStyle:
TextStyle(color: Theme.of(context).colorScheme.onPrimary),
- tabs: [
- const Tab(
+ tabs: const [
+ Tab(
text: 'Users',
icon: Icon(Icons.person),
),
- const Tab(
+ Tab(
text: 'API Tokens',
icon: Icon(Icons.person_outline),
),
- const Tab(
+ Tab(
text: 'Groups',
icon: Icon(Icons.group),
),
- const Tab(
+ Tab(
text: 'Roles',
icon: Icon(Icons.lock_open),
),
- const Tab(
+ Tab(
text: 'Domains',
icon: Icon(Icons.domain),
)
-import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:math';
);
}
+ @override
Widget build(BuildContext contect) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
@override
bool shouldRepaint(ProxmoxClusterVisualizer oldDelegate) {
- return oldDelegate.seeds != this.seeds;
+ return oldDelegate.seeds != seeds;
}
void drawSeed(Canvas canvas, num x, num y) {
static const _kFontFam = 'ProxmoxIcons';
- static const IconData proxmox = const IconData(0xf101, fontFamily: _kFontFam);
+ static const IconData proxmox = IconData(0xf101, fontFamily: _kFontFam);
}
import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
import 'package:pve_flutter_frontend/states/pve_base_state.dart';
import 'package:pve_flutter_frontend/bloc/proxmox_base_bloc.dart';
@override
Widget build(BuildContext context) {
- final _bBloc = Provider.of<PveBridgeSelectorBloc>(context);
+ final bBloc = Provider.of<PveBridgeSelectorBloc>(context);
return StreamBuilder<PveBridgeSelectorState>(
- stream: _bBloc.state,
- initialData: _bBloc.state.value,
+ stream: bBloc.state,
+ initialData: bBloc.state.value,
builder: (BuildContext context,
AsyncSnapshot<PveBridgeSelectorState> snapshot) {
if (snapshot.hasData) {
)
],
onChanged: (PveNodeNetworkModel? selection) =>
- _bBloc.events.add(BridgeSelectedEvent(selection)),
+ bBloc.events.add(BridgeSelectedEvent(selection)),
value: state.value,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (dynamic _) {
b..content = PveStorageContentType.iso),
)..events.add(LoadStoragesEvent()),
));
- if (file != null && file is PveNodesStorageContentModel) {
+ if (file != null) {
cdBloc.events.add(FileSelected(file.volid));
}
},
});
@override
Widget build(BuildContext context) {
- var pBool;
+ bool? pBool;
if (pending != null) {
pBool = pending == 0 ? false : true;
}
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart';
-import 'package:flutter/foundation.dart';
import 'package:webview_flutter/webview_flutter.dart';
class PveConsoleMenu extends StatelessWidget {
static const platform =
- const MethodChannel('com.proxmox.app.pve_flutter_frontend/filesharing');
+ MethodChannel('com.proxmox.app.pve_flutter_frontend/filesharing');
final ProxmoxApiClient apiClient;
final String? guestID;
final bool? allowSpice;
@override
Widget build(BuildContext context) {
- final _allowSpice = allowSpice ?? true;
return SingleChildScrollView(
child: Container(
constraints:
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
- if (Platform.isAndroid && _allowSpice)
+ if (Platform.isAndroid && (allowSpice ?? true))
ListTile(
title: const Text(
"SPICE",
if (Platform.isAndroid) {
final tempDir = await getExternalCacheDirectories();
- var apiPath;
+ String apiPath;
if (['qemu', 'lxc'].contains(type)) {
apiPath = '/nodes/$node/$type/$guestID/spiceproxy';
} else if (type == 'node') {
-import 'dart:ui';
-
import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:pve_flutter_frontend/utils/dot_indicator.dart';
import 'package:pve_flutter_frontend/utils/proxmox_colors.dart';
@override
Widget build(BuildContext context) {
- final _pveGuestIdSelectorBloc =
- Provider.of<PveGuestIdSelectorBloc>(context);
+ final pveGuestIdSelectorBloc = Provider.of<PveGuestIdSelectorBloc>(context);
return StreamBuilder<PveFormFieldState>(
- stream: _pveGuestIdSelectorBloc.state,
- initialData: _pveGuestIdSelectorBloc.state.value,
+ stream: pveGuestIdSelectorBloc.state,
+ initialData: pveGuestIdSelectorBloc.state.value,
builder: (context, snapshot) {
final state = snapshot.data!;
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
autovalidateMode: AutovalidateMode.onUserInteraction,
onChanged: (text) {
- _pveGuestIdSelectorBloc.events.add(OnChanged(text));
+ pveGuestIdSelectorBloc.events.add(OnChanged(text));
},
validator: (_) {
return state.errorText;
class _MigrateTargetSelector extends StatelessWidget {
const _MigrateTargetSelector({
- super.key,
required this.nodeSelectorbloc,
required this.migrateBloc,
required this.disabled,
fontWeight: FontWeight.w500,
),
);
- double? last_cpu = rrd.last.cpu;
- String last_cpu_text = last_cpu != null
- ? "${(last_cpu * 100.0).toStringAsFixed(2)} %"
+ double? lastCpu = rrd.last.cpu;
+ String lastCpuText = lastCpu != null
+ ? "${(lastCpu * 100.0).toStringAsFixed(2)} %"
: "";
return Column(
children: [
child: PveRRDChart(
title:
'CPU (${state.status?.cpuinfo.cpus ?? '-'})',
- subtitle: last_cpu_text,
+ subtitle: lastCpuText,
data: rrd.where((e) => e.cpu != null).map(
(e) => Point(
e.time!.millisecondsSinceEpoch,
@override
Widget build(BuildContext context) {
- final _pveNodeSelectorBloc = Provider.of<PveNodeSelectorBloc>(context);
+ final pveNodeSelectorBloc = Provider.of<PveNodeSelectorBloc>(context);
return StreamBuilder<PveNodeSelectorState>(
- stream: _pveNodeSelectorBloc.state,
- initialData: _pveNodeSelectorBloc.state.value,
+ stream: pveNodeSelectorBloc.state,
+ initialData: pveNodeSelectorBloc.state.value,
builder:
(BuildContext context, AsyncSnapshot<PveNodeSelectorState> snapshot) {
if (snapshot.hasData && snapshot.data!.availableNodes.isNotEmpty) {
selectedItemBuilder: (context) => state.availableNodes
.map((item) => Text(item.nodeName))
.toList(),
- onChanged: (String? selectedNode) => _pveNodeSelectorBloc.events
- .add(NodeSelectedEvent(selectedNode)),
+ onChanged: (String? selectedNode) =>
+ pveNodeSelectorBloc.events.add(NodeSelectedEvent(selectedNode)),
value: state.selectedNode!.nodeName,
);
}
initialData: rbloc.state.value,
builder: (context, snapshot) => SingleChildScrollView(
child: DataTable(
- columns: [
- const DataColumn(
+ columns: const [
+ DataColumn(
label: Text("Type"),
),
- const DataColumn(
+ DataColumn(
label: Text("Description"),
),
- const DataColumn(
+ DataColumn(
label: Text("Node"),
),
- const DataColumn(
+ DataColumn(
label: Text("Action"),
),
],
@override
Widget build(BuildContext context) {
- final _pveStorageSelectorBloc =
+ final pveStorageSelectorBloc =
sBloc ?? Provider.of<PveStorageSelectorBloc>(context);
return ProxmoxStreamBuilder<PveStorageSelectorBloc,
PveStorageSelectorState>(
- bloc: _pveStorageSelectorBloc,
+ bloc: pveStorageSelectorBloc,
builder: (BuildContext context, state) {
return DropdownButtonFormField(
decoration: InputDecoration(
)
],
onChanged: (PveNodesStorageModel? selectedStorage) =>
- _pveStorageSelectorBloc.events
+ pveStorageSelectorBloc.events
.add(StorageSelectedEvent(storage: selectedStorage)),
selectedItemBuilder: (context) =>
state.storages.map((item) => Text(item.id)).toList(),
),
subtitle: const Text('Start time'),
),
- if (duration != null)
- ListTile(
- leading: const Icon(Icons.timelapse),
- title: Text(
- Renderers.renderDuration(duration),
- ),
- subtitle: const Text('Duration'),
+ ListTile(
+ leading: const Icon(Icons.timelapse),
+ title: Text(
+ Renderers.renderDuration(duration),
),
+ subtitle: const Text('Duration'),
+ ),
ListTile(
leading: const Icon(Icons.description),
title: Text(widget.task.status),
}
class _PveTaskLogScrollViewState extends State<PveTaskLogScrollView> {
- ScrollController _scrollController = ScrollController();
+ final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();