diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 081ab6dd..cbfb8eb6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -360,7 +360,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -368,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -491,7 +491,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -499,7 +499,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -524,7 +524,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/core/utils/ui.dart b/lib/core/utils/ui.dart index 192ebebe..d47dbd1a 100644 --- a/lib/core/utils/ui.dart +++ b/lib/core/utils/ui.dart @@ -63,6 +63,7 @@ Future showRoundDialog({ title: title, content: child, actions: actions, + actionsPadding: const EdgeInsets.all(17), ); }, ); diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 79b100c2..7e403bac 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -276,11 +276,11 @@ class ServerProvider extends BusyProvider { } } - Future runSnippet(String id, Snippet snippet) async { + Future runSnippets(String id, List snippets) async { final client = _servers[id]?.client; if (client == null) { return null; } - return await client.run(snippet.script).string; + return await client.run(snippets.map((e) => e.script).join('&&')).string; } } diff --git a/lib/data/provider/snippet.dart b/lib/data/provider/snippet.dart index 3d3ce42c..8c9f7e5f 100644 --- a/lib/data/provider/snippet.dart +++ b/lib/data/provider/snippet.dart @@ -18,17 +18,19 @@ class SnippetProvider extends BusyProvider { void loadData() { _snippets = _store.fetch(); + _updateTags(); } void _updateTags() { _tags.clear(); + final tags = {}; for (final s in _snippets) { if (s.tags?.isEmpty ?? true) { continue; } - _tags.addAll(s.tags!); + tags.addAll(s.tags!); } - _tags.toSet().toList(); + _tags.addAll(tags); } void add(Snippet snippet) { diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 2f7c0937..ac6b58c3 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 369; - static const String engine = "3.10.3"; - static const String buildAt = "2023-06-27 14:47:02.701644"; - static const int modifications = 5; + static const int build = 372; + static const String engine = "3.10.5"; + static const String buildAt = "2023-07-07 21:09:39.978447"; + static const int modifications = 2; } diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index cf2d1c9d..5e01239a 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -147,6 +147,7 @@ class BackupPage extends StatelessWidget { await showRoundDialog( context: context, + title: Text(s.restore), child: Text(s.restoreSureWithDate(backup.date)), actions: [ TextButton( @@ -170,6 +171,7 @@ class BackupPage extends StatelessWidget { context.pop(); showRoundDialog( context: context, + title: Text(s.restore), child: Text(s.restoreSuccess), actions: [ TextButton( diff --git a/lib/view/page/docker.dart b/lib/view/page/docker.dart index e61a0ce9..7505396b 100644 --- a/lib/view/page/docker.dart +++ b/lib/view/page/docker.dart @@ -180,6 +180,7 @@ class _DockerManagePageState extends State { if (_textController.text == '') { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.fieldMustNotEmpty), actions: [ TextButton( @@ -286,6 +287,7 @@ class _DockerManagePageState extends State { onPressed: () async { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.sureDelete(e.repo)), actions: [ TextButton( diff --git a/lib/view/page/ping.dart b/lib/view/page/ping.dart index 5f0b5ce8..562ee28e 100644 --- a/lib/view/page/ping.dart +++ b/lib/view/page/ping.dart @@ -89,6 +89,7 @@ class _PingPageState extends State } catch (e) { showRoundDialog( context: context, + title: Text(_s.error), child: Text(e.toString()), actions: [ TextButton( diff --git a/lib/view/page/pkg.dart b/lib/view/page/pkg.dart index 24a3010a..0e1b294d 100644 --- a/lib/view/page/pkg.dart +++ b/lib/view/page/pkg.dart @@ -88,6 +88,7 @@ class _PkgManagePageState extends State if (_textController.text == '') { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.fieldMustNotEmpty), actions: [ TextButton( diff --git a/lib/view/page/process.dart b/lib/view/page/process.dart index d0263438..ead92097 100644 --- a/lib/view/page/process.dart +++ b/lib/view/page/process.dart @@ -90,6 +90,7 @@ class _ProcessPageState extends State { icon: const Icon(Icons.error), onPressed: () => showRoundDialog( context: context, + title: Text(_s.error), child: Text(_result.error!), ), )); diff --git a/lib/view/page/server/edit.dart b/lib/view/page/server/edit.dart index e9b01b92..10a9348f 100644 --- a/lib/view/page/server/edit.dart +++ b/lib/view/page/server/edit.dart @@ -15,7 +15,7 @@ import '../../../data/provider/server.dart'; import '../../../data/res/ui.dart'; import '../../../data/store/private_key.dart'; import '../../../locator.dart'; -import '../../widget/tag_editor.dart'; +import '../../widget/tag/editor.dart'; import '../private_key/edit.dart'; class ServerEditPage extends StatefulWidget { @@ -239,6 +239,7 @@ class _ServerEditPageState extends State with AfterLayoutMixin { if (!usePublicKey && _passwordController.text == '') { final cancel = await showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.sureNoPwd), actions: [ TextButton( diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index fe5bff56..cb8cca5f 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -5,11 +5,13 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:get_it/get_it.dart'; import 'package:nil/nil.dart'; import 'package:provider/provider.dart'; -import 'package:toolbox/core/extension/navigator.dart'; import 'package:toolbox/core/extension/order.dart'; import 'package:toolbox/core/utils/misc.dart'; +import 'package:toolbox/data/model/server/snippet.dart'; +import 'package:toolbox/data/provider/snippet.dart'; import 'package:toolbox/view/page/process.dart'; -import 'package:toolbox/view/widget/tag_switcher.dart'; +import 'package:toolbox/view/widget/tag/picker.dart'; +import 'package:toolbox/view/widget/tag/switcher.dart'; import '../../../core/route.dart'; import '../../../core/utils/ui.dart'; @@ -273,7 +275,7 @@ class _ServerPageState extends State Widget _buildMoreBtn(ServerPrivateInfo spi) { return PopupMenu( items: ServerTabMenuType.values.map((e) => e.build(_s)).toList(), - onSelected: (ServerTabMenuType value) { + onSelected: (ServerTabMenuType value) async { switch (value) { case ServerTabMenuType.pkg: AppRoute(PkgManagePage(spi), 'pkg manage').go(context); @@ -282,19 +284,33 @@ class _ServerPageState extends State AppRoute(SFTPPage(spi), 'SFTP').go(context); break; case ServerTabMenuType.snippet: - showSnippetDialog(context, _s, (s) async { - final result = await _serverProvider.runSnippet(spi.id, s); + final provider = locator(); + final snippets = await showDialog>( + context: context, + builder: (_) => TagPicker( + items: provider.snippets, + containsTag: (t, tag) => t.tags?.contains(tag) ?? false, + tags: provider.tags.toSet(), + name: (t) => t.name, + ), + ); + if (snippets == null) { + return; + } + final result = await _serverProvider.runSnippets(spi.id, snippets); + if (result != null && result.isNotEmpty) { showRoundDialog( context: context, - child: Text(result ?? _s.error, style: textSize13), + title: Text(_s.result), + child: Text(result), actions: [ TextButton( - onPressed: () => context.pop(), - child: Text(_s.ok), + onPressed: () => copy2Clipboard(result), + child: Text(_s.copy), ) ], ); - }); + } break; case ServerTabMenuType.edit: AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context); @@ -303,13 +319,6 @@ class _ServerPageState extends State AppRoute(DockerManagePage(spi), 'Docker manage').go(context); break; case ServerTabMenuType.process: - // AppRoute( - // SSHPage( - // spi: spi, - // initCmd: 'sh $shellPath -${shellFuncProcess.flag}', - // ), - // 'ssh page (process)', - // ).go(context); AppRoute(ProcessPage(spi: spi), 'process page').go(context); break; } diff --git a/lib/view/page/setting.dart b/lib/view/page/setting.dart index b8382c4d..fa760546 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting.dart @@ -272,13 +272,18 @@ class _SettingPageState extends State { await showRoundDialog( context: context, title: Text(_s.primaryColor), - child: MaterialColorPicker( - shrinkWrap: true, - allowShades: true, - onColorChange: (color) { - _selectedColorValue.value = color.value; - }, - selectedColor: primaryColor, + child: SizedBox( + height: 211, + child: Center( + child: MaterialColorPicker( + shrinkWrap: true, + allowShades: true, + onColorChange: (color) { + _selectedColorValue.value = color.value; + }, + selectedColor: primaryColor, + ), + ), ), actions: [ TextButton( @@ -557,7 +562,11 @@ class _SettingPageState extends State { context.pop(); final fontSize = double.tryParse(ctrller.text); if (fontSize == null) { - showRoundDialog(context: context, child: Text(_s.failed)); + showRoundDialog( + context: context, + title: Text(_s.failed), + child: Text('Parsed failed: ${ctrller.text}'), + ); return; } _fontSize.value = fontSize; diff --git a/lib/view/page/sftp/local.dart b/lib/view/page/sftp/local.dart index 6a8bad3d..304280bf 100644 --- a/lib/view/page/sftp/local.dart +++ b/lib/view/page/sftp/local.dart @@ -178,6 +178,7 @@ class _SFTPDownloadedPageState extends State { if (stat.size > editorMaxSize) { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.fileTooLarge(fileName, stat.size, '1m')), ); return; @@ -223,6 +224,7 @@ class _SFTPDownloadedPageState extends State { context.pop(); showRoundDialog( context: context, + title: Text(_s.delete), child: Text(_s.sureDelete(fileName)), actions: [ TextButton( diff --git a/lib/view/page/sftp/remote.dart b/lib/view/page/sftp/remote.dart index 13daa4c0..28abe042 100644 --- a/lib/view/page/sftp/remote.dart +++ b/lib/view/page/sftp/remote.dart @@ -134,6 +134,7 @@ class _SFTPPageState extends State { onPressed: () async { final idx = await showRoundDialog( context: context, + title: Text(_s.choose), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -517,6 +518,7 @@ class _SFTPPageState extends State { if (textController.text == '') { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.fieldMustNotEmpty), actions: [ TextButton( @@ -559,6 +561,7 @@ class _SFTPPageState extends State { if (textController.text == '') { showRoundDialog( context: context, + title: Text(_s.attention), child: Text(_s.fieldMustNotEmpty), actions: [ TextButton( diff --git a/lib/view/page/snippet/edit.dart b/lib/view/page/snippet/edit.dart index 33c19fa4..f7b3099a 100644 --- a/lib/view/page/snippet/edit.dart +++ b/lib/view/page/snippet/edit.dart @@ -9,7 +9,7 @@ import '../../../data/model/server/snippet.dart'; import '../../../data/provider/snippet.dart'; import '../../../data/res/ui.dart'; import '../../../locator.dart'; -import '../../widget/tag_editor.dart'; +import '../../widget/tag/editor.dart'; class SnippetEditPage extends StatefulWidget { const SnippetEditPage({Key? key, this.snippet}) : super(key: key); diff --git a/lib/view/page/snippet/list.dart b/lib/view/page/snippet/list.dart index e5975dab..8ac5b484 100644 --- a/lib/view/page/snippet/list.dart +++ b/lib/view/page/snippet/list.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/order.dart'; -import 'package:toolbox/view/widget/tag_switcher.dart'; +import 'package:toolbox/view/widget/tag/switcher.dart'; import '../../../data/store/setting.dart'; import '../../../locator.dart'; diff --git a/lib/view/page/ssh/term.dart b/lib/view/page/ssh/term.dart index df8f451a..632dcfb2 100644 --- a/lib/view/page/ssh/term.dart +++ b/lib/view/page/ssh/term.dart @@ -259,6 +259,7 @@ class _SSHPageState extends State { if (initPath.isEmpty || !initPath.startsWith('/')) { showRoundDialog( context: context, + title: Text(_s.error), child: const Text('Failed to get current path'), ); return; diff --git a/lib/view/widget/tag/btn.dart b/lib/view/widget/tag/btn.dart new file mode 100644 index 00000000..1b39329f --- /dev/null +++ b/lib/view/widget/tag/btn.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +import '../../../data/res/color.dart'; + +class TagBtn extends StatelessWidget { + final String content; + final void Function() onTap; + final bool isEnable; + + const TagBtn({ + super.key, + required this.onTap, + required this.isEnable, + required this.content, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 4, right: 5, bottom: 9), + child: GestureDetector( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(20.0)), + color: primaryColor.withAlpha(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 11, vertical: 2.7), + child: Center( + child: Text( + content, + style: TextStyle( + color: isEnable ? null : Colors.grey, + fontSize: 15, + fontWeight: FontWeight.w500, + ), + ), + )), + ), + ); + } +} diff --git a/lib/view/widget/tag_editor.dart b/lib/view/widget/tag/editor.dart similarity index 98% rename from lib/view/widget/tag_editor.dart rename to lib/view/widget/tag/editor.dart index a0619d4f..b69b9a29 100644 --- a/lib/view/widget/tag_editor.dart +++ b/lib/view/widget/tag/editor.dart @@ -4,8 +4,8 @@ import 'package:toolbox/view/widget/input_field.dart'; import 'package:toolbox/view/widget/round_rect_card.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../../core/utils/ui.dart'; -import '../../data/res/color.dart'; +import '../../../core/utils/ui.dart'; +import '../../../data/res/color.dart'; class TagEditor extends StatelessWidget { final List tags; diff --git a/lib/view/widget/tag/picker.dart b/lib/view/widget/tag/picker.dart new file mode 100644 index 00000000..327434b0 --- /dev/null +++ b/lib/view/widget/tag/picker.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:toolbox/core/extension/navigator.dart'; +import 'package:toolbox/data/res/ui.dart'; +import 'package:toolbox/view/widget/tag/btn.dart'; + +class TagPicker extends StatefulWidget { + final List items; + final bool Function(T, String?) containsTag; + final String Function(T) name; + final Set tags; + + const TagPicker({ + Key? key, + required this.items, + required this.containsTag, + required this.name, + required this.tags, + }) : super(key: key); + + @override + _TagPickerState createState() => _TagPickerState(); +} + +class _TagPickerState extends State> { + late S _s; + late MediaQueryData _media; + final List _selected = []; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _s = S.of(context)!; + _media = MediaQuery.of(context); + } + + @override + Widget build(BuildContext context) { + final child = widget.tags.isEmpty + ? Text(_s.noSavedSnippet) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(_s.tag), + height13, + SizedBox( + height: 37, + width: _media.size.width * 0.7, + child: _buildTags(), + ), + Text(_s.all), + height13, + SizedBox( + height: 37, + width: _media.size.width * 0.7, + child: _buildItems(), + ), + ], + ); + return AlertDialog( + title: Text(_s.choose), + content: child, + actions: [ + TextButton( + onPressed: () { + context.pop(_selected); + }, + child: Text(_s.ok), + ), + ], + ); + } + + Widget _buildTags() { + return ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: widget.tags.length, + itemBuilder: (_, idx) { + final item = widget.tags.elementAt(idx); + final isEnable = + widget.items.where((ele) => widget.containsTag(ele, item)).every( + (element) => _selected.contains(element), + ); + return TagBtn( + isEnable: isEnable, + onTap: () { + if (isEnable) { + _selected.removeWhere( + (element) => widget.containsTag(element, item), + ); + } else { + _selected.addAll(widget.items.where( + (ele) => widget.containsTag(ele, item), + )); + } + setState(() {}); + }, + content: item, + ); + }, + ); + } + + Widget _buildItems() { + return ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: widget.items.length, + itemBuilder: (context, index) { + final e = widget.items[index]; + return TagBtn( + isEnable: _selected.contains(e), + onTap: () { + if (_selected.contains(e)) { + _selected.remove(e); + } else { + _selected.add(e); + } + setState(() {}); + }, + content: widget.name(e), + ); + }, + ); + } +} diff --git a/lib/view/widget/tag/switcher.dart b/lib/view/widget/tag/switcher.dart new file mode 100644 index 00000000..9378ed2a --- /dev/null +++ b/lib/view/widget/tag/switcher.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:nil/nil.dart'; +import 'package:toolbox/view/widget/tag/view.dart'; + +class TagSwitcher extends StatelessWidget { + final List tags; + final double width; + final void Function(String?) onTagChanged; + final String? initTag; + final String all; + + const TagSwitcher({ + Key? key, + required this.tags, + required this.width, + required this.onTagChanged, + required this.all, + this.initTag, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return _buildTagsSwitcher(tags); + } + + Widget _buildTagsSwitcher(List tags) { + if (tags.isEmpty) return nil; + final items = [null, ...tags]; + return Container( + height: 37, + width: width, + alignment: Alignment.center, + color: Colors.transparent, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + final item = items[index]; + return TagView( + tag: item, + initTag: initTag, + all: all, + onTap: onTagChanged, + ); + }, + itemCount: items.length, + ), + ); + } +} diff --git a/lib/view/widget/tag/view.dart b/lib/view/widget/tag/view.dart new file mode 100644 index 00000000..c392222f --- /dev/null +++ b/lib/view/widget/tag/view.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:toolbox/view/widget/tag/btn.dart'; + +class TagView extends StatelessWidget { + final void Function(String?) onTap; + final String? tag; + final String? initTag; + final String all; + + const TagView({ + super.key, + required this.onTap, + this.tag, + this.initTag, + required this.all, + }); + + @override + Widget build(BuildContext context) { + return TagBtn( + onTap: () => onTap(tag), + isEnable: initTag == tag, + content: tag == null ? all : '#$tag', + ); + } +} diff --git a/lib/view/widget/tag_switcher.dart b/lib/view/widget/tag_switcher.dart deleted file mode 100644 index 80aaef61..00000000 --- a/lib/view/widget/tag_switcher.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:nil/nil.dart'; - -import '../../data/res/color.dart'; - -class TagSwitcher extends StatelessWidget { - final List tags; - final double width; - final void Function(String?) onTagChanged; - final String? initTag; - final String all; - - const TagSwitcher({ - Key? key, - required this.tags, - required this.width, - required this.onTagChanged, - required this.all, - this.initTag, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return _buildTagsSwitcher(tags); - } - - Widget _buildTagsSwitcher(List tags) { - if (tags.isEmpty) return nil; - final items = [null, ...tags]; - return Container( - height: 37, - width: width, - alignment: Alignment.center, - color: Colors.transparent, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) => _buildTagItem(items[index]), - itemCount: items.length, - ), - ); - } - - Widget _buildTagItem(String? tag) { - return Padding( - padding: const EdgeInsets.only(left: 4, right: 5, bottom: 9), - child: GestureDetector( - onTap: () => onTagChanged(tag), - child: Container( - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(20.0)), - color: primaryColor.withAlpha(20), - ), - padding: const EdgeInsets.symmetric(horizontal: 11, vertical: 2.7), - child: Center( - child: Text( - tag == null ? all : '#$tag', - style: TextStyle( - color: initTag == tag ? null : Colors.grey, - fontSize: 15, - fontWeight: FontWeight.w500, - ), - ), - )), - ), - ); - } -} diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index ceca1fdc..a2b55260 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -475,9 +475,9 @@ baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -490,9 +490,9 @@ baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -505,9 +505,9 @@ baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 369; + CURRENT_PROJECT_VERSION = 372; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.369; + MARKETING_VERSION = 1.0.372; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0;