Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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
92 changes: 74 additions & 18 deletions src/components/Tables/WorkspaceVendorsTable/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Switch from '@components/Switch';
import type {CompareItemsCallback, IsItemInSearchCallback, TableColumn, TableData} from '@components/Table';
import Table, {composeTableListHeader} from '@components/Table';
import TextWithTooltip from '@components/TextWithTooltip';
Expand All @@ -7,28 +8,47 @@ import useThemeStyles from '@hooks/useThemeStyles';

import tokenizedSearch from '@libs/tokenizedSearch';

import variables from '@styles/variables';

import CONST from '@src/CONST';
import type * as OnyxCommon from '@src/types/onyx/OnyxCommon';

import type {ListRenderItemInfo} from '@shopify/flash-list';

import React from 'react';
import {View} from 'react-native';

type WorkspaceVendorTableColumnKey = 'name';
type WorkspaceVendorTableColumnKey = 'name' | 'enabled';

type WorkspaceVendorTableRowData = TableData & {
name: string;
enabled: boolean;
disabled: boolean;
isLocked: boolean;
errors?: OnyxCommon.Errors;
pendingAction?: OnyxCommon.PendingAction;
onToggleEnabled: (enabled: boolean) => void;
dismissError: () => void;
};

type WorkspaceVendorsTableProps = {
/** Vendor rows to render */
vendors: WorkspaceVendorTableRowData[];

/** Whether row selection is enabled */
selectionEnabled?: boolean;

/** Currently selected vendor keys */
selectedKeys?: string[];

/** Callback fired when row selection changes */
onRowSelectionChange?: (selectedKeys: string[]) => void;

/** Page-level content rendered above the table header inside the scrollable list */
headerComponent?: React.ReactElement;
};

function WorkspaceVendorsTable({vendors, headerComponent}: WorkspaceVendorsTableProps) {
function WorkspaceVendorsTable({vendors, selectionEnabled = false, selectedKeys = [], onRowSelectionChange, headerComponent}: WorkspaceVendorsTableProps) {
const styles = useThemeStyles();
const {translate, localeCompare} = useLocalize();

Expand All @@ -38,10 +58,24 @@ function WorkspaceVendorsTable({vendors, headerComponent}: WorkspaceVendorsTable
label: translate('common.name'),
sortable: true,
},
{
key: 'enabled',
label: translate('common.enabled'),
sortable: true,
width: variables.tableSwitchColumnWidth,
styling: {
containerStyles: [styles.justifyContentEnd],
},
},
];

const compareItems: CompareItemsCallback<WorkspaceVendorTableRowData> = (item1, item2, activeSorting) => {
const orderMultiplier = activeSorting.order === 'asc' ? 1 : -1;
if (activeSorting.columnKey === 'enabled') {
const enabled1 = item1.enabled ? 1 : 0;
const enabled2 = item2.enabled ? 1 : 0;
return (enabled1 - enabled2) * orderMultiplier;
}
return localeCompare(item1.name, item2.name) * orderMultiplier;
};

Expand All @@ -50,22 +84,41 @@ function WorkspaceVendorsTable({vendors, headerComponent}: WorkspaceVendorsTable
return results.length > 0;
};

const renderVendorItem = ({item, index}: ListRenderItemInfo<WorkspaceVendorTableRowData>) => (
<Table.Row
interactive={false}
accessibilityLabel={item.name}
rowIndex={index}
sentryLabel={CONST.SENTRY_LABEL.WORKSPACE.INITIAL.VENDORS}
>
<View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter]}>
<TextWithTooltip
shouldShowTooltip
numberOfLines={1}
text={item.name}
/>
</View>
</Table.Row>
);
const renderVendorItem = ({item, index}: ListRenderItemInfo<WorkspaceVendorTableRowData>) => {
const accessibilityLabel = [item.name, item.enabled ? translate('common.enabled') : translate('common.disabled')].filter(Boolean).join(', ');

return (
<Table.Row
interactive={false}
accessibilityLabel={accessibilityLabel}
rowIndex={index}
sentryLabel={CONST.SENTRY_LABEL.WORKSPACE.INITIAL.VENDORS}
disabled={item.disabled}
offlineWithFeedback={{
errors: item.errors,
pendingAction: item.pendingAction,
onClose: item.dismissError,
}}
>
<View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter]}>
<TextWithTooltip
shouldShowTooltip
numberOfLines={1}
text={item.name}
/>
</View>
<View style={[styles.justifyContentCenter, styles.alignItemsEnd]}>
<Switch
isOn={item.enabled}
showLockIcon={item.isLocked}
disabled={item.disabled || item.isLocked}
accessibilityLabel={`${translate('workspace.vendors.enableVendor')}: ${item.name}`}
onToggle={item.onToggleEnabled}
/>
</View>
</Table.Row>
);
};

