Skip to content
Open
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
3 changes: 3 additions & 0 deletions src/interfaces/BO/catalog/products/create/tabCombinations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export interface BOProductsCreateTabCombinationsPageInterface extends BOBasePage
reference: string,
}>;
getCombinationNameFromModal(page: Page): Promise<string>;
getCombinationVirtualProductFileName(page: Page): Promise<string>;
getFilterBySizeButtonName(page: Page): Promise<string>;
getNumberOfCombinationsFromList(page: Page): Promise<number>;
getPaginationLabel(page: Page): Promise<string>;
Expand All @@ -67,6 +68,8 @@ export interface BOProductsCreateTabCombinationsPageInterface extends BOBasePage
setLabelWhenInStock(page: Page, label: string): Promise<void>;
setLabelWhenOutOfStock(page: Page, label: string): Promise<void>;
setOptionWhenOutOfStock(page: Page, option: string): Promise<void>;
setCombinationIsVirtual(page: Page, isVirtual: boolean): Promise<string>;
setCombinationVirtualProductFile(page: Page, filePath: string): Promise<string>;
setProductAttributes(page: Page, attributes: ProductAttributes[]): Promise<string|null>;
sortTable(page: Page, sortBy: string, column: number, sortDirection: string): Promise<void>;
}
1 change: 1 addition & 0 deletions src/interfaces/FO/product/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export interface FoProductPageInterface extends FOBasePagePageInterface {
getProductAttributes(page: Page): Promise<ProductAttribute[]>;
getProductAvailabilityLabel(page: Page): Promise<string>;
getProductCondition(page: Page): Promise<string>;
getProductDownloadFileName(page: Page): Promise<string>;
getProductFeaturesList(page: Page): Promise<string>;
getProductImageUrls(page: Page): Promise<ProductImageUrls>;
getProductInPackList(page: Page, productInList: number): Promise<ProductDetailsBasic>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,14 @@ class CombinationsTab extends BOBasePage implements BOProductsCreateTabCombinati

private readonly editCombinationModalSaveButton: string;

private readonly editCombinationModalVirtualFileToggle: (toCheck: number) => string;

private readonly editCombinationModalVirtualFile: string;

private readonly editCombinationModalVirtualFileName: string;

private readonly editCombinationModalIsVirtualToggle: (toCheck: number) => string;

private readonly editCombinationModalCloseButton: string;

private readonly editCombinationCloseModal: string;
Expand Down Expand Up @@ -329,6 +337,16 @@ class CombinationsTab extends BOBasePage implements BOProductsCreateTabCombinati
this.editCombinationModalFinalPriceTaxIncludedInput = '#combination_form_price_impact_final_price_tax_included';
this.editCombinationModalLocationInput = '#combination_form_stock_options_stock_location';
this.editCombinationModalSaveButton = `${this.editCombinationModal} footer button.btn-primary`;
// Virtual product file section, shown in the combination modal only for the virtual_combinations product type.
// Ids derive deterministically from the core form: root form[name="combination_form"] + embedded
// VirtualProductFileType child `virtual_product_file` (SwitchType `has_file` -> `_has_file_1`).
this.editCombinationModalVirtualFileToggle = (toCheck: number) => (
`#combination_form_virtual_product_file_has_file_${toCheck}`
);
this.editCombinationModalVirtualFile = '#combination_form_virtual_product_file_file';
this.editCombinationModalVirtualFileName = '#combination_form_virtual_product_file_name';
// Per-combination "Is virtual" switch (SwitchType renders Yes/No radios _1/_0).
this.editCombinationModalIsVirtualToggle = (toCheck: number) => `#combination_form_is_virtual_${toCheck}`;
this.editCombinationModalCloseButton = `${this.editCombinationModal} footer button.btn-close`;
this.editCombinationCloseModal = `${this.editCombinationEditModal} div.modal-prevent-close div.modal.show`;
this.editCombinationModalDiscardButton = `${this.editCombinationCloseModal} button.btn-primary`;
Expand Down Expand Up @@ -654,6 +672,54 @@ class CombinationsTab extends BOBasePage implements BOProductsCreateTabCombinati
return this.getAlertSuccessBlockParagraphContent(combinationFrame!);
}

