From 894161a99875a6ab1e70786bfa3a3a6638fb6603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Oliveira?= Date: Wed, 22 Dec 2021 14:43:10 +0000 Subject: [PATCH 01/15] feat: sms data card info --- .../src/pages/Customers/CustomerData.js | 18 +++++++++++++++--- .../src/pages/Customers/CustomerProfile.js | 2 ++ .../pages/Customers/components/EditableCard.js | 3 ++- .../src/pages/Customers/helper.js | 10 +++++++++- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.js b/new-lamassu-admin/src/pages/Customers/CustomerData.js index 3e1ba8fa..27e0e443 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerData.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.js @@ -29,7 +29,8 @@ import { EditableCard } from './components' import { customerDataElements, customerDataSchemas, - formatDates + formatDates, + getFormattedPhone } from './helper.js' const useStyles = makeStyles(styles) @@ -62,6 +63,7 @@ const Photo = ({ show, src }) => { } const CustomerData = ({ + locale, customer, updateCustomer, replacePhoto, @@ -96,6 +98,9 @@ const CustomerData = ({ R.path(['customInfoRequests'])(customer) ?? [] ) + const phone = R.path(['phone'])(customer) + const smsData = R.path(['subscriberInfo'])(customer) + const isEven = elem => elem % 2 === 0 const getVisibleCards = _.filter(elem => elem.isAvailable) @@ -126,6 +131,9 @@ const CustomerData = ({ }, idCardPhoto: { idCardPhoto: null + }, + smsData: { + phoneNumber: getFormattedPhone(phone, locale.country) } } @@ -148,12 +156,16 @@ const CustomerData = ({ isAvailable: !_.isNil(idData) }, { - title: 'SMS Confirmation', + fields: customerDataElements.smsData, + title: 'SMS data', titleIcon: , authorize: () => {}, reject: () => {}, save: () => {}, - isAvailable: false + validationSchema: customerDataSchemas.smsData, + initialValues: initialValues.smsData, + isAvailable: !_.isNil(phone), + isDeletable: !_.isNil(smsData) || !_.isEmpty(smsData.result) }, { title: 'Name', diff --git a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js index 5a0d2314..9c38bdfa 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js @@ -69,6 +69,7 @@ const GET_CUSTOMER = gql` daysSuspended isSuspended isTestCustomer + subscriberInfo customFields { id label @@ -628,6 +629,7 @@ const CustomerProfile = memo(() => { {isCustomerData && (
{ const classes = useStyles() diff --git a/new-lamassu-admin/src/pages/Customers/helper.js b/new-lamassu-admin/src/pages/Customers/helper.js index 9c980a33..990b091e 100644 --- a/new-lamassu-admin/src/pages/Customers/helper.js +++ b/new-lamassu-admin/src/pages/Customers/helper.js @@ -397,7 +397,12 @@ const customerDataElements = { } ], idCardPhoto: [{ name: 'idCardPhoto' }], - frontCamera: [{ name: 'frontCamera' }] + frontCamera: [{ name: 'frontCamera' }], + smsData: { + name: 'phoneNumber', + label: 'Phone number', + component: TextInput + } } const customerDataSchemas = { @@ -426,6 +431,9 @@ const customerDataSchemas = { }), frontCamera: Yup.object().shape({ frontCamera: Yup.mixed().required() + }), + smsData: Yup.object().shape({ + phoneNumber: Yup.mixed().required() }) } From 5406a3cfdd884cecbecffdaacae7f97d20c8546e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Oliveira?= Date: Mon, 3 Jan 2022 22:42:47 +0000 Subject: [PATCH 02/15] feat: twilio api data confirmation dialog --- .../src/components/buttons/Button.js | 11 ++- .../src/components/buttons/Button.styles.js | 23 ++++-- .../src/pages/Customers/CustomerData.js | 80 +++++++++++++++++-- .../pages/Customers/CustomerData.styles.js | 23 +++++- .../src/pages/Customers/CustomerProfile.js | 48 ++++++----- .../Customers/components/EditableCard.js | 26 ++++-- .../src/pages/Customers/helper.js | 8 +- 7 files changed, 172 insertions(+), 47 deletions(-) diff --git a/new-lamassu-admin/src/components/buttons/Button.js b/new-lamassu-admin/src/components/buttons/Button.js index 6bd24a71..5945170a 100644 --- a/new-lamassu-admin/src/components/buttons/Button.js +++ b/new-lamassu-admin/src/components/buttons/Button.js @@ -7,8 +7,15 @@ import styles from './Button.styles' const useStyles = makeStyles(styles) const ActionButton = memo( - ({ size = 'lg', children, className, buttonClassName, ...props }) => { - const classes = useStyles({ size }) + ({ + size = 'lg', + children, + className, + buttonClassName, + backgroundColor, + ...props + }) => { + const classes = useStyles({ size, backgroundColor }) return (
)}
+ ) } +const RetrieveDataDialog = ({ + setRetrieve, + retrieveAditionalData, + open, + props +}) => { + const classes = useStyles() + + return ( + +
+ setRetrieve(false)}> + + +
+

{'Retrieve API data from Twilio'}

+ + {`With this action you'll be using Twilio's API to retrieve additional + data from this user. This includes name and address, if available.\n`} + {` There is a small cost from Twilio for each retrieval. Would you like + to proceed?`} + + + + + +
+ ) +} + export default CustomerData diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js b/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js index 373e2f0c..9a4e2871 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js @@ -1,4 +1,4 @@ -import { offColor } from 'src/styling/variables' +import { offColor, spacer } from 'src/styling/variables' export default { header: { @@ -45,5 +45,26 @@ export default { left: '100%', marginLeft: 15 } + }, + closeButton: { + display: 'flex', + padding: [[spacer * 2, spacer * 2, 0, spacer * 2]], + paddingRight: spacer * 1.5, + justifyContent: 'end' + }, + dialogTitle: { + margin: [[0, spacer * 2, spacer, spacer * 4 + spacer]] + }, + dialogContent: { + width: 615, + marginLeft: 16 + }, + dialogActions: { + padding: spacer * 4, + paddingTop: spacer * 2 + }, + cancelButton: { + marginRight: 8, + padding: 0 } } diff --git a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js index 9c38bdfa..3fe7cc56 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js @@ -439,6 +439,16 @@ const CustomerProfile = memo(() => { } }) + const retrieveAditionalData = () => + setCustomer({ + variables: { + customerId, + customerInput: { + subscriberInfo: true + } + } + }) + const onClickSidebarItem = code => setClickedItem(code) const configData = R.path(['config'])(customerResponse) ?? [] @@ -559,25 +569,6 @@ const CustomerProfile = memo(() => { }> {`${blocked ? 'Authorize' : 'Block'} customer`} - - setCustomer({ - variables: { - customerId, - customerInput: { - subscriberInfo: true - } - } - }) - }> - {`Retrieve information`} -
@@ -598,6 +589,22 @@ const CustomerProfile = memo(() => { {`Test user`}
+ + updateCustomer({ + authorizedOverride: blocked + ? OVERRIDE_AUTHORIZED + : OVERRIDE_REJECTED + }) + }> + {`${blocked ? 'Authorize' : 'Block'} customer`} + )} @@ -637,7 +644,8 @@ const CustomerProfile = memo(() => { deleteEditedData={deleteEditedData} updateCustomRequest={setCustomerCustomInfoRequest} authorizeCustomRequest={authorizeCustomRequest} - updateCustomEntry={updateCustomEntry}> + updateCustomEntry={updateCustomEntry} + retrieveAditionalData={retrieveAditionalData}> )} {isNotes && ( diff --git a/new-lamassu-admin/src/pages/Customers/components/EditableCard.js b/new-lamassu-admin/src/pages/Customers/components/EditableCard.js index 9a1e848b..8857fb85 100644 --- a/new-lamassu-admin/src/pages/Customers/components/EditableCard.js +++ b/new-lamassu-admin/src/pages/Customers/components/EditableCard.js @@ -23,6 +23,8 @@ import { ReactComponent as EditReversedIcon } from 'src/styling/icons/action/edi import { ReactComponent as AuthorizeIcon } from 'src/styling/icons/button/authorize/white.svg' import { ReactComponent as BlockIcon } from 'src/styling/icons/button/block/white.svg' import { ReactComponent as CancelReversedIcon } from 'src/styling/icons/button/cancel/white.svg' +import { ReactComponent as DataReversedIcon } from 'src/styling/icons/button/data/white.svg' +import { ReactComponent as DataIcon } from 'src/styling/icons/button/data/zodiac.svg' import { ReactComponent as ReplaceReversedIcon } from 'src/styling/icons/button/replace/white.svg' import { ReactComponent as SaveReversedIcon } from 'src/styling/icons/circle buttons/save/white.svg' import { comet } from 'src/styling/variables' @@ -118,7 +120,8 @@ const EditableCard = ({ validationSchema, initialValues, deleteEditedData, - isDeletable + retrieveAdditionalData, + hasAdditionalData = true }) => { const classes = useStyles() @@ -211,19 +214,28 @@ const EditableCard = ({
{!editing && (
- {// TODO: Remove false condition for next release - false && ( -
+
+ {false && ( deleteEditedData()}> - {`Delete`} + Delete -
- )} + )} + {!hasAdditionalData && ( + retrieveAdditionalData()}> + Retrieve API data + + )} +
Date: Fri, 7 Jan 2022 18:44:08 +0000 Subject: [PATCH 03/15] feat: sms data editable fields --- lib/customers.js | 17 ++++++--- lib/new-admin/graphql/types/customer.type.js | 4 ++ ...376890-add-overrides-to-subscriber-info.js | 22 +++++++++++ .../src/pages/Customers/CustomerData.js | 37 ++++++++++++++++--- .../src/pages/Customers/CustomerProfile.js | 2 + 5 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 migrations/1641482376890-add-overrides-to-subscriber-info.js diff --git a/lib/customers.js b/lib/customers.js index 1f15dc91..589e21a9 100644 --- a/lib/customers.js +++ b/lib/customers.js @@ -24,6 +24,7 @@ const operatorDataDir = _.get('operatorDataDir', options) const sms = require('./sms') const settingsLoader = require('./new-settings-loader') const logger = require('./logger') +const consoleLogLevel = require('console-log-level') const TX_PASSTHROUGH_ERROR_CODES = ['operatorCancel'] @@ -121,7 +122,8 @@ async function updateCustomer (id, data, userToken) { 'us_ssn_override', 'sanctions_override', 'front_camera_override', - 'suspended_until' + 'suspended_until', + 'subscriber_info_override' ], _.mapKeys(_.snakeCase, data)) @@ -164,11 +166,13 @@ function edit (id, data, userToken) { 'id_card_photo', 'us_ssn', 'subscriber_info', - 'name' + 'name', + 'phone' ] const filteredData = _.pick(defaults, _.mapKeys(_.snakeCase, _.omitBy(_.isNil, data))) if (_.isEmpty(filteredData)) return getCustomerById(id) const formattedData = enhanceEditedPhotos(enhanceEditedFields(filteredData, userToken)) + const defaultDbData = { customer_id: id, created: new Date(), @@ -688,16 +692,16 @@ function getCustomersList (phone = null, name = null, address = null, id = null) function getCustomerById (id) { const passableErrorCodes = _.map(Pgp.as.text, TX_PASSTHROUGH_ERROR_CODES).join(',') const sql = `SELECT id, authorized_override, days_suspended, is_suspended, front_camera_path, front_camera_at, front_camera_override, - phone, sms_override, id_card_data_at, id_card_data, id_card_data_override, id_card_data_expiration, + phone, phone_at, sms_override, id_card_data_at, id_card_data, id_card_data_override, id_card_data_expiration, id_card_photo_path, id_card_photo_at, id_card_photo_override, us_ssn_at, us_ssn, us_ssn_override, sanctions, sanctions_at, sanctions_override, total_txs, total_spent, LEAST(created, last_transaction) AS last_active, fiat AS last_tx_fiat, - fiat_code AS last_tx_fiat_code, tx_class AS last_tx_class, subscriber_info, custom_fields, notes, is_test_customer + fiat_code AS last_tx_fiat_code, tx_class AS last_tx_class, subscriber_info, subscriber_info_at, subscriber_info_override, custom_fields, notes, is_test_customer FROM ( SELECT c.id, c.authorized_override, greatest(0, date_part('day', c.suspended_until - now())) AS days_suspended, c.suspended_until > now() AS is_suspended, c.front_camera_path, c.front_camera_override, c.front_camera_at, - c.phone, c.sms_override, c.id_card_data, c.id_card_data_at, c.id_card_data_override, c.id_card_data_expiration, + c.phone, c.phone_at, c.sms_override, c.id_card_data, c.id_card_data_at, c.id_card_data_override, c.id_card_data_expiration, c.id_card_photo_path, c.id_card_photo_at, c.id_card_photo_override, c.us_ssn, c.us_ssn_at, c.us_ssn_override, c.sanctions, c.sanctions_at, c.sanctions_override, c.subscriber_info, c.is_test_customer, c.created, t.tx_class, t.fiat, t.fiat_code, t.created as last_transaction, cn.notes, row_number() OVER (PARTITION BY c.id ORDER BY t.created DESC) AS rn, @@ -750,7 +754,8 @@ function selectLatestData (customerData, customerEditedData) { 'id_card_photo', 'us_ssn', 'subscriber_info', - 'name' + 'name', + 'phone' ] _.map(field => { let fieldName = field diff --git a/lib/new-admin/graphql/types/customer.type.js b/lib/new-admin/graphql/types/customer.type.js index bf099647..ed41b6c0 100644 --- a/lib/new-admin/graphql/types/customer.type.js +++ b/lib/new-admin/graphql/types/customer.type.js @@ -33,6 +33,7 @@ const typeDef = gql` lastTxClass: String transactions: [Transaction] subscriberInfo: JSONObject + subscriberInfoOverride: String customFields: [CustomerCustomField] customInfoRequests: [CustomRequestData] notes: [CustomerNote] @@ -63,12 +64,15 @@ const typeDef = gql` lastTxClass: String suspendedUntil: Date subscriberInfo: Boolean + subscriberInfoOverride: String } input CustomerEdit { idCardData: JSONObject idCardPhoto: UploadGQL usSsn: String + subscriberInfo: JSONObject + phone: String } type CustomerNote { diff --git a/migrations/1641482376890-add-overrides-to-subscriber-info.js b/migrations/1641482376890-add-overrides-to-subscriber-info.js new file mode 100644 index 00000000..dcfd4f9f --- /dev/null +++ b/migrations/1641482376890-add-overrides-to-subscriber-info.js @@ -0,0 +1,22 @@ +var db = require('./db') + +exports.up = function (next) { + var sql = [ + `ALTER TABLE customers + ADD COLUMN subscriber_info_override VERIFICATION_TYPE, + ADD COLUMN subscriber_info_override_by UUID, + ADD COLUMN subscriber_info_override_at TIMESTAMPTZ + `, + `ALTER TABLE edited_customer_data + ADD COLUMN phone TEXT, + ADD COLUMN phone_at TIMESTAMPTZ, + ADD COLUMN phone_by UUID + ` + ] + + db.multi(sql, next) +} + +exports.down = function (next) { + next() +} diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.js b/new-lamassu-admin/src/pages/Customers/CustomerData.js index 30ee3837..cd366680 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerData.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.js @@ -2,6 +2,7 @@ import { DialogActions, DialogContent, Dialog } from '@material-ui/core' import Grid from '@material-ui/core/Grid' import { makeStyles } from '@material-ui/core/styles' import { parse, format } from 'date-fns/fp' +import { parsePhoneNumber } from 'libphonenumber-js' import _ from 'lodash/fp' import * as R from 'ramda' import { useState, React } from 'react' @@ -25,6 +26,7 @@ import { ReactComponent as CustomerListViewIcon } from 'src/styling/icons/circle import { ReactComponent as OverviewReversedIcon } from 'src/styling/icons/circle buttons/overview/white.svg' import { ReactComponent as OverviewIcon } from 'src/styling/icons/circle buttons/overview/zodiac.svg' import { URI } from 'src/utils/apollo' +import { onlyFirstToUpper } from 'src/utils/string' import styles from './CustomerData.styles.js' import { EditableCard } from './components' @@ -103,7 +105,7 @@ const CustomerData = ({ ) const phone = R.path(['phone'])(customer) - const smsData = R.path(['subscriberInfo'])(customer) + const smsData = R.path(['subscriberInfo', 'result'])(customer) const isEven = elem => elem % 2 === 0 @@ -163,14 +165,24 @@ const CustomerData = ({ fields: customerDataElements.smsData, title: 'SMS data', titleIcon: , - authorize: () => {}, - reject: () => {}, - save: () => {}, + state: R.path(['subscriberInfoOverride'])(customer), + authorize: () => + updateCustomer({ subscriberInfoOverride: OVERRIDE_AUTHORIZED }), + reject: () => + updateCustomer({ subscriberInfoOverride: OVERRIDE_REJECTED }), + save: values => { + editCustomer({ + phone: parsePhoneNumber(values.phoneNumber).number, + subscriberInfo: { + result: _.merge(smsData, R.omit(['phoneNumber'])(values)) + } + }) + }, retrieveAditionalData: () => setRetrieve(true), validationSchema: customerDataSchemas.smsData, initialValues: initialValues.smsData, isAvailable: !_.isNil(phone), - hasAditionalData: !_.isNil(smsData) && !_.isEmpty(smsData.result) + hasAditionalData: !_.isNil(smsData) && !_.isEmpty(smsData) }, { title: 'Name', @@ -336,6 +348,21 @@ const CustomerData = ({ }) }, R.path(['customFields'])(customer) ?? []) + R.forEach(it => { + initialValues.smsData[it] = smsData[it] + smsDataElements.push({ + name: it, + label: onlyFirstToUpper(it), + component: TextInput + }) + Yup.object() + .shape({ + [it]: Yup.string() + }) + .required() + .concat(schemas.smsData) + }, R.keys(smsData) ?? []) + const editableCard = ( { title, diff --git a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js index 3fe7cc56..8243bbfc 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js @@ -70,6 +70,7 @@ const GET_CUSTOMER = gql` isSuspended isTestCustomer subscriberInfo + subscriberInfoOverride customFields { id label @@ -139,6 +140,7 @@ const SET_CUSTOMER = gql` lastTxFiatCode lastTxClass subscriberInfo + subscriberInfoOverride } } ` From 8696cea70b372aac68651bc88bc78ed0723f304c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Oliveira?= Date: Fri, 7 Jan 2022 18:45:55 +0000 Subject: [PATCH 04/15] fix: remove console log imports --- lib/customers.js | 1 - lib/plugins/wallet/mock-wallet/mock-wallet.js | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/customers.js b/lib/customers.js index 589e21a9..d8ff6b5b 100644 --- a/lib/customers.js +++ b/lib/customers.js @@ -24,7 +24,6 @@ const operatorDataDir = _.get('operatorDataDir', options) const sms = require('./sms') const settingsLoader = require('./new-settings-loader') const logger = require('./logger') -const consoleLogLevel = require('console-log-level') const TX_PASSTHROUGH_ERROR_CODES = ['operatorCancel'] diff --git a/lib/plugins/wallet/mock-wallet/mock-wallet.js b/lib/plugins/wallet/mock-wallet/mock-wallet.js index f8eb7a7f..5850fefc 100644 --- a/lib/plugins/wallet/mock-wallet/mock-wallet.js +++ b/lib/plugins/wallet/mock-wallet/mock-wallet.js @@ -3,7 +3,6 @@ const _ = require('lodash/fp') const BN = require('../../../bn') const E = require('../../../error') const { utils: coinUtils } = require('lamassu-coins') -const consoleLogLevel = require('console-log-level') const NAME = 'FakeWallet' const BATCHABLE_COINS = ['BTC'] From 750affd34945d1d4f55ed556297e006d75b9a278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Oliveira?= Date: Fri, 7 Jan 2022 18:50:30 +0000 Subject: [PATCH 05/15] fix: function name typos --- .../src/pages/Customers/CustomerData.js | 24 +++++++++---------- .../src/pages/Customers/CustomerProfile.js | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.js b/new-lamassu-admin/src/pages/Customers/CustomerData.js index cd366680..a195e320 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerData.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.js @@ -76,7 +76,7 @@ const CustomerData = ({ updateCustomRequest, authorizeCustomRequest, updateCustomEntry, - retrieveAditionalData + retrieveAdditionalData }) => { const classes = useStyles() const [listView, setListView] = useState(false) @@ -178,11 +178,11 @@ const CustomerData = ({ } }) }, - retrieveAditionalData: () => setRetrieve(true), validationSchema: customerDataSchemas.smsData, + retrieveAdditionalData: () => setRetrieve(true), initialValues: initialValues.smsData, isAvailable: !_.isNil(phone), - hasAditionalData: !_.isNil(smsData) && !_.isEmpty(smsData) + hasAdditionalData: !_.isNil(smsData) && !_.isEmpty(smsData) }, { title: 'Name', @@ -350,7 +350,7 @@ const CustomerData = ({ R.forEach(it => { initialValues.smsData[it] = smsData[it] - smsDataElements.push({ + customerDataElements.smsData.push({ name: it, label: onlyFirstToUpper(it), component: TextInput @@ -360,7 +360,7 @@ const CustomerData = ({ [it]: Yup.string() }) .required() - .concat(schemas.smsData) + .concat(customerDataSchemas.smsData) }, R.keys(smsData) ?? []) const editableCard = ( @@ -373,12 +373,12 @@ const CustomerData = ({ fields, save, deleteEditedData, - retrieveAditionalData, + retrieveAdditionalData, children, validationSchema, initialValues, hasImage, - hasAditionalData + hasAdditionalData }, idx ) => { @@ -391,14 +391,14 @@ const CustomerData = ({ state={state} titleIcon={titleIcon} hasImage={hasImage} - hasAditionalData={hasAditionalData} + hasAdditionalData={hasAdditionalData} fields={fields} children={children} validationSchema={validationSchema} initialValues={initialValues} save={save} deleteEditedData={deleteEditedData} - retrieveAditionalData={retrieveAditionalData}> + retrieveAdditionalData={retrieveAdditionalData}> ) } @@ -479,7 +479,7 @@ const CustomerData = ({
) @@ -487,7 +487,7 @@ const CustomerData = ({ const RetrieveDataDialog = ({ setRetrieve, - retrieveAditionalData, + retrieveAdditionalData, open, props }) => { @@ -530,7 +530,7 @@ const RetrieveDataDialog = ({