fix: grid width update (#4101)

* chore: enable checklist on mobile

* fix: width of grid not updating properly

* chore: fix sign-in button color and font
This commit is contained in:
Richard Shiue
2023-12-06 11:39:25 +08:00
committed by GitHub
parent 7ad05feb5b
commit 96af012471
9 changed files with 120 additions and 133 deletions

View File

@ -16,7 +16,7 @@ const _supportedFieldTypes = [
FieldType.MultiSelect, FieldType.MultiSelect,
FieldType.DateTime, FieldType.DateTime,
FieldType.Checkbox, FieldType.Checkbox,
// FieldType.Checklist, FieldType.Checklist,
]; ];
class FieldOptions extends StatelessWidget { class FieldOptions extends StatelessWidget {

View File

@ -57,7 +57,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
didReceiveFieldUpdate: (fields) { didReceiveFieldUpdate: (fields) {
emit( emit(
state.copyWith( state.copyWith(
fields: FieldList(fields), fields: fields,
), ),
); );
}, },
@ -176,7 +176,7 @@ class GridState with _$GridState {
const factory GridState({ const factory GridState({
required String viewId, required String viewId,
required Option<DatabasePB> grid, required Option<DatabasePB> grid,
required FieldList fields, required List<FieldInfo> fields,
required List<RowInfo> rowInfos, required List<RowInfo> rowInfos,
required int rowCount, required int rowCount,
required RowMetaPB? createdRow, required RowMetaPB? createdRow,
@ -188,7 +188,7 @@ class GridState with _$GridState {
}) = _GridState; }) = _GridState;
factory GridState.initial(String viewId) => GridState( factory GridState.initial(String viewId) => GridState(
fields: FieldList([]), fields: [],
rowInfos: [], rowInfos: [],
rowCount: 0, rowCount: 0,
createdRow: null, createdRow: null,
@ -201,8 +201,3 @@ class GridState with _$GridState {
sorts: [], sorts: [],
); );
} }
@freezed
class FieldList with _$FieldList {
factory FieldList(List<FieldInfo> fields) = _FieldList;
}

View File

@ -169,25 +169,17 @@ class _GridPageContentState extends State<GridPageContent> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GridBloc, GridState>(
buildWhen: (previous, current) => previous.fields != current.fields,
builder: (context, state) {
final contentWidth = GridLayout.headerWidth(state.fields.fields);
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_GridHeader(headerScrollController: headerScrollController), _GridHeader(headerScrollController: headerScrollController),
_GridRows( _GridRows(
viewId: state.viewId, viewId: widget.view.id,
contentWidth: contentWidth,
scrollController: _scrollController, scrollController: _scrollController,
), ),
const _GridFooter(), const _GridFooter(),
], ],
); );
},
);
} }
} }
@ -210,21 +202,22 @@ class _GridHeader extends StatelessWidget {
class _GridRows extends StatelessWidget { class _GridRows extends StatelessWidget {
final String viewId; final String viewId;
final double contentWidth;
final GridScrollController scrollController; final GridScrollController scrollController;
const _GridRows({ const _GridRows({
required this.viewId, required this.viewId,
required this.contentWidth,
required this.scrollController, required this.scrollController,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GridBloc, GridState>(
buildWhen: (previous, current) => previous.fields != current.fields,
builder: (context, state) {
return Flexible( return Flexible(
child: _WrapScrollView( child: _WrapScrollView(
scrollController: scrollController, scrollController: scrollController,
contentWidth: contentWidth, contentWidth: GridLayout.headerWidth(state.fields),
child: BlocBuilder<GridBloc, GridState>( child: BlocBuilder<GridBloc, GridState>(
buildWhen: (previous, current) => current.reason.maybeWhen( buildWhen: (previous, current) => current.reason.maybeWhen(
reorderRows: () => true, reorderRows: () => true,
@ -246,6 +239,8 @@ class _GridRows extends StatelessWidget {
), ),
), ),
); );
},
);
} }
Widget _renderList( Widget _renderList(

View File

@ -1,4 +1,5 @@
import 'package:appflowy/plugins/database_view/application/field/field_info.dart'; import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pbenum.dart';
import 'sizes.dart'; import 'sizes.dart';
class GridLayout { class GridLayout {
@ -6,6 +7,11 @@ class GridLayout {
if (fields.isEmpty) return 0; if (fields.isEmpty) return 0;
final fieldsWidth = fields final fieldsWidth = fields
.where(
(element) =>
element.visibility != null &&
element.visibility != FieldVisibility.AlwaysHidden,
)
.map((fieldInfo) => fieldInfo.fieldSettings!.width.toDouble()) .map((fieldInfo) => fieldInfo.fieldSettings!.width.toDouble())
.reduce((value, element) => value + element); .reduce((value, element) => value + element);

View File

@ -148,7 +148,7 @@ class _GridPageContentState extends State<GridPageContent> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocConsumer<GridBloc, GridState>( return BlocListener<GridBloc, GridState>(
listenWhen: (previous, current) => listenWhen: (previous, current) =>
previous.createdRow != current.createdRow, previous.createdRow != current.createdRow,
listener: (context, state) { listener: (context, state) {
@ -165,25 +165,19 @@ class _GridPageContentState extends State<GridPageContent> {
); );
bloc.add(const GridEvent.resetCreatedRow()); bloc.add(const GridEvent.resetCreatedRow());
}, },
buildWhen: (previous, current) => previous.fields != current.fields, child: Stack(
builder: (context, state) {
final contentWidth = GridLayout.headerWidth(state.fields.fields);
return Stack(
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: padding: EdgeInsets.only(right: GridSize.leadingHeaderPadding),
EdgeInsets.only(right: GridSize.leadingHeaderPadding),
child: _GridHeader( child: _GridHeader(
headerScrollController: headerScrollController, headerScrollController: headerScrollController,
), ),
), ),
_GridRows( _GridRows(
viewId: state.viewId, viewId: widget.view.id,
contentWidth: contentWidth,
scrollController: _scrollController, scrollController: _scrollController,
), ),
], ],
@ -194,8 +188,7 @@ class _GridPageContentState extends State<GridPageContent> {
child: getGridFabs(context), child: getGridFabs(context),
), ),
], ],
); ),
},
); );
} }
} }
@ -219,17 +212,19 @@ class _GridHeader extends StatelessWidget {
class _GridRows extends StatelessWidget { class _GridRows extends StatelessWidget {
final String viewId; final String viewId;
final double contentWidth;
final GridScrollController scrollController; final GridScrollController scrollController;
const _GridRows({ const _GridRows({
required this.viewId, required this.viewId,
required this.contentWidth,
required this.scrollController, required this.scrollController,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GridBloc, GridState>(
buildWhen: (previous, current) => previous.fields != current.fields,
builder: (context, state) {
final contentWidth = GridLayout.headerWidth(state.fields);
return Expanded( return Expanded(
child: _WrapScrollView( child: _WrapScrollView(
scrollController: scrollController, scrollController: scrollController,
@ -250,16 +245,19 @@ class _GridRows extends StatelessWidget {
); );
return ScrollConfiguration( return ScrollConfiguration(
behavior: behavior, behavior: behavior,
child: _renderList(context, state, rowInfos), child: _renderList(context, contentWidth, state, rowInfos),
); );
}, },
), ),
), ),
); );
},
);
} }
Widget _renderList( Widget _renderList(
BuildContext context, BuildContext context,
double contentWidth,
GridState state, GridState state,
List<RowInfo> rowInfos, List<RowInfo> rowInfos,
) { ) {

View File

@ -46,19 +46,13 @@ class _GridHeaderSliverAdaptorState extends State<GridHeaderSliverAdaptor> {
fieldController: fieldController, fieldController: fieldController,
)..add(const GridHeaderEvent.initial()); )..add(const GridHeaderEvent.initial());
}, },
child: BlocBuilder<GridHeaderBloc, GridHeaderState>( child: SingleChildScrollView(
buildWhen: (previous, current) =>
previous.fields.length != current.fields.length,
builder: (context, state) {
return SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
controller: widget.anchorScrollController, controller: widget.anchorScrollController,
child: _GridHeader( child: _GridHeader(
viewId: widget.viewId, viewId: widget.viewId,
fieldController: fieldController, fieldController: fieldController,
), ),
);
},
), ),
); );
} }

