Compare commits

..

10 commits

Author SHA1 Message Date
HendrikRauh
96627adf7b Update .gitignore and add flake.nix patching script for Flutter version management
Some checks failed
Android / build (push) Has been cancelled
CI / test (push) Has been cancelled
iOS / build (push) Has been cancelled
2026-01-10 14:16:05 +01:00
HendrikRauh
0546fba37f Update NOTE.md to add troubleshooting section for Flutter Java version issues
Some checks are pending
Android / build (push) Waiting to run
CI / test (push) Waiting to run
iOS / build (push) Waiting to run
2026-01-10 00:37:58 +01:00
HendrikRauh
5f623c0594 Add .envrc for Nix environment setup 2026-01-09 23:13:28 +01:00
Oliver
bf19ace3e9
New Crowdin updates (#742)
* New translations app_en.arb (Turkish)

* New translations app_en.arb (Persian)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Spanish, Mexico)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Chinese Simplified)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Danish)

* New translations app_en.arb (Danish)

* New translations app_en.arb (Danish)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Polish)

* New translations app_en.arb (Romanian)

* New translations app_en.arb (Romanian)

* New translations app_en.arb (Danish)

* New translations app_en.arb (Romanian)
2026-01-07 10:38:10 +11:00
Oliver
8c15bdafdf
New Crowdin updates (#740)
* New translations app_en.arb (Hungarian)

* New translations app_en.arb (Hungarian)

* New translations app_en.arb (Dutch)

* New translations app_en.arb (Dutch)

* New translations app_en.arb (Swedish)

* New translations app_en.arb (Ukrainian)

* New translations app_en.arb (Ukrainian)

* New translations app_en.arb (German)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Italian)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Turkish)

* New translations app_en.arb (Romanian)
2025-12-19 09:52:38 +11:00
Oliver
571ff1880f
New translations app_en.arb (Chinese Simplified) (#739) 2025-12-06 11:24:17 +11:00
Oliver
864c3eea76
Parameters refactor (#738)
* refactor attachment code into its own file

* Add getters

* Remove custom models for each type of attachment

* Refactor existing widgets

* Fix double camera open bug

* Add check for modern parameter API

* Add generic parameter type

* Remove old code

* Remove dead code

* Refactor previous widget

* Remove unused imports

* Refactor common code

* format

* Update release notes

* Helper func to render parameters list tile

* Display parameters on part page

* parameters for company

* Supplier more model types:

- ManufacturerPart
- SupplierPart
- PurchaseOrder
- SalesOrder

* dart format

* Fix image prefix

* Remove unused import

* Adjust API version
2025-12-04 18:34:05 +11:00
Oliver
346b1a150f
Attachments refactor (#737)
* refactor attachment code into its own file

* Add getters

* Remove custom models for each type of attachment

* Refactor existing widgets

* Fix double camera open bug

* Remove dead code

* Remove unused imports

* Refactor common code

* format

* Update release notes
2025-11-28 23:53:10 +11:00
Oliver
bb10117f01
New Crowdin updates (#736)
* New translations app_en.arb (Czech)

* New translations app_en.arb (Russian)
2025-11-28 20:01:55 +11:00
Oliver
0f31638bdc
[CI] Build Fixes (#734)
* precache for ios build

* build android on push too

* try without cache
2025-11-24 09:10:59 +11:00
45 changed files with 2063 additions and 1607 deletions

14
.envrc Normal file
View file

@ -0,0 +1,14 @@
# Check if nix is available
if command -v nix &> /dev/null; then
use flake
echo "✅ Nix development environment loaded"
else
# Nix is not available - show instructions for non-Nix users
echo "⚠️ Nix not detected. Please ensure the following are installed manually:"
echo " - Java JDK 17"
echo " - Python 3 with invoke package"
echo " - Android SDK"
echo " - FVM (Flutter Version Management)"
echo "💡 To use Nix: Install from https://nixos.org/download.html"
fi

View file

@ -3,6 +3,9 @@
name: Android
on:
pull_request:
branches:
- master
push:
branches:
- master
@ -30,7 +33,7 @@ jobs:
with:
flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
cache: true
cache: false
cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:"
cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:"
pub-cache-key: "flutter-pub:os:-:channel:-:version:-:arch:-:hash:"

View file

@ -3,6 +3,9 @@
name: iOS
on:
pull_request:
branches:
- master
push:
branches:
- master
@ -33,7 +36,7 @@ jobs:
with:
flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
cache: true
cache: false
cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:"
cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:"
pub-cache-key: "flutter-pub:os:-:channel:-:version:-:arch:-:hash:"
@ -49,6 +52,7 @@ jobs:
dart pub global activate fvm
fvm install
fvm flutter pub get
fvm flutter precache --ios
cd ios
pod repo update
pod install

2
.gitignore vendored
View file

@ -8,6 +8,8 @@
.buildlog/
.history
.svn/
.direnv
flake.nix.bak
coverage/*

47
NOTE.md Normal file
View file

@ -0,0 +1,47 @@
## Codeänderung
- android/app/build.gradle: compileSdkVersion/targetSdkVersion auf 36 angehoben,
weil mehrere Plugins SDK 36 voraussetzen.
## Devbuild (out of the box)
```sh
invoke translate
flutter build apk --debug
```
## Releasebuild (benötigt Signatur; interaktiv)
Signatur erstellen; Passwörter merken!:
```sh
keytool -genkey -v -keystore ~/inventree-release-key.jks \
-keyalg RSA -keysize 2048 \
-alias inventree
```
android/key.properties anlegen mit:
```properties
storePassword=DEIN_STORE_PASSWORD
keyPassword=DEIN_KEY_PASSWORD
keyAlias=inventree
storeFile=/.../inventree-release-key.jks
```
```sh
invoke translate
fvm flutter build apk --release --no-tree-shake-icons
```
## Pipe
1. nix installieren (für flake nutzung) (optional aber dann reproduzierbar)
2. flake anwenden
## Problems that occurred
### Flutter Java Version Problem
- unset flutter jdk-dir (`flutter config --jdk-dir=""`)
- a specified java version in the flutter config leads to a java

View file

@ -1,3 +1,8 @@
### x.xx.x - Month Year
---
- Fixes bug which launched camera twice when uploading an attachment
### 0.21.1 - November 2025
---

78
flake.lock generated Normal file
View file

@ -0,0 +1,78 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-dhhvQY67aboBk8b0/u0XB6vwHdgbROZT3fJAjyNh5Ww=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-flutter": {
"locked": {
"lastModified": 1751285371,
"narHash": "sha256-/hDU+2AUeFFu5qGHO/UyFMc4UG/x5Cw5uXO36KGTk6c=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"nixpkgs-flutter": "nixpkgs-flutter"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

137
flake.nix Normal file
View file

@ -0,0 +1,137 @@
{
description = "InvenTree App Development Environment - CTBK";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
nixpkgs-flutter.url = "github:NixOS/nixpkgs/b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b";
};
outputs =
{
self,
nixpkgs,
flake-utils,
nixpkgs-flutter,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
android_sdk.accept_license = true;
};
overlays = [
(final: prev: {
flutter-pkg = import (self.inputs.nixpkgs-flutter) { inherit system; };
})
];
};
androidSdk =
(pkgs.androidenv.composeAndroidPackages {
platformVersions = [
"36"
"35"
"34"
];
buildToolsVersions = [
"36.0.0"
"34.0.0"
];
includeEmulator = true;
includeNDK = true;
ndkVersions = [ "26.1.10909125" ];
cmakeVersions = [
"3.31.6"
"3.22.1"
];
}).androidsdk;
# FVM wrapper for NixOS - maps fvm commands to Nix-managed Flutter
fvm-wrapper = pkgs.writeShellScriptBin "fvm" ''
case "$1" in
use)
# 'fvm use' is a no-op on NixOS since Flutter is version-managed by Nix
echo " Using Flutter from Nix ($(flutter --version | head -n1))"
exit 0
;;
flutter)
# 'fvm flutter ...' becomes 'flutter ...'
shift
exec flutter "$@"
;;
*)
echo "fvm wrapper: command '$1' not implemented (using Nix-managed Flutter)" >&2
exit 1
;;
esac
'';
in
{
devShells.default = pkgs.mkShell {
buildInputs =
with pkgs;
[
# Mobile development
pkgs.flutter-pkg.flutter
fvm-wrapper
jdk17
# Build tools
android-tools
gradle
# Python & task runner
python3
python3Packages.invoke
jq
# System dependencies for Flutter on Linux
git
curl
unzip
which
]
++ lib.optionals stdenv.isLinux [
gtk3
glib
pcre
libepoxy
libxkbcommon
dbus
at-spi2-core
file
];
shellHook = ''
export ANDROID_HOME="${androidSdk}/libexec/android-sdk"
export ANDROID_SDK_ROOT="$ANDROID_HOME"
export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools/bin:$PATH"
export JAVA_HOME="${pkgs.jdk17}"
export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_HOME/build-tools/34.0.0/aapt2"
echo "🚀 InvenTree App Development Environment - CTBK"
echo "📦 Tools: Flutter, FVM, JDK17, Android SDK"
echo "📋 Run: invoke android # Build Android app"
'';
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath (
with pkgs;
[
gtk3
glib
pcre
libepoxy
libxkbcommon
dbus
at-spi2-core
]
);
};
}
);
}

View file

@ -353,6 +353,10 @@ class InvenTreeAPI {
// Supports separate search against "supplier" / "customer" / "manufacturer"
bool get supportsSplitCompanySearch => apiVersion >= 315;
// Does the server support the "modern" (consolidated) parameter API?
// Ref: https://github.com/inventree/InvenTree/pull/10699
bool get supportsModernParameters => apiVersion >= 429;
// Cached list of plugins (refreshed when we connect to the server)
List<InvenTreePlugin> _plugins = [];

View file

@ -0,0 +1,176 @@
import "dart:io";
import "package:flutter/cupertino.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/api.dart";
import "package:inventree/inventree/model.dart";
import "package:inventree/inventree/sentry.dart";
import "package:inventree/l10.dart";
import "package:inventree/widget/fields.dart";
import "package:inventree/widget/snacks.dart";
import "package:path/path.dart" as path;
class InvenTreeAttachment extends InvenTreeModel {
// Class representing an "attachment" file
InvenTreeAttachment() : super();
InvenTreeAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
InvenTreeAttachment createFromJson(Map<String, dynamic> json) =>
InvenTreeAttachment.fromJson(json);
@override
String get URL => "attachment/";
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, Map<String, dynamic>> fields = {"link": {}, "comment": {}};
if (!hasLink) {
fields.remove("link");
}
return fields;
}
// The model type of the instance this attachment is associated with
String get modelType => getString("model_type");
// The ID of the instance this attachment is associated with
int get modelId => getInt("model_id");
String get attachment => getString("attachment");
bool get hasAttachment => attachment.isNotEmpty;
// Return the filename of the attachment
String get filename {
return attachment.split("/").last;
}
IconData get icon {
String fn = filename.toLowerCase();
if (fn.endsWith(".pdf")) {
return TablerIcons.file_type_pdf;
} else if (fn.endsWith(".csv")) {
return TablerIcons.file_type_csv;
} else if (fn.endsWith(".doc") || fn.endsWith(".docx")) {
return TablerIcons.file_type_doc;
} else if (fn.endsWith(".xls") || fn.endsWith(".xlsx")) {
return TablerIcons.file_type_xls;
}
// Image formats
final List<String> img_formats = [".png", ".jpg", ".gif", ".bmp", ".svg"];
for (String fmt in img_formats) {
if (fn.endsWith(fmt)) {
return TablerIcons.file_type_jpg;
}
}
return TablerIcons.file;
}
String get comment => getString("comment");
DateTime? get uploadDate {
if (jsondata.containsKey("upload_date")) {
return DateTime.tryParse((jsondata["upload_date"] ?? "") as String);
} else {
return null;
}
}
// Return a count of how many attachments exist against the specified model ID
Future<int> countAttachments(String modelType, int modelId) async {
Map<String, String> filters = {};
if (!api.supportsModernAttachments) {
return 0;
}
filters["model_type"] = modelType;
filters["model_id"] = modelId.toString();
return count(filters: filters);
}
Future<bool> uploadAttachment(
File attachment,
String modelType,
int modelId, {
String comment = "",
Map<String, String> fields = const {},
}) async {
// Ensure that the correct reference field is set
Map<String, String> data = Map<String, String>.from(fields);
String url = URL;
if (comment.isNotEmpty) {
data["comment"] = comment;
}
data["model_type"] = modelType;
data["model_id"] = modelId.toString();
final APIResponse response = await InvenTreeAPI().uploadFile(
url,
attachment,
method: "POST",
name: "attachment",
fields: data,
);
return response.successful();
}
Future<bool> uploadImage(
String modelType,
int modelId, {
String prefix = "InvenTree",
}) async {
bool result = false;
await FilePickerDialog.pickImageFromCamera().then((File? file) {
if (file != null) {
String dir = path.dirname(file.path);
String ext = path.extension(file.path);
String now = DateTime.now().toIso8601String().replaceAll(":", "-");
// Rename the file with a unique name
String filename = "${dir}/${prefix}_image_${now}${ext}";
try {
return file.rename(filename).then((File renamed) {
return uploadAttachment(renamed, modelType, modelId).then((
success,
) {
result = success;
showSnackIcon(
result ? L10().imageUploadSuccess : L10().imageUploadFailure,
success: result,
);
});
});
} catch (error, stackTrace) {
sentryReportError("uploadImage", error, stackTrace);
showSnackIcon(L10().imageUploadFailure, success: false);
}
}
});
return result;
}
/*
* Download this attachment file
*/
Future<void> downloadAttachment() async {
await InvenTreeAPI().downloadFile(attachment);
}
}

View file

@ -111,31 +111,6 @@ class InvenTreeCompany extends InvenTreeModel {
InvenTreeCompany.fromJson(json);
}
/*
* Class representing an attachment file against a Company object
*/
class InvenTreeCompanyAttachment extends InvenTreeAttachment {
InvenTreeCompanyAttachment() : super();
InvenTreeCompanyAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get REFERENCE_FIELD => "company";
@override
String get REF_MODEL_TYPE => "company";
@override
String get URL => InvenTreeAPI().supportsModernAttachments
? "attachment/"
: "company/attachment/";
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreeCompanyAttachment.fromJson(json);
}
/*
* The InvenTreeSupplierPart class represents the SupplierPart model in the InvenTree database
*/

View file

@ -1,5 +1,4 @@
import "dart:async";
import "dart:io";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:flutter/material.dart";
@ -15,7 +14,6 @@ import "package:inventree/helpers.dart";
import "package:inventree/inventree/sentry.dart";
import "package:inventree/widget/dialogs.dart";
import "package:inventree/widget/fields.dart";
// Paginated response object
class InvenTreePageResponse {
@ -934,171 +932,3 @@ class InvenTreeUserSetting extends InvenTreeGlobalSetting {
@override
String get URL => "settings/user/";
}
class InvenTreeAttachment extends InvenTreeModel {
// Class representing an "attachment" file
InvenTreeAttachment() : super();
InvenTreeAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get URL => "attachment/";
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, Map<String, dynamic>> fields = {"link": {}, "comment": {}};
if (!hasLink) {
fields.remove("link");
}
return fields;
}
// Override this reference field for any subclasses
// Note: This is used for the *legacy* attachment API
String get REFERENCE_FIELD => "";
// Override this reference field for any subclasses
// Note: This is used for the *modern* attachment API
String get REF_MODEL_TYPE => "";
String get attachment => getString("attachment");
bool get hasAttachment => attachment.isNotEmpty;
// Return the filename of the attachment
String get filename {
return attachment.split("/").last;
}
IconData get icon {
String fn = filename.toLowerCase();
if (fn.endsWith(".pdf")) {
return TablerIcons.file_type_pdf;
} else if (fn.endsWith(".csv")) {
return TablerIcons.file_type_csv;
} else if (fn.endsWith(".doc") || fn.endsWith(".docx")) {
return TablerIcons.file_type_doc;
} else if (fn.endsWith(".xls") || fn.endsWith(".xlsx")) {
return TablerIcons.file_type_xls;
}
// Image formats
final List<String> img_formats = [".png", ".jpg", ".gif", ".bmp", ".svg"];
for (String fmt in img_formats) {
if (fn.endsWith(fmt)) {
return TablerIcons.file_type_jpg;
}
}
return TablerIcons.file;
}
String get comment => getString("comment");
DateTime? get uploadDate {
if (jsondata.containsKey("upload_date")) {
return DateTime.tryParse((jsondata["upload_date"] ?? "") as String);
} else {
return null;
}
}
// Return a count of how many attachments exist against the specified model ID
Future<int> countAttachments(int modelId) {
Map<String, String> filters = {};
if (InvenTreeAPI().supportsModernAttachments) {
filters["model_type"] = REF_MODEL_TYPE;
filters["model_id"] = modelId.toString();
} else {
filters[REFERENCE_FIELD] = modelId.toString();
}
return count(filters: filters);
}
Future<bool> uploadAttachment(
File attachment,
int modelId, {
String comment = "",
Map<String, String> fields = const {},
}) async {
// Ensure that the correct reference field is set
Map<String, String> data = Map<String, String>.from(fields);
String url = URL;
if (comment.isNotEmpty) {
data["comment"] = comment;
}
if (InvenTreeAPI().supportsModernAttachments) {
url = "attachment/";
data["model_id"] = modelId.toString();
data["model_type"] = REF_MODEL_TYPE;
} else {
if (REFERENCE_FIELD.isEmpty) {
sentryReportMessage(
"uploadAttachment called with empty 'REFERENCE_FIELD'",
);
return false;
}
data[REFERENCE_FIELD] = modelId.toString();
}
final APIResponse response = await InvenTreeAPI().uploadFile(
url,
attachment,
method: "POST",
name: "attachment",
fields: data,
);
return response.successful();
}
Future<bool> uploadImage(int modelId, {String prefix = "InvenTree"}) async {
bool result = false;
await FilePickerDialog.pickImageFromCamera().then((File? file) {
if (file != null) {
String dir = path.dirname(file.path);
String ext = path.extension(file.path);
String now = DateTime.now().toIso8601String().replaceAll(":", "-");
// Rename the file with a unique name
String filename = "${dir}/${prefix}_image_${now}${ext}";
try {
file.rename(filename).then((File renamed) {
uploadAttachment(renamed, modelId).then((success) {
result = success;
showSnackIcon(
result ? L10().imageUploadSuccess : L10().imageUploadFailure,
success: result,
);
});
});
} catch (error, stackTrace) {
sentryReportError("uploadImage", error, stackTrace);
showSnackIcon(L10().imageUploadFailure, success: false);
}
}
});
return result;
}
/*
* Download this attachment file
*/
Future<void> downloadAttachment() async {
await InvenTreeAPI().downloadFile(attachment);
}
}

View file

@ -0,0 +1,77 @@
import "package:inventree/inventree/model.dart";
class InvenTreeParameter extends InvenTreeModel {
InvenTreeParameter() : super();
InvenTreeParameter.fromJson(Map<String, dynamic> json) : super.fromJson(json);
@override
InvenTreeParameter createFromJson(Map<String, dynamic> json) =>
InvenTreeParameter.fromJson(json);
@override
String get URL => "parameter/";
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, Map<String, dynamic>> fields = {
"header": {
"type": "string",
"read_only": true,
"label": name,
"help_text": description,
"value": "",
},
"data": {"type": "string"},
"note": {},
};
return fields;
}
@override
String get name => getString("name", subKey: "template_detail");
@override
String get description => getString("description", subKey: "template_detail");
String get value => getString("data");
String get valueString {
String v = value;
if (units.isNotEmpty) {
v += " ";
v += units;
}
return v;
}
bool get as_bool => value.toLowerCase() == "true";
String get units => getString("units", subKey: "template_detail");
bool get is_checkbox =>
getBool("checkbox", subKey: "template_detail", backup: false);
// The model type of the instance this attachment is associated with
String get modelType => getString("model_type");
// The ID of the instance this attachment is associated with
int get modelId => getInt("model_id");
// Return a count of how many parameters exist against the specified model ID
Future<int> countParameters(String modelType, int modelId) async {
Map<String, String> filters = {};
if (!api.supportsModernParameters) {
return 0;
}
filters["model_type"] = modelType;
filters["model_id"] = modelId.toString();
return count(filters: filters);
}
}

View file

@ -132,68 +132,6 @@ class InvenTreePartTestTemplate extends InvenTreeModel {
}
}
/*
Class representing the PartParameter database model
*/
class InvenTreePartParameter extends InvenTreeModel {
InvenTreePartParameter() : super();
InvenTreePartParameter.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get URL => "part/parameter/";
@override
List<String> get rolesRequired => ["part"];
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreePartParameter.fromJson(json);
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, Map<String, dynamic>> fields = {
"header": {
"type": "string",
"read_only": true,
"label": name,
"help_text": description,
"value": "",
},
"data": {"type": "string"},
};
return fields;
}
@override
String get name => getString("name", subKey: "template_detail");
@override
String get description => getString("description", subKey: "template_detail");
String get value => getString("data");
String get valueString {
String v = value;
if (units.isNotEmpty) {
v += " ";
v += units;
}
return v;
}
bool get as_bool => value.toLowerCase() == "true";
String get units => getString("units", subKey: "template_detail");
bool get is_checkbox =>
getBool("checkbox", subKey: "template_detail", backup: false);
}
/*
* Class representing the Part database model
*/
@ -547,28 +485,3 @@ class InvenTreePartPricing extends InvenTreeModel {
double? get saleHistoryMin => getDoubleOrNull("sale_history_min");
double? get saleHistoryMax => getDoubleOrNull("sale_history_max");
}
/*
* Class representing an attachment file against a Part object
*/
class InvenTreePartAttachment extends InvenTreeAttachment {
InvenTreePartAttachment() : super();
InvenTreePartAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get REFERENCE_FIELD => "part";
@override
String get REF_MODEL_TYPE => "part";
@override
String get URL => InvenTreeAPI().supportsModernAttachments
? "attachment/"
: "part/attachment/";
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreePartAttachment.fromJson(json);
}

View file

@ -336,28 +336,3 @@ class InvenTreePOExtraLineItem extends InvenTreeExtraLineItem {
);
}
}
/*
* Class representing an attachment file against a PurchaseOrder object
*/
class InvenTreePurchaseOrderAttachment extends InvenTreeAttachment {
InvenTreePurchaseOrderAttachment() : super();
InvenTreePurchaseOrderAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get REFERENCE_FIELD => "order";
@override
String get REF_MODEL_TYPE => "purchaseorder";
@override
String get URL => InvenTreeAPI().supportsModernAttachments
? "attachment/"
: "order/po/attachment/";
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreePurchaseOrderAttachment.fromJson(json);
}