const tableHeaderComponent = composeTableListHeader(headerComponent, <Table.FilterBar label={translate('workspace.vendors.findVendor')} />);

Expand All @@ -79,6 +132,9 @@ function WorkspaceVendorsTable({vendors, headerComponent}: WorkspaceVendorsTable
isItemInSearch={isItemInSearch}
renderItem={renderVendorItem}
keyExtractor={(item) => item.keyForList}
selectionEnabled={selectionEnabled}
selectedKeys={selectedKeys}
onRowSelectionChange={onRowSelectionChange}
>
<Table.ListHeader>{tableHeaderComponent}</Table.ListHeader>
<Table.EmptyState
Expand Down
5 changes: 5 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6874,6 +6874,11 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
emptySubtitle: 'Anbieter werden hier angezeigt, nachdem Ihre Buchhaltungssynchronisierung abgeschlossen ist.',
findVendor: 'Lieferanten finden',
managedInAccountingSoftware: 'Lieferanten werden verwaltet in Ihrem',
enableVendor: 'Lieferanten aktivieren',
enableVendors: 'Anbieter aktivieren',
disableVendor: 'Lieferanten deaktivieren',
disableVendors: 'Lieferanten deaktivieren',
updateFailureMessage: 'Beim Aktualisieren des Lieferanten ist ein Fehler aufgetreten, bitte versuchen Sie es erneut.',
},
tags: {
tagName: 'Tag-Name',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/el.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9055,6 +9055,11 @@ ${reportName}`,
emptySubtitle: 'Οι προμηθευτές θα εμφανιστούν εδώ μετά την ολοκλήρωση του συγχρονισμού λογιστικής σας.',
findVendor: 'Εύρεση προμηθευτή',
managedInAccountingSoftware: 'Οι προμηθευτές διαχειρίζονται στο',
enableVendor: 'Ενεργοποίηση προμηθευτή',
enableVendors: 'Ενεργοποίηση προμηθευτών',
disableVendor: 'Απενεργοποίηση προμηθευτή',
disableVendors: 'Απενεργοποίηση προμηθευτών',
updateFailureMessage: 'Προέκυψε σφάλμα κατά την ενημέρωση του προμηθευτή, δοκιμάστε ξανά',
},
campfire: {
campfireSetup: 'Ρύθμιση campfire',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7209,6 +7209,11 @@ const translations = {
emptySubtitle: 'Vendors will appear here after your accounting sync completes.',
findVendor: 'Find vendor',
managedInAccountingSoftware: 'Vendors are managed in your',
enableVendor: 'Enable vendor',
enableVendors: 'Enable vendors',
disableVendor: 'Disable vendor',
disableVendors: 'Disable vendors',
updateFailureMessage: 'An error occurred while updating the vendor, please try again',
},
tags: {
tagName: 'Tag name',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6741,6 +6741,11 @@ ${amount} para ${merchant} - ${date}`,
emptySubtitle: 'Los proveedores aparecerán aquí una vez que se complete la sincronización de contabilidad.',
findVendor: 'Buscar proveedor',
managedInAccountingSoftware: 'Los proveedores se gestionan en tu',
enableVendor: 'Habilitar proveedor',
enableVendors: 'Habilitar proveedores',
disableVendor: 'Deshabilitar proveedor',
disableVendors: 'Deshabilitar proveedores',
updateFailureMessage: 'Se ha producido un error al actualizar el proveedor, inténtalo de nuevo por favor',
},
tags: {
tagName: 'Nombre de etiqueta',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6892,6 +6892,11 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
emptySubtitle: 'Les fournisseurs apparaîtront ici une fois la synchronisation comptable terminée.',
findVendor: 'Trouver un fournisseur',
managedInAccountingSoftware: 'Les fournisseurs sont gérés dans votre',
enableVendor: 'Activer le fournisseur',
enableVendors: 'Activer les fournisseurs',
disableVendor: 'Désactiver le fournisseur',
disableVendors: 'Désactiver les fournisseurs',
updateFailureMessage: 'Une erreur s’est produite lors de la mise à jour du fournisseur, veuillez réessayer',
},
tags: {
tagName: 'Nom du tag',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6834,6 +6834,11 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
emptySubtitle: 'I fornitori verranno visualizzati qui al termine della sincronizzazione contabile.',
findVendor: 'Trova fornitore',
managedInAccountingSoftware: 'I fornitori sono gestiti nel tuo',
enableVendor: 'Abilita fornitore',
enableVendors: 'Abilita fornitori',
disableVendor: 'Disabilita fornitore',
disableVendors: 'Disattiva fornitori',
updateFailureMessage: "Si è verificato un errore durante l'aggiornamento del fornitore, riprova per favore",
},
tags: {
tagName: 'Nome tag',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6747,6 +6747,11 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
emptySubtitle: '会計システムとの同期が完了すると、ここに取引先が表示されます。',
findVendor: '取引先を検索',
managedInAccountingSoftware: '取引先は次の場所で管理されます:',
enableVendor: 'ベンダーを有効にする',
enableVendors: 'ベンダーを有効にする',
disableVendor: '取引先を無効にする',
disableVendors: '取引先を無効化',
updateFailureMessage: '仕入先の更新中にエラーが発生しました。もう一度お試しください。',
},
tags: {
tagName: 'タグ名',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6819,6 +6819,11 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
emptySubtitle: 'Leveranciers verschijnen hier zodra je boekhoudkundige synchronisatie is voltooid.',
findVendor: 'Leverancier zoeken',
managedInAccountingSoftware: 'Leveranciers worden beheerd in je',
enableVendor: 'Leverancier inschakelen',
enableVendors: 'Leveranciers inschakelen',
disableVendor: 'Leverancier uitschakelen',
disableVendors: 'Leveranciers uitschakelen',
updateFailureMessage: 'Er is een fout opgetreden bij het bijwerken van de leverancier, probeer het alsjeblieft opnieuw',
},
tags: {
tagName: 'Tagnaam',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6843,6 +6843,11 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
emptySubtitle: 'Dostawcy pojawią się tutaj po zakończeniu synchronizacji z księgowością.',
findVendor: 'Znajdź dostawcę',
managedInAccountingSoftware: 'Dostawcy są zarządzani w twoim',
enableVendor: 'Włącz kontrahenta',
enableVendors: 'Włącz dostawców',
disableVendor: 'Wyłącz dostawcę',
disableVendors: 'Wyłącz dostawców',
updateFailureMessage: 'Wystąpił błąd podczas aktualizowania dostawcy, spróbuj ponownie',
},
tags: {
tagName: 'Nazwa tagu',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6821,6 +6821,11 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS
emptySubtitle: 'Os fornecedores vão aparecer aqui depois que a sincronização contábil for concluída.',
findVendor: 'Encontrar fornecedor',
managedInAccountingSoftware: 'Fornecedores são gerenciados no seu',
enableVendor: 'Ativar fornecedor',
enableVendors: 'Ativar fornecedores',
disableVendor: 'Desativar fornecedor',
disableVendors: 'Desativar fornecedores',
updateFailureMessage: 'Ocorreu um erro ao atualizar o fornecedor, tente novamente por favor',
},
tags: {
tagName: 'Nome da tag',
Expand Down
12 changes: 11 additions & 1 deletion src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6578,7 +6578,17 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
invoiceFieldInitialValueRequiredError: '请选择发票字段的初始值',
addField: '添加字段',
},
vendors: {emptyTitle: '尚无供应商', emptySubtitle: '会计同步完成后,供应商将显示在此处。', findVendor: '查找供应商', managedInAccountingSoftware: '供应商在您的'},
vendors: {
emptyTitle: '尚无供应商',
emptySubtitle: '会计同步完成后,供应商将显示在此处。',
findVendor: '查找供应商',
managedInAccountingSoftware: '供应商在您的',
enableVendor: '启用供应商',
enableVendors: '启用供应商',
disableVendor: '停用供应商',
disableVendors: '禁用供应商',
updateFailureMessage: '更新供应商时出错,请重试',
},
tags: {
tagName: '标签名称',
requiresTag: '成员必须为所有报销添加标签',
Expand Down
11 changes: 11 additions & 0 deletions src/libs/API/parameters/SetPolicyVendorsEnabledParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
type SetPolicyVendorsEnabledParams = {
policyID: string;
/**
* Stringified JSON array of vendor IDs, e.g.:
* string[]
*/
vendorIDs: string;
enabled: boolean;
};

export default SetPolicyVendorsEnabledParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ export type {default as UpdateWorkspaceDescriptionParams} from './UpdateWorkspac
export type {default as UpdateWorkspaceClientIDParams} from './UpdateWorkspaceClientIDParams';
export type {default as UpdateWorkspaceMembersRoleParams} from './UpdateWorkspaceMembersRoleParams';
export type {default as SetWorkspaceCategoriesEnabledParams} from './SetWorkspaceCategoriesEnabledParams';
export type {default as SetPolicyVendorsEnabledParams} from './SetPolicyVendorsEnabledParams';
export type {default as CreateWorkspaceCategoriesParams} from './CreateWorkspaceCategoriesParams';
export type {default as RenameWorkspaceCategoriesParams} from './RenameWorkspaceCategoriesParams';
export type {default as SetWorkspaceRequiresCategoryParams} from './SetWorkspaceRequiresCategoryParams';
Expand Down
2 changes: 2 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ const WRITE_COMMANDS = {
CREATE_WORKSPACE_FROM_IOU_PAYMENT: 'CreateWorkspaceFromIOUPayment',
UPDATE_POLICY_MEMBERS_CUSTOM_FIELDS: 'UpdatePolicyMembersCustomFields',
SET_WORKSPACE_CATEGORIES_ENABLED: 'SetWorkspaceCategoriesEnabled',
SET_POLICY_VENDORS_ENABLED: 'SetPolicyVendorsEnabled',
MOVE_IOU_REPORT_TO_POLICY_AND_INVITE_SUBMITTER: 'MoveIOUReportToPolicyAndInviteSubmitter',
SET_POLICY_TAGS_ENABLED: 'SetPolicyTagsEnabled',
CREATE_WORKSPACE_CATEGORIES: 'CreateWorkspaceCategories',
Expand Down Expand Up @@ -919,6 +920,7 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.UPDATE_POLICY_MEMBERS_CUSTOM_FIELDS]: Parameters.UpdatePolicyMembersCustomFieldsParams;
[WRITE_COMMANDS.MOVE_IOU_REPORT_TO_EXISTING_POLICY]: Parameters.MoveIOUReportToExistingPolicyParams;
[WRITE_COMMANDS.SET_WORKSPACE_CATEGORIES_ENABLED]: Parameters.SetWorkspaceCategoriesEnabledParams;
[WRITE_COMMANDS.SET_POLICY_VENDORS_ENABLED]: Parameters.SetPolicyVendorsEnabledParams;
[WRITE_COMMANDS.MOVE_IOU_REPORT_TO_POLICY_AND_INVITE_SUBMITTER]: Parameters.MoveIOUReportToPolicyAndInviteSubmitterParams;
[WRITE_COMMANDS.CREATE_WORKSPACE_CATEGORIES]: Parameters.CreateWorkspaceCategoriesParams;
[WRITE_COMMANDS.IMPORT_CSV_COMPANY_CARDS]: Parameters.ImportCSVCompanyCardsParams;
Expand Down
Loading
Loading