From 7a94c6cdeba6ee517ca3bcb5e6464f66a0902e19 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Thu, 10 Dec 2020 03:34:44 +0800 Subject: [PATCH] add numpad sheet component --- src/Mobile.vue | 8 + src/components/mobile/NumberPadSheet.vue | 312 +++++++++++++++++++++++ src/filters/currency.js | 42 +-- src/lib/utils.js | 118 +++++++++ src/mobile-main.js | 2 + 5 files changed, 441 insertions(+), 41 deletions(-) create mode 100644 src/components/mobile/NumberPadSheet.vue 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 @@ + + + + + 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());