mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
fix: settings ui improvements (#5590)
* fix: settings ui improvements * fix: replace placeholder + fix open folder * fix: collapse sidebar button on windows * test: fix tests after changes * test: missed type cast
This commit is contained in:
parent
d8b32168a9
commit
7586a0ed48
@ -1,5 +1,5 @@
|
|||||||
import 'package:appflowy/workspace/application/settings/settings_dialog_bloc.dart';
|
import 'package:appflowy/workspace/application/settings/settings_dialog_bloc.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:integration_test/integration_test.dart';
|
import 'package:integration_test/integration_test.dart';
|
||||||
|
|
||||||
@ -17,25 +17,25 @@ void main() {
|
|||||||
await tester.openSettingsPage(SettingsPage.notifications);
|
await tester.openSettingsPage(SettingsPage.notifications);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
final switchFinder = find.byType(Switch).first;
|
final toggleFinder = find.byType(Toggle).first;
|
||||||
|
|
||||||
// Defaults to enabled
|
// Defaults to enabled
|
||||||
Switch switchWidget = tester.widget(switchFinder);
|
Toggle toggleWidget = tester.widget(toggleFinder);
|
||||||
expect(switchWidget.value, true);
|
expect(toggleWidget.value, true);
|
||||||
|
|
||||||
// Disable
|
// Disable
|
||||||
await tester.tap(switchFinder);
|
await tester.tap(toggleFinder);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
switchWidget = tester.widget(switchFinder);
|
toggleWidget = tester.widget(toggleFinder);
|
||||||
expect(switchWidget.value, false);
|
expect(toggleWidget.value, false);
|
||||||
|
|
||||||
// Enable again
|
// Enable again
|
||||||
await tester.tap(switchFinder);
|
await tester.tap(toggleFinder);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
switchWidget = tester.widget(switchFinder);
|
toggleWidget = tester.widget(toggleFinder);
|
||||||
expect(switchWidget.value, true);
|
expect(toggleWidget.value, true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/shared/window_title_bar.dart';
|
import 'package:appflowy/shared/window_title_bar.dart';
|
||||||
import 'package:appflowy/util/theme_extension.dart';
|
import 'package:appflowy/util/theme_extension.dart';
|
||||||
import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
|
import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
|
import 'package:flowy_infra_ui/style_widget/hover.dart';
|
||||||
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
class CocoaWindowChannel {
|
class CocoaWindowChannel {
|
||||||
@ -122,15 +123,21 @@ class MoveWindowDetectorState extends State<MoveWindowDetector> {
|
|||||||
|
|
||||||
return FlowyTooltip(
|
return FlowyTooltip(
|
||||||
richMessage: textSpan,
|
richMessage: textSpan,
|
||||||
child: FlowyIconButton(
|
child: Listener(
|
||||||
hoverColor: Colors.transparent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onPressed: () => context
|
onPointerDown: (_) => context
|
||||||
.read<HomeSettingBloc>()
|
.read<HomeSettingBloc>()
|
||||||
.add(const HomeSettingEvent.collapseMenu()),
|
.add(const HomeSettingEvent.collapseMenu()),
|
||||||
iconPadding: const EdgeInsets.all(4.0),
|
child: FlowyHover(
|
||||||
icon: context.read<HomeSettingBloc>().state.isMenuCollapsed
|
child: Container(
|
||||||
? const FlowySvg(FlowySvgs.show_menu_s)
|
width: 24,
|
||||||
: const FlowySvg(FlowySvgs.hide_menu_m),
|
padding: const EdgeInsets.all(4),
|
||||||
|
child: const RotatedBox(
|
||||||
|
quarterTurns: 2,
|
||||||
|
child: FlowySvg(FlowySvgs.hide_menu_s),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/database/application/database_controller.dart';
|
import 'package:appflowy/plugins/database/application/database_controller.dart';
|
||||||
@ -5,12 +7,10 @@ import 'package:appflowy/plugins/database/application/setting/property_bloc.dart
|
|||||||
import 'package:appflowy/plugins/database/calendar/application/calendar_setting_bloc.dart';
|
import 'package:appflowy/plugins/database/calendar/application/calendar_setting_bloc.dart';
|
||||||
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
||||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
/// Widget that displays a list of settings that alters the appearance of the
|
/// Widget that displays a list of settings that alters the appearance of the
|
||||||
@ -325,7 +325,6 @@ Widget _toggleItem({
|
|||||||
Toggle(
|
Toggle(
|
||||||
value: value,
|
value: value,
|
||||||
onChanged: (value) => onToggle(!value),
|
onChanged: (value) => onToggle(!value),
|
||||||
style: ToggleStyle.big,
|
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/database/application/field/field_controller.dart';
|
import 'package:appflowy/plugins/database/application/field/field_controller.dart';
|
||||||
@ -11,12 +13,10 @@ import 'package:appflowy/plugins/database/grid/presentation/widgets/common/type_
|
|||||||
import 'package:appflowy/util/field_type_extension.dart';
|
import 'package:appflowy/util/field_type_extension.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
||||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
import 'field_type_list.dart';
|
import 'field_type_list.dart';
|
||||||
@ -258,7 +258,6 @@ enum FieldAction {
|
|||||||
onChanged: (_) => context
|
onChanged: (_) => context
|
||||||
.read<FieldEditorBloc>()
|
.read<FieldEditorBloc>()
|
||||||
.add(const FieldEditorEvent.toggleWrapCellContent()),
|
.add(const FieldEditorEvent.toggleWrapCellContent()),
|
||||||
style: ToggleStyle.big,
|
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class DateFormatButton extends StatelessWidget {
|
class DateFormatButton extends StatelessWidget {
|
||||||
const DateFormatButton({
|
const DateFormatButton({
|
||||||
@ -248,7 +248,6 @@ class IncludeTimeButton extends StatelessWidget {
|
|||||||
Toggle(
|
Toggle(
|
||||||
value: value,
|
value: value,
|
||||||
onChanged: onChanged,
|
onChanged: onChanged,
|
||||||
style: ToggleStyle.big,
|
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -9,7 +9,6 @@ import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
|||||||
import 'package:appflowy/plugins/database/grid/presentation/widgets/common/type_option_separator.dart';
|
import 'package:appflowy/plugins/database/grid/presentation/widgets/common/type_option_separator.dart';
|
||||||
import 'package:appflowy/util/field_type_extension.dart';
|
import 'package:appflowy/util/field_type_extension.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
@ -74,7 +73,6 @@ class DatabaseGroupList extends StatelessWidget {
|
|||||||
value: !state.layoutSettings.hideUngroupedColumn,
|
value: !state.layoutSettings.hideUngroupedColumn,
|
||||||
onChanged: (value) =>
|
onChanged: (value) =>
|
||||||
_updateLayoutSettings(state.layoutSettings, value),
|
_updateLayoutSettings(state.layoutSettings, value),
|
||||||
style: ToggleStyle.big,
|
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -22,7 +22,6 @@ import 'package:appflowy/workspace/presentation/settings/widgets/files/settings_
|
|||||||
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
||||||
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
||||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||||
import 'package:dotted_border/dotted_border.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra/file_picker/file_picker_service.dart';
|
import 'package:flowy_infra/file_picker/file_picker_service.dart';
|
||||||
import 'package:flowy_infra/theme_extension.dart';
|
import 'package:flowy_infra/theme_extension.dart';
|
||||||
@ -288,65 +287,22 @@ class _ImportDataFieldState extends State<_ImportDataField> {
|
|||||||
(_) => _showToast(LocaleKeys.settings_menu_importFailed.tr()),
|
(_) => _showToast(LocaleKeys.settings_menu_importFailed.tr()),
|
||||||
),
|
),
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return DottedBorder(
|
return SingleSettingAction(
|
||||||
radius: const Radius.circular(8),
|
label:
|
||||||
dashPattern: const [2, 2],
|
LocaleKeys.settings_manageDataPage_importData_description.tr(),
|
||||||
borderType: BorderType.RRect,
|
labelMaxLines: 2,
|
||||||
color: Theme.of(context).colorScheme.primary,
|
buttonLabel:
|
||||||
child: Padding(
|
LocaleKeys.settings_manageDataPage_importData_action.tr(),
|
||||||
padding: const EdgeInsets.all(16),
|
onPressed: () async {
|
||||||
child: Column(
|
final path = await getIt<FilePickerService>().getDirectoryPath();
|
||||||
children: [
|
if (path == null || !context.mounted) {
|
||||||
// When dragging files are enabled
|
return;
|
||||||
// FlowyText.regular('Drag file here or'),
|
}
|
||||||
// const VSpace(8),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
SizedBox(
|
|
||||||
height: 42,
|
|
||||||
child: FlowyTextButton(
|
|
||||||
LocaleKeys.settings_manageDataPage_importData_action
|
|
||||||
.tr(),
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 24,
|
|
||||||
vertical: 12,
|
|
||||||
),
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
radius: BorderRadius.circular(12),
|
|
||||||
fillColor: Theme.of(context).colorScheme.primary,
|
|
||||||
hoverColor: const Color(0xFF005483),
|
|
||||||
fontHoverColor: Colors.white,
|
|
||||||
onPressed: () async {
|
|
||||||
final path = await getIt<FilePickerService>()
|
|
||||||
.getDirectoryPath();
|
|
||||||
if (path == null || !context.mounted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
context.read<SettingFileImportBloc>().add(
|
context
|
||||||
SettingFileImportEvent
|
.read<SettingFileImportBloc>()
|
||||||
.importAppFlowyDataFolder(
|
.add(SettingFileImportEvent.importAppFlowyDataFolder(path));
|
||||||
path,
|
},
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const VSpace(8),
|
|
||||||
FlowyText.regular(
|
|
||||||
LocaleKeys.settings_manageDataPage_importData_description
|
|
||||||
.tr(),
|
|
||||||
// 'Supported filetypes:\nCSV, Notion, Text, and Markdown',
|
|
||||||
maxLines: 3,
|
|
||||||
lineHeight: 1.5,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -496,7 +452,7 @@ class _DataPathActions extends StatelessWidget {
|
|||||||
label:
|
label:
|
||||||
LocaleKeys.settings_manageDataPage_dataStorage_actions_open.tr(),
|
LocaleKeys.settings_manageDataPage_dataStorage_actions_open.tr(),
|
||||||
icon: const FlowySvg(FlowySvgs.folder_m, size: Size.square(20)),
|
icon: const FlowySvg(FlowySvgs.folder_m, size: Size.square(20)),
|
||||||
onPressed: () => afLaunchUrlString('file://$currentPath'),
|
onPressed: () => afLaunchUrl(Uri.file(currentPath)),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
|
import 'package:appflowy/util/theme_extension.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart';
|
import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/plan/workspace_subscription_ext.dart';
|
import 'package:appflowy/workspace/application/settings/plan/workspace_subscription_ext.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/shared/settings_alert_dialog.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/settings_alert_dialog.dart';
|
||||||
@ -44,6 +45,8 @@ class _SettingsPlanComparisonDialogState
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final isLM = Theme.of(context).isLightMode;
|
||||||
|
|
||||||
return BlocListener<SettingsPlanBloc, SettingsPlanState>(
|
return BlocListener<SettingsPlanBloc, SettingsPlanState>(
|
||||||
listener: (context, state) {
|
listener: (context, state) {
|
||||||
final readyState = state.mapOrNull(ready: (state) => state);
|
final readyState = state.mapOrNull(ready: (state) => state);
|
||||||
@ -64,15 +67,11 @@ class _SettingsPlanComparisonDialogState
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
title:
|
title: LocaleKeys.settings_comparePlanDialog_paymentSuccess_title
|
||||||
LocaleKeys.settings_comparePlanDialog_paymentSuccess_title.tr(
|
.tr(args: [readyState.subscription.label]),
|
||||||
args: [readyState.subscription.label],
|
|
||||||
),
|
|
||||||
subtitle: LocaleKeys
|
subtitle: LocaleKeys
|
||||||
.settings_comparePlanDialog_paymentSuccess_description
|
.settings_comparePlanDialog_paymentSuccess_description
|
||||||
.tr(
|
.tr(args: [readyState.subscription.label]),
|
||||||
args: [readyState.subscription.label],
|
|
||||||
),
|
|
||||||
hideCancelButton: true,
|
hideCancelButton: true,
|
||||||
confirm: Navigator.of(context).pop,
|
confirm: Navigator.of(context).pop,
|
||||||
confirmLabel: LocaleKeys.button_close.tr(),
|
confirmLabel: LocaleKeys.button_close.tr(),
|
||||||
@ -96,6 +95,7 @@ class _SettingsPlanComparisonDialogState
|
|||||||
FlowyText.semibold(
|
FlowyText.semibold(
|
||||||
LocaleKeys.settings_comparePlanDialog_title.tr(),
|
LocaleKeys.settings_comparePlanDialog_title.tr(),
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
|
color: AFThemeExtension.of(context).strongText,
|
||||||
),
|
),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
@ -108,13 +108,14 @@ class _SettingsPlanComparisonDialogState
|
|||||||
child: FlowySvg(
|
child: FlowySvg(
|
||||||
FlowySvgs.m_close_m,
|
FlowySvgs.m_close_m,
|
||||||
size: const Size.square(20),
|
size: const Size.square(20),
|
||||||
color: Theme.of(context).colorScheme.outline,
|
color: AFThemeExtension.of(context).strongText,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
const VSpace(16),
|
||||||
Flexible(
|
Flexible(
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
controller: horizontalController,
|
controller: horizontalController,
|
||||||
@ -140,7 +141,7 @@ class _SettingsPlanComparisonDialogState
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
const VSpace(26),
|
const VSpace(30),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 100,
|
height: 100,
|
||||||
child: FlowyText.semibold(
|
child: FlowyText.semibold(
|
||||||
@ -149,7 +150,9 @@ class _SettingsPlanComparisonDialogState
|
|||||||
.tr(),
|
.tr(),
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
maxLines: 2,
|
maxLines: 2,
|
||||||
color: const Color(0xFF5C3699),
|
color: isLM
|
||||||
|
? const Color(0xFF5C3699)
|
||||||
|
: const Color(0xFFE8E0FF),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 64),
|
const SizedBox(height: 64),
|
||||||
@ -281,17 +284,18 @@ class _PlanTable extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final highlightPlan = !isCurrent && !canDowngrade && canUpgrade;
|
final highlightPlan = !isCurrent && !canDowngrade && canUpgrade;
|
||||||
|
final isLM = Theme.of(context).isLightMode;
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
width: 210,
|
width: 215,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(24),
|
borderRadius: BorderRadius.circular(24),
|
||||||
gradient: !highlightPlan
|
gradient: !highlightPlan
|
||||||
? null
|
? null
|
||||||
: const LinearGradient(
|
: LinearGradient(
|
||||||
colors: [
|
colors: [
|
||||||
Color(0xFF251D37),
|
isLM ? const Color(0xFF251D37) : const Color(0xFF7459AD),
|
||||||
Color(0xFF7547C0),
|
isLM ? const Color(0xFF7547C0) : const Color(0xFFDDC8FF),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -311,6 +315,7 @@ class _PlanTable extends StatelessWidget {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if (isCurrent) const _CurrentBadge(),
|
if (isCurrent) const _CurrentBadge(),
|
||||||
|
const VSpace(4),
|
||||||
_Heading(
|
_Heading(
|
||||||
title: title,
|
title: title,
|
||||||
description: description,
|
description: description,
|
||||||
@ -376,14 +381,16 @@ class _CurrentBadge extends StatelessWidget {
|
|||||||
height: 22,
|
height: 22,
|
||||||
width: 72,
|
width: 72,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: const Color(0xFF4F3F5F),
|
color: Theme.of(context).isLightMode
|
||||||
|
? const Color(0xFF4F3F5F)
|
||||||
|
: const Color(0xFFE8E0FF),
|
||||||
borderRadius: BorderRadius.circular(4),
|
borderRadius: BorderRadius.circular(4),
|
||||||
),
|
),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: FlowyText.medium(
|
child: FlowyText.medium(
|
||||||
LocaleKeys.settings_comparePlanDialog_current.tr(),
|
LocaleKeys.settings_comparePlanDialog_current.tr(),
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: Colors.white,
|
color: Theme.of(context).isLightMode ? Colors.white : Colors.black,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -417,22 +424,28 @@ class _ComparisonCell extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
children: [
|
||||||
if (icon != null) ...[
|
if (icon != null) ...[
|
||||||
FlowySvg(icon!),
|
FlowySvg(
|
||||||
|
icon!,
|
||||||
|
color: AFThemeExtension.of(context).strongText,
|
||||||
|
),
|
||||||
] else ...[
|
] else ...[
|
||||||
Expanded(
|
Expanded(
|
||||||
child: FlowyText.medium(
|
child: FlowyText.medium(
|
||||||
label,
|
label,
|
||||||
lineHeight: 1.2,
|
lineHeight: 1.2,
|
||||||
|
color: AFThemeExtension.of(context).strongText,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
if (tooltip != null)
|
if (tooltip != null)
|
||||||
FlowyTooltip(
|
FlowyTooltip(
|
||||||
message: tooltip,
|
message: tooltip,
|
||||||
child: const FlowySvg(FlowySvgs.information_s),
|
child: FlowySvg(
|
||||||
|
FlowySvgs.information_s,
|
||||||
|
color: AFThemeExtension.of(context).strongText,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -457,9 +470,8 @@ class _ActionButton extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final isLM = Theme.of(context).brightness == Brightness.light;
|
final isLM = Theme.of(context).isLightMode;
|
||||||
|
|
||||||
final gradientBorder = useGradientBorder && isLM;
|
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
height: 56,
|
height: 56,
|
||||||
child: Row(
|
child: Row(
|
||||||
@ -475,25 +487,17 @@ class _ActionButton extends StatelessWidget {
|
|||||||
child: _drawGradientBorder(
|
child: _drawGradientBorder(
|
||||||
isLM: isLM,
|
isLM: isLM,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: gradientBorder ? 36 : 40,
|
height: 36,
|
||||||
width: gradientBorder ? 148 : 152,
|
width: 148,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: useGradientBorder
|
color: useGradientBorder
|
||||||
? Theme.of(context).cardColor
|
? Theme.of(context).cardColor
|
||||||
: Colors.transparent,
|
: Colors.transparent,
|
||||||
border: Border.all(
|
border: Border.all(color: Colors.transparent),
|
||||||
color: gradientBorder
|
borderRadius: BorderRadius.circular(14),
|
||||||
? Colors.transparent
|
|
||||||
: AFThemeExtension.of(context).textColor,
|
|
||||||
),
|
|
||||||
borderRadius:
|
|
||||||
BorderRadius.circular(gradientBorder ? 14 : 16),
|
|
||||||
),
|
),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: _drawText(
|
child: _drawText(label, isLM),
|
||||||
label,
|
|
||||||
isLM,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -511,6 +515,7 @@ class _ActionButton extends StatelessWidget {
|
|||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
lineHeight: 1.2,
|
lineHeight: 1.2,
|
||||||
fontWeight: useGradientBorder ? FontWeight.w600 : FontWeight.w500,
|
fontWeight: useGradientBorder ? FontWeight.w600 : FontWeight.w500,
|
||||||
|
color: const Color(0xFFC49BEC),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!useGradientBorder || !isLM) {
|
if (!useGradientBorder || !isLM) {
|
||||||
@ -532,19 +537,15 @@ class _ActionButton extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _drawGradientBorder({required bool isLM, required Widget child}) {
|
Widget _drawGradientBorder({required bool isLM, required Widget child}) {
|
||||||
if (!useGradientBorder || !isLM) {
|
|
||||||
return child;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
padding: const EdgeInsets.all(2),
|
padding: const EdgeInsets.all(2),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
gradient: const LinearGradient(
|
gradient: LinearGradient(
|
||||||
transform: GradientRotation(-1.2),
|
transform: const GradientRotation(-1.2),
|
||||||
stops: [0.4, 1],
|
stops: const [0.4, 1],
|
||||||
colors: [
|
colors: [
|
||||||
Color(0xFF251D37),
|
isLM ? const Color(0xFF251D37) : const Color(0xFF7459AD),
|
||||||
Color(0xFF7547C0),
|
isLM ? const Color(0xFF7547C0) : const Color(0xFFDDC8FF),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
@ -582,7 +583,9 @@ class _Heading extends StatelessWidget {
|
|||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
color: isPrimary
|
color: isPrimary
|
||||||
? AFThemeExtension.of(context).strongText
|
? AFThemeExtension.of(context).strongText
|
||||||
: const Color(0xFF5C3699),
|
: Theme.of(context).isLightMode
|
||||||
|
? const Color(0xFF5C3699)
|
||||||
|
: const Color(0xFFC49BEC),
|
||||||
),
|
),
|
||||||
if (description != null && description!.isNotEmpty) ...[
|
if (description != null && description!.isNotEmpty) ...[
|
||||||
const VSpace(4),
|
const VSpace(4),
|
||||||
|
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/util/int64_extension.dart';
|
import 'package:appflowy/util/int64_extension.dart';
|
||||||
|
import 'package:appflowy/util/theme_extension.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
|
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/date_time/date_format_ext.dart';
|
import 'package:appflowy/workspace/application/settings/date_time/date_format_ext.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart';
|
import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart';
|
||||||
@ -12,7 +13,6 @@ import 'package:appflowy/workspace/presentation/settings/pages/settings_plan_com
|
|||||||
import 'package:appflowy/workspace/presentation/settings/shared/flowy_gradient_button.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/flowy_gradient_button.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
|
import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
|
||||||
import 'package:appflowy_backend/protobuf/flowy-user/workspace.pb.dart';
|
import 'package:appflowy_backend/protobuf/flowy-user/workspace.pb.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
@ -62,19 +62,17 @@ class SettingsPlanView extends StatelessWidget {
|
|||||||
|
|
||||||
return ErrorWidget.withDetails(message: 'Something went wrong!');
|
return ErrorWidget.withDetails(message: 'Something went wrong!');
|
||||||
},
|
},
|
||||||
ready: (state) {
|
ready: (state) => SettingsBody(
|
||||||
return SettingsBody(
|
autoSeparate: false,
|
||||||
autoSeparate: false,
|
title: LocaleKeys.settings_planPage_title.tr(),
|
||||||
title: LocaleKeys.settings_planPage_title.tr(),
|
children: [
|
||||||
children: [
|
_PlanUsageSummary(
|
||||||
_PlanUsageSummary(
|
usage: state.workspaceUsage,
|
||||||
usage: state.workspaceUsage,
|
subscription: state.subscription,
|
||||||
subscription: state.subscription,
|
),
|
||||||
),
|
_CurrentPlanBox(subscription: state.subscription),
|
||||||
_CurrentPlanBox(subscription: state.subscription),
|
],
|
||||||
],
|
),
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -266,13 +264,16 @@ class _ProConItem extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Row(
|
return Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 24,
|
width: 18,
|
||||||
width: 24,
|
|
||||||
child: FlowySvg(
|
child: FlowySvg(
|
||||||
isPro ? FlowySvgs.check_m : FlowySvgs.close_s,
|
isPro ? FlowySvgs.check_m : FlowySvgs.close_error_s,
|
||||||
color: isPro ? null : const Color(0xFF900000),
|
size: const Size.square(18),
|
||||||
|
color: isPro
|
||||||
|
? AFThemeExtension.of(context).strongText
|
||||||
|
: const Color(0xFF900000),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const HSpace(4),
|
const HSpace(4),
|
||||||
@ -415,7 +416,7 @@ class _ToggleMoreState extends State<_ToggleMore> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final isLM = Brightness.light == Theme.of(context).brightness;
|
final isLM = Theme.of(context).isLightMode;
|
||||||
final primaryColor =
|
final primaryColor =
|
||||||
isLM ? const Color(0xFF653E8C) : const Color(0xFFE8E2EE);
|
isLM ? const Color(0xFF653E8C) : const Color(0xFFE8E2EE);
|
||||||
final secondaryColor =
|
final secondaryColor =
|
||||||
@ -426,7 +427,6 @@ class _ToggleMoreState extends State<_ToggleMore> {
|
|||||||
Toggle(
|
Toggle(
|
||||||
value: toggleValue,
|
value: toggleValue,
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
style: ToggleStyle.big,
|
|
||||||
onChanged: (_) {
|
onChanged: (_) {
|
||||||
setState(() => toggleValue = !toggleValue);
|
setState(() => toggleValue = !toggleValue);
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@ import 'package:appflowy/workspace/presentation/settings/shared/settings_radio_s
|
|||||||
import 'package:appflowy/workspace/presentation/settings/shared/single_setting_action.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/single_setting_action.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/widgets/theme_upload/theme_upload_view.dart';
|
import 'package:appflowy/workspace/presentation/settings/widgets/theme_upload/theme_upload_view.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
||||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
@ -417,7 +416,6 @@ class EnableRTLItemsSwitcher extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const HSpace(16),
|
const HSpace(16),
|
||||||
Toggle(
|
Toggle(
|
||||||
style: ToggleStyle.big,
|
|
||||||
value: context
|
value: context
|
||||||
.watch<AppearanceSettingsCubit>()
|
.watch<AppearanceSettingsCubit>()
|
||||||
.state
|
.state
|
||||||
@ -564,7 +562,6 @@ class _TimeFormatSwitcher extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const HSpace(16),
|
const HSpace(16),
|
||||||
Toggle(
|
Toggle(
|
||||||
style: ToggleStyle.big,
|
|
||||||
value: context.watch<AppearanceSettingsCubit>().state.timeFormat ==
|
value: context.watch<AppearanceSettingsCubit>().state.timeFormat ==
|
||||||
UserTimeFormatPB.TwentyFourHour,
|
UserTimeFormatPB.TwentyFourHour,
|
||||||
onChanged: (value) =>
|
onChanged: (value) =>
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/sign_in_or_logout_button.dart';
|
import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/sign_in_or_logout_button.dart';
|
||||||
import 'package:appflowy_editor/appflowy_editor.dart' show PlatformExtension;
|
import 'package:appflowy_editor/appflowy_editor.dart' show PlatformExtension;
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class RestartButton extends StatelessWidget {
|
class RestartButton extends StatelessWidget {
|
||||||
const RestartButton({
|
const RestartButton({
|
||||||
@ -17,7 +18,7 @@ class RestartButton extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final List<Widget> children = [_buildRestartButton()];
|
final List<Widget> children = [_buildRestartButton(context)];
|
||||||
if (showRestartHint) {
|
if (showRestartHint) {
|
||||||
children.add(
|
children.add(
|
||||||
Padding(
|
Padding(
|
||||||
@ -33,25 +34,43 @@ class RestartButton extends StatelessWidget {
|
|||||||
return Column(children: children);
|
return Column(children: children);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildRestartButton() {
|
Widget _buildRestartButton(BuildContext context) {
|
||||||
if (PlatformExtension.isDesktopOrWeb) {
|
if (PlatformExtension.isDesktopOrWeb) {
|
||||||
return Row(
|
return Row(
|
||||||
children: [
|
children: [
|
||||||
FlowyButton(
|
SizedBox(
|
||||||
isSelected: true,
|
height: 42,
|
||||||
useIntrinsicWidth: true,
|
child: FlowyTextButton(
|
||||||
margin: const EdgeInsets.symmetric(
|
LocaleKeys.settings_manageDataPage_dataStorage_actions_change
|
||||||
horizontal: 30,
|
.tr(),
|
||||||
vertical: 10,
|
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
radius: BorderRadius.circular(12),
|
||||||
|
fillColor: Theme.of(context).colorScheme.primary,
|
||||||
|
hoverColor: const Color(0xFF005483),
|
||||||
|
fontHoverColor: Colors.white,
|
||||||
|
onPressed: onClick,
|
||||||
),
|
),
|
||||||
text: FlowyText(
|
|
||||||
LocaleKeys.settings_menu_restartApp.tr(),
|
|
||||||
),
|
|
||||||
onTap: onClick,
|
|
||||||
),
|
),
|
||||||
const Spacer(),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
// Row(
|
||||||
|
// children: [
|
||||||
|
// FlowyButton(
|
||||||
|
// isSelected: true,
|
||||||
|
// useIntrinsicWidth: true,
|
||||||
|
// margin: const EdgeInsets.symmetric(
|
||||||
|
// horizontal: 30,
|
||||||
|
// vertical: 10,
|
||||||
|
// ),
|
||||||
|
// text: FlowyText(
|
||||||
|
// LocaleKeys.settings_menu_restartApp.tr(),
|
||||||
|
// ),
|
||||||
|
// onTap: onClick,
|
||||||
|
// ),
|
||||||
|
// const Spacer(),
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
} else {
|
} else {
|
||||||
return MobileSignInOrLogoutButton(
|
return MobileSignInOrLogoutButton(
|
||||||
labelText: LocaleKeys.settings_menu_restartApp.tr(),
|
labelText: LocaleKeys.settings_menu_restartApp.tr(),
|
||||||
|
@ -10,7 +10,6 @@ import 'package:appflowy/workspace/application/settings/appflowy_cloud_urls_bloc
|
|||||||
import 'package:appflowy/workspace/presentation/settings/widgets/_restart_app_button.dart';
|
import 'package:appflowy/workspace/presentation/settings/widgets/_restart_app_button.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:appflowy_backend/dispatch/dispatch.dart';
|
import 'package:appflowy_backend/dispatch/dispatch.dart';
|
||||||
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
|
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
|
||||||
import 'package:appflowy_backend/protobuf/flowy-user/user_setting.pb.dart';
|
import 'package:appflowy_backend/protobuf/flowy-user/user_setting.pb.dart';
|
||||||
@ -317,7 +316,6 @@ class AppFlowyCloudEnableSync extends StatelessWidget {
|
|||||||
FlowyText.medium(LocaleKeys.settings_menu_enableSync.tr()),
|
FlowyText.medium(LocaleKeys.settings_menu_enableSync.tr()),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
Toggle(
|
Toggle(
|
||||||
style: ToggleStyle.big,
|
|
||||||
value: state.setting.enableSync,
|
value: state.setting.enableSync,
|
||||||
onChanged: (value) => context
|
onChanged: (value) => context
|
||||||
.read<AppFlowyCloudSettingBloc>()
|
.read<AppFlowyCloudSettingBloc>()
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/env/cloud_env.dart';
|
import 'package:appflowy/env/cloud_env.dart';
|
||||||
import 'package:appflowy/env/env.dart';
|
import 'package:appflowy/env/env.dart';
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
@ -6,16 +8,16 @@ import 'package:appflowy/mobile/presentation/bottom_sheet/bottom_sheet.dart';
|
|||||||
import 'package:appflowy/mobile/presentation/widgets/widgets.dart';
|
import 'package:appflowy/mobile/presentation/widgets/widgets.dart';
|
||||||
import 'package:appflowy/startup/startup.dart';
|
import 'package:appflowy/startup/startup.dart';
|
||||||
import 'package:appflowy/workspace/application/settings/cloud_setting_bloc.dart';
|
import 'package:appflowy/workspace/application/settings/cloud_setting_bloc.dart';
|
||||||
|
import 'package:appflowy/workspace/presentation/settings/shared/af_dropdown_menu_entry.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
||||||
|
import 'package:appflowy/workspace/presentation/settings/shared/settings_dropdown.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/widgets/setting_local_cloud.dart';
|
import 'package:appflowy/workspace/presentation/settings/widgets/setting_local_cloud.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
|
||||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra/theme_extension.dart';
|
|
||||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
|
||||||
@ -41,6 +43,7 @@ class SettingCloud extends StatelessWidget {
|
|||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return SettingsBody(
|
return SettingsBody(
|
||||||
title: LocaleKeys.settings_menu_cloudSettings.tr(),
|
title: LocaleKeys.settings_menu_cloudSettings.tr(),
|
||||||
|
autoSeparate: false,
|
||||||
children: [
|
children: [
|
||||||
if (Env.enableCustomCloud)
|
if (Env.enableCustomCloud)
|
||||||
Row(
|
Row(
|
||||||
@ -50,11 +53,13 @@ class SettingCloud extends StatelessWidget {
|
|||||||
LocaleKeys.settings_menu_cloudServerType.tr(),
|
LocaleKeys.settings_menu_cloudServerType.tr(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
CloudTypeSwitcher(
|
Flexible(
|
||||||
cloudType: state.cloudType,
|
child: CloudTypeSwitcher(
|
||||||
onSelected: (type) => context
|
cloudType: state.cloudType,
|
||||||
.read<CloudSettingBloc>()
|
onSelected: (type) => context
|
||||||
.add(CloudSettingEvent.updateCloudType(type)),
|
.read<CloudSettingBloc>()
|
||||||
|
.add(CloudSettingEvent.updateCloudType(type)),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -74,21 +79,13 @@ class SettingCloud extends StatelessWidget {
|
|||||||
Widget _viewFromCloudType(AuthenticatorType cloudType) {
|
Widget _viewFromCloudType(AuthenticatorType cloudType) {
|
||||||
switch (cloudType) {
|
switch (cloudType) {
|
||||||
case AuthenticatorType.local:
|
case AuthenticatorType.local:
|
||||||
return SettingLocalCloud(
|
return SettingLocalCloud(restartAppFlowy: restartAppFlowy);
|
||||||
restartAppFlowy: restartAppFlowy,
|
|
||||||
);
|
|
||||||
case AuthenticatorType.supabase:
|
case AuthenticatorType.supabase:
|
||||||
return SettingSupabaseCloudView(
|
return SettingSupabaseCloudView(restartAppFlowy: restartAppFlowy);
|
||||||
restartAppFlowy: restartAppFlowy,
|
|
||||||
);
|
|
||||||
case AuthenticatorType.appflowyCloud:
|
case AuthenticatorType.appflowyCloud:
|
||||||
return AppFlowyCloudViewSetting(
|
return AppFlowyCloudViewSetting(restartAppFlowy: restartAppFlowy);
|
||||||
restartAppFlowy: restartAppFlowy,
|
|
||||||
);
|
|
||||||
case AuthenticatorType.appflowyCloudSelfHost:
|
case AuthenticatorType.appflowyCloudSelfHost:
|
||||||
return CustomAppFlowyCloudView(
|
return CustomAppFlowyCloudView(restartAppFlowy: restartAppFlowy);
|
||||||
restartAppFlowy: restartAppFlowy,
|
|
||||||
);
|
|
||||||
case AuthenticatorType.appflowyCloudDevelop:
|
case AuthenticatorType.appflowyCloudDevelop:
|
||||||
return AppFlowyCloudViewSetting(
|
return AppFlowyCloudViewSetting(
|
||||||
serverURL: "http://localhost",
|
serverURL: "http://localhost",
|
||||||
@ -122,63 +119,57 @@ class CloudTypeSwitcher extends StatelessWidget {
|
|||||||
return isDevelopMode || element != AuthenticatorType.appflowyCloudDevelop;
|
return isDevelopMode || element != AuthenticatorType.appflowyCloudDevelop;
|
||||||
}).toList();
|
}).toList();
|
||||||
return PlatformExtension.isDesktopOrWeb
|
return PlatformExtension.isDesktopOrWeb
|
||||||
? AppFlowyPopover(
|
? SettingsDropdown(
|
||||||
direction: PopoverDirection.bottomWithRightAligned,
|
selectedOption: cloudType,
|
||||||
child: FlowyTextButton(
|
onChanged: (type) {
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 6),
|
if (type != cloudType) {
|
||||||
titleFromCloudType(cloudType),
|
NavigatorAlertDialog(
|
||||||
fontColor: AFThemeExtension.of(context).onBackground,
|
title: LocaleKeys.settings_menu_changeServerTip.tr(),
|
||||||
fillColor: Colors.transparent,
|
confirm: () async {
|
||||||
onPressed: () {},
|
onSelected(type);
|
||||||
),
|
},
|
||||||
popupBuilder: (BuildContext context) {
|
hideCancelButton: true,
|
||||||
return ListView.builder(
|
).show(context);
|
||||||
shrinkWrap: true,
|
}
|
||||||
itemBuilder: (context, index) {
|
|
||||||
return CloudTypeItem(
|
|
||||||
cloudType: values[index],
|
|
||||||
currentCloudtype: cloudType,
|
|
||||||
onSelected: onSelected,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
itemCount: values.length,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
options: values
|
||||||
|
.map(
|
||||||
|
(type) => buildDropdownMenuEntry(
|
||||||
|
context,
|
||||||
|
value: type,
|
||||||
|
label: titleFromCloudType(type),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
)
|
)
|
||||||
: FlowyButton(
|
: FlowyButton(
|
||||||
text: FlowyText(
|
text: FlowyText(titleFromCloudType(cloudType)),
|
||||||
titleFromCloudType(cloudType),
|
|
||||||
),
|
|
||||||
useIntrinsicWidth: true,
|
useIntrinsicWidth: true,
|
||||||
rightIcon: const Icon(
|
rightIcon: const Icon(
|
||||||
Icons.chevron_right,
|
Icons.chevron_right,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () => showMobileBottomSheet(
|
||||||
showMobileBottomSheet(
|
context,
|
||||||
context,
|
showHeader: true,
|
||||||
showHeader: true,
|
showDragHandle: true,
|
||||||
showDragHandle: true,
|
showDivider: false,
|
||||||
showDivider: false,
|
title: LocaleKeys.settings_menu_cloudServerType.tr(),
|
||||||
title: LocaleKeys.settings_menu_cloudServerType.tr(),
|
builder: (context) => Column(
|
||||||
builder: (context) {
|
children: values
|
||||||
return Column(
|
.mapIndexed(
|
||||||
children: values
|
(i, e) => FlowyOptionTile.checkbox(
|
||||||
.mapIndexed(
|
text: titleFromCloudType(values[i]),
|
||||||
(i, e) => FlowyOptionTile.checkbox(
|
isSelected: cloudType == values[i],
|
||||||
text: titleFromCloudType(values[i]),
|
onTap: () {
|
||||||
isSelected: cloudType == values[i],
|
onSelected(e);
|
||||||
onTap: () {
|
context.pop();
|
||||||
onSelected(e);
|
},
|
||||||
context.pop();
|
showBottomBorder: i == values.length - 1,
|
||||||
},
|
),
|
||||||
showBottomBorder: i == values.length - 1,
|
)
|
||||||
),
|
.toList(),
|
||||||
)
|
),
|
||||||
.toList(),
|
),
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
|
|||||||
import 'package:appflowy/workspace/application/settings/notifications/notification_settings_cubit.dart';
|
import 'package:appflowy/workspace/application/settings/notifications/notification_settings_cubit.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/shared/setting_list_tile.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/setting_list_tile.dart';
|
||||||
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
import 'package:appflowy/workspace/presentation/settings/shared/settings_body.dart';
|
||||||
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
@ -23,10 +24,8 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
hint: LocaleKeys.settings_notifications_enableNotifications_hint
|
hint: LocaleKeys.settings_notifications_enableNotifications_hint
|
||||||
.tr(),
|
.tr(),
|
||||||
trailing: [
|
trailing: [
|
||||||
Switch(
|
Toggle(
|
||||||
value: state.isNotificationsEnabled,
|
value: state.isNotificationsEnabled,
|
||||||
splashRadius: 0,
|
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
onChanged: (value) => context
|
onChanged: (value) => context
|
||||||
.read<NotificationSettingsCubit>()
|
.read<NotificationSettingsCubit>()
|
||||||
.toggleNotificationsEnabled(),
|
.toggleNotificationsEnabled(),
|
||||||
@ -40,10 +39,8 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
hint: LocaleKeys.settings_notifications_showNotificationsIcon_hint
|
hint: LocaleKeys.settings_notifications_showNotificationsIcon_hint
|
||||||
.tr(),
|
.tr(),
|
||||||
trailing: [
|
trailing: [
|
||||||
Switch(
|
Toggle(
|
||||||
value: state.isShowNotificationsIconEnabled,
|
value: state.isShowNotificationsIconEnabled,
|
||||||
splashRadius: 0,
|
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
onChanged: (_) => context
|
onChanged: (_) => context
|
||||||
.read<NotificationSettingsCubit>()
|
.read<NotificationSettingsCubit>()
|
||||||
.toogleShowNotificationIconEnabled(),
|
.toogleShowNotificationIconEnabled(),
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
import 'package:appflowy/generated/flowy_svgs.g.dart';
|
||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
import 'package:appflowy/plugins/database/grid/presentation/layout/sizes.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
|
||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class EndTimeButton extends StatelessWidget {
|
class EndTimeButton extends StatelessWidget {
|
||||||
const EndTimeButton({
|
const EndTimeButton({
|
||||||
@ -38,7 +38,6 @@ class EndTimeButton extends StatelessWidget {
|
|||||||
Toggle(
|
Toggle(
|
||||||
value: isRange,
|
value: isRange,
|
||||||
onChanged: onChanged,
|
onChanged: onChanged,
|
||||||
style: ToggleStyle.big,
|
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -1,13 +1,40 @@
|
|||||||
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
|
|
||||||
import 'package:flowy_infra/theme_extension.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:flowy_infra/theme_extension.dart';
|
||||||
|
|
||||||
|
class ToggleStyle {
|
||||||
|
const ToggleStyle({
|
||||||
|
required this.height,
|
||||||
|
required this.width,
|
||||||
|
required this.thumbRadius,
|
||||||
|
});
|
||||||
|
|
||||||
|
const ToggleStyle.big()
|
||||||
|
: height = 16,
|
||||||
|
width = 27,
|
||||||
|
thumbRadius = 14;
|
||||||
|
|
||||||
|
const ToggleStyle.small()
|
||||||
|
: height = 10,
|
||||||
|
width = 16,
|
||||||
|
thumbRadius = 8;
|
||||||
|
|
||||||
|
const ToggleStyle.mobile()
|
||||||
|
: height = 24,
|
||||||
|
width = 42,
|
||||||
|
thumbRadius = 18;
|
||||||
|
|
||||||
|
final double height;
|
||||||
|
final double width;
|
||||||
|
final double thumbRadius;
|
||||||
|
}
|
||||||
|
|
||||||
class Toggle extends StatelessWidget {
|
class Toggle extends StatelessWidget {
|
||||||
const Toggle({
|
const Toggle({
|
||||||
super.key,
|
super.key,
|
||||||
required this.value,
|
required this.value,
|
||||||
required this.onChanged,
|
required this.onChanged,
|
||||||
required this.style,
|
this.style = const ToggleStyle.big(),
|
||||||
this.thumbColor,
|
this.thumbColor,
|
||||||
this.activeBackgroundColor,
|
this.activeBackgroundColor,
|
||||||
this.inactiveBackgroundColor,
|
this.inactiveBackgroundColor,
|
||||||
@ -26,7 +53,8 @@ class Toggle extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final backgroundColor = value
|
final backgroundColor = value
|
||||||
? activeBackgroundColor ?? Theme.of(context).colorScheme.primary
|
? activeBackgroundColor ?? Theme.of(context).colorScheme.primary
|
||||||
: activeBackgroundColor ?? AFThemeExtension.of(context).toggleOffFill;
|
: inactiveBackgroundColor ??
|
||||||
|
AFThemeExtension.of(context).toggleButtonBGColor;
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () => onChanged(value),
|
onTap: () => onChanged(value),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
@ -49,7 +77,7 @@ class Toggle extends StatelessWidget {
|
|||||||
height: style.thumbRadius,
|
height: style.thumbRadius,
|
||||||
width: style.thumbRadius,
|
width: style.thumbRadius,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: thumbColor ?? Theme.of(context).colorScheme.onPrimary,
|
color: thumbColor ?? Colors.white,
|
||||||
borderRadius: BorderRadius.circular(style.thumbRadius / 2),
|
borderRadius: BorderRadius.circular(style.thumbRadius / 2),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
class ToggleStyle {
|
|
||||||
ToggleStyle({
|
|
||||||
required this.height,
|
|
||||||
required this.width,
|
|
||||||
required this.thumbRadius,
|
|
||||||
});
|
|
||||||
|
|
||||||
final double height;
|
|
||||||
final double width;
|
|
||||||
final double thumbRadius;
|
|
||||||
|
|
||||||
static ToggleStyle get big =>
|
|
||||||
ToggleStyle(height: 16, width: 27, thumbRadius: 14);
|
|
||||||
|
|
||||||
static ToggleStyle get small =>
|
|
||||||
ToggleStyle(height: 10, width: 16, thumbRadius: 8);
|
|
||||||
|
|
||||||
static ToggleStyle get mobile =>
|
|
||||||
ToggleStyle(height: 24, width: 42, thumbRadius: 18);
|
|
||||||
}
|
|
@ -126,7 +126,7 @@ class DefaultColorScheme extends FlowyColorScheme {
|
|||||||
questionBubbleBG: _darkShader3,
|
questionBubbleBG: _darkShader3,
|
||||||
progressBarBGColor: _darkShader3,
|
progressBarBGColor: _darkShader3,
|
||||||
toolbarColor: _darkInput,
|
toolbarColor: _darkInput,
|
||||||
toggleButtonBGColor: _darkShader1,
|
toggleButtonBGColor: const Color(0xFF828282),
|
||||||
calendarWeekendBGColor: _darkShader1,
|
calendarWeekendBGColor: _darkShader1,
|
||||||
gridRowCountColor: _darkShader5,
|
gridRowCountColor: _darkShader5,
|
||||||
);
|
);
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flowy_infra/size.dart';
|
import 'package:flowy_infra/size.dart';
|
||||||
import 'package:flowy_infra_ui/style_widget/hover.dart';
|
import 'package:flowy_infra_ui/style_widget/hover.dart';
|
||||||
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
||||||
import 'package:flowy_infra_ui/widget/ignore_parent_gesture.dart';
|
import 'package:flowy_infra_ui/widget/ignore_parent_gesture.dart';
|
||||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class FlowyButton extends StatelessWidget {
|
class FlowyButton extends StatelessWidget {
|
||||||
final Widget text;
|
final Widget text;
|
||||||
@ -195,7 +196,11 @@ class FlowyTextButton extends StatelessWidget {
|
|||||||
children.add(heading!);
|
children.add(heading!);
|
||||||
children.add(const HSpace(8));
|
children.add(const HSpace(8));
|
||||||
}
|
}
|
||||||
children.add(Text(text, overflow: overflow, textAlign: TextAlign.center));
|
children.add(Text(
|
||||||
|
text,
|
||||||
|
overflow: overflow,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
));
|
||||||
|
|
||||||
Widget child = Row(
|
Widget child = Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
@ -230,6 +235,7 @@ class FlowyTextButton extends StatelessWidget {
|
|||||||
fontSize: fontSize,
|
fontSize: fontSize,
|
||||||
decoration: decoration,
|
decoration: decoration,
|
||||||
fontFamily: fontFamily,
|
fontFamily: fontFamily,
|
||||||
|
height: 1.1,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
backgroundColor: WidgetStateProperty.resolveWith(
|
backgroundColor: WidgetStateProperty.resolveWith(
|
||||||
|
9
frontend/resources/flowy_icons/16x/close_error.svg
Normal file
9
frontend/resources/flowy_icons/16x/close_error.svg
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<mask id="mask0_4030_10552" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
|
||||||
|
<rect width="16" height="16" fill="#D9D9D9"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask0_4030_10552)">
|
||||||
|
<path d="M4.26659 12.7942L3.20572 11.7333L6.93905 8.00001L3.20572 4.26668L4.26659 3.20581L7.99992 6.93914L11.7333 3.20581L12.7941 4.26668L9.06078 8.00001L12.7941 11.7333L11.7333 12.7942L7.99992 9.06088L4.26659 12.7942Z" fill="#900000"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 549 B |
@ -478,8 +478,8 @@
|
|||||||
"importData": {
|
"importData": {
|
||||||
"title": "Import data",
|
"title": "Import data",
|
||||||
"tooltip": "Import data from @:appName backups/data folders",
|
"tooltip": "Import data from @:appName backups/data folders",
|
||||||
"description": "Copy data from an external @:appName data folder and import it into the current @:appName data folder",
|
"description": "Copy data from an external @:appName data folder",
|
||||||
"action": "Browse folder"
|
"action": "Browse file"
|
||||||
},
|
},
|
||||||
"encryption": {
|
"encryption": {
|
||||||
"title": "Encryption",
|
"title": "Encryption",
|
||||||
@ -494,7 +494,7 @@
|
|||||||
},
|
},
|
||||||
"cache": {
|
"cache": {
|
||||||
"title": "Clear cache",
|
"title": "Clear cache",
|
||||||
"description": "If you encounter issues with images not loading or fonts not displaying correctly, try clearing your cache. This action will not remove your user data.",
|
"description": "Clear app cache, this can help resolve issues like images or fonts not loading. This will not affect your data.",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"title": "Are you sure?",
|
"title": "Are you sure?",
|
||||||
"description": "Clearing the cache will cause images and fonts to be re-downloaded on load. This action will not remove or modify your data.",
|
"description": "Clearing the cache will cause images and fonts to be re-downloaded on load. This action will not remove or modify your data.",
|
||||||
|
Loading…
Reference in New Issue
Block a user