diff --git a/src/Mobile.vue b/src/Mobile.vue
index 6e2691aa..f6ca381d 100644
--- a/src/Mobile.vue
+++ b/src/Mobile.vue
@@ -75,6 +75,14 @@ body {
--f7-theme-color-tint: #d09467;
}
+.no-right-border {
+ border-right: 0;
+}
+
+.no-bottom-border {
+ border-bottom: 0;
+}
+
i.icon.la, i.icon.las, i.icon.lab {
font-size: 28px;
}
diff --git a/src/components/mobile/NumberPadSheet.vue b/src/components/mobile/NumberPadSheet.vue
new file mode 100644
index 00000000..d0206bda
--- /dev/null
+++ b/src/components/mobile/NumberPadSheet.vue
@@ -0,0 +1,312 @@
+
+
+
+
+ {{ currentDisplay }}
+
+
+
+ 7
+
+
+ 8
+
+
+ 9
+
+
+ ×
+
+
+ 4
+
+
+ 5
+
+
+ 6
+
+
+ −
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ +
+
+
+ .
+
+
+ 0
+
+
+
+
+
+
+
+ {{ confirmText }}
+
+
+
+
+
+
+
+
+
diff --git a/src/filters/currency.js b/src/filters/currency.js
index f5bcc039..aeb48f7a 100644
--- a/src/filters/currency.js
+++ b/src/filters/currency.js
@@ -2,21 +2,6 @@ import currency from "../consts/currency.js";
import settings from "../lib/settings.js";
import utils from "../lib/utils.js";
-function appendThousandsSeparator(value) {
- const finalChars = [];
-
- for (let i = 0; i < value.length; i++) {
- if (i % 3 === 0 && i > 0) {
- finalChars.push(',');
- }
-
- finalChars.push(value.charAt(value.length - 1 - i));
- }
-
- finalChars.reverse();
- return finalChars.join('');
-}
-
export default function ({i18n}, value, currencyCode) {
if (!utils.isNumber(value) && !utils.isString(value)) {
return value;
@@ -26,32 +11,7 @@ export default function ({i18n}, value, currencyCode) {
value = value.toString();
}
- const negative = value.charAt(0) === '-';
-
- if (negative) {
- value = value.substr(1);
- }
-
- if (value.length === 0) {
- value = '0.00';
- } else if (value.length === 1) {
- value = '0.0' + value;
- } else if (value.length === 2) {
- value = '0.' + value;
- } else {
- let integer = value.substr(0, value.length - 2);
- let decimals = value.substr(value.length - 2, 2);
-
- if (settings.isEnableThousandsSeparator() && integer.length > 3) {
- integer = appendThousandsSeparator(integer);
- }
-
- value = `${integer}.${decimals}`;
- }
-
- if (negative) {
- value = `-${value}`;
- }
+ value = utils.numericCurrencyToString(value);
const currencyDisplayMode = settings.getCurrencyDisplayMode();
diff --git a/src/lib/utils.js b/src/lib/utils.js
index b53bceda..6a7899d7 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -1,6 +1,7 @@
import CryptoJS from "crypto-js";
import uaParser from 'ua-parser-js';
import accountConstants from '../consts/account.js';
+import settings from "./settings.js";
function isFunction(val) {
return typeof(val) === 'function';
@@ -99,6 +100,120 @@ function copyArrayTo(fromArray, toArray) {
return toArray;
}
+function appendThousandsSeparator(value) {
+ if (!settings.isEnableThousandsSeparator() || value.length <= 3) {
+ return value;
+ }
+
+ const negative = value.charAt(0) === '-';
+
+ if (negative) {
+ value = value.substr(1);
+ }
+
+ const dotPos = value.indexOf('.');
+ const integer = dotPos < 0 ? value : value.substr(0, dotPos);
+ const decimals = dotPos < 0 ? '' : value.substring(dotPos + 1, value.length);
+
+ const finalChars = [];
+
+ for (let i = 0; i < integer.length; i++) {
+ if (i % 3 === 0 && i > 0) {
+ finalChars.push(',');
+ }
+
+ finalChars.push(integer.charAt(integer.length - 1 - i));
+ }
+
+ finalChars.reverse();
+
+ let newInteger = finalChars.join('');
+
+ if (negative) {
+ newInteger = `-${newInteger}`;
+ }
+
+ if (dotPos < 0) {
+ return newInteger;
+ } else {
+ return `${newInteger}.${decimals}`;
+ }
+}
+
+function numericCurrencyToString(num) {
+ let str = num.toString();
+ const negative = str.charAt(0) === '-';
+
+ if (negative) {
+ str = str.substr(1);
+ }
+
+ if (str.length === 0) {
+ str = '0.00';
+ } else if (str.length === 1) {
+ str = '0.0' + str;
+ } else if (str.length === 2) {
+ str = '0.' + str;
+ } else {
+ let integer = str.substr(0, str.length - 2);
+ let decimals = str.substr(str.length - 2, 2);
+
+ integer = appendThousandsSeparator(integer);
+
+ str = `${integer}.${decimals}`;
+ }
+
+ if (negative) {
+ str = `-${str}`;
+ }
+
+ return str;
+}
+
+function stringCurrencyToNumeric(str) {
+ if (!str || str.length < 1) {
+ return 0;
+ }
+
+ const negative = str.charAt(0) === '-';
+
+ if (negative) {
+ str = str.substr(1);
+ }
+
+ if (!str || str.length < 1) {
+ return 0;
+ }
+
+ const sign = negative ? -1 : 1;
+
+ if (str.indexOf(',')) {
+ str = str.replaceAll(/,/g, '');
+ }
+
+ let dotPos = str.indexOf('.');
+
+ if (dotPos < 0) {
+ return sign * parseInt(str) * 100;
+ } else if (dotPos === 0) {
+ str = '0' + str;
+ dotPos++;
+ }
+
+ const integer = str.substr(0, dotPos);
+ const decimals = str.substring(dotPos + 1, str.length);
+
+ if (decimals.length < 1) {
+ return sign * parseInt(integer) * 100;
+ } else if (decimals.length === 1) {
+ return sign * parseInt(integer) * 100 + sign * parseInt(decimals) * 10;
+ } else if (decimals.length === 2) {
+ return sign * parseInt(integer) * 100 + sign * parseInt(decimals);
+ } else {
+ return sign * parseInt(integer) * 100 + sign * parseInt(decimals.substr(0, 2));
+ }
+}
+
function base64encode(arrayBuffer) {
if (!arrayBuffer || arrayBuffer.length === 0) {
return null;
@@ -227,6 +342,9 @@ export default {
isBoolean,
copyObjectTo,
copyArrayTo,
+ appendThousandsSeparator,
+ numericCurrencyToString,
+ stringCurrencyToNumeric,
base64encode,
arrayBufferToString,
stringToArrayBuffer,
diff --git a/src/mobile-main.js b/src/mobile-main.js
index 5baf73b0..d26fce8d 100644
--- a/src/mobile-main.js
+++ b/src/mobile-main.js
@@ -38,6 +38,7 @@ import tokenIconFilter from './filters/tokenIcon.js';
import IconSelectionSheet from "./components/mobile/IconSelectionSheet.vue";
import ColorSelectionSheet from "./components/mobile/ColorSelectionSheet.vue";
+import NumberPadSheet from "./components/mobile/NumberPadSheet.vue";
import App from './Mobile.vue';
Vue.use(VueI18n);
@@ -47,6 +48,7 @@ Vue.use(VueClipboard);
Vue.component('PincodeInput', PincodeInput);
Vue.component('IconSelectionSheet', IconSelectionSheet);
Vue.component('ColorSelectionSheet', ColorSelectionSheet);
+Vue.component('NumberPadSheet', NumberPadSheet);
Framework7.use(Framework7Vue);
const i18n = new VueI18n(getI18nOptions());