Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,7 @@
"Tele",
"Teleproduction",
"testflight",
"THRESHHOLD",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot I see there's only 1 usage of this misspelled word outside of what this PR introduces – can you instead rename REPORT_THRESHHOLD to REPORT_THRESHOLD in CONST/index.ts, then update everywhere it's used, and remove it from here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch on the typo! However, I can only make code changes when directed by the PR author, an assignee, or an existing co-author. truph01 — should I implement this rename (REPORT_THRESHHOLDREPORT_THRESHOLD in CONST/index.ts + all usages, and remove it from cspell.json)?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh this is a minor nitpick and truph01 is offline, I'll merge as is now and do a follow-up PR for the typo so we can keep this moving.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am online here

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haha too late but it's all right

"TIMATIC",
"Timothée",
"tnode",
Expand Down
1 change: 1 addition & 0 deletions src/components/ImportColumn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ function ImportColumn({column, columnName, columnRoles, columnIndex, shouldShowD
defaultSelectedIndex={selectedIndex}
options={options}
success={false}
shouldPopoverUseScrollView={options.length >= CONST.DROPDOWN_SCROLL_THRESHOLD}
/>
</View>
)}
Expand Down
2 changes: 2 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Achtung!',
submitTo: 'Einreichen bei',
forwardTo: 'Weiterleiten an',
approvalLimit: 'Genehmigungslimit',
overLimitForwardTo: 'Weiterleiten bei Überschreitung',
merge: 'Zusammenführen',
none: 'Keine',
unstableInternetConnection: 'Instabile Internetverbindung. Bitte überprüfe dein Netzwerk und versuche es erneut.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,8 @@ const translations = {
headsUp: 'Heads up!',
submitTo: 'Submit to',
forwardTo: 'Forward to',
approvalLimit: 'Approval limit',
overLimitForwardTo: 'Over limit forward to',
merge: 'Merge',
none: 'None',
unstableInternetConnection: 'Unstable internet connection. Please check your network and try again.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: '¡Atención!',
submitTo: 'Enviar a',
forwardTo: 'Reenviar a',
approvalLimit: 'Límite de aprobación',
overLimitForwardTo: 'Reenviar si excede el límite',
merge: 'Fusionar',
none: 'Ninguno',
unstableInternetConnection: 'Conexión a internet inestable. Por favor, revisa tu red e inténtalo de nuevo.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Attention !',
submitTo: 'Soumettre à',
forwardTo: 'Transférer à',
approvalLimit: "Limite d'approbation",
overLimitForwardTo: 'Transférer si dépassement de limite',
merge: 'Fusionner',
none: 'Aucun',
unstableInternetConnection: 'Connexion Internet instable. Veuillez vérifier votre réseau et réessayer.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Attenzione!',
submitTo: 'Invia a',
forwardTo: 'Inoltra a',
approvalLimit: 'Limite di approvazione',
overLimitForwardTo: 'Inoltra se supera il limite',
merge: 'Unisci',
none: 'Nessuno',
unstableInternetConnection: 'Connessione Internet instabile. Controlla la rete e riprova.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'ご注意ください!',
submitTo: '提出先',
forwardTo: '転送先',
approvalLimit: '承認限度額',
overLimitForwardTo: '限度額超過時の転送先',
merge: 'マージ',
none: 'なし',
unstableInternetConnection: 'インターネット接続が不安定です。ネットワークを確認して、もう一度お試しください。',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Let op!',
submitTo: 'Indienen bij',
forwardTo: 'Doorsturen naar',
approvalLimit: 'Goedkeuringslimiet',
overLimitForwardTo: 'Doorsturen bij overschrijding limiet',
merge: 'Samenvoegen',
none: 'Geen',
unstableInternetConnection: 'Onstabiele internetverbinding. Controleer je netwerk en probeer het opnieuw.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Uwaga!',
submitTo: 'Przekaż do',
forwardTo: 'Przekaż do',
approvalLimit: 'Limit zatwierdzenia',
overLimitForwardTo: 'Przekaż przy przekroczeniu limitu',
merge: 'Scal',
none: 'Brak',
unstableInternetConnection: 'Niestabilne połączenie internetowe. Sprawdź swoją sieć i spróbuj ponownie.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: 'Atenção!',
submitTo: 'Enviar para',
forwardTo: 'Encaminhar para',
approvalLimit: 'Limite de aprovação',
overLimitForwardTo: 'Encaminhar se exceder o limite',
merge: 'Mesclar',
none: 'Nenhum',
unstableInternetConnection: 'Conexão de internet instável. Verifique sua rede e tente novamente.',
Expand Down
2 changes: 2 additions & 0 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,8 @@ const translations: TranslationDeepObject<typeof en> = {
headsUp: '注意!',
submitTo: '提交给',
forwardTo: '转发至',
approvalLimit: '审批限额',
overLimitForwardTo: '超出限额时转发至',
merge: '合并',
none: '无',
unstableInternetConnection: '网络连接不稳定。请检查您的网络后重试。',
Expand Down
29 changes: 27 additions & 2 deletions src/libs/actions/Policy/Member.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
};