View file

@ -334,7 +334,7 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel {
/*
* Class representing an allocation of stock against a SalesOrderShipment
*/
class InvenTreeSalesOrderAllocation extends InvenTreeAttachment {
class InvenTreeSalesOrderAllocation extends InvenTreeModel {
InvenTreeSalesOrderAllocation() : super();
InvenTreeSalesOrderAllocation.fromJson(Map<String, dynamic> json)
@ -428,48 +428,3 @@ class InvenTreeSalesOrderAllocation extends InvenTreeAttachment {
}
}
}
/*
* Class representing an attachment file against a SalesOrder object
*/
class InvenTreeSalesOrderAttachment extends InvenTreeAttachment {
InvenTreeSalesOrderAttachment() : super();
InvenTreeSalesOrderAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreeSalesOrderAttachment.fromJson(json);
@override
String get REFERENCE_FIELD => "order";
@override
String get REF_MODEL_TYPE => "salesorder";
@override
String get URL => InvenTreeAPI().supportsModernAttachments
? "attachment/"
: "order/so/attachment/";
}
class InvenTreeSalesOrderShipmentAttachment extends InvenTreeAttachment {
InvenTreeSalesOrderShipmentAttachment() : super();
InvenTreeSalesOrderShipmentAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreeSalesOrderShipmentAttachment.fromJson(json);
@override
String get REFERENCE_FIELD => "shipment";
@override
String get REF_MODEL_TYPE => "salesordershipment";
@override
String get URL => "attachment/";
}

View file

@ -575,31 +575,6 @@ class InvenTreeStockItem extends InvenTreeModel {
}
}
/*
* Class representing an attachment file against a StockItem object
*/
class InvenTreeStockItemAttachment extends InvenTreeAttachment {
InvenTreeStockItemAttachment() : super();
InvenTreeStockItemAttachment.fromJson(Map<String, dynamic> json)
: super.fromJson(json);
@override
String get REFERENCE_FIELD => "stock_item";
@override
String get REF_MODEL_TYPE => "stockitem";
@override
String get URL => InvenTreeAPI().supportsModernAttachments
? "attachment/"
: "stock/attachment/";
@override
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
InvenTreeStockItemAttachment.fromJson(json);
}
class InvenTreeStockLocation extends InvenTreeModel {
InvenTreeStockLocation() : super();

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Skenování čárových kódů pozastaveno",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Kliknutím pozastavíte skenování",
"@barcodeScanPause": {},
"barcodeScanAssign": "Skenovat pro přiřazení čárového kódu",
"@barcodeScanAssign": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Klíčová slova",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Ovladač pro popisky",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Vyberte ovladač pro tiskárnu štítků",
"@labelSelectDriver": {},
"labelPrinting": "Tisk štítku",
"@labelPrinting": {},

File diff suppressed because it is too large Load diff

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Barcode-Scannen angehalten",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Tippen um das Scannen zu pausieren",
"@barcodeScanPause": {},
"barcodeScanAssign": "Scannen um Barcode zuzuweisen",
"@barcodeScanAssign": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Schlüsselwörter",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Etikettendrucker Treiber",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Etikettendrucker Treiber auswählen",
"@labelSelectDriver": {},
"labelPrinting": "Etikettendruck",
"@labelPrinting": {},
@ -944,29 +944,29 @@
"@shipment": {},
"shipments": "Lieferungen",
"@shipments": {},
"shipmentsPending": "Ausstehende Sendungen",
"shipmentsPending": "Ausstehende Lieferungen",
"@shipmentsPending": {},
"shipmentAdd": "Lieferung hinzufügen",
"@shipmentAdd": {},
"shipmentCheck": "Sendung prüfen",
"shipmentCheck": "Lieferung überprüfen",
"@shipmentCheck": {},
"shipmentCheckDetail": "Diese Sendung als geprüft markieren",
"shipmentCheckDetail": "Diese Lieferung als geprüft markieren",
"@shipmentCheckDetail": {},
"shipmentChecked": "Sendung geprüft",
"shipmentChecked": "Lieferung überprüft",
"@shipmentChecked": {},
"shipmentDate": "Versanddatum",
"@shipmentDate": {},
"shipmentEdit": "Sendung bearbeiten",
"shipmentEdit": "Lieferung bearbeiten",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"shipmentReference": "Sendungsreferenz",
"@shipmentReference": {},
"shipmentSend": "Lieferung versenden",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Lieferung ungeprüft markieren",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "Diese Lieferung als ungeprüft markieren",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "Lieferung Aktualisiert",
"@shipmentUpdated": {},
"shipped": "Versandt",
"@shipped": {},
@ -1102,7 +1102,7 @@
"@timeout": {
"description": ""
},
"toggleTorch": "Toggle Torch",
"toggleTorch": "Taschenlampe umschalten",
"@toggleTorch": {},
"tokenError": "Token-Fehler",
"@tokenError": {},
@ -1182,7 +1182,7 @@
"@priceRange": {},
"priceOverrideMin": "Mindestpreis überschreiben",
"@priceOverrideMin": {},
"priceOverrideMax": "Maximum Price Override",
"priceOverrideMax": "Maximalen Preis ignorieren",
"@priceOverrideMax": {},
"salePrice": "Verkaufspreis",
"@salePrice": {},
@ -1198,7 +1198,7 @@
"@variantCost": {},
"overallPricing": "Gesamt Preise",
"@overallPricing": {},
"pricingOverrides": "Pricing Overrides",
"pricingOverrides": "Preisgestaltung ignorieren",
"@pricingOverrides": {},
"currency": "Währung",
"@currency": {},

View file

@ -962,7 +962,7 @@
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Deseleccionar Envío",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"@shipmentUncheckDetail": {},
@ -1068,7 +1068,7 @@
"@suppliers": {},
"supplierReference": "Referencia del proveedor",
"@supplierReference": {},
"switchCamera": "Switch Camera",
"switchCamera": "Cambiar Cámara",
"@switchCamera": {},
"takePicture": "Tomar una foto",
"@takePicture": {},
@ -1148,7 +1148,7 @@
"@uploadFailed": {},
"uploadSuccess": "Archivo subido",
"@uploadSuccess": {},
"uploadImage": "Upload Image",
"uploadImage": "Subir Imagen",
"@uploadImage": {},
"usedIn": "Usado en",
"@usedIn": {},

View file

@ -36,17 +36,17 @@
"@appDetails": {},
"allocated": "اختصاص داده شده",
"@allocated": {},
"aspectRatio16x9": "16:9",
"aspectRatio16x9": "۱۶ به ۹",
"@aspectRatio16x9": {},
"aspectRatio3x2": "3:2",
"aspectRatio3x2": "۳ به ۲",
"@aspectRatio3x2": {},
"aspectRatio4x3": "4:3",
"aspectRatio4x3": "۴ به ۳",
"@aspectRatio4x3": {},
"aspectRatioSquare": "Square (1:1)",
"aspectRatioSquare": "مربعی (۱ به ۱)",
"@aspectRatioSquare": {},
"allocateStock": "موجودی اختصاص داده شده",
"@allocateStock": {},
"allocatedStock": "Allocated Stock",
"allocatedStock": "موجودی اختصاص داده شده",
"@allocatedStock": {},
"appReleaseNotes": "نمایش یادداشت های انتشار برنامه",
"@appReleaseNotes": {},
@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "اسکن بارکد متوقف شد",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "برای توقف اسکن لمس کنید",
"@barcodeScanPause": {},
"barcodeScanAssign": "برای اختصاص بارکد اسکن کنید",
"@barcodeScanAssign": {},
@ -180,9 +180,9 @@
"@companyUpdated": {},
"companies": "شرکت‌ها",
"@companies": {},
"complete": "Complete",
"complete": "تکمیل",
"@complete": {},
"completeOrder": "Complete Order",
"completeOrder": "تکمیل سفارش",
"@completeOrder": {},
"completionDate": "تاریخ تکمیل",
"@completionDate": {},
@ -204,9 +204,9 @@
},
"credits": "اعتبارات",
"@credits": {},
"crop": "Crop",
"crop": "برش",
"@crop": {},
"cropImage": "Crop Image",
"cropImage": "برش تصویر",
"@cropImage": {},
"customer": "مشتری",
"@customer": {},
@ -228,11 +228,11 @@
"@delete": {},
"deleteFailed": "عملیات حذف ناموفق بوده است",
"@deleteFailed": {},
"deleteImageConfirmation": "Are you sure you want to delete this image?",
"deleteImageConfirmation": "آیا مطمئن هستید که میخواهید این تصویر را حذف کنید؟",
"@deleteImageConfirmation": {},
"deleteImageTooltip": "Delete Image",
"deleteImageTooltip": "حذف تصویر",
"@deleteImageTooltip": {},
"deleteImage": "Delete Image",
"deleteImage": "حذف تصویر",
"@deleteImage": {},
"deletePart": "حذف قسمت",
"@deletePart": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "عملیات حذف با موفقیت انجام شد",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "تاریخ تحویل",
"@deliveryDate": {},
"description": "توضیحات",
"@description": {},
@ -254,9 +254,9 @@
},
"documentation": "مستندات",
"@documentation": {},
"downloadComplete": "Download Complete",
"downloadComplete": "دانلود انجام شد",
"@downloadComplete": {},
"downloadError": "Error downloading image",
"downloadError": "خطای دانلود تصویر",
"@downloadError": {},
"downloading": "در حال دانلود فایل",
"@downloading": {},
@ -282,7 +282,7 @@
"@editItem": {},
"editLineItem": "ویرایش ایتم خط",
"@editLineItem": {},
"email": "Email",
"email": "پست الکترونیکی",
"@email": {},
"enterPassword": "رمز عبور را وارد کنید",
"@enterPassword": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "نمایش دکمه سفارش خرید در صفحه خانه",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "نمایش محموله",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "نمایش محموله در انتظار ارسال بر روی صفحه اصلی",
"@homeShowShipmentsDescription": {},
"homeShowSo": "نمایش سفارش های فروش",
"@homeShowSo": {},
@ -454,9 +454,9 @@
"@invalidSupplierPart": {},
"invalidUsernamePassword": "ترکیب نام کاربری / رمز عبور نامعتبر",
"@invalidUsernamePassword": {},
"invoice": "Invoice",
"invoice": "صورت‌حساب",
"@invoice": {},
"invoiceNumber": "Invoice Number",
"invoiceNumber": "شماره صورت‌حساب",
"@invoiceNumber": {},
"issue": "موضوع",
"@issue": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "کلمات کلیدی",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "درایور چاپگر برچسب",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "انتخاب درایور چاپگر برچسب",
"@labelSelectDriver": {},
"labelPrinting": "چاپ لیبل",
"@labelPrinting": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "مکان سهام جدید ایجاد کنید",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "مکان پیش‌فرض",
"@locationDefault": {},
"locationNotSet": "هیچ مکانی مشخص نشده است",
"@locationNotSet": {},
@ -544,9 +544,9 @@
"@missingData": {},
"name": "نام",
"@name": {},
"no": "No",
"no": "خیر",
"@no": {},
"notApplicable": "N/A",
"notApplicable": "موجود نیست",
"@notApplicable": {},
"notConnected": "متصل نیست",
"@notConnected": {},
@ -562,11 +562,11 @@
"@noResponse": {},
"noResults": "بدون نتیجه",
"@noResults": {},
"noImageAvailable": "No image available",
"noImageAvailable": "هیچ تصویری موجود نیست",
"@noImageAvailable": {},
"noPricingAvailable": "No pricing available",
"noPricingAvailable": "هیچ قیمتی موجود نیست",
"@noPricingAvailable": {},
"noPricingDataFound": "No pricing data found for this part",
"noPricingDataFound": "هیچ اطلاعات قیمتی برای این قطعه یافت نشد",
"@noPricingDataFound": {},
"noSubcategories": "بدون زیر دسته بندی",
"@noSubcategories": {},
@ -630,9 +630,9 @@
"@partsNone": {},
"partNoResults": "هیچ قطعه ای مطابق با جست و جو یافت نشد",
"@partNoResults": {},
"partPricing": "Part Pricing",
"partPricing": "قیمت‌گذاری قطعات",
"@partPricing": {},
"partPricingSettingDetail": "Display part pricing information",
"partPricingSettingDetail": "نمایش اطلاعات قیمت‌گذاری قطعات",
"@pricingSettingDetail": {},
"partSettings": "تنظیمات قطعه",
"@partSettings": {},
@ -660,13 +660,13 @@
"@password": {},
"passwordEmpty": "رمز عبور نمی تواند خالی باشد",
"@passwordEmpty": {},
"pending": "Pending",
"pending": "در حال بررسی",
"@pending": {},
"permissionAccountDenied": "حساب شما مجوزهای لازم برای انجام این عمل را ندارد",
"@permissionAccountDenied": {},
"permissionRequired": "نیازمند مجوز",
"@permissionRequired": {},
"phone": "Phone",
"phone": "تماس",
"@phone": {},
"printLabel": "پرینت برچسب",
"@printLabel": {},
@ -762,7 +762,7 @@
"@reference": {},
"refresh": "تازه سازی",
"@refresh": {},
"rotateClockwise": "Rotate 90° clockwise",
"rotateClockwise": "چرخش °90 درجه در جهت عقربه های ساعت",
"@rotateClockwise": {},
"refreshing": "در حال تازه سازی",
"@refreshing": {},
@ -940,33 +940,33 @@
"@serverNotConnected": {},
"serverNotSelected": "سرور انتخاب نشده است",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "محموله",
"@shipment": {},
"shipments": "محموله ها",
"@shipments": {},
"shipmentsPending": "Pending Shipments",
"shipmentsPending": "محموله در انتظار ارسال",
"@shipmentsPending": {},
"shipmentAdd": "افزودن محموله",
"@shipmentAdd": {},
"shipmentCheck": "Check Shipment",
"shipmentCheck": "بررسی محموله",
"@shipmentCheck": {},
"shipmentCheckDetail": "Mark this shipment as checked",
"shipmentCheckDetail": "این محموله را بررسی شده علامت گذاری کن",
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"shipmentChecked": "محموله بررسی شده",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "تاریخ ارسال",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"shipmentEdit": "تغییر محموله",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"shipmentReference": "کد محموله",
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"shipmentSend": "ارسال محموله",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "محموله بررسی نشده",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "این محموله را بررسی نشده علامت گذاری کن",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "محموله به روز رسانی شد",
"@shipmentUpdated": {},
"shipped": "ارسال شده",
"@shipped": {},
@ -1112,7 +1112,7 @@
"@tokenMissingFromResponse": {},
"totalPrice": "قیمت کل",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "کد رهگیری",
"@trackingNumber": {},
"transfer": "انتقال",
"@transfer": {
@ -1148,7 +1148,7 @@
"@uploadFailed": {},
"uploadSuccess": "فایل اپلود شد",
"@uploadSuccess": {},
"uploadImage": "Upload Image",
"uploadImage": "بارگذاری تصویر",
"@uploadImage": {},
"usedIn": "استفاده شده در",
"@usedIn": {},
@ -1174,34 +1174,34 @@
"@viewSupplierPart": {},
"website": "وب سایت",
"@website": {},
"yes": "Yes",
"yes": "بله",
"@yes": {},
"price": "Price",
"price": "قیمت",
"@price": {},
"priceRange": "Price Range",
"priceRange": "بازه‌ قیمت",
"@priceRange": {},
"priceOverrideMin": "Minimum Price Override",
"priceOverrideMin": "قیمت دستی مینیمم",
"@priceOverrideMin": {},
"priceOverrideMax": "Maximum Price Override",
"priceOverrideMax": "قیمت دستی ماکزیمم",
"@priceOverrideMax": {},
"salePrice": "Sale Price",
"salePrice": "قیمت حراج",
"@salePrice": {},
"saleHistory": "Sale History",
"saleHistory": "تاریخچه حراج",
"@saleHistory": {},
"supplierPricing": "Supplier Pricing",
"supplierPricing": "قیمت تامین کننده",
"@supplierPricing": {},
"bomCost": "BOM Cost",
"bomCost": "هزینه تمام شده",
"@bomCost": {},
"internalCost": "Internal Cost",
"internalCost": "هزینه داخلی",
"@internalCost": {},
"variantCost": "Variant Cost",
"variantCost": "هزینه متغیر",
"@variantCost": {},
"overallPricing": "Overall Pricing",
"overallPricing": "قیمت نهایی",
"@overallPricing": {},
"pricingOverrides": "Pricing Overrides",
"pricingOverrides": "قیمت دستی",
"@pricingOverrides": {},
"currency": "Currency",
"currency": "واحد پول",
"@currency": {},
"priceBreaks": "Price Breaks",
"priceBreaks": "کاهش قیمت",
"@priceBreaks": {}
}

