{"version":3,"file":"static/js/63029cc6429747fba56b.bundle.js","mappings":"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","sources":["webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/get-product-reviews.ts?6edb","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/get-user-review.ts?bad7","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/inputs/get-product-reviews-input.ts?c654","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/inputs/get-user-review-input.ts?ab81","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/ratings-reviews-state-data-action.ts?26cd","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/submit-user-review.ts?ac78","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://@msdyn365-commerce-partners/fabrikam/./src/common/review-modal.tsx?54a9","webpack://@msdyn365-commerce-partners/fabrikam/./src/common/rnrInterface.ts?f761","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/report-review-concern.ts?bf43","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/reviews-list/components/components.tsx?033b","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://@msdyn365-commerce-partners/fabrikam/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/write-review/components/components.tsx?3575","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/write-review/write-review.tsx?9afc","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/write-review/write-review.view.tsx?b867"],"sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Reviews } from '@msdyn365-commerce/commerce-entities';\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICreateActionContext, IGeneric, sendRequest } from '@msdyn365-commerce/core';\nimport { getRnrEndpointId, getRnrPartnerId, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { GetProductReviewsInput } from './inputs/get-product-reviews-input';\n\n/**\n * TODO: Use this function to create the input required to make the API call.\n * @param input\n */\nexport const createInputForProductReviews = (input: ICreateActionContext>): IActionInput => {\n const productId = getSelectedProductIdFromActionInput(input);\n if (productId) {\n // Task #211227597 Remove these hardcoded values.\n return new GetProductReviewsInput(productId, getRnrPartnerId(input), input.requestContext.locale, getRnrEndpointId(input));\n }\n throw new Error('[GetProductReviews] Not all necessary parameters found while creating Input for GetProductReviewsApi');\n};\n\nexport async function getReviewsForGivenProduct(input: GetProductReviewsInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[GetProductReviews] Invalid input. ProductId = ${input.productId}, TenantId = ${input.tenantId}, localeListFilter = ${input.localeListFilter}`\n );\n }\n let requestUrl =\n `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}` +\n `?tenantId=${input.tenantId}` +\n `&localeListFilter=${input.localeListFilter}` +\n `&pageSize=${input.pageSize}` +\n `&orderBy=${input.orderBy}` +\n `&skipItems=${input.skipItems}`;\n\n if (input.starFilters !== undefined && input.starFilters.length > 0) {\n requestUrl = `${requestUrl}&starFilters=${input.starFilters}`;\n }\n\n if (input.pageToken !== null) {\n requestUrl = `${requestUrl}&pageToken=${input.pageToken}`;\n }\n return sendRequest(requestUrl, 'get')\n .then(response => {\n if (response.data && response.data.items && response.data.items.length > 0) {\n return {\n items: response.data.items.filter(i => !i.isTakenDown),\n pagingInfo: response.data.pagingInfo\n };\n }\n ctx.trace('[GetProductReviews] No reviews found for this product.');\n return response.data;\n })\n .catch(error => {\n ctx.trace('[GetProductReviews] Failed to get reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[GetProductReviews] Failed to get reviews for product');\n throw error;\n });\n}\n\nfunction inputIsValid(input: GetProductReviewsInput): boolean {\n return input && input.productId.length > 0 && input.tenantId.length > 0 && input.localeListFilter.length > 0 && input.pageSize > 0;\n}\n\nexport const getReviewsForGivenProductDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/get-product-reviews',\n action: >getReviewsForGivenProduct,\n input: createInputForProductReviews\n});\n\nexport default getReviewsForGivenProductDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext, sendRequest } from '@msdyn365-commerce/core';\nimport { getRnrAuthEndpointId, getRnrPartnerId, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { GetUserReviewInput } from './inputs/get-user-review-input';\n\n/**\n * This method builds the input for the getUserReviewApi call.\n * @param input\n */\nconst createInput = (input: ICreateActionContext): IActionInput => {\n const productId = getSelectedProductIdFromActionInput(input);\n const userInfo = input.requestContext.user;\n if (productId && userInfo && userInfo.isAuthenticated) {\n // Task #211227597 Remove these hardcoded values.\n return new GetUserReviewInput(productId, getRnrPartnerId(input), userInfo.token, getRnrAuthEndpointId(input));\n }\n throw new Error('[GetUserReview] Not all necessary parameters found while creating Input for GetUserReviewAPI');\n};\n\n/**\n * This method gets the user's review from the RnR service endpoint.\n * @param input\n * @param ctx\n */\nasync function getUserReview(input: GetUserReviewInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n const errorMessage = `[GettUserReview] Failed to get user's review due to bad input ${input}`;\n ctx.trace(errorMessage);\n throw new Error(errorMessage);\n }\n\n const requestUrl = `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?tenantId=${input.tenantId}`;\n\n return sendRequest(requestUrl, 'get', null, { headers: { Authorization: `id_token ${input.authorization}` } }).then((response) => {\n return response.data;\n }).catch((error) => {\n ctx.trace('[GettUserReview] Failed to get user\\'s review for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[GettUserReview] Failed to get user\\'s review for product');\n ctx.trace(error);\n throw (error);\n });\n}\n\nfunction inputIsValid(input: GetUserReviewInput): boolean {\n return input.productId.length > 0 && input.authorization.length > 0 && input.tenantId.length > 0;\n}\n\nexport const getUserReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/get-user-review',\n action: >getUserReview,\n input: createInput\n});\n\nexport default getUserReviewDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport type OrderBy =\n | 'None'\n | 'MostRecent'\n | 'Oldest'\n | 'HighestRating'\n | 'LowestRating'\n | 'MostHelpful'\n | 'LeastHelpful'\n | 'MostAsked'\n | 'MostAnswered'\n | 'LeastConcerns'\n | 'MostConcerns'\n | 'ReviewerNameAsc'\n | 'ReviewerNameDesc';\n\n/**\n * ReviewsGetRatingsSummary Input Action.\n */\nexport class GetProductReviewsInput implements IActionInput {\n /**\n * The Id representing the product to get the reviews for.\n */\n public productId: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The market for which to get the reviews from.\n */\n public localeListFilter: string;\n\n /**\n * Number of reviews to be shown on each page.\n */\n public pageSize: number;\n\n /**\n * Order in which reviews to be shown.\n */\n public orderBy: string;\n\n /**\n * Need to set this value if reviews need to be filtered with specific star rating .\n */\n public starFilters?: string;\n\n /**\n * Need to set this value if we need to skip few reviews.\n */\n public skipItems: number;\n\n /**\n * The continuation token.\n */\n public pageToken: string | null;\n\n /**\n * Selects which data sources to use to retrieve data.\n */\n public dataSources: string | null;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string,\n tenantId: string,\n localeListFilter: string,\n serviceEndpoint: string,\n orderBy: string = 'MostHelpful',\n starFilters: string = '',\n skipItems: number = 0,\n pageSize: number = 10,\n pageToken: string | null = null,\n dataSources: string | null = null\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.localeListFilter = localeListFilter;\n\n // Max page size which Rnr API supports is 25.\n // Hence if config has page size more than 25, we'll default it to 25.\n this.pageSize = pageSize > 25 ? 25 : pageSize;\n this.orderBy = orderBy;\n this.starFilters = starFilters;\n this.skipItems = skipItems;\n this.pageToken = pageToken;\n this.dataSources = dataSources;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => `${this.productId}-${this.tenantId}-${this.localeListFilter}-${this.pageSize}-${this.orderBy}-${this.starFilters}-${this.skipItems}`;\n\n public getCacheObjectType = () => 'ProductReview';\n\n public dataCacheType = (): CacheType => 'request';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * These are the get user review API inputs.\n */\nexport class GetUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string,\n tenantId: string,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'GetUserReview';\n\n public getCacheObjectType = () => 'GetUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionInput } from '@msdyn365-commerce/core';\nimport { GenericInput, getGenericAction } from '@msdyn365-commerce-modules/retail-actions';\n\nexport interface IRatingsReviewsState {\n filterKey: string;\n}\n\nexport function createRatingsReviewsStateInput(result: IRatingsReviewsState): GenericInput {\n return new GenericInput('ratingsReviewsState', result, 'ratingsReviewsStateInput');\n}\n\nconst createInternalRatingsReviewsStateInput = (): IActionInput => {\n return createRatingsReviewsStateInput({ filterKey: '1;2;3;4;5' });\n};\n\nexport const getGenericActionDataAction = createObservableDataAction({\n action: >getGenericAction,\n input: createInternalRatingsReviewsStateInput\n});\n\nexport default getGenericActionDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl = `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } }).then((response) => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n }).catch((error) => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: >submitReview\n});\n\nexport default submitReviewDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert, Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Modal, ModalBody, ModalFooter, ModalHeader, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent): void;\n onTextChange(event: React.ChangeEvent): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: { tag: Modal, className: 'ms-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: ,\n submitButton: \n {props.resources.submitReviewButtonText}\n ,\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: \n {props.resources.errorMessageText}\n \n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n \n { props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle }\n \n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return ();\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n \n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return ();\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n \n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return ();\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n

\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n \n {props.resources.privacyPolicyTitle}\n \n {isSeparatorAtEnd ? '' : (isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]) }\n

