mirror of
https://github.com/foss42/apidash.git
synced 2025-06-05 10:20:44 +08:00
wip: history request groups
This commit is contained in:
110
lib/widgets/card_sidebar_history.dart
Normal file
110
lib/widgets/card_sidebar_history.dart
Normal file
@ -0,0 +1,110 @@
|
||||
import 'package:apidash/models/history_meta_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart';
|
||||
import 'texts.dart' show MethodBox;
|
||||
|
||||
class SidebarHistoryCard extends StatelessWidget {
|
||||
const SidebarHistoryCard({
|
||||
super.key,
|
||||
required this.id,
|
||||
required this.models,
|
||||
required this.method,
|
||||
this.selectedId,
|
||||
this.requestGroupSize = 1,
|
||||
this.onTap,
|
||||
});
|
||||
|
||||
final String id;
|
||||
final List<HistoryMetaModel> models;
|
||||
final HTTPVerb method;
|
||||
final String? selectedId;
|
||||
final int requestGroupSize;
|
||||
final Function()? onTap;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final Color color = Theme.of(context).colorScheme.surface;
|
||||
final Color colorVariant =
|
||||
Theme.of(context).colorScheme.surfaceContainerHighest.withOpacity(0.5);
|
||||
final model = models.first;
|
||||
final Color surfaceTint = Theme.of(context).colorScheme.primary;
|
||||
bool isSelected = selectedId == getHistoryRequestKey(model);
|
||||
final String name = getHistoryRequestName(model);
|
||||
return Tooltip(
|
||||
message: name,
|
||||
triggerMode: TooltipTriggerMode.manual,
|
||||
waitDuration: const Duration(seconds: 1),
|
||||
child: Card(
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: kBorderRadius8,
|
||||
),
|
||||
elevation: isSelected ? 1 : 0,
|
||||
surfaceTintColor: isSelected ? surfaceTint : null,
|
||||
color: isSelected
|
||||
? Theme.of(context).colorScheme.brightness == Brightness.dark
|
||||
? colorVariant
|
||||
: color
|
||||
: color,
|
||||
margin: EdgeInsets.zero,
|
||||
child: InkWell(
|
||||
onTap: onTap,
|
||||
borderRadius: kBorderRadius8,
|
||||
hoverColor: colorVariant,
|
||||
focusColor: colorVariant.withOpacity(0.5),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 6,
|
||||
right: 6,
|
||||
top: 5,
|
||||
bottom: 5,
|
||||
),
|
||||
child: SizedBox(
|
||||
height: 20,
|
||||
child: Row(
|
||||
children: [
|
||||
MethodBox(method: method),
|
||||
kHSpacer4,
|
||||
Expanded(
|
||||
child: Text(
|
||||
name,
|
||||
softWrap: false,
|
||||
overflow: TextOverflow.fade,
|
||||
),
|
||||
),
|
||||
requestGroupSize > 1 ? kHSpacer4 : const SizedBox.shrink(),
|
||||
Visibility(
|
||||
visible: requestGroupSize > 1,
|
||||
child: Container(
|
||||
padding: kPh4,
|
||||
constraints: const BoxConstraints(minWidth: 24),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
borderRadius: kBorderRadius6,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
requestGroupSize == 2
|
||||
? requestGroupSize.toString()
|
||||
: "9+",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.labelSmall
|
||||
?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onPrimaryContainer,
|
||||
)),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
65
lib/widgets/splitview_history.dart
Normal file
65
lib/widgets/splitview_history.dart
Normal file
@ -0,0 +1,65 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:multi_split_view/multi_split_view.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class HistorySplitView extends StatefulWidget {
|
||||
const HistorySplitView({
|
||||
super.key,
|
||||
required this.sidebarWidget,
|
||||
required this.mainWidget,
|
||||
});
|
||||
|
||||
final Widget sidebarWidget;
|
||||
final Widget mainWidget;
|
||||
|
||||
@override
|
||||
HistorySplitViewState createState() => HistorySplitViewState();
|
||||
}
|
||||
|
||||
class HistorySplitViewState extends State<HistorySplitView> {
|
||||
final MultiSplitViewController _controller = MultiSplitViewController(
|
||||
areas: [
|
||||
Area(id: "sidebar", min: 200, size: 220, max: 300),
|
||||
Area(id: "main"),
|
||||
],
|
||||
);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MultiSplitViewTheme(
|
||||
data: MultiSplitViewThemeData(
|
||||
dividerThickness: 3,
|
||||
dividerPainter: DividerPainters.background(
|
||||
color: Theme.of(context).colorScheme.surfaceContainerHighest,
|
||||
highlightedColor: Theme.of(context).colorScheme.outline.withOpacity(
|
||||
kHintOpacity,
|
||||
),
|
||||
animationEnabled: false,
|
||||
),
|
||||
),
|
||||
child: MultiSplitView(
|
||||
controller: _controller,
|
||||
sizeOverflowPolicy: SizeOverflowPolicy.shrinkFirst,
|
||||
sizeUnderflowPolicy: SizeUnderflowPolicy.stretchLast,
|
||||
builder: (context, area) {
|
||||
return switch (area.id) {
|
||||
"sidebar" => widget.sidebarWidget,
|
||||
"main" => widget.mainWidget,
|
||||
_ => Container(),
|
||||
};
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ export 'button_save_download.dart';
|
||||
export 'button_send.dart';
|
||||
export 'card_request_details.dart';
|
||||
export 'card_sidebar_environment.dart';
|
||||
export 'card_sidebar_history.dart';
|
||||
export 'card_sidebar_request.dart';
|
||||
export 'checkbox.dart';
|
||||
export 'code_previewer.dart';
|
||||
@ -42,6 +43,7 @@ export 'snackbars.dart';
|
||||
export 'splitview_drawer.dart';
|
||||
export 'splitview_dashboard.dart';
|
||||
export 'splitview_equal.dart';
|
||||
export 'splitview_history.dart';
|
||||
export 'suggestions_menu.dart';
|
||||
export 'tables.dart';
|
||||
export 'tabs.dart';
|
||||
|
Reference in New Issue
Block a user