add providers per page
show only 10 packages new page for all packages
This commit is contained in:
@ -5,6 +5,7 @@ import 'package:aurcache/providers/build_provider.dart';
|
||||
import 'package:aurcache/utils/time_formatter.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../components/dashboard/your_packages.dart';
|
||||
|
||||
@ -21,54 +22,59 @@ class _BuildScreenState extends State<BuildScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: APIBuilder<BuildProvider, Build, BuildDTO>(
|
||||
key: const Key("Build on seperate page"),
|
||||
dto: BuildDTO(buildID: widget.buildID),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("loading"),
|
||||
onData: (buildData) {
|
||||
final start_time = DateTime.fromMillisecondsSinceEpoch(
|
||||
(buildData.start_time ?? 0) * 1000);
|
||||
body: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<BuildProvider>(create: (_) => BuildProvider()),
|
||||
],
|
||||
child: APIBuilder<BuildProvider, Build, BuildDTO>(
|
||||
key: const Key("Build on seperate page"),
|
||||
dto: BuildDTO(buildID: widget.buildID),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("loading"),
|
||||
onData: (buildData) {
|
||||
final start_time = DateTime.fromMillisecondsSinceEpoch(
|
||||
(buildData.start_time ?? 0) * 1000);
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
IconButton(
|
||||
icon: Icon(
|
||||
switchSuccessIcon(buildData.status),
|
||||
color: switchSuccessColor(buildData.status),
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
onPressed: () {
|
||||
context.replace("/build/${buildData.id}");
|
||||
},
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
buildData.pkg_name,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text("triggered ${start_time.readableDuration()}")
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 15,
|
||||
),
|
||||
_buildPage(buildData)
|
||||
],
|
||||
);
|
||||
}),
|
||||
IconButton(
|
||||
icon: Icon(
|
||||
switchSuccessIcon(buildData.status),
|
||||
color: switchSuccessColor(buildData.status),
|
||||
),
|
||||
onPressed: () {
|
||||
context.replace("/build/${buildData.id}");
|
||||
},
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
buildData.pkg_name,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text("triggered ${start_time.readableDuration()}")
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 15,
|
||||
),
|
||||
_buildPage(buildData)
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
appBar: AppBar(),
|
||||
);
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ import 'package:aurcache/components/builds_table.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/builds_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../constants/color_constants.dart';
|
||||
import '../models/build.dart';
|
||||
|
||||
@ -12,33 +13,39 @@ class BuildsScreen extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Container(
|
||||
body: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<BuildsProvider>(
|
||||
create: (_) => BuildsProvider()),
|
||||
],
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
decoration: const BoxDecoration(
|
||||
color: secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"All Builds",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>, Object>(
|
||||
key: const Key("Builds on seperate screen"),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("no data"),
|
||||
onData: (data) {
|
||||
return BuildsTable(data: data);
|
||||
}),
|
||||
)
|
||||
],
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
decoration: const BoxDecoration(
|
||||
color: secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"All Builds",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>, Object>(
|
||||
key: const Key("Builds on seperate screen"),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("no data"),
|
||||
onData: (data) {
|
||||
return BuildsTable(data: data);
|
||||
}),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -1,12 +1,12 @@
|
||||
import 'package:aurcache/api/statistics.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/stats_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../api/API.dart';
|
||||
import '../components/dashboard/header.dart';
|
||||
import '../constants/color_constants.dart';
|
||||
import '../providers/builds_provider.dart';
|
||||
import '../providers/packages_provider.dart';
|
||||
import '../utils/responsive.dart';
|
||||
import '../models/stats.dart';
|
||||
import '../components/dashboard/quick_info_banner.dart';
|
||||
@ -22,63 +22,71 @@ class DashboardScreen extends StatefulWidget {
|
||||
class _DashboardScreenState extends State<DashboardScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return APIBuilder<StatsProvider, Stats, Object>(
|
||||
interval: const Duration(seconds: 10),
|
||||
onData: (stats) {
|
||||
return SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Column(
|
||||
children: [
|
||||
const Header(),
|
||||
const SizedBox(height: defaultPadding),
|
||||
QuickInfoBanner(
|
||||
stats: stats,
|
||||
),
|
||||
const SizedBox(height: defaultPadding),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Column(
|
||||
children: [
|
||||
const YourPackages(),
|
||||
const SizedBox(height: defaultPadding),
|
||||
const RecentBuilds(),
|
||||
if (Responsive.isMobile(context))
|
||||
const SizedBox(height: defaultPadding),
|
||||
if (Responsive.isMobile(context))
|
||||
SidePanel(
|
||||
nrbuilds: stats.total_builds,
|
||||
nrfailedbuilds: stats.failed_builds,
|
||||
nrActiveBuilds: stats.active_builds),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (!Responsive.isMobile(context))
|
||||
const SizedBox(width: defaultPadding),
|
||||
// On Mobile means if the screen is less than 850 we dont want to show it
|
||||
if (!Responsive.isMobile(context))
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<StatsProvider>(create: (_) => StatsProvider()),
|
||||
ChangeNotifierProvider<PackagesProvider>(
|
||||
create: (_) => PackagesProvider()),
|
||||
ChangeNotifierProvider<BuildsProvider>(create: (_) => BuildsProvider()),
|
||||
],
|
||||
child: APIBuilder<StatsProvider, Stats, Object>(
|
||||
interval: const Duration(seconds: 10),
|
||||
onData: (stats) {
|
||||
return SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Column(
|
||||
children: [
|
||||
const Header(),
|
||||
const SizedBox(height: defaultPadding),
|
||||
QuickInfoBanner(
|
||||
stats: stats,
|
||||
),
|
||||
const SizedBox(height: defaultPadding),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: SidePanel(
|
||||
nrbuilds: stats.total_builds,
|
||||
nrfailedbuilds: stats.failed_builds,
|
||||
nrActiveBuilds: stats.active_builds),
|
||||
flex: 5,
|
||||
child: Column(
|
||||
children: [
|
||||
const YourPackages(),
|
||||
const SizedBox(height: defaultPadding),
|
||||
const RecentBuilds(),
|
||||
if (Responsive.isMobile(context))
|
||||
const SizedBox(height: defaultPadding),
|
||||
if (Responsive.isMobile(context))
|
||||
SidePanel(
|
||||
nrbuilds: stats.total_builds,
|
||||
nrfailedbuilds: stats.failed_builds,
|
||||
nrActiveBuilds: stats.active_builds),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
if (!Responsive.isMobile(context))
|
||||
const SizedBox(width: defaultPadding),
|
||||
// On Mobile means if the screen is less than 850 we dont want to show it
|
||||
if (!Responsive.isMobile(context))
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: SidePanel(
|
||||
nrbuilds: stats.total_builds,
|
||||
nrfailedbuilds: stats.failed_builds,
|
||||
nrActiveBuilds: stats.active_builds),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
onLoad: () {
|
||||
return Text("loading");
|
||||
},
|
||||
);
|
||||
},
|
||||
onLoad: () {
|
||||
return Text("loading");
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -29,94 +29,103 @@ class _PackageScreenState extends State<PackageScreen> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: APIBuilder<PackageProvider, Package, PackageDTO>(
|
||||
dto: PackageDTO(pkgID: widget.pkgID),
|
||||
onLoad: () => const Text("loading"),
|
||||
onData: (pkg) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
margin: const EdgeInsets.only(left: 15),
|
||||
child: Text(
|
||||
pkg.name,
|
||||
style: const TextStyle(fontSize: 32),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(right: 15),
|
||||
child: ElevatedButton(
|
||||
onPressed: () async {
|
||||
final confirmResult =
|
||||
await showDeleteConfirmationDialog(context);
|
||||
if (!confirmResult) return;
|
||||
|
||||
final succ = await API.deletePackage(pkg.id);
|
||||
if (succ) {
|
||||
context.pop();
|
||||
|
||||
Provider.of<PackagesProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<BuildsProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<StatsProvider>(context, listen: false)
|
||||
.refresh(context);
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"Delete",
|
||||
style: TextStyle(color: Colors.redAccent),
|
||||
body: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<BuildsProvider>(
|
||||
create: (_) => BuildsProvider()),
|
||||
ChangeNotifierProvider<PackageProvider>(
|
||||
create: (_) => PackageProvider()),
|
||||
],
|
||||
child: APIBuilder<PackageProvider, Package, PackageDTO>(
|
||||
dto: PackageDTO(pkgID: widget.pkgID),
|
||||
onLoad: () => const Text("loading"),
|
||||
onData: (pkg) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
margin: const EdgeInsets.only(left: 15),
|
||||
child: Text(
|
||||
pkg.name,
|
||||
style: const TextStyle(fontSize: 32),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 25,
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
decoration: const BoxDecoration(
|
||||
color: secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Builds of ${pkg.name}",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>,
|
||||
BuildsDTO>(
|
||||
key: const Key("Builds on Package info"),
|
||||
dto: BuildsDTO(pkgID: pkg.id),
|
||||
interval: const Duration(seconds: 5),
|
||||
onData: (data) {
|
||||
return BuildsTable(data: data);
|
||||
},
|
||||
onLoad: () => const Text("no data"),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(right: 15),
|
||||
child: ElevatedButton(
|
||||
onPressed: () async {
|
||||
final confirmResult =
|
||||
await showDeleteConfirmationDialog(context);
|
||||
if (!confirmResult) return;
|
||||
|
||||
final succ = await API.deletePackage(pkg.id);
|
||||
if (succ) {
|
||||
context.pop();
|
||||
|
||||
Provider.of<PackagesProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<BuildsProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<StatsProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"Delete",
|
||||
style: TextStyle(color: Colors.redAccent),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 25,
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
decoration: const BoxDecoration(
|
||||
color: secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Builds of ${pkg.name}",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>,
|
||||
BuildsDTO>(
|
||||
key: const Key("Builds on Package info"),
|
||||
dto: BuildsDTO(pkgID: pkg.id),
|
||||
interval: const Duration(seconds: 5),
|
||||
onData: (data) {
|
||||
return BuildsTable(data: data);
|
||||
},
|
||||
onLoad: () => const Text("no data"),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
56
frontend/lib/screens/packages_screen.dart
Normal file
56
frontend/lib/screens/packages_screen.dart
Normal file
@ -0,0 +1,56 @@
|
||||
import 'package:aurcache/components/packages_table.dart';
|
||||
import 'package:aurcache/providers/packages_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../components/api/APIBuilder.dart';
|
||||
import '../constants/color_constants.dart';
|
||||
import '../models/package.dart';
|
||||
|
||||
class PackagesScreen extends StatelessWidget {
|
||||
const PackagesScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<PackagesProvider>(
|
||||
create: (_) => PackagesProvider()),
|
||||
],
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(defaultPadding),
|
||||
decoration: const BoxDecoration(
|
||||
color: secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"All Packages",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<PackagesProvider, List<Package>, Object>(
|
||||
key: const Key("Builds on seperate screen"),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("no data"),
|
||||
onData: (data) {
|
||||
return PackagesTable(data: data);
|
||||
}),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user