View file

@ -46,7 +46,7 @@
"@aspectRatioSquare": {},
"allocateStock": "Készlet foglalása",
"@allocateStock": {},
"allocatedStock": "Allocated Stock",
"allocatedStock": "Lefoglalt Készlet",
"@allocatedStock": {},
"appReleaseNotes": "Kiadási közlemények",
"@appReleaseNotes": {},
@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Vonalkód olvasás megállítva",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Érintse meg a szkennelés szüneteltetéséhez",
"@barcodeScanPause": {},
"barcodeScanAssign": "Kódolvasás a hozzárendeléshez",
"@barcodeScanAssign": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "Törlés sikeres",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "Szállítási Dátum",
"@deliveryDate": {},
"description": "Leírás",
"@description": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "Beszerzési rendelések gomb megjelenítése a főoldalon",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "Szállítmányok Mutatása",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "Függőben lévő szállítmányok megjelenítése a kezdőképernyőn",
"@homeShowShipmentsDescription": {},
"homeShowSo": "Vevői rendelések megmutatása",
"@homeShowSo": {},
@ -454,9 +454,9 @@
"@invalidSupplierPart": {},
"invalidUsernamePassword": "Érvénytelen felhasználónév/jelszó kombináció",
"@invalidUsernamePassword": {},
"invoice": "Invoice",
"invoice": "Számla",
"@invoice": {},
"invoiceNumber": "Invoice Number",
"invoiceNumber": "Számlaszám",
"@invoiceNumber": {},
"issue": "Kiküldés",
"@issue": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Kulcsszavak",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Címke Meghajtó",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Címkenyomtató Meghajtó Kiválasztása",
"@labelSelectDriver": {},
"labelPrinting": "Címke nyomtatás",
"@labelPrinting": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Új készlet hely létrehozása",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Alapértelmezett Hely",
"@locationDefault": {},
"locationNotSet": "Nincs megadva hely",
"@locationNotSet": {},
@ -544,7 +544,7 @@
"@missingData": {},
"name": "Név",
"@name": {},
"no": "No",
"no": "Nem",
"@no": {},
"notApplicable": "N/A",
"@notApplicable": {},
@ -660,7 +660,7 @@
"@password": {},
"passwordEmpty": "Jelszó nem lehet üres",
"@passwordEmpty": {},
"pending": "Pending",
"pending": "Függőben",
"@pending": {},
"permissionAccountDenied": "Nincs meg a szükséges jogosultságod, hogy végrehajtsd ezt a műveletet",
"@permissionAccountDenied": {},
@ -940,33 +940,33 @@
"@serverNotConnected": {},
"serverNotSelected": "Nincs kiszolgáló választva",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "Szállítmány",
"@shipment": {},
"shipments": "Szállítmányok",
"@shipments": {},
"shipmentsPending": "Pending Shipments",
"shipmentsPending": "Függőben Lévő Szállítmányok",
"@shipmentsPending": {},
"shipmentAdd": "Szállítmány hozzáadása",
"@shipmentAdd": {},
"shipmentCheck": "Check Shipment",
"shipmentCheck": "Szállítmány Ellenőrzése",
"@shipmentCheck": {},
"shipmentCheckDetail": "Mark this shipment as checked",
"shipmentCheckDetail": "Jelölje meg ezt a szállítmányt ellenőrzöttként",
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"shipmentChecked": "Szállítmány Ellenőrizve",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "Szállítmány Dátuma",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"shipmentEdit": "Szállítmány Szerkesztése",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"shipmentReference": "Szállítmány Hivatkozás",
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"shipmentSend": "Szállítmány Küldése",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Szállítmány Ellenőrzés Visszavonása",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "Jelölje meg ezt a szállítmányt nem ellenőrzöttként",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "Szállítmány Frissítve",
"@shipmentUpdated": {},
"shipped": "Kiszállítva",
"@shipped": {},
@ -1112,7 +1112,7 @@
"@tokenMissingFromResponse": {},
"totalPrice": "Teljes ár",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "Nyomkövetési Szám",
"@trackingNumber": {},
"transfer": "Áthelyezés",
"@transfer": {
@ -1174,7 +1174,7 @@
"@viewSupplierPart": {},
"website": "Weboldal",
"@website": {},
"yes": "Yes",
"yes": "Igen",
"@yes": {},
"price": "Ár",
"@price": {},

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Scansione codice a barre in pausa",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Tocca per mettere in pausa la scansione",
"@barcodeScanPause": {},
"barcodeScanAssign": "Scansiona per assegnare codice a barre",
"@barcodeScanAssign": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Parole Chiave",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Driver Etichetta",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Seleziona Il Driver Della Stampante Etichette",
"@labelSelectDriver": {},
"labelPrinting": "Etichetta in stampa",
"@labelPrinting": {},

View file

@ -46,7 +46,7 @@
"@aspectRatioSquare": {},
"allocateStock": "Voorraad Toewijzen",
"@allocateStock": {},
"allocatedStock": "Allocated Stock",
"allocatedStock": "Toegewezen voorraad",
"@allocatedStock": {},
"appReleaseNotes": "App release notities weergeven",
"@appReleaseNotes": {},
@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Barcode scannen gepauzeerd",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Klik om scannen te pauzeren",
"@barcodeScanPause": {},
"barcodeScanAssign": "Scan om streepjescode toe te wijzen",
"@barcodeScanAssign": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "Succesvol verwijderd",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "Leveringsdatum",
"@deliveryDate": {},
"description": "Omschrijving",
"@description": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "Inkooporder knop op startscherm weergeven",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "Verzending weergeven",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "Toon Leveringen in afwachting op het startscherm",
"@homeShowShipmentsDescription": {},
"homeShowSo": "Toon Verkooporders",
"@homeShowSo": {},
@ -454,9 +454,9 @@
"@invalidSupplierPart": {},
"invalidUsernamePassword": "Ongeldige gebruikersnaam / wachtwoord combinatie",
"@invalidUsernamePassword": {},
"invoice": "Invoice",
"invoice": "Factuur",
"@invoice": {},
"invoiceNumber": "Invoice Number",
"invoiceNumber": "Factuur nummer",
"@invoiceNumber": {},
"issue": "Probleem",
"@issue": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Trefwoorden",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Label printer",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Selecteer Label Printer Driver",
"@labelSelectDriver": {},
"labelPrinting": "Label afdrukken",
"@labelPrinting": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Creëer nieuwe voorraadlocatie",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Standaard locatie",
"@locationDefault": {},
"locationNotSet": "Geen locatie opgegeven",
"@locationNotSet": {},
@ -544,9 +544,9 @@
"@missingData": {},
"name": "Naam",
"@name": {},
"no": "No",
"no": "Nee",
"@no": {},
"notApplicable": "N/A",
"notApplicable": "N.v.t. ",
"@notApplicable": {},
"notConnected": "Niet verbonden",
"@notConnected": {},
@ -660,7 +660,7 @@
"@password": {},
"passwordEmpty": "Wachtwoord mag niet leeg zijn",
"@passwordEmpty": {},
"pending": "Pending",
"pending": "In behandeling",
"@pending": {},
"permissionAccountDenied": "U heeft niet de vereiste rechten om deze actie uit te voeren",
"@permissionAccountDenied": {},
@ -940,33 +940,33 @@
"@serverNotConnected": {},
"serverNotSelected": "Server niet geselecteerd",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "Levering",
"@shipment": {},
"shipments": "Verzendingen",
"@shipments": {},
"shipmentsPending": "Pending Shipments",
"shipmentsPending": "Leveringen in behandeling",
"@shipmentsPending": {},
"shipmentAdd": "Verzending toevoegen",
"@shipmentAdd": {},
"shipmentCheck": "Check Shipment",
"shipmentCheck": "Controleer Levering",
"@shipmentCheck": {},
"shipmentCheckDetail": "Mark this shipment as checked",
"shipmentCheckDetail": "Markeer deze levering als gecontroleerd",
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"shipmentChecked": "Levering gecontroleerd",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "Leverings Datum",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"shipmentEdit": "Wijzig levering",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"shipmentSend": "Verzending versturen",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Verzending uitvinken",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "Markeer deze levering als niet gecontroleerd",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "Verzending bijgewerkt",
"@shipmentUpdated": {},
"shipped": "Verzonden",
"@shipped": {},
@ -1112,7 +1112,7 @@
"@tokenMissingFromResponse": {},
"totalPrice": "Totaalprijs",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "Traceernummer",
"@trackingNumber": {},
"transfer": "Verplaats",
"@transfer": {
@ -1174,7 +1174,7 @@
"@viewSupplierPart": {},
"website": "Website",
"@website": {},
"yes": "Yes",
"yes": "Ja",
"@yes": {},
"price": "Prijs",
"@price": {},

View file

@ -1202,6 +1202,6 @@
"@pricingOverrides": {},
"currency": "Waluta",
"@currency": {},
"priceBreaks": "Price Breaks",
"priceBreaks": "Widełki cenowe",
"@priceBreaks": {}
}

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Scanare cod de bare întreruptă",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Atingeți pentru a întrerupe scanarea",
"@barcodeScanPause": {},
"barcodeScanAssign": "Scanează pentru a atribui cod de bare",
"@barcodeScanAssign": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Cuvinte cheie",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Etichetează șofer",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Selectați șofer de imprimante etichetă",
"@labelSelectDriver": {},
"labelPrinting": "Printare etichete",
"@labelPrinting": {},
@ -822,386 +822,386 @@
"@response504": {},
"response505": "Versiunea HTTP nu este suportată",
"@response505": {},
"responseData": "Response data",
"responseData": "Date Răspuns",
"@responseData": {},
"responseInvalid": "Invalid Response Code",
"responseInvalid": "Cod de răspuns nevalid",
"@responseInvalid": {},
"responseUnknown": "Unknown Response",
"responseUnknown": "Răspuns necunoscut",
"@responseUnknown": {},
"result": "Result",
"result": "Rezultat",
"@result": {
"description": ""
},
"returned": "Returned",
"returned": "Returnat",
"@returned": {},
"salesOrder": "Sales Order",
"salesOrder": "Comenzi de Vânzare",
"@salesOrder": {},
"salesOrders": "Sales Orders",
"salesOrders": "Comenzi de Vânzare",
"@salesOrders": {},
"salesOrderEnable": "Enable Sales Orders",
"salesOrderEnable": "Activează Comenzile de Vânzări",
"@salesOrderEnable": {},
"salesOrderEnableDetail": "Enable sales order functionality",
"salesOrderEnableDetail": "Activați funcționalitatea comenzilor de vânzare",
"@salesOrderEnableDetail": {},
"salesOrderShowCamera": "Camera Shortcut",
"salesOrderShowCamera": "Scurtătura Cameră",
"@salesOrderShowCamera": {},
"salesOrderShowCameraDetail": "Enable image upload shortcut on sales order screen",
"salesOrderShowCameraDetail": "Activează scurtătura de încărcare a imaginilor pe ecranul comenzii de vânzare",
"@salesOrderShowCameraDetail": {},
"salesOrderSettings": "Sales order settings",
"salesOrderSettings": "Setările comenzii de vânzare",
"@salesOrderSettings": {},
"salesOrderCreate": "New Sales Order",
"salesOrderCreate": "Comandă de vânzări nouă",
"@saleOrderCreate": {},
"salesOrderEdit": "Edit Sales Order",
"salesOrderEdit": "Editează Comanda de Vânzare",
"@salesOrderEdit": {},
"salesOrderUpdated": "Sales order updated",
"salesOrderUpdated": "Comanda de vanzare actualizată",
"@salesOrderUpdated": {},
"save": "Save",
"save": "Salvaţi",
"@save": {
"description": "Save"
},
"scanBarcode": "Scan Barcode",
"scanBarcode": "Scanați codul de bare",
"@scanBarcode": {},
"scanSupplierPart": "Scan supplier part barcode",
"scanSupplierPart": "Scanare cod de bare furnizor",
"@scanSupplierPart": {},
"scanIntoLocation": "Scan Into Location",
"scanIntoLocation": "Scanare în locație",
"@scanIntoLocation": {},
"scanIntoLocationDetail": "Scan this item into location",
"scanIntoLocationDetail": "Scanează acest articol în locație",
"@scanIntoLocationDetail": {},
"scannerExternal": "External Scanner",
"scannerExternal": "Scanner extern",
"@scannerExternal": {},
"scannerExternalDetail": "Use external scanner to read barcodes (wedge mode)",
"scannerExternalDetail": "Utilizează scanerul extern pentru a citi codurile de bare (modul wedge)",
"@scannerExternalDetail": {},
"scanReceivedParts": "Scan Received Parts",
"scanReceivedParts": "Scanați capitolele primite",
"@scanReceivedParts": {},
"search": "Search",
"search": "Caută",
"@search": {
"description": "search"
},
"searching": "Searching",
"searching": "Căutare",
"@searching": {},
"searchLocation": "Search for location",
"searchLocation": "Căutați locația",
"@searchLocation": {},
"searchParts": "Search Parts",
"searchParts": "Caută componente",
"@searchParts": {},
"searchStock": "Search Stock",
"searchStock": "Căutare Stoc",
"@searchStock": {},
"select": "Select",
"select": "Selectează",
"@select": {},
"selectFile": "Select File",
"selectFile": "Selectează fișier",
"@selectFile": {},
"selectImage": "Select Image",
"selectImage": "Selectează imagine",
"@selectImage": {},
"selectLocation": "Select a location",
"selectLocation": "Selectați o locație",
"@selectLocation": {},
"send": "Send",
"send": "Trimite",
"@send": {},
"serialNumber": "Serial Number",
"serialNumber": "Număr de serie",
"@serialNumber": {},
"serialNumbers": "Serial Numbers",
"serialNumbers": "Număr de serie",
"@serialNumbers": {},
"server": "Server",
"@server": {},
"serverAddress": "Server Address",
"serverAddress": "Adresă server",
"@serverAddress": {},
"serverApiRequired": "Required API Version",
"serverApiRequired": "Versiunea API necesară",
"@serverApiRequired": {},
"serverApiVersion": "Server API Version",
"serverApiVersion": "Versiune API server",
"@serverApiVersion": {},
"serverAuthenticationError": "Authentication Error",
"serverAuthenticationError": "Eroare autentificare",
"@serverAuthenticationError": {},
"serverCertificateError": "Cerficate Error",
"@serverCertificateError": {},
"serverCertificateInvalid": "Server HTTPS certificate is invalid",
"serverCertificateInvalid": "Certificatul HTTPS al serverului nu este valid",
"@serverCertificateInvalid": {},
"serverConnected": "Connected to Server",
"serverConnected": "Conectare la server",
"@serverConnected": {},
"serverConnecting": "Connecting to server",
"serverConnecting": "Se conecteaza la server",
"@serverConnecting": {},
"serverCouldNotConnect": "Could not connect to server",
"serverCouldNotConnect": "Nu s-a putut conecta la server",
"@serverCouldNotConnect": {},
"serverEmpty": "Server cannot be empty",
"serverEmpty": "Serverul nu poate fi gol",
"@serverEmpty": {},
"serverError": "Server Error",
"serverError": "Eroare de server",
"@serverError": {},
"serverDetails": "Server Details",
"serverDetails": "Detalii despre server",
"@serverDetails": {},
"serverMissingData": "Server response missing required fields",
"serverMissingData": "Răspuns server lipsă câmpuri obligatorii",
"@serverMissingData": {},
"serverOld": "Old Server Version",
"serverOld": "Versiunea veche a serverului",
"@serverOld": {},
"serverSettings": "Server Settings",
"serverSettings": "Setări server",
"@serverSettings": {},
"serverStart": "Server must start with http[s]",
"serverStart": "Serverul trebuie să înceapă cu http[s]",
"@serverStart": {},
"settings": "Settings",
"settings": "Setări",
"@settings": {},
"serverInstance": "Server Instance",
"serverInstance": "Instanță server",
"@serverInstance": {},
"serverNotConnected": "Server not connected",
"serverNotConnected": "Serverul nu este conectat",
"@serverNotConnected": {},
"serverNotSelected": "Server not selected",
"serverNotSelected": "Serverul nu este selectat",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "Expediere",
"@shipment": {},
"shipments": "Shipments",
"shipments": "Livrări",
"@shipments": {},
"shipmentsPending": "Pending Shipments",
"shipmentsPending": "Livrări în așteptare",
"@shipmentsPending": {},
"shipmentAdd": "Add Shipment",
"shipmentAdd": "Adaugă livrare",
"@shipmentAdd": {},
"shipmentCheck": "Check Shipment",
"shipmentCheck": "Verifica livrare",
"@shipmentCheck": {},
"shipmentCheckDetail": "Mark this shipment as checked",
"shipmentCheckDetail": "Marchează livrarea ca verificată",
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"shipmentChecked": "Livrare verificată",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "Data livrării",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"shipmentEdit": "Editare livrare",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"shipmentReference": "Referință livrare",
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"shipmentSend": "Livrare Trimisa",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Debifează livrare",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "Marchează livrarea ca nebifat",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "Livrare actualizată",
"@shipmentUpdated": {},
"shipped": "Shipped",
"shipped": "Livrat",
"@shipped": {},
"sku": "SKU",
"@sku": {},
"sounds": "Sounds",
"sounds": "Sunete",
"@sounds": {},
"soundOnBarcodeAction": "Play audible tone on barcode action",
"soundOnBarcodeAction": "Redă ton sonor la acțiunea codului de bare",
"@soundOnBarcodeAction": {},
"soundOnServerError": "Play audible tone on server error",
"soundOnServerError": "Redă sunetul sonor la eroarea serverului",
"@soundOnServerError": {},
"startDate": "Start Date",
"startDate": "Data inceput",
"@startDate": {},
"status": "Status",
"@status": {},
"statusCode": "Status Code",
"@statusCode": {},
"stock": "Stock",
"stock": "Stoc",
"@stock": {
"description": "stock"
},
"stockDetails": "Current available stock quantity",
"stockDetails": "Stoc disponibil curent",
"@stockDetails": {},
"stockItem": "Stock Item",
"stockItem": "Articol Stoc",
"@stockItem": {
"description": "stock item title"
},
"stockItems": "Stock Items",
"stockItems": "Articol Stoc",
"@stockItems": {},
"stockItemCreate": "New Stock Item",
"stockItemCreate": "Element nou în stoc",
"@stockItemCreate": {},
"stockItemCreateDetail": "Create new stock item in this location",
"stockItemCreateDetail": "Crează element nou în stoc în această locație",
"@stockItemCreateDetail": {},
"stockItemDelete": "Delete Stock Item",
"stockItemDelete": "Şterge elementul din stoc",
"@stockItemDelete": {},
"stockItemDeleteConfirm": "Are you sure you want to delete this stock item?",
"stockItemDeleteConfirm": "Sunteţi sigur că doriţi să ştergeţi acest articol din stoc?",
"@stockItemDeleteConfirm": {},
"stockItemDeleteFailure": "Could not delete stock item",
"stockItemDeleteFailure": "Nu s-a putut șterge articolul din stoc",
"@stockItemDeleteFailure": {},
"stockItemDeleteSuccess": "Stock item deleted",
"stockItemDeleteSuccess": "Articol șters",
"@stockItemDeleteSuccess": {},
"stockItemHistory": "Stock History",
"stockItemHistory": "Istoric Stoc",
"@stockItemHistory": {},
"stockItemHistoryDetail": "Display historical stock tracking information",
"stockItemHistoryDetail": "Afişează informaţii istorice de urmărire stoc",
"@stockItemHistoryDetail": {},
"stockItemTransferred": "Stock item transferred",
"stockItemTransferred": "Articol stoc transferat",
"@stockItemTransferred": {},
"stockItemUpdated": "Stock item updated",
"stockItemUpdated": "Articol stoc actualizat",
"@stockItemUpdated": {},
"stockItemsNotAvailable": "No stock items available",
"stockItemsNotAvailable": "Nu sunt articole disponibile în stoc",
"@stockItemsNotAvailable": {},
"stockItemNotes": "Stock Item Notes",
"stockItemNotes": "Note element de stoc",
"@stockItemNotes": {},
"stockItemUpdateSuccess": "Stock item updated",
"stockItemUpdateSuccess": "Articol stoc actualizat",
"@stockItemUpdateSuccess": {},
"stockItemUpdateFailure": "Stock item update failed",
"stockItemUpdateFailure": "Actualizarea articolului stoc a eșuat",
"@stockItemUpdateFailure": {},
"stockLocation": "Stock Location",
"stockLocation": "Locația stocului",
"@stockLocation": {
"description": "stock location"
},
"stockLocations": "Stock Locations",
"stockLocations": "Locația stocului",
"@stockLocations": {},
"stockTopLevel": "Top level stock location",
"stockTopLevel": "Locație stoc nivel superior",
"@stockTopLevel": {},
"strictHttps": "Use Strict HTTPS",
"strictHttps": "Folosește HTTPS Strict",
"@strictHttps": {},
"strictHttpsDetails": "Enforce strict checking of HTTPs certificates",
"strictHttpsDetails": "Impune controlul strict al certificatelor HTTP",
"@strictHttpsDetails": {},
"subcategory": "Subcategory",
"subcategory": "Subcategorie",
"@subcategory": {},
"subcategories": "Subcategories",
"subcategories": "Subcategorii",
"@subcategories": {},
"sublocation": "Sublocation",
"sublocation": "Sublocare",
"@sublocation": {},
"sublocations": "Sublocations",
"sublocations": "Sublocare",
"@sublocations": {},
"sublocationNone": "No Sublocations",
"sublocationNone": "Fără sublocări",
"@sublocationNone": {},
"sublocationNoneDetail": "No sublocations available",
"sublocationNoneDetail": "Nu există sublocații disponibile",
"@sublocationNoneDetail": {},
"submitFeedback": "Submit Feedback",
"submitFeedback": "Trimiteți feedback",
"@submitFeedback": {},
"suppliedParts": "Supplied Parts",
"suppliedParts": "Piese furnizate",
"@suppliedParts": {},
"supplier": "Supplier",
"supplier": "Furnizor",
"@supplier": {},
"supplierPart": "Supplier Part",
"supplierPart": "Piesă Furnizor",
"@supplierPart": {},
"supplierPartEdit": "Edit Supplier Part",
"supplierPartEdit": "Editați articol furnizorului",
"@supplierPartEdit": {},
"supplierPartNumber": "Supplier Part Number",
"supplierPartNumber": "Cod furnizor",
"@supplierPartNumber": {},
"supplierPartUpdated": "Supplier Part Updated",
"supplierPartUpdated": "Cod furnizor actualizat",
"@supplierPartUpdated": {},
"supplierParts": "Supplier Parts",
"supplierParts": "Piese Furnizor",
"@supplierParts": {},
"suppliers": "Suppliers",
"suppliers": "Furnizori",
"@suppliers": {},
"supplierReference": "Supplier Reference",
"supplierReference": "Cod furnizor",
"@supplierReference": {},
"switchCamera": "Switch Camera",
"switchCamera": "Comutați Camera",
"@switchCamera": {},
"takePicture": "Take Picture",
"takePicture": "Faceți o fotografie",
"@takePicture": {},
"targetDate": "Target Date",
"targetDate": "Data țintă",
"@targetDate": {},
"templatePart": "Parent Template Part",
"templatePart": "Capitol șablon părinte",
"@templatePart": {},
"testName": "Test Name",
"testName": "Nume test",
"@testName": {},
"testPassedOrFailed": "Test passed or failed",
"testPassedOrFailed": "Testul a trecut sau a eșuat",
"@testPassedOrFailed": {},
"testsRequired": "Required Tests",
"testsRequired": "Teste necesare",
"@testsRequired": {},
"testResults": "Test Results",
"testResults": "Rezultatele testului",
"@testResults": {
"description": ""
},
"testResultsDetail": "Display stock item test results",
"testResultsDetail": "Afișează rezultatele testului produsului în stoc",
"@testResultsDetail": {},
"testResultAdd": "Add Test Result",
"testResultAdd": "Adăugare rezultat test",
"@testResultAdd": {},
"testResultNone": "No Test Results",
"testResultNone": "Niciun rezultat de test",
"@testResultNone": {},
"testResultNoneDetail": "No test results available",
"testResultNoneDetail": "Nici un rezultat de test disponibil",
"@testResultNoneDetail": {},
"testResultUploadFail": "Error uploading test result",
"testResultUploadFail": "Eroare încărcare rezultat test",
"@testResultUploadFail": {},
"testResultUploadPass": "Test result uploaded",
"testResultUploadPass": "Rezultat test încărcat",
"@testResultUploadPass": {},
"timeout": "Timeout",
"@timeout": {
"description": ""
},
"toggleTorch": "Toggle Torch",
"toggleTorch": "Comutare lanternă",
"@toggleTorch": {},
"tokenError": "Token Error",
"tokenError": "Eroare token",
"@tokenError": {},
"tokenMissing": "Missing Token",
"tokenMissing": "Token lipsă",
"@tokenMissing": {},
"tokenMissingFromResponse": "Access token missing from response",
"tokenMissingFromResponse": "Token-ul de acces lipsește din răspuns",
"@tokenMissingFromResponse": {},
"totalPrice": "Total Price",
"totalPrice": "Preț total",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "Număr de urmărire",
"@trackingNumber": {},
"transfer": "Transfer",
"@transfer": {
"description": "transfer"
},
"transferStock": "Transfer Stock",
"transferStock": "Transfera stoc",
"@transferStock": {
"description": "transfer stock"
},
"transferStockDetail": "Transfer item to a different location",
"transferStockDetail": "Transferați articolul într-o locație diferită",
"@transferStockDetail": {},
"transferStockLocation": "Transfer Stock Location",
"transferStockLocation": "Transfer locație stoc",
"@transferStockLocation": {},
"transferStockLocationDetail": "Transfer this stock location into another",
"transferStockLocationDetail": "Transferați această locație a stocului în alta",
"@transferStockLocationDetail": {},
"translate": "Translate",
"translate": "Traduceți",
"@translate": {},
"translateHelp": "Help translate the InvenTree app",
"translateHelp": "Ajută la traducerea aplicației InvenTree",
"@translateHelp": {},
"unavailable": "Unavailable",
"unavailable": "Indisponibil",
"@unavailable": {},
"unavailableDetail": "Item is not available",
"unavailableDetail": "Articolul nu este disponibil",
"@unavailableDetail": {},
"unitPrice": "Unit Price",
"unitPrice": "Preţ Unitar",
"@unitPrice": {},
"units": "Units",
"units": "Unități",
"@units": {},
"unknownResponse": "Unknown Response",
"unknownResponse": "Răspuns necunoscut",
"@unknownResponse": {},
"upload": "Upload",
"upload": "Încărcaţi",
"@upload": {},
"uploadFailed": "File upload failed",
"uploadFailed": "Încărcare fișier eșuată",
"@uploadFailed": {},
"uploadSuccess": "File uploaded",
"uploadSuccess": "Fişier încărcat",
"@uploadSuccess": {},
"uploadImage": "Upload Image",
"uploadImage": "Încărcare imagine",
"@uploadImage": {},
"usedIn": "Used In",
"usedIn": "Folosite în",
"@usedIn": {},
"usedInDetails": "Assemblies which require this part",
"usedInDetails": "Ansambluri care necesită aceast articol",
"@usedInDetails": {},
"username": "Nume utilizator",
"@username": {},
"usernameEmpty": "Numele de utilizator nu poate fi gol",
"@usernameEmpty": {},
"value": "Value",
"value": "Valoare",
"@value": {
"description": "value"
},
"valueCannotBeEmpty": "Value cannot be empty",
"valueCannotBeEmpty": "Valoarea nu poate fi goală",
"@valueCannotBeEmpty": {},
"valueRequired": "Value is required",
"valueRequired": "Valoarea este obligatorie",
"@valueRequired": {},
"variants": "Variants",
"variants": "Variante",
"@variants": {},
"version": "Version",
"version": "Verisune",
"@version": {},
"viewSupplierPart": "View Supplier Part",
"viewSupplierPart": "Vezi capitol furnizor",
"@viewSupplierPart": {},
"website": "Website",
"@website": {},
"yes": "Yes",
"yes": "Da",
"@yes": {},
"price": "Price",
"price": "Preț",
"@price": {},
"priceRange": "Price Range",
"priceRange": "Interval de preț",
"@priceRange": {},
"priceOverrideMin": "Minimum Price Override",
"priceOverrideMin": "Suprascriere Preț Minim",
"@priceOverrideMin": {},
"priceOverrideMax": "Maximum Price Override",
"priceOverrideMax": "Suprascriere de preț maximă",
"@priceOverrideMax": {},
"salePrice": "Sale Price",
"salePrice": "Preț de vânzare",
"@salePrice": {},
"saleHistory": "Sale History",
"saleHistory": "Istoric vanzari",
"@saleHistory": {},
"supplierPricing": "Supplier Pricing",
"supplierPricing": "Prețurile furnizorului",
"@supplierPricing": {},
"bomCost": "BOM Cost",
"bomCost": "Cost BOM",
"@bomCost": {},
"internalCost": "Internal Cost",
"internalCost": "Cost intern",
"@internalCost": {},
"variantCost": "Variant Cost",
"variantCost": "Cost variantă",
"@variantCost": {},
"overallPricing": "Overall Pricing",
"overallPricing": "Preț general",
"@overallPricing": {},
"pricingOverrides": "Pricing Overrides",
"pricingOverrides": "Suprascrieri preturi",
"@pricingOverrides": {},
"currency": "Currency",
"currency": "Monedă",
"@currency": {},
"priceBreaks": "Price Breaks",
"priceBreaks": "Reduceri de preț",
"@priceBreaks": {}
}

