mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-06 03:15:48 -06:00
Merge pull request #277 from astubenbord/feat/show-changelogs
feat: add changelogs, update old changelogs, update build scripts
This commit is contained in:
1
.github/workflows/create-github-release.yml
vendored
1
.github/workflows/create-github-release.yml
vendored
@@ -45,6 +45,7 @@ jobs:
|
||||
- name: Get packages and run codegen
|
||||
run: |
|
||||
bash install_dependencies.sh
|
||||
bash update_changelogs.sh
|
||||
working-directory: scripts
|
||||
|
||||
- name: Setup Fastlane
|
||||
|
||||
1
.github/workflows/create_release.yml
vendored
1
.github/workflows/create_release.yml
vendored
@@ -58,6 +58,7 @@ jobs:
|
||||
- name: Get packages and run codegen
|
||||
run: |
|
||||
bash install_dependencies.sh
|
||||
bash update_changelogs.sh
|
||||
working-directory: scripts
|
||||
|
||||
- name: Setup Fastlane
|
||||
|
||||
@@ -52,6 +52,7 @@ jobs:
|
||||
- name: Get packages and run codegen
|
||||
run: |
|
||||
bash install_dependencies.sh
|
||||
bash update_changelogs.sh
|
||||
working-directory: scripts
|
||||
|
||||
- name: Setup Fastlane
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -74,3 +74,5 @@ docker/
|
||||
|
||||
crowdin_credentials.yml
|
||||
|
||||
# Changelogs
|
||||
assets/changelogs/*.md
|
||||
@@ -1,4 +1,4 @@
|
||||
Diese Version ist eine Betaversion und enthält neue Features und Umstrukturierungen. Deshalb wird empfohlen, die App neu zu installieren!
|
||||
### Diese Version ist eine Betaversion und enthält neue Features und Umstrukturierungen. Deshalb wird empfohlen, die App neu zu installieren!
|
||||
* Neues Feature: Massenbearbeitung von Dokumenten.
|
||||
* Neues Feature: Unterstützung für mehrere Accounts und mehrere Instanzen mit schnellem Wechsel zwischen diesen (Achtung: Die in paperless-ngx 1.14.0 neu hinzugefügten Berechtigungen sind hier noch nicht enthalten!)
|
||||
* Bugfixes
|
||||
@@ -1,4 +1,4 @@
|
||||
Dies ist eine Beta Version und noch work in progress! Diese Version wurde mit paperless-ngx 1.13.0 sowie 1.14.2 getestet.
|
||||
### Dies ist eine Beta Version und noch work in progress! Diese Version wurde mit paperless-ngx 1.13.0 sowie 1.14.2 getestet.
|
||||
* Beheben einiger Fehler, die durch API-Update zustande kamen
|
||||
* Berechtigungs-Checks bei wichtigen Funktionen (noch nicht vollständig)
|
||||
* Neue Einstellungen für den Standard Dateityp beim Downloaden/Teilen
|
||||
@@ -1,5 +1,4 @@
|
||||
DISCLAIMER: Major Update mit potentiellen breaking changes - eine Neuinstallation wird dringend empfohlen!
|
||||
|
||||
### DISCLAIMER: Major Update mit potentiellen breaking changes - eine Neuinstallation wird dringend empfohlen!
|
||||
* Neue Startseite hinzugefügt
|
||||
* Viele Fehlerbehebungen
|
||||
* Verbesserte Unterstützung für mehrere Accounts/Benutzer
|
||||
|
||||
@@ -1 +1 @@
|
||||
Beheben eines Fehlers, durch welchen die App bei Paperless Versionen vor 1.14.0 nicht mehr startete
|
||||
### Beheben eines Fehlers, durch welchen die App bei Paperless Versionen vor 1.14.0 nicht mehr startete
|
||||
@@ -0,0 +1,2 @@
|
||||
* Neu: Anzeigen von Changelogs beim ersten Appstart mit neuer Version
|
||||
* Kleinere Fixes
|
||||
@@ -1,4 +1,4 @@
|
||||
This version is a beta and contains new features and some restructurings. Therefore it is highly recommended to perform a fresh installation of the app.
|
||||
### This version is a beta and contains new features and some restructurings. Therefore it is highly recommended to perform a fresh installation of the app.
|
||||
* New feature: Document bulk edits
|
||||
* New feature: Support for multiple accounts and multiple instances with quick switching between them (Note: This does not yet include the new multi-user features introduced in paperless-ngx 1.14.0!)
|
||||
* Bugfixes
|
||||
@@ -1,4 +1,4 @@
|
||||
This is a beta version and still work in progress! This version was tested with paperless-ngx 1.3.0 as well as 1.14.2.
|
||||
### This is a beta version and still work in progress! This version was tested with paperless-ngx 1.3.0 as well as 1.14.2.
|
||||
* Fixes some bugs which were caused by breaking changes to the Paperless API.
|
||||
* Permission checks for major features (upload, edit, view documents etc., not complete yet)
|
||||
* Add setting to set default download/share file type
|
||||
@@ -1,5 +1,4 @@
|
||||
DISCLAIMER: Major update with possibly breaking changes - a fresh install is highly recommended!
|
||||
|
||||
### DISCLAIMER: Major update with possibly breaking changes - a fresh install is highly recommended!
|
||||
* Added new home page
|
||||
* Tons of bugfixes
|
||||
* Improved support for multiple accounts/users
|
||||
|
||||
@@ -1 +1 @@
|
||||
Fix bug where app would not login with paperless versions before 1.14.0
|
||||
* Fix bug where app would not login with paperless versions before 1.14.0
|
||||
@@ -0,0 +1,2 @@
|
||||
* New: Show changelogs the first time the app is opened
|
||||
* Some minor fixes
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:paperless_mobile/generated/assets.gen.dart';
|
||||
|
||||
class PaperlessLogo extends StatelessWidget {
|
||||
static const _paperlessGreen = Color(0xFF18541F);
|
||||
@@ -25,15 +26,16 @@ class PaperlessLogo extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
constraints: BoxConstraints(
|
||||
maxHeight: height ?? Theme.of(context).iconTheme.size ?? 32,
|
||||
maxWidth: width ?? Theme.of(context).iconTheme.size ?? 32,
|
||||
),
|
||||
padding: const EdgeInsets.only(right: 8),
|
||||
child: SvgPicture.asset(
|
||||
"assets/logos/paperless_logo_white.svg",
|
||||
color: _color,
|
||||
),
|
||||
);
|
||||
constraints: BoxConstraints(
|
||||
maxHeight: height ?? Theme.of(context).iconTheme.size ?? 32,
|
||||
maxWidth: width ?? Theme.of(context).iconTheme.size ?? 32,
|
||||
),
|
||||
padding: const EdgeInsets.only(right: 8),
|
||||
child: Assets.logos.paperlessLogoWhiteSvg.svg(
|
||||
colorFilter: ColorFilter.mode(
|
||||
_color,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,17 +5,20 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:paperless_mobile/constants.dart';
|
||||
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
|
||||
import 'package:paperless_mobile/core/global/asset_images.dart';
|
||||
import 'package:paperless_mobile/core/widgets/hint_card.dart';
|
||||
import 'package:paperless_mobile/core/widgets/paperless_logo.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/cubit/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart';
|
||||
import 'package:paperless_mobile/features/sharing/cubit/receive_share_cubit.dart';
|
||||
import 'package:paperless_mobile/generated/assets.gen.dart';
|
||||
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/documents_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/saved_views_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/upload_queue_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/settings_route.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
@@ -95,7 +98,7 @@ class AppDrawer extends StatelessWidget {
|
||||
),
|
||||
actionsAlignment: MainAxisAlignment.spaceBetween,
|
||||
actions: [
|
||||
Text("~ Anton"),
|
||||
const Text("~ Anton"),
|
||||
TextButton(
|
||||
onPressed: Navigator.of(context).pop,
|
||||
child: Text(S.of(context)!.gotIt),
|
||||
@@ -105,6 +108,14 @@ class AppDrawer extends StatelessWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
dense: true,
|
||||
leading: const Icon(Icons.history),
|
||||
title: Text(S.of(context)!.changelog),
|
||||
onTap: () {
|
||||
ChangelogRoute().push(context);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
dense: true,
|
||||
leading: const Icon(Icons.bug_report_outlined),
|
||||
@@ -127,9 +138,11 @@ class AppDrawer extends StatelessWidget {
|
||||
),
|
||||
ListTile(
|
||||
dense: true,
|
||||
leading: SvgPicture.asset(
|
||||
"assets/images/github-mark.svg",
|
||||
color: Theme.of(context).colorScheme.onBackground,
|
||||
leading: Assets.images.githubMark.svg(
|
||||
colorFilter: ColorFilter.mode(
|
||||
Theme.of(context).colorScheme.onBackground,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
height: 24,
|
||||
width: 24,
|
||||
),
|
||||
@@ -215,7 +228,7 @@ class AppDrawer extends StatelessWidget {
|
||||
const CreateSavedViewRoute(showInSidebar: true)
|
||||
.push(context);
|
||||
},
|
||||
icon: Icon(Icons.add),
|
||||
icon: const Icon(Icons.add),
|
||||
label: Text(S.of(context)!.newView),
|
||||
),
|
||||
],
|
||||
@@ -227,7 +240,7 @@ class AppDrawer extends StatelessWidget {
|
||||
final view = sidebarViews[index];
|
||||
return ListTile(
|
||||
title: Text(view.name),
|
||||
trailing: Icon(Icons.arrow_forward),
|
||||
trailing: const Icon(Icons.arrow_forward),
|
||||
onTap: () {
|
||||
Scaffold.of(context).closeDrawer();
|
||||
context
|
||||
|
||||
118
lib/features/changelogs/view/changelog_dialog.dart
Normal file
118
lib/features/changelogs/view/changelog_dialog.dart
Normal file
@@ -0,0 +1,118 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
|
||||
import 'package:paperless_mobile/theme.dart';
|
||||
|
||||
class ChangelogDialog extends StatelessWidget {
|
||||
const ChangelogDialog({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
actionsPadding: const EdgeInsets.all(4),
|
||||
title: Text(S.of(context)!.changelog),
|
||||
content: FutureBuilder<String>(
|
||||
future: _loadChangelog(context),
|
||||
builder: (context, snapshot) {
|
||||
if (!snapshot.hasData) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
).padded(24);
|
||||
}
|
||||
return SizedBox(
|
||||
width: 1000,
|
||||
child: Markdown(
|
||||
data: snapshot.data!,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text(S.of(context)!.close),
|
||||
onPressed: () {
|
||||
context.pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Future<String> _loadChangelog(BuildContext context) async {
|
||||
final languageCode = Localizations.localeOf(context).languageCode;
|
||||
final locale = switch (languageCode) {
|
||||
'de' => 'de-DE',
|
||||
_ => 'en-US',
|
||||
};
|
||||
'en-US';
|
||||
String changelog = await rootBundle.loadString(
|
||||
'assets/changelogs/changelogs_$locale.md',
|
||||
);
|
||||
for (var versionNumber in _versionNumbers.keys) {
|
||||
changelog = changelog.replaceFirst(
|
||||
RegExp('# $versionNumber'),
|
||||
'# v${_versionNumbers[versionNumber]!}',
|
||||
);
|
||||
}
|
||||
return changelog;
|
||||
}
|
||||
}
|
||||
|
||||
const _versionNumbers = {
|
||||
"53": "3.0.6",
|
||||
"52": "3.0.5",
|
||||
"51": "3.0.4",
|
||||
"50": "3.0.3",
|
||||
"49": "3.0.2",
|
||||
"48": "3.0.1",
|
||||
"47": "3.0.0",
|
||||
"46": "2.3.11",
|
||||
"45": "2.3.10",
|
||||
"44": "2.3.9",
|
||||
"43": "2.3.8",
|
||||
"42": "2.3.7",
|
||||
"41": "2.3.6",
|
||||
"40": "2.3.5",
|
||||
"39": "2.3.4",
|
||||
"38": "2.3.3",
|
||||
"37": "2.3.2",
|
||||
"36": "2.3.1",
|
||||
"35": "2.3.0",
|
||||
"34": "2.2.6",
|
||||
"33": "2.2.5",
|
||||
"32": "2.2.4",
|
||||
"31": "2.2.3",
|
||||
"30": "2.2.2",
|
||||
"29": "2.2.1",
|
||||
"28": "2.2.0",
|
||||
"27": "2.1.0",
|
||||
"26": "2.0.9",
|
||||
"25": "2.0.8",
|
||||
"24": "2.0.7",
|
||||
"23": "2.0.6",
|
||||
"22": "2.0.5",
|
||||
"21": "2.0.4",
|
||||
"20": "2.0.3",
|
||||
"19": "2.0.2",
|
||||
"18": "2.0.1",
|
||||
"17": "2.0.0",
|
||||
"16": "1.5.3",
|
||||
"15": "1.5.2",
|
||||
"14": "1.5.1",
|
||||
"13": "1.5.0",
|
||||
"12": "1.4.1",
|
||||
"11": "1.4.0",
|
||||
"10": "1.3.1",
|
||||
"9": "1.3.0",
|
||||
"8": "1.2.2",
|
||||
"7": "1.2.1",
|
||||
"6": "1.2.0",
|
||||
"5": "1.1.0",
|
||||
"3": "1.0.5",
|
||||
"4": "1.0.6",
|
||||
"2": "1.0.4",
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/constants.dart';
|
||||
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/app_drawer/view/app_drawer.dart';
|
||||
@@ -14,6 +15,14 @@ import 'package:paperless_mobile/routes/typed/branches/documents_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/inbox_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/saved_views_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class Changelog {
|
||||
final int buildNumber;
|
||||
final String? changelog;
|
||||
Changelog(this.buildNumber, this.changelog);
|
||||
}
|
||||
|
||||
class LandingPage extends StatefulWidget {
|
||||
const LandingPage({super.key});
|
||||
@@ -25,6 +34,34 @@ class LandingPage extends StatefulWidget {
|
||||
class _LandingPageState extends State<LandingPage> {
|
||||
final _searchBarHandle = SliverOverlapAbsorberHandle();
|
||||
|
||||
Future<bool> get _shouldShowChangelog async {
|
||||
try {
|
||||
final sp = await SharedPreferences.getInstance();
|
||||
final currentBuild = packageInfo.buildNumber;
|
||||
final _existingVersions =
|
||||
sp.getStringList('changelogSeenForBuilds') ?? [];
|
||||
if (_existingVersions.contains(currentBuild)) {
|
||||
return false;
|
||||
} else {
|
||||
_existingVersions.add(currentBuild);
|
||||
await sp.setStringList('changelogSeenForBuilds', _existingVersions);
|
||||
return true;
|
||||
}
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
if (await _shouldShowChangelog) {
|
||||
ChangelogRoute().push(context);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final currentUser = context.watch<LocalUserAccount>().paperlessUser;
|
||||
@@ -187,18 +224,19 @@ class _LandingPageState extends State<LandingPage> {
|
||||
titleTextStyle: Theme.of(context).textTheme.labelLarge,
|
||||
title: Text(S.of(context)!.totalCharacters),
|
||||
trailing: Text(
|
||||
stats.totalChars.toString(),
|
||||
(stats.totalChars ?? 0).toString(),
|
||||
style: Theme.of(context).textTheme.labelLarge,
|
||||
),
|
||||
),
|
||||
),
|
||||
AspectRatio(
|
||||
aspectRatio: 1.3,
|
||||
child: SizedBox(
|
||||
width: 300,
|
||||
child: MimeTypesPieChart(statistics: stats),
|
||||
if (stats.fileTypeCounts.isNotEmpty)
|
||||
AspectRatio(
|
||||
aspectRatio: 1.3,
|
||||
child: SizedBox(
|
||||
width: 300,
|
||||
child: MimeTypesPieChart(statistics: stats),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
).padded(16);
|
||||
},
|
||||
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "Tens canvis sense desar. Si continues es perdran. Vols descartar els canvis?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "Du hast ungespeicherte Änderungen. Diese gehen verloren, falls du fortfährst. Möchtest du die Änderungen verwerfen?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -1000,5 +1000,6 @@
|
||||
"discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?",
|
||||
"@discardChangesWarning": {
|
||||
"description": "Warning message shown when the user tries to close a route without saving the changes."
|
||||
}
|
||||
},
|
||||
"changelog": "Changelog"
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import 'package:device_info_plus/device_info_plus.dart';
|
||||
import 'package:dynamic_color/dynamic_color.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
||||
import 'package:flutter_native_splash/flutter_native_splash.dart';
|
||||
@@ -39,6 +40,7 @@ import 'package:paperless_mobile/routes/navigation_keys.dart';
|
||||
import 'package:paperless_mobile/routes/typed/branches/landing_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/add_account_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/logging_out_route.dart';
|
||||
import 'package:paperless_mobile/routes/typed/top_level/login_route.dart';
|
||||
import 'package:paperless_mobile/theme.dart';
|
||||
@@ -89,6 +91,7 @@ Future<void> performMigrations() async {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Future<void> _initHive() async {
|
||||
await Hive.initFlutter();
|
||||
|
||||
@@ -316,6 +319,7 @@ class _GoRouterShellState extends State<GoRouterShell> {
|
||||
$loginRoute,
|
||||
$loggingOutRoute,
|
||||
$addAccountRoute,
|
||||
$changelogRoute,
|
||||
$authenticatedRoute,
|
||||
],
|
||||
),
|
||||
|
||||
18
lib/routes/typed/top_level/changelog_route.dart
Normal file
18
lib/routes/typed/top_level/changelog_route.dart
Normal file
@@ -0,0 +1,18 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:paperless_mobile/features/changelogs/view/changelog_dialog.dart';
|
||||
import 'package:paperless_mobile/routes/navigation_keys.dart';
|
||||
import 'package:paperless_mobile/routes/utils/dialog_page.dart';
|
||||
|
||||
part 'changelog_route.g.dart';
|
||||
|
||||
@TypedGoRoute<ChangelogRoute>(path: '/changelogs)')
|
||||
class ChangelogRoute extends GoRouteData {
|
||||
static final $parentNavigatorKey = rootNavigatorKey;
|
||||
@override
|
||||
Page<void> buildPage(BuildContext context, GoRouterState state) {
|
||||
return DialogPage(
|
||||
builder: (context) => const ChangelogDialog(),
|
||||
);
|
||||
}
|
||||
}
|
||||
40
lib/routes/utils/dialog_page.dart
Normal file
40
lib/routes/utils/dialog_page.dart
Normal file
@@ -0,0 +1,40 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class DialogPage<T> extends Page<T> {
|
||||
final Offset? anchorPoint;
|
||||
final Color? barrierColor;
|
||||
final bool barrierDismissible;
|
||||
final String? barrierLabel;
|
||||
final bool useSafeArea;
|
||||
final CapturedThemes? themes;
|
||||
final WidgetBuilder builder;
|
||||
|
||||
const DialogPage({
|
||||
required this.builder,
|
||||
this.anchorPoint,
|
||||
this.barrierColor = Colors.black38,
|
||||
this.barrierDismissible = true,
|
||||
this.barrierLabel,
|
||||
this.useSafeArea = true,
|
||||
this.themes,
|
||||
super.key,
|
||||
super.name,
|
||||
super.arguments,
|
||||
super.restorationId,
|
||||
});
|
||||
|
||||
@override
|
||||
Route<T> createRoute(BuildContext context) => DialogRoute<T>(
|
||||
context: context,
|
||||
settings: this,
|
||||
builder: (context) => Dialog(
|
||||
child: builder(context),
|
||||
),
|
||||
anchorPoint: anchorPoint,
|
||||
barrierColor: barrierColor,
|
||||
barrierDismissible: barrierDismissible,
|
||||
barrierLabel: barrierLabel,
|
||||
useSafeArea: useSafeArea,
|
||||
themes: themes,
|
||||
);
|
||||
}
|
||||
@@ -82,12 +82,14 @@ SystemUiOverlayStyle buildOverlayStyle(
|
||||
Brightness.light => SystemUiOverlayStyle.dark.copyWith(
|
||||
systemNavigationBarColor: color,
|
||||
systemNavigationBarDividerColor: color,
|
||||
statusBarColor: theme.colorScheme.background,
|
||||
// statusBarColor: theme.colorScheme.background,
|
||||
// systemNavigationBarDividerColor: theme.colorScheme.surface,
|
||||
),
|
||||
Brightness.dark => SystemUiOverlayStyle.light.copyWith(
|
||||
systemNavigationBarColor: color,
|
||||
systemNavigationBarDividerColor: color,
|
||||
statusBarColor: theme.colorScheme.background,
|
||||
// statusBarColor: theme.colorScheme.background,
|
||||
// systemNavigationBarDividerColor: theme.colorScheme.surface,
|
||||
),
|
||||
|
||||
92
pubspec.lock
92
pubspec.lock
@@ -225,6 +225,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.2"
|
||||
color:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: color
|
||||
sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -289,6 +297,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
dartx:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dartx
|
||||
sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -492,6 +508,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
flutter_gen_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_gen_core
|
||||
sha256: "8b4ff1d45d125e576e26ea99d15e0419bb3c45b53696e022880866b78bb6b830"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.3.2"
|
||||
flutter_gen_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_gen_runner
|
||||
sha256: fd197f8c657e79313d53d3934de602ebe604ba722a84c88ae3a43cd90428c67a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.3.2"
|
||||
flutter_html:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -585,6 +617,14 @@ packages:
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_markdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_markdown
|
||||
sha256: "8afc9a6aa6d8e8063523192ba837149dbf3d377a37c0b0fc579149a1fbd4a619"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.18"
|
||||
flutter_native_splash:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -661,10 +701,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: "6ff9fa12892ae074092de2fa6a9938fb21dbabfdaa2ff57dc697ff912fc8d4b2"
|
||||
sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.6"
|
||||
version: "2.0.7"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@@ -965,6 +1005,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
markdown:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: markdown
|
||||
sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.1.1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1099,14 +1147,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.3"
|
||||
path_drawing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_drawing
|
||||
sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1648,6 +1688,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.3"
|
||||
time:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: time
|
||||
sha256: "83427e11d9072e038364a5e4da559e85869b227cf699a541be0da74f14140124"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1760,6 +1808,30 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.7"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.7"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_codec
|
||||
sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.7"
|
||||
vector_graphics_compiler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.7"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
18
pubspec.yaml
18
pubspec.yaml
@@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||
# Read more about iOS versioning at
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
version: 3.0.5+52
|
||||
version: 3.0.6+53
|
||||
|
||||
environment:
|
||||
sdk: ">=3.0.0 <4.0.0"
|
||||
@@ -41,7 +41,7 @@ dependencies:
|
||||
image: ^4.0.17
|
||||
photo_view: ^0.14.0
|
||||
intl: ^0.18.1
|
||||
flutter_svg: ^1.0.3
|
||||
flutter_svg: ^2.0.7
|
||||
url_launcher: ^6.1.2
|
||||
file_picker: ^5.2.4
|
||||
web_socket_channel: ^2.2.0
|
||||
@@ -97,6 +97,7 @@ dependencies:
|
||||
transparent_image: ^2.0.1
|
||||
flutter_animate: ^4.2.0+1
|
||||
shared_preferences: ^2.2.1
|
||||
flutter_markdown: ^0.6.18
|
||||
# camerawesome: ^2.0.0-dev.1
|
||||
|
||||
dependency_overrides:
|
||||
@@ -119,9 +120,20 @@ dev_dependencies:
|
||||
mock_server:
|
||||
path: packages/mock_server
|
||||
go_router_builder: ^2.3.3
|
||||
flutter_gen_runner: ^5.3.2
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
# The following section is specific to Flutter.
|
||||
|
||||
flutter_gen:
|
||||
output: lib/generated/ # Optional (default: lib/gen/)
|
||||
line_length: 80 # Optional (default: 80)
|
||||
|
||||
# Optional
|
||||
integrations:
|
||||
flutter_svg: true
|
||||
|
||||
|
||||
flutter:
|
||||
generate: true
|
||||
# The following line ensures that the Material Icons font is
|
||||
@@ -138,6 +150,8 @@ flutter:
|
||||
- test/fixtures/tags/
|
||||
- test/fixtures/preview/
|
||||
- test/fixtures/document_types/
|
||||
- assets/changelogs/
|
||||
|
||||
# An image asset can refer to one or more resolution-specific "variants", see
|
||||
# https://flutter.dev/assets-and-images/#resolution-aware.
|
||||
# For details regarding adding assets from package dependencies, see
|
||||
|
||||
22
scripts/update_changelogs.sh
Normal file
22
scripts/update_changelogs.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
__script_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||
__target_dir=$__script_dir/../assets/changelogs
|
||||
readonly __script_dir
|
||||
# Receives locale as first argument
|
||||
function mergeChangelogs () {
|
||||
__target_file=$__target_dir/changelogs_$1.md
|
||||
rm -f $__target_file
|
||||
touch $__target_file
|
||||
ls $__script_dir/../android/fastlane/metadata/android/$1/changelogs/[0-9]*.txt | tac | while read f; do
|
||||
__build_number="${f%.*}"
|
||||
echo "# $(basename -- $__build_number)" >> $__target_file
|
||||
cat $f >> $__target_file
|
||||
printf "\n\n" >> $__target_file
|
||||
done
|
||||
}
|
||||
|
||||
mergeChangelogs 'en-US'
|
||||
mergeChangelogs 'de-DE'
|
||||
|
||||
Reference in New Issue
Block a user