2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-28 05:26:47 +00:00

Adds pre-generated file for mapping icon names to icon hex values (#235)

* Adds pre-generated file for mapping icon names to icon hex values

* Remove unused import

* Simple method for converting icon string into useable data

* Add rendering for category list and location list

* Add custom icons to detail views

* Updated release notes
This commit is contained in:
Oliver 2022-12-18 00:06:11 +11:00 committed by GitHub
parent 8639ccf79e
commit f339ac249b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 1530 additions and 2 deletions

View File

@ -1,6 +1,14 @@
## InvenTree App Release Notes
---
### 0.9.2 - December 2022
---
- Support custom icons for part category
- Support custom icons for stock location
- Updated translations
### 0.9.1 - December 2022
---

1461
lib/fa_icon_mapping.dart Normal file

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,9 @@ import "package:url_launcher/url_launcher.dart";
import "package:path/path.dart" as path;
import "package:inventree/l10.dart";
import "package:inventree/api_form.dart";
import "package:inventree/fa_icon_mapping.dart";
import "package:inventree/l10.dart";
// Paginated response object
@ -148,6 +149,61 @@ class InvenTreeModel {
// Legacy API provided external link as "URL", while newer API uses "link"
String get link => (jsondata["link"] ?? jsondata["URL"] ?? "") as String;
/*
* Attempt to extract a custom icon for this model.
* If icon data is provided, attempt to convert to a FontAwesome icon
*
* Icon data *should* be presented something like "fas fa-boxes" / "fab fa-github" (etc):
*
* - First part specifies the *style*
* - Second part specifies the icon
*
*/
FaIcon? get customIcon {
String icon = (jsondata["icon"] ?? "").toString();
// Empty icon (default)
if (icon.isEmpty) {
return null;
}
final split = icon.trim().split(" ");
// Must have two distinct units
if (split.length != 2) {
return null;
}
String style = split[0];
String name = split[1];
// Remove "fa-" leading text (if provided)
if (name.startsWith("fa-")) {
name = name.substring(3);
}
int? iconHex = fontAwesomeIconMap[name];
// No match for the icon name
if (iconHex == null) {
return null;
}
switch (style) {
case "fas":
return FaIcon(IconDataSolid(iconHex));
case "fab":
return FaIcon(IconDataBrands(iconHex));
case "fa":
return FaIcon(IconDataRegular(iconHex));
case "fal":
return FaIcon(IconDataLight(iconHex));
default:
// No match
return null;
}
}
/* Extract any custom barcode data available for the model.
* Note that old API used 'uid' (only for StockItem),
* but this was updated to use 'barcode_hash'

View File

@ -114,6 +114,7 @@ class _CategoryDisplayState extends RefreshableState<CategoryDisplayWidget> {
style: TextStyle(fontWeight: FontWeight.bold)
),
subtitle: Text("${category?.description}"),
leading: category!.customIcon ?? FaIcon(FontAwesomeIcons.sitemap),
),
];

View File

@ -112,6 +112,7 @@ class _PaginatedPartCategoryListState extends PaginatedSearchState<PaginatedPart
title: Text(category.name),
subtitle: Text(category.pathstring),
trailing: Text("${category.partcount}"),
leading: category.customIcon,
onTap: () {
Navigator.push(
context,

View File

@ -211,7 +211,7 @@ class _LocationDisplayState extends RefreshableState<LocationDisplayWidget> {
ListTile(
title: Text("${location!.name}"),
subtitle: Text("${location!.description}"),
leading: FaIcon(FontAwesomeIcons.boxes),
leading: location!.customIcon ?? FaIcon(FontAwesomeIcons.boxes),
),
];

View File

@ -97,6 +97,7 @@ class _PaginatedStockLocationListState extends PaginatedSearchState<PaginatedSto
title: Text(location.name),
subtitle: Text(location.pathstring),
trailing: Text("${location.itemcount}"),
leading: location.customIcon,
onTap: () {
Navigator.push(
context,