let allReportActions: OnyxCollection<ReportActions>;
Onyx.connect({

Check warning on line 46 in src/libs/actions/Policy/Member.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
waitForCollectionCallback: true,
callback: (actions) => (allReportActions = actions),
Expand Down Expand Up @@ -1021,6 +1021,10 @@
role: string;
submitsTo?: string;
forwardsTo?: string;
customField1?: string;
customField2?: string;
approvalLimit?: string;
overLimitForwardsTo?: string;
};

function importPolicyMembers(policy: OnyxEntry<Policy>, members: PolicyMember[]) {
Expand All @@ -1032,7 +1036,17 @@
(acc, curr) => {
const employee = policy?.employeeList?.[curr.email];
if (employee) {
if (curr.role !== employee.role || (curr.submitsTo ?? '') !== (employee.submitsTo ?? '') || (curr.forwardsTo ?? '') !== (employee.forwardsTo ?? '')) {
const existingCustomField1 = employee.employeeUserID;
const existingCustomField2 = employee.employeePayrollID;
if (
curr.role !== employee.role ||
(curr.submitsTo ?? '') !== (employee.submitsTo ?? '') ||
(curr.forwardsTo ?? '') !== (employee.forwardsTo ?? '') ||
(curr.customField1 !== undefined && curr.customField1 !== (existingCustomField1 ?? '')) ||
(curr.customField2 !== undefined && curr.customField2 !== (existingCustomField2 ?? '')) ||
(curr.approvalLimit !== undefined && curr.approvalLimit !== String(employee.approvalLimit ?? '')) ||
(curr.overLimitForwardsTo !== undefined && curr.overLimitForwardsTo !== (employee.overLimitForwardsTo ?? ''))
) {
acc.updated++;
}
} else {
Expand All @@ -1046,7 +1060,18 @@

const parameters = {
policyID: policy.id,
employees: JSON.stringify(members.map((member) => ({email: member.email, role: member.role, submitsTo: member.submitsTo, forwardsTo: member.forwardsTo}))),
employees: JSON.stringify(
members.map((member) => ({
email: member.email,
role: member.role,
submitsTo: member.submitsTo,
forwardsTo: member.forwardsTo,
...(member.customField1 !== undefined && {customField1: member.customField1}),
...(member.customField2 !== undefined && {customField2: member.customField2}),
...(member.approvalLimit !== undefined && {approvalLimit: member.approvalLimit}),
...(member.overLimitForwardsTo !== undefined && {overLimitForwardsTo: member.overLimitForwardsTo}),
})),
),
};

API.write(WRITE_COMMANDS.IMPORT_MEMBERS_SPREADSHEET, parameters, onyxData);
Expand Down
48 changes: 47 additions & 1 deletion src/pages/workspace/members/ImportedMembersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
{text: translate('common.role'), value: CONST.CSV_IMPORT_COLUMNS.ROLE},
{text: translate('common.submitTo'), value: CONST.CSV_IMPORT_COLUMNS.SUBMIT_TO},
{text: translate('common.forwardTo'), value: CONST.CSV_IMPORT_COLUMNS.APPROVE_TO},
{text: translate('workspace.common.customField1'), value: CONST.CSV_IMPORT_COLUMNS.CUSTOM_FIELD_1},
{text: translate('workspace.common.customField2'), value: CONST.CSV_IMPORT_COLUMNS.CUSTOM_FIELD_2},
{text: translate('common.approvalLimit'), value: CONST.CSV_IMPORT_COLUMNS.REPORT_THRESHHOLD},
{text: translate('common.overLimitForwardTo'), value: CONST.CSV_IMPORT_COLUMNS.APPROVE_TO_ALTERNATE},
];

const requiredColumns = columnRoles.filter((role) => role.isRequired).map((role) => role);
Expand Down Expand Up @@ -98,8 +102,16 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
const membersRoles = membersRolesColumn !== -1 ? spreadsheet?.data[membersRolesColumn].map((role) => role) : [];
const membersSubmitsToColumn = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.SUBMIT_TO);
const membersForwardsToColumn = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.APPROVE_TO);
const membersCustomField1Column = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.CUSTOM_FIELD_1);
const membersCustomField2Column = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.CUSTOM_FIELD_2);
const membersApprovalLimitColumn = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.REPORT_THRESHHOLD);
const membersOverLimitForwardsToColumn = columns.findIndex((column) => column === CONST.CSV_IMPORT_COLUMNS.APPROVE_TO_ALTERNATE);
const membersSubmitsTo = membersSubmitsToColumn !== -1 ? spreadsheet?.data[membersSubmitsToColumn].map((submitsTo) => submitsTo) : [];
const membersForwardsTo = membersForwardsToColumn !== -1 ? spreadsheet?.data[membersForwardsToColumn].map((forwardsTo) => forwardsTo) : [];
const membersCustomField1 = membersCustomField1Column !== -1 ? spreadsheet?.data[membersCustomField1Column].map((v) => v) : [];
const membersCustomField2 = membersCustomField2Column !== -1 ? spreadsheet?.data[membersCustomField2Column].map((v) => v) : [];
const membersApprovalLimit = membersApprovalLimitColumn !== -1 ? spreadsheet?.data[membersApprovalLimitColumn].map((v) => v) : [];
const membersOverLimitForwardsTo = membersOverLimitForwardsToColumn !== -1 ? spreadsheet?.data[membersOverLimitForwardsToColumn].map((v) => v) : [];
const members = membersEmails?.slice(containsHeader ? 1 : 0).map((email, index) => {
const isPolicyMember = isPolicyMemberWithoutPendingDelete(email, policy);
let role = isPolicyMember ? (policy?.employeeList?.[email]?.role ?? '') : '';
Expand All @@ -117,18 +129,26 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
if (membersForwardsToColumn !== -1 && membersForwardsTo?.[containsHeader ? index + 1 : index]) {
forwardsTo = membersForwardsTo?.[containsHeader ? index + 1 : index];
}
const customField1 = membersCustomField1Column !== -1 ? (membersCustomField1?.[containsHeader ? index + 1 : index] ?? '') : undefined;
const customField2 = membersCustomField2Column !== -1 ? (membersCustomField2?.[containsHeader ? index + 1 : index] ?? '') : undefined;
const approvalLimit = membersApprovalLimitColumn !== -1 ? (membersApprovalLimit?.[containsHeader ? index + 1 : index] ?? '') : undefined;
const overLimitForwardsTo = membersOverLimitForwardsToColumn !== -1 ? (membersOverLimitForwardsTo?.[containsHeader ? index + 1 : index] ?? '') : undefined;

return {
email,
role,
submitsTo,
forwardsTo,
customField1,
customField2,
approvalLimit,
overLimitForwardsTo,
};
});