View file

@ -46,7 +46,7 @@
"@aspectRatioSquare": {},
"allocateStock": "Выделить запас",
"@allocateStock": {},
"allocatedStock": "Allocated Stock",
"allocatedStock": "Зарезервированные остатки",
"@allocatedStock": {},
"appReleaseNotes": "Показать заметки о выпуске приложения",
"@appReleaseNotes": {},
@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Сканирование штрих-кода приостановлено",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Нажмите, чтобы приостановить сканирование",
"@barcodeScanPause": {},
"barcodeScanAssign": "Сканировать для присвоения штрих-кода",
"@barcodeScanAssign": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "Удаление успешно завершено",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "Дата доставки",
"@deliveryDate": {},
"description": "Описание",
"@description": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "Показывать кнопку заказа на главном экране",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "Показать отгрузки",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "Показывать ожидающие отгрузки на главном экране",
"@homeShowShipmentsDescription": {},
"homeShowSo": "Показать заказы на продажу",
"@homeShowSo": {},
@ -454,9 +454,9 @@
"@invalidSupplierPart": {},
"invalidUsernamePassword": "Неверная комбинация имени пользователя и пароля",
"@invalidUsernamePassword": {},
"invoice": "Invoice",
"invoice": "Счет",
"@invoice": {},
"invoiceNumber": "Invoice Number",
"invoiceNumber": "Номер счета",
"@invoiceNumber": {},
"issue": "Оформить",
"@issue": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Ключевые слова",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Драйвер принтера этикеток",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Выберите драйвер принтера этикеток",
"@labelSelectDriver": {},
"labelPrinting": "Печать этикеток",
"@labelPrinting": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Создать новое расположение склада",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Расположение по умолчанию",
"@locationDefault": {},
"locationNotSet": "Не указано месторасположение",
"@locationNotSet": {},
@ -544,9 +544,9 @@
"@missingData": {},
"name": "Название",
"@name": {},
"no": "No",
"no": "Нет",
"@no": {},
"notApplicable": "N/A",
"notApplicable": "Н",
"@notApplicable": {},
"notConnected": "Соединение не установлено",
"@notConnected": {},
@ -660,7 +660,7 @@
"@password": {},
"passwordEmpty": "Пароль не может быть пустым",
"@passwordEmpty": {},
"pending": "Pending",
"pending": "В обработке",
"@pending": {},
"permissionAccountDenied": "Ваш аккаунт не имеет разрешения на выполнение этого действия",
"@permissionAccountDenied": {},
@ -940,33 +940,33 @@
"@serverNotConnected": {},
"serverNotSelected": "Сервер не выбран",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "Отгрузка",
"@shipment": {},
"shipments": "Поставки",
"@shipments": {},
"shipmentsPending": "Pending Shipments",
"shipmentsPending": "Ожидающие отгрузки",
"@shipmentsPending": {},
"shipmentAdd": "Новое Отправление",
"@shipmentAdd": {},
"shipmentCheck": "Check Shipment",
"shipmentCheck": "Проверить отгрузку",
"@shipmentCheck": {},
"shipmentCheckDetail": "Mark this shipment as checked",
"shipmentCheckDetail": "Отметить этот груз как проверенный",
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"shipmentChecked": "Отгрузка проверена",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "Дата отгрузки",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"shipmentEdit": "Редактировать отгрузку",
"@shipmentEdit": {},
"shipmentReference": "Shipment Reference",
"shipmentReference": "Ссылка на отгрузку",
"@shipmentReference": {},
"shipmentSend": "Send Shipment",
"shipmentSend": "Отправить отгрузку",
"@shipmentSend": {},
"shipmentUncheck": "Uncheck Shipment",
"shipmentUncheck": "Снять отметку с отгрузки",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Mark this shipment as unchecked",
"shipmentUncheckDetail": "Отметить этот груз как непроверенный",
"@shipmentUncheckDetail": {},
"shipmentUpdated": "Shipment Updated",
"shipmentUpdated": "Отгрузка обновлена",
"@shipmentUpdated": {},
"shipped": "Отгружено",
"@shipped": {},
@ -1112,7 +1112,7 @@
"@tokenMissingFromResponse": {},
"totalPrice": "Общая стоимость",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "Номер отслеживания",
"@trackingNumber": {},
"transfer": "Перемещение",
"@transfer": {
@ -1174,7 +1174,7 @@
"@viewSupplierPart": {},
"website": "Сайт",
"@website": {},
"yes": "Yes",
"yes": "Да",
"@yes": {},
"price": "Цена",
"@price": {},

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Streckkodsskanning pausad",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Tryck för att pausa skanning",
"@barcodeScanPause": {},
"barcodeScanAssign": "Skanna för att tilldela streckkod",
"@barcodeScanAssign": {},
@ -228,7 +228,7 @@
"@delete": {},
"deleteFailed": "Borttagning misslyckades",
"@deleteFailed": {},
"deleteImageConfirmation": "Are you sure you want to delete this image?",
"deleteImageConfirmation": "Är du säker på att du vill radera denna bild?",
"@deleteImageConfirmation": {},
"deleteImageTooltip": "Radera bild",
"@deleteImageTooltip": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "Borttagning lyckad",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "Leveransdatum",
"@deliveryDate": {},
"description": "Beskrivning",
"@description": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "Visa knappen för inköpsorder på startskärmen",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "Visa leveranser",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "Visa väntande leveranser på startskärmen",
"@homeShowShipmentsDescription": {},
"homeShowSo": "Visa försäljningsorder",
"@homeShowSo": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Skapa ny lagerplats",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Förvald plats",
"@locationDefault": {},
"locationNotSet": "Ingen plats specificerad",
"@locationNotSet": {},
@ -564,9 +564,9 @@
"@noResults": {},
"noImageAvailable": "Ingen bild tillgänglig",
"@noImageAvailable": {},
"noPricingAvailable": "No pricing available",
"noPricingAvailable": "Ingen prisinformation tillgänglig",
"@noPricingAvailable": {},
"noPricingDataFound": "No pricing data found for this part",
"noPricingDataFound": "Inga prisuppgifter hittades för denna artikel",
"@noPricingDataFound": {},
"noSubcategories": "Inga underkategorier",
"@noSubcategories": {},
@ -630,7 +630,7 @@
"@partsNone": {},
"partNoResults": "Inga artiklar som matchar sökfrågan",
"@partNoResults": {},
"partPricing": "Part Pricing",
"partPricing": "Artikelpris",
"@partPricing": {},
"partPricingSettingDetail": "Display part pricing information",
"@pricingSettingDetail": {},
@ -762,7 +762,7 @@
"@reference": {},
"refresh": "Uppdatera",
"@refresh": {},
"rotateClockwise": "Rotate 90° clockwise",
"rotateClockwise": "Rotera 90° medurs",
"@rotateClockwise": {},
"refreshing": "Uppdaterar",
"@refreshing": {},
@ -940,7 +940,7 @@
"@serverNotConnected": {},
"serverNotSelected": "Servern är inte vald",
"@serverNotSelected": {},
"shipment": "Shipment",
"shipment": "Försändelse",
"@shipment": {},
"shipments": "Frakt",
"@shipments": {},
@ -954,7 +954,7 @@
"@shipmentCheckDetail": {},
"shipmentChecked": "Shipment Checked",
"@shipmentChecked": {},
"shipmentDate": "Shipment Date",
"shipmentDate": "Leveransdatum",
"@shipmentDate": {},
"shipmentEdit": "Edit Shipment",
"@shipmentEdit": {},
@ -1112,7 +1112,7 @@
"@tokenMissingFromResponse": {},
"totalPrice": "Totalpris",
"@totalPrice": {},
"trackingNumber": "Tracking Number",
"trackingNumber": "Sändningsnummer",
"@trackingNumber": {},
"transfer": "Överföring",
"@transfer": {
@ -1184,11 +1184,11 @@
"@priceOverrideMin": {},
"priceOverrideMax": "Maximum Price Override",
"@priceOverrideMax": {},
"salePrice": "Sale Price",
"salePrice": "Försäljningspris",
"@salePrice": {},
"saleHistory": "Sale History",
"@saleHistory": {},
"supplierPricing": "Supplier Pricing",
"supplierPricing": "Leverantörspriser",
"@supplierPricing": {},
"bomCost": "BOM Cost",
"@bomCost": {},

View file

@ -10,7 +10,7 @@
},
"about": "Hakkında",
"@about": {},
"accountDetails": "Hesap Detayları",
"accountDetails": "Hesap Ayrıntıları",
"@accountDetails": {},
"actions": "Eylemler",
"@actions": {
@ -34,7 +34,7 @@
"@appCredits": {},
"appDetails": "Uygulama Ayrıntıları",
"@appDetails": {},
"allocated": "Tahsis edildi",
"allocated": "Tahsis Edildi",
"@allocated": {},
"aspectRatio16x9": "16:9",
"@aspectRatio16x9": {},
@ -44,11 +44,11 @@
"@aspectRatio4x3": {},
"aspectRatioSquare": "Kare (1:1)",
"@aspectRatioSquare": {},
"allocateStock": "Tahsisli stok",
"allocateStock": "Stoku Tahsis Et",
"@allocateStock": {},
"allocatedStock": "Tahsis Edilen Stok",
"@allocatedStock": {},
"appReleaseNotes": "Uygulama yayınlama notlarınıster",
"appReleaseNotes": "Uygulama yayınlama notlarınırüntüle",
"@appReleaseNotes": {},
"appSettings": "Uygulama Ayarları",
"@appSettings": {},
@ -60,7 +60,7 @@
"@assignedToMeDetail": {},
"attachments": "Ekler",
"@attachments": {},
"attachImage": "Resim ekle",
"attachImage": "Görsel Ekle",
"@attachImage": {
"description": "Attach an image"
},
@ -98,11 +98,11 @@
"@barcodeNotAssigned": {},
"barcodeScanPart": "Parça barkodnu tara",
"@barcodeScanPart": {},
"barcodeReceivePart": "Tesellüm barkodunu tara",
"barcodeReceivePart": "Parçayı teslim almak için barkodu tarayın",
"@barcodeReceivePart": {},
"barcodeScanPaused": "Barkod tarama duraklatıldı",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Taramayı duraklatmak için dokunun",
"@barcodeScanPause": {},
"barcodeScanAssign": "Atanmış barkodu tara",
"@barcodeScanAssign": {},
@ -116,7 +116,7 @@
"@barcodeScanDelayDetail": {},
"barcodeScanGeneral": "Bir InvenTree barkodu tara",
"@barcodeScanGeneral": {},
"barcodeScanInItems": "Stok ögelerini bu konum içine tara",
"barcodeScanInItems": "Stok kalemlerini bu konumun içine tara",
"@barcodeScanInItems": {},
"barcodeScanLocation": "Stok konumu tara",
"@barcodeScanLocation": {},
@ -128,7 +128,7 @@
"@barcodeScanIntoLocationSuccess": {},
"barcodeScanIntoLocationFailure": "Madde taranmış değil",
"@barcodeScanIntoLocationFailure": {},
"barcodeScanItem": "Stok öğesi tara",
"barcodeScanItem": "Stok kalemi tara",
"@barcodeScanItem": {},
"barcodeTones": "Barkod Tonları",
"@barcodeTones": {},
@ -138,15 +138,15 @@
"@barcodeUnknown": {},
"batchCode": "Grup kodu",
"@batchCode": {},
"billOfMaterials": "Fatura materyalleri",
"billOfMaterials": "Ürün Ağacı",
"@billOfMaterials": {},
"bom": "BOM",
"@bom": {},
"bomEnable": "Malzeme Listesini Görüntüle",
"bomEnable": "Ürün Ağacını Görüntüle",
"@bomEnable": {},
"build": "Oluştur",
"build": "Üret",
"@build": {},
"building": "Oluşturma",
"building": "Üretiliyor",
"@building": {},
"cameraCreationError": "Kamera Kontrolcüsü Açılamadı",
"@cameraCreationError": {},
@ -176,7 +176,7 @@
"@companyEdit": {},
"companyNoResults": "Sorguyla eşleşen şirket yok",
"@companyNoResults": {},
"companyUpdated": "Firma bilgileri güncellendi",
"companyUpdated": "Şirket bilgileri güncellendi",
"@companyUpdated": {},
"companies": "Şirketler",
"@companies": {},
@ -206,7 +206,7 @@
"@credits": {},
"crop": "Kırp",
"@crop": {},
"cropImage": "Resmi Kırp",
"cropImage": "Görseli Kırp",
"@cropImage": {},
"customer": "Müşteri",
"@customer": {},
@ -228,11 +228,11 @@
"@delete": {},
"deleteFailed": "Silme işlemi başarısız",
"@deleteFailed": {},
"deleteImageConfirmation": "Bu resmi silmek istediğinizden emin misiniz?",
"deleteImageConfirmation": "Bu görseli silmek istediğinize emin misiniz?",
"@deleteImageConfirmation": {},
"deleteImageTooltip": "Görüntüyü Sil",
"deleteImageTooltip": "Görseli Sil",
"@deleteImageTooltip": {},
"deleteImage": "Resmi sil",
"deleteImage": "Görseli sil",
"@deleteImage": {},
"deletePart": "Parça Sil",
"@deletePart": {},
@ -244,11 +244,11 @@
"@deliveryDate": {},
"description": "Açıklama",
"@description": {},
"destination": "Varış Yeri",
"destination": "Hedef",
"@destination": {},
"destroyed": "Yok edildi",
"@destroyed": {},
"details": "Detaylar",
"details": "Ayrıntılar",
"@details": {
"description": "details"
},
@ -278,9 +278,9 @@
"@editPart": {
"description": "edit part"
},
"editItem": "Parçayı Düzenle",
"editItem": "Stok kalemi düzenle",
"@editItem": {},
"editLineItem": "Satır Ögesini Düzenle",
"editLineItem": "Satırı Düzenle",
"@editLineItem": {},
"email": "E-posta",
"@email": {},
@ -316,9 +316,9 @@
"@expiryExpired": {},
"expiryStale": "Eskimiş",
"@expiryStale": {},
"extraLineItem": "Fazladan Satır Ögesi",
"extraLineItem": "Ek Kalem",
"@extraLineItem": {},
"extraLineItems": "Fazladan Satır Ögeleri",
"extraLineItems": "Ek Kalemler",
"@extraLineItems": {},
"feedback": "Geri Bildirim",
"@feedback": {},
@ -348,7 +348,7 @@
"@filterInStockDetail": {},
"filterSerialized": "Sıralandırılmış",
"@filterSerialized": {},
"filterSerializedDetail": "Sıralandırılmış stok ürünkerini göster",
"filterSerializedDetail": "Seri numaralı stok kalemlerini göster",
"@filterSerializedDetail": {},
"filterTemplate": "Şablon",
"@filterTemplate": {},
@ -392,9 +392,9 @@
"@homeShowSo": {},
"homeShowSoDescription": "Satış siparişleri tuşunu giriş ekranında göster",
"@homeShowSoDescription": {},
"homeShowSubscribed": "Parça bildirimlerine abone ol",
"homeShowSubscribed": "Takip Edilen Parçalar",
"@homeShowSubscribed": {},
"homeShowSubscribedDescription": "Abone olunan bölümleri ana ekranda göster",
"homeShowSubscribedDescription": "Takip edilen parçaları ana ekranda göster",
"@homeShowSubscsribedDescription": {},
"homeShowSuppliers": "Tedarikçileri Göster",
"@homeShowSuppliers": {},
@ -408,13 +408,13 @@
"@homeShowCustomers": {},
"homeShowCustomersDescription": "Müşteri butonunu ana ekranda göster",
"@homeShowCustomersDescription": {},
"imageUploadFailure": "Fotoğraf yükleme başarısız",
"imageUploadFailure": "Görsel yükleme başarısız",
"@imageUploadFailure": {},
"imageUploadSuccess": "Resim yüklendi",
"imageUploadSuccess": "Görsel yüklendi",
"@imageUploadSuccess": {},
"inactive": "Pasif",
"@inactive": {},
"inactiveCompany": "Bu şirket inaktif olarak imlendi",
"inactiveCompany": "Bu şirket pasif olarak işaretlendi",
"@inactiveCompany": {},
"inactiveDetail": "Bu parça pasif olarak işaretlendi",
"@inactiveDetail": {},
@ -432,9 +432,9 @@
"@internalPartNumber": {},
"info": "Bilgi",
"@info": {},
"inProduction": "Yapım Aşamasında",
"inProduction": "Üretimde",
"@inProduction": {},
"inProductionDetail": "Bu ürün üretim aşamasında",
"inProductionDetail": "Bu stok kalemi üretimdedir",
"@inProductionDetail": {},
"internalPart": "İç Parça",
"@internalPart": {},
@ -448,7 +448,7 @@
"@invalidPartCategory": {},
"invalidStockLocation": "Geçersiz Stok Konumu",
"@invalidStockLocation": {},
"invalidStockItem": "Geçersiz Stok Parçası",
"invalidStockItem": "Geçersiz Stok Kalemi",
"@invalidStockItem": {},
"invalidSupplierPart": "Geçersiz Tedarikçi Parçası",
"@invalidSupplierPart": {},
@ -462,7 +462,7 @@
"@issue": {},
"issueDate": "Sorun Tarihi",
"@issueDate": {},
"issueOrder": "Sipariş Ver",
"issueOrder": "Sipariş Düzenle",
"@issueOrder": {},
"itemInLocation": "Parça zaten konumda",
"@itemInLocation": {},
@ -472,13 +472,13 @@
"@itemUpdated": {},
"keywords": "Anahtar kelimeler",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Etiket Sürücü",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Etiket Yazıcı Sürücüsü Seçin",
"@labelSelectDriver": {},
"labelPrinting": "Etiket Yazdırma",
"@labelPrinting": {},
"labelPrintingDetail": "Etiket yazdırmayı aktifleştir",
"labelPrintingDetail": "Etiket yazdırmayı etkinleştir",
"@labelPrintingDetail": {},
"labelTemplate": "Etiket Şablonu",
"@labelTemplate": {},
@ -492,21 +492,21 @@
"@languageDefault": {},
"languageSelect": "Dil Seçin",
"@languageSelect": {},
"lastStocktake": "Son stok tutma",
"lastStocktake": "Son Stok Sayımı",
"@lastStocktake": {},
"lastUpdated": "Son güncelleme",
"@lastUpdated": {},
"level": "Düzey",
"level": "Seviye",
"@level": {},
"lineItemAdd": "Satır Ögesi Ekle",
"lineItemAdd": "Satır Ekle",
"@lineItemAdd": {},
"lineItem": "Parça Sırası",
"lineItem": "Satır",
"@lineItem": {},
"lineItems": "Parçalar Sırası",
"lineItems": "Satırlar",
"@lineItems": {},
"lineItemUpdated": "Satır ögesi güncellendi",
"lineItemUpdated": "Satır güncellendi",
"@lineItemUpdated": {},
"locateItem": "Stok ögesi bul",
"locateItem": "Stok kalemi bul",
"@locateItem": {},
"locateLocation": "Stok konumu bul",
"@locateLocation": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Yeni stok konumu oluştur",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Varsayılan Konum",
"@locationDefault": {},
"locationNotSet": "Belirtilmiş konum yok",
"@locationNotSet": {},
@ -562,7 +562,7 @@
"@noResponse": {},
"noResults": "Sonuç Yok",
"@noResults": {},
"noImageAvailable": "Kullanılabilir resim yok",
"noImageAvailable": "Görsel yok",
"@noImageAvailable": {},
"noPricingAvailable": "Fiyatlandırma mevcut değil",
"@noPricingAvailable": {},
@ -588,9 +588,9 @@
"@orientationPortrait": {},
"orientationSystem": "Sistem",
"@orientationSystem": {},
"outstanding": "Beklemede",
"outstanding": "ık",
"@outstanding": {},
"outstandingOrderDetail": "Bekleyen siparişleri göster",
"outstandingOrderDetail": "ık siparişleri göster",
"@outstandingOrderDetail": {},
"overdue": "Gecikmede",
"@overdue": {},
@ -602,7 +602,7 @@
"@packageName": {},
"parameters": "Parametreler",
"@parameters": {},
"parametersSettingDetail": "Parça parametrelerini göster",
"parametersSettingDetail": "Parça parametrelerini görüntüle",
"@parametersSettingDetail": {},
"parent": "Üst",
"@parent": {},
@ -624,7 +624,7 @@
"@parts": {
"description": "Part (multiple)"
},
"partNotSalable": "Parça satılabilir olarak imlenmemiş",
"partNotSalable": "Parça satılabilir olarak işaretli değil",
"@partNotSalable": {},
"partsNone": "Parça Yok",
"@partsNone": {},
@ -636,7 +636,7 @@
"@pricingSettingDetail": {},
"partSettings": "Parça Ayarları",
"@partSettings": {},
"partsStarred": "Sürekli Gelen parçalar",
"partsStarred": "Takip Edilen Parçalar",
"@partsStarred": {},
"partsStarredNone": "Yıldızlı parça yok",
"@partsStarredNone": {},
@ -648,7 +648,7 @@
"@partCategoryTopLevel": {},
"partCategories": "Parça Kategorileri",
"@partCategories": {},
"partDetails": "Parça detayları",
"partDetails": "Parça Ayrıntıları",
"@partDetails": {},
"partNotes": "Parça notları",
"@partNotes": {},
@ -710,15 +710,15 @@
"@projectCode": {},
"purchaseOrderConfirmScan": "Tarama Verisini Onayla",
"@purchaseOrderConfirmScan": {},
"purchaseOrderConfirmScanDetail": "Taranan Ürünlerin Detaylarını Onayla",
"purchaseOrderConfirmScanDetail": "Kalemleri tararken ayrıntıları onayla",
"@purchaseOrderConfirmScanDetail": {},
"purchaseOrderEnable": "Satın Alma Emirlerini Etkinleştir",
"purchaseOrderEnable": "Satın Alma Siparişlerini Etkinleştir",
"@purchaseOrderEnable": {},
"purchaseOrderEnableDetail": "Satın Alma Emirlerinin İşlevselliğini Etkinleştir",
"@purchaseOrderEnableDetail": {},
"purchaseOrderShowCamera": "Kamera Kısayolu",
"@purchaseOrderShowCamera": {},
"purchaseOrderShowCameraDetail": "Satın alma emirleri ekranında fotoğraf yükleme kısayolunu etkinleştir",
"purchaseOrderShowCameraDetail": "Satın alma siparişi ekranında görsel yükleme kısayolunu etkinleştir",
"@purchaseOrderShowCameraDetail": {},
"purchaseOrder": "Satınalma Siparişi",
"@purchaseOrder": {},
@ -728,7 +728,7 @@
"@purchaseOrderEdit": {},
"purchaseOrderSettings": "Satın Alma Emri Ayarları",
"@purchaseOrderSettings": {},
"purchaseOrders": "Satınalma Siparişleri",
"purchaseOrders": "Satın Alma Siparişleri",
"@purchaseOrders": {},
"purchaseOrderUpdated": "Satın Alma Siparişi güncellendi",
"@purchaseOrderUpdated": {},
@ -750,13 +750,13 @@
"@queryEmpty": {},
"queryNoResults": "Sorgu için sonuç yok",
"@queryNoResults": {},
"received": "Alınan",
"received": "Teslim Alındı",
"@received": {},
"receivedFilterDetail": "Alınan ögeleri göster",
"receivedFilterDetail": "Teslim alınan kalemleri göster",
"@receivedFilterDetail": {},
"receiveItem": "Alınan Öğeler",
"receiveItem": "Kalemi Teslim Al",
"@receiveItem": {},
"receivedItem": "Alınan stok parçaları",
"receivedItem": "Teslim alınan stok kalemleri",
"@receivedItem": {},
"reference": "Referans",
"@reference": {},
@ -838,13 +838,13 @@
"@salesOrder": {},
"salesOrders": "Satış Siparişleri",
"@salesOrders": {},
"salesOrderEnable": "Satış Emirlerini Etkinleştir",
"salesOrderEnable": "Satış Siparişlerini Etkinleştir",
"@salesOrderEnable": {},
"salesOrderEnableDetail": "Satış Siparişlerinin İşlevselliğini Etkinleştir",
"@salesOrderEnableDetail": {},
"salesOrderShowCamera": "Kamera Kısayolu",
"@salesOrderShowCamera": {},
"salesOrderShowCameraDetail": "Satış emirleri ekranında fotoğraf yükleme kısayolunu etkinleştir",
"salesOrderShowCameraDetail": "Satış siparişi ekranında görsel yükleme kısayolunu etkinleştir",
"@salesOrderShowCameraDetail": {},
"salesOrderSettings": "Satış emirleri ayarları",
"@salesOrderSettings": {},
@ -860,7 +860,7 @@
},
"scanBarcode": "Barkod Tara",
"@scanBarcode": {},
"scanSupplierPart": "Sağlayıcı parça barkodunu tara",
"scanSupplierPart": "Tedarikçi parça barkodunu tara",
"@scanSupplierPart": {},
"scanIntoLocation": "Konuma Tara",
"@scanIntoLocation": {},
@ -870,7 +870,7 @@
"@scannerExternal": {},
"scannerExternalDetail": "Barkodları okumak için harici tarayıcı kullan (keyboard wedge modu)",
"@scannerExternalDetail": {},
"scanReceivedParts": "Alınan Parçaları Tara",
"scanReceivedParts": "Teslim Alınan Parçaları Tara",
"@scanReceivedParts": {},
"search": "Ara",
"@search": {
@ -888,7 +888,7 @@
"@select": {},
"selectFile": "Dosya Seç",
"@selectFile": {},
"selectImage": "Resim Seç",
"selectImage": "Görsel Seç",
"@selectImage": {},
"selectLocation": "Bir yer seçin",
"@selectLocation": {},
@ -922,7 +922,7 @@
"@serverEmpty": {},
"serverError": "Sunucu Hatası",
"@serverError": {},
"serverDetails": "Sunucu Detayları",
"serverDetails": "Sunucu Ayrıntıları",
"@serverDetails": {},
"serverMissingData": "Sunucu yanıtında gerekli alanlar eksik",
"@serverMissingData": {},
@ -948,11 +948,11 @@
"@shipmentsPending": {},
"shipmentAdd": "Gönderi Ekle",
"@shipmentAdd": {},
"shipmentCheck": "Teslimatı Kontrol Et",
"shipmentCheck": "Sevkiyatı Kontrol Et",
"@shipmentCheck": {},
"shipmentCheckDetail": "Bu teslimatı kontrol edildi olarak işaretle",
"shipmentCheckDetail": "Bu sevkiyatı kontrol edildi olarak işaretle",
"@shipmentCheckDetail": {},
"shipmentChecked": "Teslimat Kontrol Edildi",
"shipmentChecked": "Sevkiyat Kontrol Edildi",
"@shipmentChecked": {},
"shipmentDate": "Teslimat Tarihi",
"@shipmentDate": {},
@ -962,7 +962,7 @@
"@shipmentReference": {},
"shipmentSend": "Teslimatı Gönder",
"@shipmentSend": {},
"shipmentUncheck": "Teslimat İşaretini Kaldır",
"shipmentUncheck": "Sevkiyat Kontrolünü Kaldır",
"@shipmentUncheck": {},
"shipmentUncheckDetail": "Bu teslimatı kontrol edilmedi olarak işaretle",
"@shipmentUncheckDetail": {},
@ -998,25 +998,25 @@
"@stockItems": {},
"stockItemCreate": "Yeni Stok Kalemi",
"@stockItemCreate": {},
"stockItemCreateDetail": "Bu konuma yeni stok kalemi oluştur",
"stockItemCreateDetail": "Bu konumda yeni stok kalemi oluştur",
"@stockItemCreateDetail": {},
"stockItemDelete": "Stok parçasını sil",
"@stockItemDelete": {},
"stockItemDeleteConfirm": "Bu stock ögesini silmek istediğinize emin misiniz?",
"stockItemDeleteConfirm": "Bu stok kalemini silmek istediğinize emin misiniz?",
"@stockItemDeleteConfirm": {},
"stockItemDeleteFailure": "Stok parçası silinemedi",
"stockItemDeleteFailure": "Stok kalemi silinemedi",
"@stockItemDeleteFailure": {},
"stockItemDeleteSuccess": "Stok ögesi silindi",
"stockItemDeleteSuccess": "Stok kalemi silindi",
"@stockItemDeleteSuccess": {},
"stockItemHistory": "Stok Geçmişi",
"@stockItemHistory": {},
"stockItemHistoryDetail": "Geçmiş stok takip bilgisini göster",
"stockItemHistoryDetail": "Geçmiş stok takip bilgisini görüntüle",
"@stockItemHistoryDetail": {},
"stockItemTransferred": "Stok ögesi aktarıldı",
"stockItemTransferred": "Stok kalemi aktarıldı",
"@stockItemTransferred": {},
"stockItemUpdated": "Stok ögesi güncellendi",
"stockItemUpdated": "Stok kalemi güncellendi",
"@stockItemUpdated": {},
"stockItemsNotAvailable": "Kullanılabilir stok ögesi yok",
"stockItemsNotAvailable": "Stok kalemi bulunmamaktadır",
"@stockItemsNotAvailable": {},
"stockItemNotes": "Stok Kalemi Notları",
"@stockItemNotes": {},
@ -1056,11 +1056,11 @@
"@supplier": {},
"supplierPart": "Tedarikçi Parçası",
"@supplierPart": {},
"supplierPartEdit": "Sağlayıcı Parçasını Düzenle",
"supplierPartEdit": "Tedarikçi Parçasını Düzenle",
"@supplierPartEdit": {},
"supplierPartNumber": "Sağlayıcı Parça Numarası",
"supplierPartNumber": "Tedarikçi Parça Numarası",
"@supplierPartNumber": {},
"supplierPartUpdated": "Sağlayıcı Parçası Güncellendi",
"supplierPartUpdated": "Tedarikçi Parçası Güncellendi",
"@supplierPartUpdated": {},
"supplierParts": "Tedarikçi Parçaları",
"@supplierParts": {},
@ -1086,7 +1086,7 @@
"@testResults": {
"description": ""
},
"testResultsDetail": "Stok ögesi test sonuçlarını görüntüle",
"testResultsDetail": "Stok kalemi test sonuçlarını görüntüle",
"@testResultsDetail": {},
"testResultAdd": "Test Sonucu Ekle",
"@testResultAdd": {},
@ -1148,7 +1148,7 @@
"@uploadFailed": {},
"uploadSuccess": "Dosya yüklendi",
"@uploadSuccess": {},
"uploadImage": "Resim Yükleyin",
"uploadImage": "Görsel Yükle",
"@uploadImage": {},
"usedIn": "Burada Kullanıldı",
"@usedIn": {},
@ -1166,7 +1166,7 @@
"@valueCannotBeEmpty": {},
"valueRequired": "Değer gereklidir",
"@valueRequired": {},
"variants": "Türevler",
"variants": "Varyantlar",
"@variants": {},
"version": "Sürüm",
"@version": {},
@ -1188,13 +1188,13 @@
"@salePrice": {},
"saleHistory": "Satış Geçmişi",
"@saleHistory": {},
"supplierPricing": "Sağlayıcı Fiyatlandırması",
"supplierPricing": "Tedarikçi Fiyatlandırması",
"@supplierPricing": {},
"bomCost": "BoM Maliyeti",
"@bomCost": {},
"internalCost": "Dahili Maliyet",
"@internalCost": {},
"variantCost": "Türev Maliyeti",
"variantCost": "Varyant Maliyeti",
"@variantCost": {},
"overallPricing": "Genel Fiyatlandırma",
"@overallPricing": {},
@ -1202,6 +1202,6 @@
"@pricingOverrides": {},
"currency": "Para Birimi",
"@currency": {},
"priceBreaks": "Fiyat Aralığı",
"priceBreaks": "Fiyat Kademeleri",
"@priceBreaks": {}
}

View file

@ -46,7 +46,7 @@
"@aspectRatioSquare": {},
"allocateStock": "Виділити запас",
"@allocateStock": {},
"allocatedStock": "Allocated Stock",
"allocatedStock": "Виділений Запас",
"@allocatedStock": {},
"appReleaseNotes": "Показати примітки до випуску",
"@appReleaseNotes": {},
@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "Сканування штрих-кодів призупинено",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "Торкніться або утримуйте, щоб призупинити сканування",
"@barcodeScanPause": {},
"barcodeScanAssign": "Сканувати щоб призначити штрих-код",
"@barcodeScanAssign": {},
@ -228,11 +228,11 @@
"@delete": {},
"deleteFailed": "Помилка видалення",
"@deleteFailed": {},
"deleteImageConfirmation": "Are you sure you want to delete this image?",
"deleteImageConfirmation": "Ви дійсно хочете видалити це зображення?",
"@deleteImageConfirmation": {},
"deleteImageTooltip": "Delete Image",
"deleteImageTooltip": "Видалити Зображення",
"@deleteImageTooltip": {},
"deleteImage": "Delete Image",
"deleteImage": "Видалити Зображення",
"@deleteImage": {},
"deletePart": "Видалити деталь",
"@deletePart": {},
@ -240,7 +240,7 @@
"@deletePartDetail": {},
"deleteSuccess": "Операція видалення пройшла успішно",
"@deleteSuccess": {},
"deliveryDate": "Delivery Date",
"deliveryDate": "Дата Доставки",
"@deliveryDate": {},
"description": "Опис",
"@description": {},
@ -384,9 +384,9 @@
"@homeShowPo": {},
"homeShowPoDescription": "Показувати кнопку замовлення на домашньому екрані",
"@homeShowPoDescription": {},
"homeShowShipments": "Show Shipments",
"homeShowShipments": "Показати відправлення",
"@homeShowShipments": {},
"homeShowShipmentsDescription": "Show pending shipments on the home screen",
"homeShowShipmentsDescription": "Показати відкладені відправлення на головному екрані",
"@homeShowShipmentsDescription": {},
"homeShowSo": "Показати замовлення",
"@homeShowSo": {},
@ -454,15 +454,15 @@
"@invalidSupplierPart": {},
"invalidUsernamePassword": "Неправильна комбінація імені користувача та пароля",
"@invalidUsernamePassword": {},
"invoice": "Invoice",
"invoice": "Інвойс",
"@invoice": {},
"invoiceNumber": "Invoice Number",
"invoiceNumber": "Номер Інвойсу",
"@invoiceNumber": {},
"issue": "Issue",
"issue": "Видача",
"@issue": {},
"issueDate": "Issue Date",
"issueDate": "Дата Видачі",
"@issueDate": {},
"issueOrder": "Issue Order",
"issueOrder": "Оформити Замовлення",
"@issueOrder": {},
"itemInLocation": "Товар вже на місці",
"@itemInLocation": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "Ключові слова",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "Драйвер Етикеток",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "Вибрати Драйвер Принтера Етикеток",
"@labelSelectDriver": {},
"labelPrinting": "Друк Ярликів",
"@labelPrinting": {},
@ -482,9 +482,9 @@
"@labelPrintingDetail": {},
"labelTemplate": "Шаблон Ярлика",
"@labelTemplate": {},
"labelSelectTemplate": "Select Label Template",
"labelSelectTemplate": "Вибрати Шаблон Етикетки",
"@labelSelectTemplate": {},
"labelSelectPrinter": "Select Label Printer",
"labelSelectPrinter": "Вибрати Принтер Етикеток",
"@labelSelectPrinter": {},
"language": "Мова",
"@language": {},
@ -492,19 +492,19 @@
"@languageDefault": {},
"languageSelect": "Вибір мови",
"@languageSelect": {},
"lastStocktake": "Last Stocktake",
"lastStocktake": "Остання інвентаризація",
"@lastStocktake": {},
"lastUpdated": "Останнє оновлення",
"@lastUpdated": {},
"level": "Рівень",
"@level": {},
"lineItemAdd": "Add Line Item",
"lineItemAdd": "Додати Позицію",
"@lineItemAdd": {},
"lineItem": "Line Item",
"lineItem": "Позиція",
"@lineItem": {},
"lineItems": "Line Items",
"lineItems": "Позиції",
"@lineItems": {},
"lineItemUpdated": "Line item updated",
"lineItemUpdated": "Позицію оновлено",
"@lineItemUpdated": {},
"locateItem": "Знайти елемент запасів",
"@locateItem": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "Створити нове розташування на складі",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "Розташування за замовчуванням",
"@locationDefault": {},
"locationNotSet": "Розташування не вказано",
"@locationNotSet": {},
@ -544,9 +544,9 @@
"@missingData": {},
"name": "Назва",
"@name": {},
"no": "No",
"no": "Ні",
"@no": {},
"notApplicable": "N/A",
"notApplicable": "Н",
"@notApplicable": {},
"notConnected": "Не під’єднано",
"@notConnected": {},
@ -564,19 +564,19 @@
"@noResults": {},
"noImageAvailable": "Немає доступного зображення",
"@noImageAvailable": {},
"noPricingAvailable": "No pricing available",
"noPricingAvailable": "Ціни не вказано",
"@noPricingAvailable": {},
"noPricingDataFound": "No pricing data found for this part",
"noPricingDataFound": "Для цієї деталі не знайдено даних про ціну",
"@noPricingDataFound": {},
"noSubcategories": "No Subcategories",
"noSubcategories": "Немає Підкатегорій",
"@noSubcategories": {},
"noSubcategoriesAvailable": "No subcategories available",
"noSubcategoriesAvailable": "Немає доступних підкатегорій",
"@noSubcategoriesAvailable": {},
"numberInvalid": "Некоректний номер",
"@numberInvalid": {},
"onOrder": "On Order",
"onOrder": "У замовленні",
"@onOrder": {},
"onOrderDetails": "Items currently on order",
"onOrderDetails": "Позиції в поточних замовленнях",
"@onOrderDetails": {},
"orientation": "Орієнтація екрана",
"@orientation": {},
@ -632,7 +632,7 @@
"@partNoResults": {},
"partPricing": "Ціна деталі",
"@partPricing": {},
"partPricingSettingDetail": "Display part pricing information",
"partPricingSettingDetail": "Відображати інформацію про ціни на деталь",
"@pricingSettingDetail": {},
"partSettings": "Налаштування позиції",
"@partSettings": {},
@ -652,7 +652,7 @@
"@partDetails": {},
"partNotes": "Примітки до позиції",
"@partNotes": {},
"partStock": "Part Stock",
"partStock": "Наявність На Складі",
"@partStock": {
"description": "part stock"
},
@ -660,7 +660,7 @@
"@password": {},
"passwordEmpty": "Пароль не може бути порожнім",
"@passwordEmpty": {},
"pending": "Pending",
"pending": "В очікуванні",
"@pending": {},
"permissionAccountDenied": "Ваш обліковий запис не має необхідних прав для виконання цієї дії",
"@permissionAccountDenied": {},
@ -712,27 +712,27 @@
"@purchaseOrderConfirmScan": {},
"purchaseOrderConfirmScanDetail": "Підтвердити подробиці при скануванні в позицій",
"@purchaseOrderConfirmScanDetail": {},
"purchaseOrderEnable": "Enable Purchase Orders",
"purchaseOrderEnable": "Увімкнути Закупівлю",
"@purchaseOrderEnable": {},
"purchaseOrderEnableDetail": "Enable purchase order functionality",
"purchaseOrderEnableDetail": "Увімкнути функціонал закупівлі",
"@purchaseOrderEnableDetail": {},
"purchaseOrderShowCamera": "Camera Shortcut",
"purchaseOrderShowCamera": "Швидкий Доступ до Камери",
"@purchaseOrderShowCamera": {},
"purchaseOrderShowCameraDetail": "Enable image upload shortcut on purchase order screen",
"purchaseOrderShowCameraDetail": "Увімкнути ярлик для завантаження зображень на екрані закупівель",
"@purchaseOrderShowCameraDetail": {},
"purchaseOrder": "Purchase Order",
"purchaseOrder": "Замовлення на Закупівлю",
"@purchaseOrder": {},
"purchaseOrderCreate": "New Purchase Order",
"purchaseOrderCreate": "Нове Замовлення на Закупівлю",
"@purchaseOrderCreate": {},
"purchaseOrderEdit": "Edit Purchase Order",
"purchaseOrderEdit": "Редагувати Замовлення на Закупівлю",
"@purchaseOrderEdit": {},
"purchaseOrderSettings": "Purchase order settings",
"purchaseOrderSettings": "Налаштування замовлення на закупівлю",
"@purchaseOrderSettings": {},
"purchaseOrders": "Purchase Orders",
"purchaseOrders": "Закупівлі",
"@purchaseOrders": {},
"purchaseOrderUpdated": "Purchase order updated",
"purchaseOrderUpdated": "Замовлення на закупівлю оновлено",
"@purchaseOrderUpdated": {},
"purchasePrice": "Purchase Price",
"purchasePrice": "Закупівельна Ціна",
"@purchasePrice": {},
"quantity": "Кількість",
"@quantity": {
@ -740,7 +740,7 @@
},
"quantityAvailable": "Доступна кількість",
"@quantityAvailable": {},
"quantityEmpty": "Quantity is empty",
"quantityEmpty": "Кількість не вказана",
"@quantityEmpty": {},
"quantityInvalid": "Некоректна кількість",
"@quantityInvalid": {},
@ -752,13 +752,13 @@
"@queryNoResults": {},
"received": "Отримано",
"@received": {},
"receivedFilterDetail": "Show received items",
"receivedFilterDetail": "Показувати отримані позиції",
"@receivedFilterDetail": {},
"receiveItem": "Receive Item",
"receiveItem": "Прийняти Позицію",
"@receiveItem": {},
"receivedItem": "Received Stock Item",
"receivedItem": "Отримана Складська Позиція",
"@receivedItem": {},
"reference": "Reference",
"reference": "Номер документа",
"@reference": {},
"refresh": "Оновити",
"@refresh": {},
@ -766,7 +766,7 @@
"@rotateClockwise": {},
"refreshing": "Оновлення",
"@refreshing": {},
"rejected": "Rejected",
"rejected": "Відхилено",
"@rejected": {},
"releaseNotes": "Замітки до випуску",
"@releaseNotes": {},

View file

@ -102,7 +102,7 @@
"@barcodeReceivePart": {},
"barcodeScanPaused": "条形码扫描已暂停",
"@barodeScanPaused": {},
"barcodeScanPause": "Tap to pause scanning",
"barcodeScanPause": "点击以暂停扫描",
"@barcodeScanPause": {},
"barcodeScanAssign": "扫描以分配条形码",
"@barcodeScanAssign": {},
@ -472,9 +472,9 @@
"@itemUpdated": {},
"keywords": "关键词",
"@keywords": {},
"labelDriver": "Label Driver",
"labelDriver": "标签打印机",
"@labelDriver": {},
"labelSelectDriver": "Select Label Printer Driver",
"labelSelectDriver": "选择标签打印机",
"@labelSelectDriver": {},
"labelPrinting": "打印标签",
"@labelPrinting": {},
@ -514,7 +514,7 @@
"@locationCreate": {},
"locationCreateDetail": "创建新库存地点",
"@locationCreateDetail": {},
"locationDefault": "Default Location",
"locationDefault": "默认位置",
"@locationDefault": {},
"locationNotSet": "没有指定仓储位置",
"@locationNotSet": {},

View file

@ -32,7 +32,6 @@ const String INV_LABEL_DEFAULT_PRINTER = "defaultLabelPrinter";
const String INV_LABEL_DEFAULT_PLUGIN = "defaultLabelPlugin";
// Part settings
const String INV_PART_SHOW_PARAMETERS = "partShowParameters";
const String INV_PART_SHOW_BOM = "partShowBom";
const String INV_PART_SHOW_PRICING = "partShowPricing";

View file

@ -13,7 +13,6 @@ class InvenTreePartSettingsWidget extends StatefulWidget {
class _InvenTreePartSettingsState extends State<InvenTreePartSettingsWidget> {
_InvenTreePartSettingsState();
bool partShowParameters = true;
bool partShowBom = true;
bool partShowPricing = true;
bool stockShowHistory = false;
@ -28,10 +27,6 @@ class _InvenTreePartSettingsState extends State<InvenTreePartSettingsWidget> {
}
Future<void> loadSettings() async {
partShowParameters = await InvenTreeSettingsManager().getBool(
INV_PART_SHOW_PARAMETERS,
true,
);
partShowBom = await InvenTreeSettingsManager().getBool(
INV_PART_SHOW_BOM,
true,
@ -68,23 +63,6 @@ class _InvenTreePartSettingsState extends State<InvenTreePartSettingsWidget> {
body: Container(
child: ListView(
children: [
ListTile(
title: Text(L10().parameters),
subtitle: Text(L10().parametersSettingDetail),
leading: Icon(TablerIcons.list),
trailing: Switch(
value: partShowParameters,
onChanged: (bool value) {
InvenTreeSettingsManager().setValue(
INV_PART_SHOW_PARAMETERS,
value,
);
setState(() {
partShowParameters = value;
});
},
),
),
ListTile(
title: Text(L10().bom),
subtitle: Text(L10().bomEnable),

View file

@ -2,14 +2,13 @@ import "dart:io";
import "package:flutter/material.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/api.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/widget/link_icon.dart";
import "package:one_context/one_context.dart";
import "package:inventree/api.dart";
import "package:inventree/l10.dart";
import "package:inventree/app_colors.dart";
import "package:inventree/inventree/model.dart";
import "package:inventree/widget/fields.dart";
import "package:inventree/widget/progress.dart";
import "package:inventree/widget/snacks.dart";
@ -23,13 +22,13 @@ import "package:inventree/widget/refreshable_state.dart";
*/
class AttachmentWidget extends StatefulWidget {
const AttachmentWidget(
this.attachmentClass,
this.modelType,
this.modelId,
this.imagePrefix,
this.hasUploadPermission,
) : super();
final InvenTreeAttachment attachmentClass;
final String modelType;
final int modelId;
final bool hasUploadPermission;
final String imagePrefix;
@ -54,15 +53,15 @@ class _AttachmentWidgetState extends RefreshableState<AttachmentWidget> {
IconButton(
icon: Icon(TablerIcons.camera),
onPressed: () async {
widget.attachmentClass.uploadImage(
InvenTreeAttachment()
.uploadImage(
widget.modelType,
widget.modelId,
prefix: widget.imagePrefix,
);
FilePickerDialog.pickImageFromCamera().then((File? file) {
upload(context, file).then((_) {
)
.then((_) {
refresh(context);
});
});
},
),
IconButton(
@ -83,8 +82,9 @@ class _AttachmentWidgetState extends RefreshableState<AttachmentWidget> {
showLoadingOverlay();
final bool result = await widget.attachmentClass.uploadAttachment(
final bool result = await InvenTreeAttachment().uploadAttachment(
file,
widget.modelType,
widget.modelId,
);
@ -168,25 +168,24 @@ class _AttachmentWidgetState extends RefreshableState<AttachmentWidget> {
Future<void> request(BuildContext context) async {
Map<String, String> filters = {};
if (InvenTreeAPI().supportsModernAttachments) {
filters["model_type"] = widget.attachmentClass.REF_MODEL_TYPE;
filters["model_type"] = widget.modelType;
filters["model_id"] = widget.modelId.toString();
} else {
filters[widget.attachmentClass.REFERENCE_FIELD] = widget.modelId
.toString();
}
await widget.attachmentClass.list(filters: filters).then((var results) {
attachments.clear();
List<InvenTreeAttachment> _attachments = [];
InvenTreeAttachment().list(filters: filters).then((var results) {
for (var result in results) {
if (result is InvenTreeAttachment) {
attachments.add(result);
_attachments.add(result);
}
}
if (mounted) {
setState(() {
attachments = _attachments;
});
}
});
setState(() {});
}
@override
@ -240,3 +239,40 @@ class _AttachmentWidgetState extends RefreshableState<AttachmentWidget> {
return tiles;
}
}
/*
* Return a ListTile to display attachments for the specified model
*/
ListTile? ShowAttachmentsItem(
BuildContext context,
String modelType,
int modelId,
String imagePrefix,
int attachmentCount,
bool hasUploadPermission,
) {
if (!InvenTreeAPI().supportsModernAttachments) {
return null;
}
return ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
modelType,
modelId,
imagePrefix,
hasUploadPermission,
),
),
);
},
);
}

View file

@ -1,6 +1,8 @@
import "package:flutter/material.dart";
import "package:flutter_speed_dial/flutter_speed_dial.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/l10.dart";
import "package:inventree/api.dart";
@ -13,6 +15,7 @@ import "package:inventree/widget/attachment_widget.dart";
import "package:inventree/widget/link_icon.dart";
import "package:inventree/widget/order/purchase_order_list.dart";
import "package:inventree/widget/order/sales_order_list.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/refreshable_state.dart";
import "package:inventree/widget/snacks.dart";
import "package:inventree/widget/company/supplier_part_list.dart";
@ -37,6 +40,7 @@ class _CompanyDetailState extends RefreshableState<CompanyDetailWidget> {
int outstandingPurchaseOrders = 0;
int outstandingSalesOrders = 0;
int parameterCount = 0;
int attachmentCount = 0;
@override
@ -184,9 +188,19 @@ class _CompanyDetailState extends RefreshableState<CompanyDetailWidget> {
}
});
InvenTreeCompanyAttachment().countAttachments(widget.company.pk).then((
value,
) {
InvenTreeParameter()
.countParameters(InvenTreeCompany.MODEL_TYPE, widget.company.pk)
.then((value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
InvenTreeAttachment()
.countAttachments(InvenTreeCompany.MODEL_TYPE, widget.company.pk)
.then((value) {
if (mounted) {
setState(() {
attachmentCount = value;
@ -393,29 +407,31 @@ class _CompanyDetailState extends RefreshableState<CompanyDetailWidget> {
);
}
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? parameterTile = ShowParametersItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeCompanyAttachment(),
InvenTreeCompany.MODEL_TYPE,
widget.company.pk,
parameterCount,
widget.company.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreeCompany.MODEL_TYPE,
widget.company.pk,
widget.company.name,
InvenTreeCompany().canEdit,
),
),
);
},
),
attachmentCount,
widget.company.canEdit,
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}
}

View file

@ -1,6 +1,8 @@
import "package:flutter/material.dart";
import "package:flutter_speed_dial/flutter_speed_dial.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/l10.dart";
import "package:inventree/api.dart";
@ -8,6 +10,8 @@ import "package:inventree/app_colors.dart";
import "package:inventree/inventree/company.dart";
import "package:inventree/inventree/part.dart";
import "package:inventree/widget/attachment_widget.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/refreshable_state.dart";
import "package:inventree/widget/snacks.dart";
@ -31,6 +35,9 @@ class _ManufacturerPartDisplayState
extends RefreshableState<ManufacturerPartDetailWidget> {
_ManufacturerPartDisplayState();
int parameterCount = 0;
int attachmentCount = 0;
@override
String getAppBarTitle() => L10().manufacturerPart;
@ -42,7 +49,34 @@ class _ManufacturerPartDisplayState
if (!result) {
Navigator.of(context).pop();
return;
}
InvenTreeParameter()
.countParameters(
InvenTreeManufacturerPart.MODEL_TYPE,
widget.manufacturerPart.pk,
)
.then((value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
InvenTreeAttachment()
.countAttachments(
InvenTreeManufacturerPart.MODEL_TYPE,
widget.manufacturerPart.pk,
)
.then((value) {
if (mounted) {
setState(() {
attachmentCount = value;
});
}
});
}
Future<void> editManufacturerPart(BuildContext context) async {
@ -91,11 +125,6 @@ class _ManufacturerPartDisplayState
List<Widget> getTiles(BuildContext context) {
List<Widget> tiles = [];
if (loading) {
tiles.add(progressIndicator());
return tiles;
}
// Internal Part
tiles.add(
ListTile(
@ -174,6 +203,31 @@ class _ManufacturerPartDisplayState
);
}
ListTile? parameterTile = ShowParametersItem(
context,
InvenTreeManufacturerPart.MODEL_TYPE,
widget.manufacturerPart.pk,
parameterCount,
widget.manufacturerPart.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreeManufacturerPart.MODEL_TYPE,
widget.manufacturerPart.pk,
widget.manufacturerPart.MPN,
attachmentCount,
widget.manufacturerPart.canEdit,
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}
}

View file

@ -2,6 +2,9 @@ import "package:flutter/material.dart";
import "package:flutter_speed_dial/flutter_speed_dial.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/helpers.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/widget/attachment_widget.dart";
import "package:inventree/widget/link_icon.dart";
import "package:inventree/app_colors.dart";
@ -11,6 +14,7 @@ import "package:inventree/barcode/barcode.dart";
import "package:inventree/inventree/part.dart";
import "package:inventree/inventree/company.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/progress.dart";
import "package:inventree/widget/refreshable_state.dart";
@ -35,6 +39,9 @@ class _SupplierPartDisplayState
extends RefreshableState<SupplierPartDetailWidget> {
_SupplierPartDisplayState();
int parameterCount = 0;
int attachmentCount = 0;
@override
String getAppBarTitle() => L10().supplierPart;
@ -97,7 +104,34 @@ class _SupplierPartDisplayState
if (!result) {
Navigator.of(context).pop();
return;
}
InvenTreeParameter()
.countParameters(
InvenTreeSupplierPart.MODEL_TYPE,
widget.supplierPart.pk,
)
.then((value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
InvenTreeAttachment()
.countAttachments(
InvenTreeSupplierPart.MODEL_TYPE,
widget.supplierPart.pk,
)
.then((value) {
if (mounted) {
setState(() {
attachmentCount = value;
});
}
});
}
/*
@ -286,6 +320,31 @@ class _SupplierPartDisplayState
);
}
ListTile? parameterTile = ShowParametersItem(
context,
InvenTreeSupplierPart.MODEL_TYPE,
widget.supplierPart.pk,
parameterCount,
widget.supplierPart.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreeSupplierPart.MODEL_TYPE,
widget.supplierPart.pk,
widget.supplierPart.SKU,
attachmentCount,
widget.supplierPart.canEdit,
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}
}

View file

@ -7,6 +7,8 @@ import "package:inventree/app_colors.dart";
import "package:inventree/barcode/barcode.dart";
import "package:inventree/barcode/purchase_order.dart";
import "package:inventree/helpers.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/l10.dart";
import "package:inventree/inventree/model.dart";
@ -21,6 +23,7 @@ import "package:inventree/widget/order/po_line_list.dart";
import "package:inventree/widget/attachment_widget.dart";
import "package:inventree/widget/notes_widget.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/progress.dart";
import "package:inventree/widget/refreshable_state.dart";
import "package:inventree/widget/snacks.dart";
@ -50,6 +53,7 @@ class _PurchaseOrderDetailState
int completedLines = 0;
int attachmentCount = 0;
int parameterCount = 0;
bool showCameraShortcut = true;
bool supportProjectCodes = false;
@ -174,8 +178,12 @@ class _PurchaseOrderDetailState
/// Upload an image against the current PurchaseOrder
Future<void> _uploadImage(BuildContext context) async {
InvenTreePurchaseOrderAttachment()
.uploadImage(widget.order.pk, prefix: widget.order.reference)
InvenTreeAttachment()
.uploadImage(
InvenTreePurchaseOrder.MODEL_TYPE,
widget.order.pk,
prefix: widget.order.reference,
)
.then((result) => refresh(context));
}
@ -295,9 +303,19 @@ class _PurchaseOrderDetailState
}
}
InvenTreePurchaseOrderAttachment().countAttachments(widget.order.pk).then((
int value,
) {
InvenTreeParameter()
.countParameters(InvenTreePurchaseOrder.MODEL_TYPE, widget.order.pk)
.then((int value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
InvenTreeAttachment()
.countAttachments(InvenTreePurchaseOrder.MODEL_TYPE, widget.order.pk)
.then((int value) {
if (mounted) {
setState(() {
attachmentCount = value;
@ -565,30 +583,31 @@ class _PurchaseOrderDetailState
),
);
// Attachments
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? parameterTile = ShowParametersItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreePurchaseOrderAttachment(),
InvenTreePurchaseOrder.MODEL_TYPE,
widget.order.pk,
parameterCount,
widget.order.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreePurchaseOrder.MODEL_TYPE,
widget.order.pk,
widget.order.reference,
attachmentCount,
widget.order.canEdit,
),
),
);
},
),
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}

View file

@ -3,13 +3,16 @@ import "package:flutter_speed_dial/flutter_speed_dial.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/barcode/barcode.dart";
import "package:inventree/barcode/sales_order.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/company.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/inventree/sales_order.dart";
import "package:inventree/preferences.dart";
import "package:inventree/widget/link_icon.dart";
import "package:inventree/widget/order/so_extra_line_list.dart";
import "package:inventree/widget/order/so_line_list.dart";
import "package:inventree/widget/order/so_shipment_list.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/refreshable_state.dart";
import "package:inventree/l10.dart";
@ -42,6 +45,7 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
bool showCameraShortcut = true;
bool supportsProjectCodes = false;
int attachmentCount = 0;
int parameterCount = 0;
@override
String getAppBarTitle() {
@ -108,8 +112,12 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
/// Upload an image for this order
Future<void> _uploadImage(BuildContext context) async {
InvenTreeSalesOrderAttachment()
.uploadImage(widget.order.pk, prefix: widget.order.reference)
InvenTreeAttachment()
.uploadImage(
InvenTreeSalesOrder.MODEL_TYPE,
widget.order.pk,
prefix: widget.order.reference,
)
.then((result) => refresh(context));
}
@ -266,9 +274,19 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
true,
);
InvenTreeSalesOrderAttachment().countAttachments(widget.order.pk).then((
int value,
) {
InvenTreeParameter()
.countParameters(InvenTreeSalesOrder.MODEL_TYPE, widget.order.pk)
.then((int value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
InvenTreeAttachment()
.countAttachments(InvenTreeSalesOrder.MODEL_TYPE, widget.order.pk)
.then((int value) {
if (mounted) {
setState(() {
attachmentCount = value;
@ -492,30 +510,31 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
),
);
// Attachments
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? parameterTile = ShowParametersItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeSalesOrderAttachment(),
InvenTreeSalesOrder.MODEL_TYPE,
widget.order.pk,
parameterCount,
widget.order.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreeSalesOrder.MODEL_TYPE,
widget.order.pk,
widget.order.reference,
attachmentCount,
widget.order.canEdit,
),
),
);
},
),
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}

View file

@ -8,6 +8,7 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/api.dart";
import "package:inventree/api_form.dart";
import "package:inventree/app_colors.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/sales_order.dart";
import "package:inventree/l10.dart";
import "package:inventree/preferences.dart";
@ -91,8 +92,11 @@ class _SOShipmentDetailWidgetState
});
}
InvenTreeSalesOrderShipmentAttachment()
.countAttachments(widget.shipment.pk)
InvenTreeAttachment()
.countAttachments(
InvenTreeSalesOrderShipment.MODEL_TYPE,
widget.shipment.pk,
)
.then((int value) {
if (mounted) {
setState(() {
@ -104,8 +108,12 @@ class _SOShipmentDetailWidgetState
/// Upload an image for this shipment
Future<void> _uploadImage(BuildContext context) async {
InvenTreeSalesOrderShipmentAttachment()
.uploadImage(widget.shipment.pk, prefix: widget.shipment.reference)
InvenTreeAttachment()
.uploadImage(
InvenTreeSalesOrderShipment.MODEL_TYPE,
widget.shipment.pk,
prefix: widget.shipment.reference,
)
.then((result) => refresh(context));
}
@ -339,30 +347,19 @@ class _SOShipmentDetailWidgetState
),
);
// Attachments
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? attachmentTile = ShowAttachmentsItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeSalesOrderShipmentAttachment(),
InvenTreeSalesOrderShipment.MODEL_TYPE,
widget.shipment.pk,
widget.shipment.reference,
attachmentCount,
widget.shipment.canEdit,
),
),
);
},
),
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}

View file

@ -1,8 +1,12 @@
import "package:flutter/material.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/api.dart";
import "package:inventree/app_colors.dart";
import "package:inventree/inventree/model.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/l10.dart";
import "package:inventree/inventree/part.dart";
import "package:inventree/widget/link_icon.dart";
import "package:inventree/widget/paginator.dart";
import "package:inventree/widget/progress.dart";
import "package:inventree/widget/refreshable_state.dart";
@ -10,16 +14,18 @@ import "package:inventree/widget/refreshable_state.dart";
/*
* Widget for displaying a list of parameters associated with a given Part instance
*/
class PartParameterWidget extends StatefulWidget {
const PartParameterWidget(this.part);
class ParameterWidget extends StatefulWidget {
const ParameterWidget(this.modelType, this.modelId, this.editable) : super();
final InvenTreePart part;
final String modelType;
final int modelId;
final bool editable;
@override
_ParameterWidgetState createState() => _ParameterWidgetState();
}
class _ParameterWidgetState extends RefreshableState<PartParameterWidget> {
class _ParameterWidgetState extends RefreshableState<ParameterWidget> {
_ParameterWidgetState();
@override
@ -34,9 +40,16 @@ class _ParameterWidgetState extends RefreshableState<PartParameterWidget> {
@override
Widget getBody(BuildContext context) {
Map<String, String> filters = {"part": widget.part.pk.toString()};
Map<String, String> filters = {
"model_type": widget.modelType,
"model_id": widget.modelId.toString(),
};
return Column(children: [Expanded(child: PaginatedParameterList(filters))]);
return Column(
children: [
Expanded(child: PaginatedParameterList(filters, widget.editable)),
],
);
}
}
@ -44,9 +57,11 @@ class _ParameterWidgetState extends RefreshableState<PartParameterWidget> {
* Widget for displaying a paginated list of Part parameters
*/
class PaginatedParameterList extends PaginatedSearchWidget {
const PaginatedParameterList(Map<String, String> filters)
const PaginatedParameterList(Map<String, String> filters, this.editable)
: super(filters: filters);
final bool editable;
@override
String get searchTitle => L10().parameters;
@ -75,7 +90,7 @@ class _PaginatedParameterState
int offset,
Map<String, String> params,
) async {
final page = await InvenTreePartParameter().listPaginated(
final page = await InvenTreeParameter().listPaginated(
limit,
offset,
filters: params,
@ -84,7 +99,7 @@ class _PaginatedParameterState
return page;
}
Future<void> editParameter(InvenTreePartParameter parameter) async {
Future<void> editParameter(InvenTreeParameter parameter) async {
// Checkbox values are handled separately
if (parameter.is_checkbox) {
return;
@ -101,7 +116,7 @@ class _PaginatedParameterState
@override
Widget buildItem(BuildContext context, InvenTreeModel model) {
InvenTreePartParameter parameter = model as InvenTreePartParameter;
InvenTreeParameter parameter = model as InvenTreeParameter;
String title = parameter.name;
@ -116,7 +131,7 @@ class _PaginatedParameterState
? Switch(
value: parameter.as_bool,
onChanged: (bool value) {
if (parameter.canEdit) {
if (widget.editable) {
showLoadingOverlay();
parameter.update(values: {"data": value.toString()}).then((
value,
@ -131,10 +146,47 @@ class _PaginatedParameterState
onTap: parameter.is_checkbox
? null
: () async {
if (parameter.canEdit) {
if (widget.editable) {
editParameter(parameter);
}
},
);
}
}
/*
* Return a ListTile to display parameters for the specified model
*/
ListTile? ShowParametersItem(
BuildContext context,
String modelType,
int modelId,
int parameterCount,
bool editable,
) {
// Note: Currently cannot add parameters from the app,
// So, if there are no parameters, do not show the item
if (parameterCount == 0) {
return null;
}
if (!InvenTreeAPI().supportsModernParameters) {
return null;
}
return ListTile(
title: Text(L10().parameters),
leading: Icon(TablerIcons.list_details, color: COLOR_ACTION),
trailing: LinkIcon(
text: parameterCount > 0 ? parameterCount.toString() : null,
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ParameterWidget(modelType, modelId, editable),
),
);
},
);
}

View file

@ -4,6 +4,8 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
import "package:inventree/app_colors.dart";
import "package:inventree/barcode/barcode.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/parameter.dart";
import "package:inventree/l10.dart";
import "package:inventree/helpers.dart";
@ -15,10 +17,10 @@ import "package:inventree/preferences.dart";
import "package:inventree/widget/attachment_widget.dart";
import "package:inventree/widget/link_icon.dart";
import "package:inventree/widget/parameter_widget.dart";
import "package:inventree/widget/part/bom_list.dart";
import "package:inventree/widget/part/part_list.dart";
import "package:inventree/widget/notes_widget.dart";
import "package:inventree/widget/part/part_parameter_widget.dart";
import "package:inventree/widget/part/part_pricing.dart";
import "package:inventree/widget/progress.dart";
import "package:inventree/widget/part/category_display.dart";
@ -49,13 +51,11 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
InvenTreeStockLocation? defaultLocation;
int parameterCount = 0;
bool allowLabelPrinting = false;
bool showParameters = false;
bool showBom = false;
bool showPricing = false;
int parameterCount = 0;
int attachmentCount = 0;
int bomCount = 0;
int usedInCount = 0;
@ -152,10 +152,6 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
INV_PART_SHOW_PRICING,
true,
);
showParameters = await InvenTreeSettingsManager().getBool(
INV_PART_SHOW_PARAMETERS,
true,
);
showBom = await InvenTreeSettingsManager().getBool(INV_PART_SHOW_BOM, true);
allowLabelPrinting = await InvenTreeSettingsManager().getBool(
INV_ENABLE_LABEL_PRINTING,
@ -212,13 +208,30 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
}
// Request the number of attachments
InvenTreePartAttachment().countAttachments(part.pk).then((int value) {
if (api.supportsModernAttachments) {
InvenTreeAttachment()
.countAttachments(InvenTreePart.MODEL_TYPE, part.pk)
.then((int value) {
if (mounted) {
setState(() {
attachmentCount = value;
});
}
});
}
// Request the number of parameters
if (api.supportsModernParameters) {
InvenTreeParameter()
.countParameters(InvenTreePart.MODEL_TYPE, part.pk)
.then((int value) {
if (mounted) {
setState(() {
parameterCount = value;
});
}
});
}
// If show pricing information?
if (showPricing) {
@ -596,29 +609,31 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
),
);
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? parameterTile = ShowParametersItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreePartAttachment(),
InvenTreePart.MODEL_TYPE,
part.pk,
parameterCount,
part.canEdit,
);
if (parameterTile != null) {
tiles.add(parameterTile);
}
ListTile? attachmentTile = ShowAttachmentsItem(
context,
InvenTreePart.MODEL_TYPE,
part.pk,
L10().part,
attachmentCount,
part.canEdit,
),
),
);
},
),
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}
@ -712,10 +727,6 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
List<Widget> getTabIcons(BuildContext context) {
List<Widget> icons = [Tab(text: L10().details), Tab(text: L10().stock)];
if (showParameters) {
icons.add(Tab(text: L10().parameters));
}
return icons;
}
@ -728,11 +739,6 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
),
PaginatedStockItemList({"part": part.pk.toString()}),
];
if (showParameters) {
tabs.add(PaginatedParameterList({"part": part.pk.toString()}));
}
return tabs;
}
}

View file

@ -7,6 +7,7 @@ import "package:inventree/app_colors.dart";
import "package:inventree/barcode/barcode.dart";
import "package:inventree/barcode/stock.dart";
import "package:inventree/helpers.dart";
import "package:inventree/inventree/attachment.dart";
import "package:inventree/inventree/sales_order.dart";
import "package:inventree/l10.dart";
import "package:inventree/api.dart";
@ -255,9 +256,9 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
}
// Request the number of attachments
InvenTreeStockItemAttachment().countAttachments(widget.item.pk).then((
int value,
) {
InvenTreeAttachment()
.countAttachments(InvenTreeStockItem.MODEL_TYPE, widget.item.pk)
.then((int value) {
if (mounted) {
setState(() {
attachmentCount = value;
@ -837,29 +838,19 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
),
);
tiles.add(
ListTile(
title: Text(L10().attachments),
leading: Icon(TablerIcons.file, color: COLOR_ACTION),
trailing: LinkIcon(
text: attachmentCount > 0 ? attachmentCount.toString() : null,
),
onTap: () {
Navigator.push(
ListTile? attachmentTile = ShowAttachmentsItem(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeStockItemAttachment(),
InvenTreeStockItem.MODEL_TYPE,
widget.item.pk,
L10().stockItem,
attachmentCount,
widget.item.canEdit,
),
),
);
},
),
);
if (attachmentTile != null) {
tiles.add(attachmentTile);
}
return tiles;
}
}

60
update-flutter-nix.sh Normal file
View file

@ -0,0 +1,60 @@
#!/usr/bin/env bash
set -e
# 0. Abhängigkeiten prüfen
for cmd in jq curl sed nix; do
command -v $cmd >/dev/null 2>&1 || { echo "Fehler: $cmd nicht installiert!"; exit 1; }
done
# 1. Version aus .fvmrc extrahieren
if [ ! -f .fvmrc ]; then
echo "Fehler: .fvmrc nicht gefunden!"
exit 1
fi
FLUTTER_VERSION=$(jq -r .flutter .fvmrc)
echo "Gesuchte Flutter Version: $FLUTTER_VERSION"
# 2. Commit-Hash und Version aus Devbox-API holen
API_URL="https://search.devbox.sh/v2/pkg?name=flutter"
RELEASES_JSON=$(curl -s "$API_URL")
# Alle Versionen extrahieren und sortieren
ALL_VERSIONS=$(echo "$RELEASES_JSON" | jq -r '.releases[].version' | sort -V)
# Finde die gewünschte oder nächsthöhere Version
FOUND_VERSION=$(echo "$ALL_VERSIONS" | awk -v v="$FLUTTER_VERSION" '$0 >= v { print; exit }')
if [ -z "$FOUND_VERSION" ]; then
echo "Fehler: Keine passende Flutter-Version gefunden."
exit 1
fi
if [ "$FOUND_VERSION" != "$FLUTTER_VERSION" ]; then
echo "Hinweis: Exakte Version nicht gefunden, benutze stattdessen Version $FOUND_VERSION."
fi
# Commit-Hash für x86_64-linux extrahieren
COMMIT=$(echo "$RELEASES_JSON" | jq -r --arg v "$FOUND_VERSION" '.releases[] | select(.version==$v) | .platforms[] | select(.system=="x86_64-linux") | .commit_hash' | head -n 1)
if [ -z "$COMMIT" ] || [ "$COMMIT" == "null" ]; then
echo "Fehler: Kein Commit-Hash für Version $FOUND_VERSION und Plattform x86_64-linux gefunden."
exit 1
fi
echo "Gefundener Commit: $COMMIT (Version: $FOUND_VERSION)"
# 3. Die flake.nix patchen (Backup anlegen)
sed -i.bak "s|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/[a-f0-9]*\";|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/$COMMIT\";|" flake.nix
# 4. Den Flake-Lock aktualisieren
nix flake update nixpkgs-flutter
# 5. Optional: direnv reload
if command -v direnv >/dev/null 2>&1; then
direnv reload
fi
echo "Erfolgreich! Die flake.nix nutzt nun den Commit für Flutter $FLUTTER_VERSION (oder höher)."