/**
* Upload a downloadable file to the currently open combination (virtual_combinations product type)
* @param page {Page} Browser tab
* @param filePath {string} Path of the file to upload
* @returns {Promise<string>}
*/
async setCombinationVirtualProductFile(page: Page, filePath: string): Promise<string> {
await this.waitForVisibleSelector(page, this.editCombinationIframe);

const combinationFrame: Frame|null = page.frame({url: /sell\/catalog\/products\/combinations/gmi});

await this.setChecked(combinationFrame!, this.editCombinationModalVirtualFileToggle(1));
await this.waitForVisibleSelector(combinationFrame!, this.editCombinationModalVirtualFile);
await this.uploadFile(combinationFrame!, this.editCombinationModalVirtualFile, filePath);
await this.setValue(combinationFrame!, this.editCombinationModalVirtualFileName, filePath);
await this.waitForSelectorAndClick(page, this.editCombinationModalSaveButton);

return this.getAlertSuccessBlockParagraphContent(combinationFrame!);
}

/**
* Mark the currently open combination as virtual (or physical) and save
* @param page {Page} Browser tab
* @param isVirtual {boolean} Whether the combination is virtual (non-shippable)
* @returns {Promise<string>}
*/
async setCombinationIsVirtual(page: Page, isVirtual: boolean): Promise<string> {
await this.waitForVisibleSelector(page, this.editCombinationIframe);

const combinationFrame: Frame|null = page.frame({url: /sell\/catalog\/products\/combinations/gmi});

await this.setChecked(combinationFrame!, this.editCombinationModalIsVirtualToggle(isVirtual ? 1 : 0));
await this.waitForSelectorAndClick(page, this.editCombinationModalSaveButton);

return this.getAlertSuccessBlockParagraphContent(combinationFrame!);
}

/**
* Get the name of the downloadable file attached to the currently open combination
* @param page {Page} Browser tab
* @returns {Promise<string>}
*/
async getCombinationVirtualProductFileName(page: Page): Promise<string> {
const combinationFrame: Frame|null = page.frame({url: /sell\/catalog\/products\/combinations/gmi});

return combinationFrame!.locator(this.editCombinationModalVirtualFileName).inputValue();
}

/**
* Get recent stock movements
* @param page {Page} Browser tab
Expand Down
14 changes: 14 additions & 0 deletions src/versions/develop/pages/FO/classic/product/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ class ProductPage extends FOBasePage implements FoProductPageInterface {

protected productCondition: string;

protected productDownloadFileName: string;

protected continueShoppingButton: string;

protected productAvailability: string;
Expand Down Expand Up @@ -256,6 +258,9 @@ class ProductPage extends FOBasePage implements FoProductPageInterface {
this.productDetail = 'div.product-information a[href=\'#product-details\']';
this.productFeaturesList = '#product-details section.product-features';
this.productCondition = '#product-details div.product-condition';
// Downloadable file offered for the currently selected combination (virtual_combinations product type).
// TODO(selector): the FO theme markup is not in this checkout; confirm the real per-combination download selector.
this.productDownloadFileName = '#product-details .product-download a';
this.continueShoppingButton = `${this.blockCartModal} div.cart-content-btn button`;
this.productAvailability = '#product-availability';
this.productAvailabilityIcon = `${this.productAvailability} i`;
Expand Down Expand Up @@ -1100,6 +1105,15 @@ class ProductPage extends FOBasePage implements FoProductPageInterface {
return this.getTextContent(page, this.productCondition);
}

/**
* Get the downloadable file name offered for the currently selected combination
* @param page {Page} Browser tab
* @returns {Promise<string>}
*/
async getProductDownloadFileName(page: Page): Promise<string> {
return this.getTextContent(page, this.productDownloadFileName);
}

/**
* Is customization block visible
* @param page {Page} Browser tab
Expand Down
Loading