diff --git a/packages/nc-gui-v2/components/cell/Duration.vue b/packages/nc-gui-v2/components/cell/Duration.vue index 00a46e0847..9a19351556 100644 --- a/packages/nc-gui-v2/components/cell/Duration.vue +++ b/packages/nc-gui-v2/components/cell/Duration.vue @@ -1,7 +1,7 @@ + + diff --git a/packages/nc-gui-v2/components/smartsheet-column/DurationOptions.vue b/packages/nc-gui-v2/components/smartsheet-column/DurationOptions.vue new file mode 100644 index 0000000000..09bb007926 --- /dev/null +++ b/packages/nc-gui-v2/components/smartsheet-column/DurationOptions.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue b/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue index 84863d8d50..7d9b148f76 100644 --- a/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue +++ b/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue @@ -23,6 +23,8 @@ const { isEdit, } = useColumnCreateStoreOrThrow() +const columnToValidate = [UITypes.Email, UITypes.URL, UITypes.PhoneNumber] + const uiTypesOptions = computed(() => { return [ ...uiTypes.filter((t) => !isEdit || !t.virtual), @@ -85,6 +87,8 @@ watchEffect(() => { + +
@@ -97,6 +101,15 @@ watchEffect(() => {
+ + + {{ `Accept only valid ${formState.uidt}` }} + +
diff --git a/packages/nc-gui-v2/components/smartsheet-header/CellIcon.vue b/packages/nc-gui-v2/components/smartsheet-header/CellIcon.vue index b288da87d3..10ea007c32 100644 --- a/packages/nc-gui-v2/components/smartsheet-header/CellIcon.vue +++ b/packages/nc-gui-v2/components/smartsheet-header/CellIcon.vue @@ -5,10 +5,13 @@ import FilePhoneIcon from '~icons/mdi/file-phone' import { useColumn } from '#imports' import KeyIcon from '~icons/mdi/key-variant' import JSONIcon from '~icons/mdi/code-json' +import ClockIcon from '~icons/mdi/clock-time-five' // import FKIcon from '~icons/mdi/link-variant' +import WebIcon from '~icons/mdi/web' import TextAreaIcon from '~icons/mdi/card-text-outline' import StringIcon from '~icons/mdi/alpha-a-box-outline' import BooleanIcon from '~icons/mdi/check-box-outline' +import YearIcon from '~icons/mdi/calendar' import SingleSelectIcon from '~icons/mdi/radiobox-marked' import MultiSelectIcon from '~icons/mdi/checkbox-multiple-marked' import DatetimeIcon from '~icons/mdi/calendar-clock' @@ -17,7 +20,6 @@ import RatingIcon from '~icons/mdi/star' import GenericIcon from '~icons/mdi/square-rounded' import NumericIcon from '~icons/mdi/numeric' import AttachmentIcon from '~icons/mdi/image-multiple-outline' -import URLIcon from '~icons/mdi/link' import EmailIcon from '~icons/mdi/email' import CurrencyIcon from '~icons/mdi/currency-usd-circle-outline' import PercentIcon from '~icons/mdi/percent-outline' @@ -48,6 +50,10 @@ const icon = computed(() => { return TextAreaIcon } else if (additionalColMeta.isEmail) { return EmailIcon + } else if (additionalColMeta.isYear) { + return YearIcon + } else if (additionalColMeta.isTime) { + return ClockIcon } else if (additionalColMeta.isRating) { return RatingIcon } else if (additionalColMeta.isAttachment) { @@ -61,7 +67,7 @@ const icon = computed(() => { // return FKIcon // } else if (additionalColMeta.isURL) { - return URLIcon + return WebIcon } else if (additionalColMeta.isCurrency) { return CurrencyIcon } else if (additionalColMeta.isPercent) { diff --git a/packages/nc-gui-v2/composables/useInjectionState/index.ts b/packages/nc-gui-v2/composables/useInjectionState/index.ts index 6cd0f3dbd9..a714fd5f3c 100644 --- a/packages/nc-gui-v2/composables/useInjectionState/index.ts +++ b/packages/nc-gui-v2/composables/useInjectionState/index.ts @@ -3,7 +3,7 @@ import type { InjectionKey } from 'vue' export function useInjectionState( composable: (...args: Arguments) => Return, keyName = 'InjectionState', -): readonly [useProvidingState: (...args: Arguments) => void, useInjectedState: () => Return | undefined] { +): readonly [useInjectionState: (...args: Arguments) => Return, useInjectedState: () => Return | undefined] { const key: string | InjectionKey = Symbol(keyName) const useProvidingState = (...args: Arguments) => { diff --git a/packages/nc-gui-v2/package-lock.json b/packages/nc-gui-v2/package-lock.json index 8f0a2e375d..33942a1dde 100644 --- a/packages/nc-gui-v2/package-lock.json +++ b/packages/nc-gui-v2/package-lock.json @@ -11,6 +11,7 @@ "dayjs": "^1.11.3", "file-saver": "^2.0.5", "jwt-decode": "^3.1.2", + "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", @@ -8554,6 +8555,14 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/iso639-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", + "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -8801,6 +8810,11 @@ "integrity": "sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==", "dev": true }, + "node_modules/langs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", + "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==" + }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -9001,6 +9015,19 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/locale-codes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", + "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "dependencies": { + "iso639-codes": "^1.0.1", + "langs": "^2.0.0", + "windows-locale": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -14214,6 +14241,14 @@ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", "dev": true }, + "node_modules/windows-locale": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.1.3.tgz", + "integrity": "sha512-0OlMOPNGj7GTB6C7WmqS3o4eydjnoYj0uwot2KJf7E0JUucwYwzkcvCWQwnuOV60WqDMeGJpSankgveNMj5r0g==", + "engines": { + "node": ">=v10.24.1" + } + }, "node_modules/wmf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", @@ -20699,6 +20734,11 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "iso639-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", + "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==" + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -20893,6 +20933,11 @@ "integrity": "sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==", "dev": true }, + "langs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", + "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==" + }, "lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -21050,6 +21095,16 @@ "integrity": "sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==", "dev": true }, + "locale-codes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", + "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "requires": { + "iso639-codes": "^1.0.1", + "langs": "^2.0.0", + "windows-locale": "^1.1.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -24944,6 +24999,11 @@ } } }, + "windows-locale": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.1.3.tgz", + "integrity": "sha512-0OlMOPNGj7GTB6C7WmqS3o4eydjnoYj0uwot2KJf7E0JUucwYwzkcvCWQwnuOV60WqDMeGJpSankgveNMj5r0g==" + }, "wmf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", diff --git a/packages/nc-gui-v2/package.json b/packages/nc-gui-v2/package.json index c038b5bb59..d954b68033 100644 --- a/packages/nc-gui-v2/package.json +++ b/packages/nc-gui-v2/package.json @@ -17,6 +17,7 @@ "dayjs": "^1.11.3", "file-saver": "^2.0.5", "jwt-decode": "^3.1.2", + "locale-codes": "^1.3.1", "monaco-editor": "^0.33.0", "nocodb-sdk": "file:../nocodb-sdk", "papaparse": "^5.3.2", diff --git a/packages/nc-gui-v2/utils/columnUtils.ts b/packages/nc-gui-v2/utils/columnUtils.ts index 3db1717e66..1020e60851 100644 --- a/packages/nc-gui-v2/utils/columnUtils.ts +++ b/packages/nc-gui-v2/utils/columnUtils.ts @@ -3,6 +3,7 @@ import LinkVariant from '~icons/mdi/link-variant' import TableColumnPlusBefore from '~icons/mdi/table-column-plus-before' import FormatColorText from '~icons/mdi/format-color-text' import TextSubject from '~icons/mdi/text-subject' +import JSONIcon from '~icons/mdi/code-json' import Attachment from '~icons/mdi/attachment' import CheckboxMarkedOutline from '~icons/mdi/checkbox-marked-outline' import FormatListBulletedSquare from '~icons/mdi/format-list-bulleted-square' @@ -135,7 +136,7 @@ const uiTypes = [ }, { name: UITypes.JSON, - icon: 'mdi-code-json', + icon: JSONIcon, }, { name: UITypes.SpecificDBType, diff --git a/packages/nc-gui-v2/utils/currencyUtils.ts b/packages/nc-gui-v2/utils/currencyUtils.ts new file mode 100644 index 0000000000..5ac1ccb46f --- /dev/null +++ b/packages/nc-gui-v2/utils/currencyUtils.ts @@ -0,0 +1,220 @@ +import locale from 'locale-codes' + +export const currencyCodes = [ + 'AED', + 'AFN', + 'ALL', + 'AMD', + 'ANG', + 'AOA', + 'ARS', + 'AUD', + 'AWG', + 'AZN', + 'BAM', + 'BBD', + 'BDT', + 'BGN', + 'BHD', + 'BIF', + 'BMD', + 'BND', + 'BOB', + 'BOV', + 'BRL', + 'BSD', + 'BTN', + 'BWP', + 'BYR', + 'BZD', + 'CAD', + 'CDF', + 'CHE', + 'CHF', + 'CHW', + 'CLF', + 'CLP', + 'CNY', + 'COP', + 'COU', + 'CRC', + 'CUP', + 'CVE', + 'CYP', + 'CZK', + 'DJF', + 'DKK', + 'DOP', + 'DZD', + 'EEK', + 'EGP', + 'ERN', + 'ETB', + 'EUR', + 'FJD', + 'FKP', + 'GBP', + 'GEL', + 'GHC', + 'GIP', + 'GMD', + 'GNF', + 'GTQ', + 'GYD', + 'HKD', + 'HNL', + 'HRK', + 'HTG', + 'HUF', + 'IDR', + 'ILS', + 'INR', + 'IQD', + 'IRR', + 'ISK', + 'JMD', + 'JOD', + 'JPY', + 'KES', + 'KGS', + 'KHR', + 'KMF', + 'KPW', + 'KRW', + 'KWD', + 'KYD', + 'KZT', + 'LAK', + 'LBP', + 'LKR', + 'LRD', + 'LSL', + 'LTL', + 'LVL', + 'LYD', + 'MAD', + 'MDL', + 'MGA', + 'MKD', + 'MMK', + 'MNT', + 'MOP', + 'MRO', + 'MTL', + 'MUR', + 'MVR', + 'MWK', + 'MXN', + 'MXV', + 'MYR', + 'MZN', + 'NAD', + 'NGN', + 'NIO', + 'NOK', + 'NPR', + 'NZD', + 'OMR', + 'PAB', + 'PEN', + 'PGK', + 'PHP', + 'PKR', + 'PLN', + 'PYG', + 'QAR', + 'ROL', + 'RON', + 'RSD', + 'RUB', + 'RWF', + 'SAR', + 'SBD', + 'SCR', + 'SDD', + 'SEK', + 'SGD', + 'SHP', + 'SIT', + 'SKK', + 'SLL', + 'SOS', + 'SRD', + 'STD', + 'SYP', + 'SZL', + 'THB', + 'TJS', + 'TMM', + 'TND', + 'TOP', + 'TRY', + 'TTD', + 'TWD', + 'TZS', + 'UAH', + 'UGX', + 'USD', + 'USN', + 'USS', + 'UYU', + 'UZS', + 'VEB', + 'VND', + 'VUV', + 'WST', + 'XAF', + 'XAG', + 'XAU', + 'XBA', + 'XBB', + 'XBC', + 'XBD', + 'XCD', + 'XDR', + 'XFO', + 'XFU', + 'XOF', + 'XPD', + 'XPF', + 'XPT', + 'XTS', + 'XXX', + 'YER', + 'ZAR', + 'ZMK', + 'ZWD', +] + +export function validateCurrencyCode(v: string) { + return currencyCodes.includes(v) +} + +export function currencyLocales() { + const localeList = locale.all + .filter((l: Record) => { + try { + if (Intl.NumberFormat.supportedLocalesOf(l.tag).length > 0) { + return true + } + return false + } catch (e) { + return false + } + }) + .map((l: Record) => { + return { + text: `${l.name} (${l.tag})`, + value: l.tag, + } + }) + return localeList +} + +export function validateCurrencyLocale(v: string) { + try { + return Intl.NumberFormat.supportedLocalesOf(v).length > 0 + } catch (e) { + return false + } +} diff --git a/packages/nc-gui-v2/utils/durationHelper.ts b/packages/nc-gui-v2/utils/durationUtils.ts similarity index 100% rename from packages/nc-gui-v2/utils/durationHelper.ts rename to packages/nc-gui-v2/utils/durationUtils.ts diff --git a/packages/nc-gui-v2/utils/index.ts b/packages/nc-gui-v2/utils/index.ts index e6850a4566..a0fc5854c5 100644 --- a/packages/nc-gui-v2/utils/index.ts +++ b/packages/nc-gui-v2/utils/index.ts @@ -1,7 +1,7 @@ export * from './colorsUtils' export * from './dateTimeUtils' export * from './deepCompare' -export * from './durationHelper' +export * from './durationUtils' export * from './errorUtils' export * from './fileUtils' export * from './iconUtils' @@ -11,3 +11,4 @@ export * from './projectCreateUtils' export * from './urlUtils' export * from './validation' export * from './viewUtils' +export * from './currencyUtils'