\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(props.product, props.reviewTitle, props.reviewText, props.rating, props.context, props.userReview, props.onReviewComplete);\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (product: SimpleProduct, title: string, text: string, rating: number, context: ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext).then(reviewId => {\n const review = reviewId ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n } : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n }).catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\n });\n }\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport {\n format,\n INodeProps,\n Progress\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: \n {stars}\n ,\n percentage: \n {formattedPercent}\n ,\n bar: ,\n buttonProps: { tag: 'button', className: 'ms-ratings-histogram__item', onClick: () => {\n props.onClick(stars);\n } }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (

\n {props.summary.averageRating}\n {' '}\n / 5\n

);\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (

\n {props.summary.totalRatingsCount}\n

);\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent> {\n\n constructor(props: IRatingsHistogramProps) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const { ratingsSummary: { result: ratingsSummary } } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary ? HistogramItems({ ratingsSummary, resources: { ...resources }, locale: this.props.context.request.locale, onClick: this.selectFilterBy }) : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n \n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n \n {heading}\n \n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n \n \n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n \n {props.starLabel}\n {props.bar}\n {props.percentage}\n \n );\n};\n\nexport default RatingsHistogramView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: >reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n concernCategory: string,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { format, getPayloadObject, getTelemetryAttributes, ILabeledDropdownOption, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n \n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n \n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): Promise;\n}\n\nexport const PageControls: React.FC = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {_hasPreviousPage(currentPage) && (\n \n {resources.previousButtonText}\n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (pageReviewAriaLabel: string, currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, isNextPage: boolean, page?: number): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n false\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { Alert, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Modal, ModalBody, ModalFooter, ModalHeader, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext>;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: { tag: Modal, className: 'ms-report-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header:

\n {props.resources.reportConcernText}\n

,\n headerSubmitted:

\n {props.resources.feedbackThankYouText}\n

,\n cancelButton: ,\n submitButton: ,\n succesfulButton: ,\n reportMessage:

\n {props.resources.reportModalMessage}\n

,\n reportSubmittedMessage:

\n {props.resources.reportSubmittedMessage}\n

,\n radioButtons: radioPairs(props),\n error: \n {props.resources.errorMessageText}\n \n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n
\n \n \n
\n );\n }\n\n return (\n
\n {pairs}\n
\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name:

\n {props.review.userName}\n

,\n rating: rating(props),\n date:

\n {renderDate(props, props.review.submittedDateTime)}\n

,\n reviewTitle:

\n {props.review.title}\n

,\n reviewText:

\n {props.review.reviewText}\n

,\n ratingHelpfulLabel: props.isUserReview ? undefined :

\n {props.resources.wasReviewHelpfulText}\n

,\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ?

\n {props.review.userResponse.responderName}\n

: undefined,\n responseText: props.review.userResponse ?

\n {props.review.userResponse.responseText}\n

: undefined,\n responseDate: props.review.userResponse ?

\n {renderDate(props, props.review.userResponse.submittedDateTime)}\n

: undefined,\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n \n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n {title}\n );\n }\n return (\n {title}\n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview) {\n return ();\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(new Date(date));\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return ();\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return (

\n {props.resources.reportedText}\n

);\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return ();\n\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n isHelpful: boolean,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrEndpointId, getRnrPartnerId, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject;\n\n private readonly _userReportModalToggle: React.RefObject;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n constructor(props: IReviewsListProps) {\n super(props);\n const { userReview: { result: userReview } } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef();\n this._userReportModalToggle = React.createRef();\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount = async () => {\n this.props.data.reviewsList.then((reviewsList) => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (\n filterKey &&\n !isNaN(filterKeyValue) &&\n filterKeyValue < dropdownItemsCount\n ) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n\n public shouldComponentUpdate(nextProps: IReviewsListProps,\n nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const { ratingsSummary: { result: ratingsSummary } } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n \n ),\n sortByDropdown: ,\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: ,\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n ),\n noReviewsMessage: \n {resources.noReviewsMessage}\n ,\n noReviewsWithFilterMessage: \n {resources.noReviewsWithSelectedFilterMessage}\n ,\n heading: heading && heading.text && (\n \n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({ isReportModalOpen: true, reportingReviewId: reviewId, reported: false, reportedKey: ReviewConcernCategory.SpamAdvertising });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n }).catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map((review) => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n }).catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n toggleModal: this._toggleReviewModal,\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n reportReview: this._reportReviewCallback,\n updateFilterByDropdown: this.updateFilterByDropdown,\n updateSortByDropdown: this.updateSortByDropdown,\n updateReviews: this.updateReviews\n };\n}\n\nexport default ReviewsList;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return (\n {noReviewsMessage}\n );\n }\n\n return (\n \n {heading}\n {averageRating}\n {reviewCount}\n \n {sortByDropdown}\n {filterByDropdown}\n \n \n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n \n { reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n \n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n \n \n {props.rating}\n {props.name}\n \n \n \n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n \n \n {props.responseName}\n {props.responseDate}\n {props.responseText}\n \n \n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n \n \n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n \n \n {state.reported ? props.headerSubmitted : props.header}\n \n \n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n \n \n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n \n \n );\n};\n\nexport default ReviewsListview;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return (

\n {props.text}\n

);\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: { text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n {text}\n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n {text}\n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent>}\n */\nclass WriteReview extends React.PureComponent, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n\n public constructor(props: IWriteReviewProps) {\n super(props);\n const { userReview: { result: userReview } } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const { product: { result: product }, userReview: { result: userReview } } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: ,\n signInButton: ,\n modalToggle: product && (\n \n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n \n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n}\n\nexport default WriteReview;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n \n {heading}\n {!isAuthenticated ? <>\n {signInMessage}\n {signInButton}\n : <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n }\n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nexport default WriteReviewView;\n"],"names":["createInputForProductReviews","input","productId","getSelectedProductIdFromActionInput","requestContext","locale","Error","async","getReviewsForGivenProduct","ctx","length","tenantId","localeListFilter","pageSize","inputIsValid","requestUrl","serviceEndpoint","orderBy","skipItems","undefined","starFilters","pageToken","then","response","data","items","filter","i","isTakenDown","pagingInfo","trace","catch","error","telemetry","exception","debug","getReviewsForGivenProductDataAction","id","action","getUserReviewDataAction","authorization","errorMessage","headers","Authorization","userInfo","user","isAuthenticated","token","GetProductReviewsInput","dataSources","getCacheKey","this","getCacheObjectType","dataCacheType","GetUserReviewInput","createRatingsReviewsStateInput","result","getGenericActionDataAction","filterKey","channelId","userReviewData","status","SubmitUserReviewInput","onClickSubmit","props","onSubmit","ReviewModal","payLoad","telemetryContent","submitButtonAttribute","contentAction","etext","cancelButtonAttribute","modal","tag","className","toggle","onModalToggle","applicationNode","isOpen","returnFocusRef","returnRef","modalHeader","modalHeaderNode","modalFooter","modalBody","cancelButton","onClick","resources","discardReviewButtonText","submitButton","disabled","submitDisabled","submitReviewButtonText","rating","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","form","autoComplete","inputRow","hasError","color","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","readOnly","avgRating","ariaLabel","selectRatingAriaLabel","initialRating","context","parentId","typeName","parentType","key","onChange","onRatingChange","selectRatingLabel","maxLength","app","config","reviewTitleMaxLength","renderContextId","onTitleChange","value","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","onTextChange","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","split","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","actionContext","privacyPolicyAttribute","href","target","privacyPolicyTitle","product","submitReview","onReviewComplete","text","replace","RegExp","trim","title","onReviewSubmission","request","RecordId","toString","apiSettings","productName","Name","userEmail","emailAddress","userName","name","review","submittedDateTime","Date","helpfulPositive","helpfulNegative","firstName","getReviewInput","update","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","count","totalCount","percentage","formattedPercent","Intl","NumberFormat","style","format","barItemAriaLabel","starLabel","bar","max","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","super","handleHeadingChange","event","heading","selectFilterBy","bind","ratingCount","completeClass","viewProps","callbacks","moduleProps","histogramItems","averageRatingAriaLabel","hideCount","averageNumber","totalReviews","ratingsSummaryProps","editProps","onEdit","histogramProps","renderView","histogramItem","Node","Module","map","item","authToken","requestBody","concernCategory","requestHeader","isHelpful","ReviewConcernCategory","ReportReviewConcernInput","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","nextAttribute","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","Math","min","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","option","inputId","checked","reportedKey","push","type","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","votedReviews","approved","isVotedFor","isDisabled","isUserReview","label","yesButtonText","noButtonText","voteCount","updateReviewHelpfulness","signInUrl","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","DateTimeFormat","month","day","year","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","includes","reportedText","ref","reportedReviewId","innerRef","SubmitHelpfulnessVoteInput","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","componentDidMount","reviewsList","totalItems","setState","listOfReviews","state","isFilterApplied","ratingsReviewsState","filterKeyValue","Number","dropdownItemsCount","isNaN","filterByOption","find","selectedIndex","warning","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isPublished","cardProps","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_toggleReviewModal","_onReportModalOpen","updateReviewHelpfulnessVote","_userReviewModal","R","isReviewModalOpen","userReviewRating","userReviewTitle","userReviewText","_onTitleChange","_onTextChange","_onRatingChange","_onReviewComplete","_userReviewModalToggle","hasReviewError","reviewsListCallbacks","updateReviewTitle","updateReviewText","updateRating","isSuccess","_reportReviewModal","submitReviewAttribute","successAttribute","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","header","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReview","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","isReportModalOpen","_onReportModalClose","_onRadioChange","_reportReview","hasReportError","reported","currentTarget","getAttribute","_reportReviewCallback","getUserToken","_value","reportedReview","updateSortByDropdown","notification","selectedOption","updateFilterByDropdown","_updateVoteUi","alreadyExists","list","concat","onReviewSubmitted","isSuccessful","toggleModal","toggleReportModal","showSpinner","telemetryPageName","friendlyName","nextProps","nextState","reviewModal","reportReviewModal","filterByDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","attributes","ModalToggle","WriteReview","writeReviewCallbacks","_modalToggleRef","signInMessage","signInButton","signInLabel","signInAriaLabel","modalToggle","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal"],"sourceRoot":""}