View File

@ -47,12 +47,7 @@ class _MobileChecklistCellEditScreenState
child: _buildHeader(context), child: _buildHeader(context),
), ),
const Divider(), const Divider(),
const Expanded( const Expanded(child: _TaskList()),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 0.0),
child: _TaskList(),
),
),
], ],
); );
}, },
@ -169,7 +164,7 @@ class _ChecklistItemState extends State<_ChecklistItem> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
padding: const EdgeInsets.only(left: 5, right: 16), padding: const EdgeInsets.symmetric(horizontal: 5),
height: 44, height: 44,
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,

View File

@ -55,7 +55,11 @@ class SignInAnonymousButton extends StatelessWidget {
minimumSize: const Size(double.infinity, 56), minimumSize: const Size(double.infinity, 56),
), ),
onPressed: onTap, onPressed: onTap,
child: Text(LocaleKeys.signIn_loginStartWithAnonymous.tr()), child: FlowyText(
LocaleKeys.signIn_loginStartWithAnonymous.tr(),
fontSize: 14,
color: Theme.of(context).colorScheme.onPrimary,
),
); );
} }
// SignInAnonymousButton in desktop // SignInAnonymousButton in desktop

View File

@ -62,7 +62,7 @@ class MobileAppearance extends BaseAppearance {
: ColorScheme( : ColorScheme(
brightness: brightness, brightness: brightness,
primary: _primaryColor, primary: _primaryColor,
onPrimary: Colors.white, onPrimary: Colors.black,
// TODO(yijing): add color later // TODO(yijing): add color later
secondary: const Color(0xff2d2d2d), //temp secondary: const Color(0xff2d2d2d), //temp
onSecondary: Colors.white, onSecondary: Colors.white,
@ -125,7 +125,7 @@ class MobileAppearance extends BaseAppearance {
backgroundColor: MaterialStateProperty.resolveWith<Color>( backgroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) { (Set<MaterialState> states) {
if (states.contains(MaterialState.disabled)) { if (states.contains(MaterialState.disabled)) {
return const Color(0xFF57B5F8); return _primaryColor;
} }
return colorTheme.primary; return colorTheme.primary;
}, },
@ -176,7 +176,7 @@ class MobileAppearance extends BaseAppearance {
fontFamily: fontStyle.fontFamily, fontFamily: fontStyle.fontFamily,
textTheme: TextTheme( textTheme: TextTheme(
displayLarge: const TextStyle( displayLarge: const TextStyle(
color: Color(0xFF57B5F8), color: _primaryColor,
fontSize: 32, fontSize: 32,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 1.20, height: 1.20,