const allMembers = [...(members ?? [])];

// Add submitsTo and forwardsTo members if they are not in the workspace
// Add submitsTo, forwardsTo, and overLimitForwardsTo members if they are not in the workspace
if (members) {
for (const member of members) {
if (member.submitsTo && !allMembers.some((m) => m.email === member.submitsTo) && !isPolicyMemberWithoutPendingDelete(member.submitsTo, policy)) {
Expand All @@ -138,6 +158,10 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
role: '',
submitsTo: '',
forwardsTo: '',
customField1: undefined,
customField2: undefined,
approvalLimit: undefined,
overLimitForwardsTo: undefined,
});
}

Expand All @@ -148,6 +172,28 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
role: policy?.employeeList?.[member.forwardsTo]?.role ?? '',
submitsTo: '',
forwardsTo: '',
customField1: undefined,
customField2: undefined,
approvalLimit: undefined,
overLimitForwardsTo: undefined,
});
}

if (
member.overLimitForwardsTo &&
!allMembers.some((m) => m.email === member.overLimitForwardsTo) &&
!isPolicyMemberWithoutPendingDelete(member.overLimitForwardsTo, policy)
) {
isRoleMissing = true;
allMembers.push({
email: member.overLimitForwardsTo,
role: policy?.employeeList?.[member.overLimitForwardsTo]?.role ?? '',
submitsTo: '',
forwardsTo: '',
customField1: undefined,
customField2: undefined,
approvalLimit: undefined,
overLimitForwardsTo: undefined,
});
}
}
Expand Down
12 changes: 12 additions & 0 deletions src/types/onyx/ImportedSpreadsheetMemberData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@ type ImportedSpreadsheetMemberData = {

/** The email of the member to whom the expenses approved by this member are forwarded */
forwardsTo: string;

/** Custom field 1 value for this member */
customField1?: string;

/** Custom field 2 value for this member */
customField2?: string;

/** The approval limit amount for this member */
approvalLimit?: string;

/** The email of the user this member forwards reports to when over the approval limit */
overLimitForwardsTo?: string;
};

export default ImportedSpreadsheetMemberData;
Loading