chore(dashboard): text changes and fixes (#7925)

- Improvements to existing texts
- Add subtitles to sections where useful.
- Added the ability to edit the message shown in a list when no records are found + change the message where necessary
- Change documentation link to `https://docs.medusajs.com/v2`.
This commit is contained in:
Shahed Nasser
2024-07-05 15:14:10 +03:00
committed by GitHub
parent f4dd390ab1
commit eafa3560ae
41 changed files with 377 additions and 149 deletions

View File

@@ -3,7 +3,7 @@ import { Button, Text, clx } from "@medusajs/ui"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
type NoResultsProps = {
export type NoResultsProps = {
title?: string
message?: string
className?: string

View File

@@ -319,11 +319,7 @@ const LoggedInUser = () => {
<Profile />
<DropdownMenu.Separator />
<DropdownMenu.Item asChild>
<Link
// TODO change link once docs are public
to="https://medusa-docs-v2-git-docs-v2-medusajs.vercel.app/"
target="_blank"
>
<Link to="https://docs.medusajs.com/v2" target="_blank">
<BookOpen className="text-ui-fg-subtle mr-2" />
Documentation
</Link>

View File

@@ -1,6 +1,6 @@
import { clx } from "@medusajs/ui"
import { memo } from "react"
import { NoRecords } from "../../common/empty-table-content"
import { NoRecords, NoResultsProps } from "../../common/empty-table-content"
import { TableSkeleton } from "../../common/skeleton"
import { DataTableQuery, DataTableQueryProps } from "./data-table-query"
import { DataTableRoot, DataTableRootProps } from "./data-table-root"
@@ -11,6 +11,7 @@ interface DataTableProps<TData>
isLoading?: boolean
pageSize: number
queryObject?: Record<string, any>
noRecords?: Pick<NoResultsProps, "title" | "message">
}
// Maybe we should use the memoized version of DataTableRoot
@@ -32,6 +33,7 @@ export const DataTable = <TData,>({
pageSize,
isLoading = false,
layout = "fit",
noRecords: noRecordsProps = {},
}: DataTableProps<TData>) => {
if (isLoading) {
return (
@@ -57,6 +59,7 @@ export const DataTable = <TData,>({
className={clx({
"flex h-full flex-col overflow-hidden": layout === "fill",
})}
{...noRecordsProps}
/>
)
}

View File

@@ -28,7 +28,7 @@ export const usePromotionTableColumns = () => {
columnHelper.display({
id: "method",
header: () => <TextHeader text={t("promotions.fields.method")} />,
header: () => <TextHeader text={t("promotions.fields.campaign")} />,
cell: ({ row }) => {
const text = row.original.is_automatic
? "Automatic"

View File

@@ -47,8 +47,8 @@
"noSearchResultsFor": "No search results for <0>'{{query}}'</0>",
"noRecordsTitle": "No records",
"noRecordsMessage": "There are no records to show",
"unsavedChangesTitle": "Are you sure you want to leave this page?",
"unsavedChangesDescription": "You have unsaved changes that will be lost if you leave this page.",
"unsavedChangesTitle": "Are you sure you want to leave this form?",
"unsavedChangesDescription": "You have unsaved changes that will be lost if you exit this form.",
"includesTaxTooltip": "Enter the total amount including tax. The net amount excluding tax will be automatically calculated and saved."
},
"validation": {
@@ -205,6 +205,9 @@
},
"products": {
"domain": "Products",
"list": {
"noRecordsMessage": "Create your first product to start selling."
},
"create": {
"header": "General",
"tabs": {
@@ -219,14 +222,14 @@
},
"inventory": {
"heading": "Inventory kits",
"label": "Inventory kit",
"label": "Add inventory items to the variant's inventory kit.",
"itemPlaceholder": "Select inventory item",
"quantityPlaceholder": "How many of these are needed for the kit?"
},
"variants": {
"header": "Variants",
"subHeadingTitle": "Yes, this is a product with variants",
"subHeadingDescription": "When unchecked we will create a default variant for you",
"subHeadingDescription": "When unchecked, we will create a default variant for you",
"optionTitle": {
"placeholder": "Size"
},
@@ -235,7 +238,7 @@
},
"productVariants": {
"label": "Product variants",
"hint": "This ranking will affect how the variants are ranked in your frontend.",
"hint": "This ranking will affect the variants' order in your storefront.",
"alert": "Add options to create variants."
},
"productOptions": {
@@ -273,7 +276,7 @@
"action": "Add media"
}
},
"discountableHint": "When unchecked discounts will not be applied to this product.",
"discountableHint": "When unchecked, discounts will not be applied to this product.",
"noSalesChannels": "Not available in any sales channels",
"variantCount_one": "{{count}} variant",
"variantCount_other": "{{count}} variants",
@@ -302,7 +305,7 @@
},
"discountable": {
"label": "Discountable",
"hint": "When unchecked discounts will not be applied to this product"
"hint": "When unchecked, discounts will not be applied to this product"
},
"type": {
"label": "Type"
@@ -318,7 +321,7 @@
},
"sales_channels": {
"label": "Sales channels",
"hint": "This product will only be available in the default sales channel if left untouched"
"hint": "This product will only be available in the default sales channel if left untouched."
},
"countryOrigin": {
"label": "Country of origin"
@@ -385,9 +388,9 @@
"header": "Stock & Inventory",
"editItemDetails": "Edit item details",
"manageInventoryLabel": "Manage inventory",
"manageInventoryHint": "When enabled the inventory level will be regulated when orders and returns are created.",
"manageInventoryHint": "When enabled, we'll change the inventory quantity for you when orders and returns are created.",
"allowBackordersLabel": "Allow backorders",
"allowBackordersHint": "When enabled the variant can be sold even if the inventory level is below zero.",
"allowBackordersHint": "When enabled, customers can purchase the variant even if there's no available quantity.",
"toast": {
"levelsBatch": "Inventory levels updated.",
"update": "Inventory item updated successfully.",
@@ -430,6 +433,7 @@
},
"collections": {
"domain": "Collections",
"subtitle": "Organize products into collections.",
"createCollection": "Create Collection",
"createCollectionHint": "Create a new collection to organize your products.",
"editCollection": "Edit Collection",
@@ -437,16 +441,22 @@
"deleteWarning": "You are about to delete the collection {{title}}. This action cannot be undone.",
"removeSingleProductWarning": "You are about to remove the product {{title}} from the collection. This action cannot be undone.",
"removeProductsWarning_one": "You are about to remove {{count}} product from the collection. This action cannot be undone.",
"removeProductsWarning_other": "You are about to remove {{count}} products from the collection. This action cannot be undone."
"removeProductsWarning_other": "You are about to remove {{count}} products from the collection. This action cannot be undone.",
"products": {
"list": {
"noRecordsMessage": "There are no products in the collection."
}
}
},
"categories": {
"domain": "Categories",
"subtitle": "Organize products into categories, and manage those categories' ranking and hierarchy.",
"create": {
"header": "Create Category",
"hint": "Create a new category to organize your products.",
"tabs": {
"details": "Details",
"organize": "Organize"
"organize": "Organize Ranking"
},
"successToast": "Category {{name}} was successfully created."
},
@@ -465,6 +475,9 @@
"confirmation_other": "You are about to remove {{count}} products from the category. This action cannot be undone.",
"successToast_one": "Removed {{count}} product from the category.",
"successToast_other": "Removed {{count}} products from the category."
},
"list": {
"noRecordsMessage": "There are no products in the category."
}
},
"organize": {
@@ -496,15 +509,16 @@
},
"inventory": {
"domain": "Inventory",
"subtitle": "Manage your inventory items",
"reserved": "Reserved",
"available": "Available",
"locationLevels": "Location levels",
"locationLevels": "Locations",
"associatedVariants": "Associated variants",
"manageLocations": "Manage locations",
"deleteWarning": "You are about to delete an inventory item. This action cannot be undone.",
"editItemDetails": "Edit item details",
"create": {
"title": "Add item",
"title": "Add inventory item",
"details": "Details",
"availability": "Availability",
"locations": "Locations",
@@ -514,7 +528,7 @@
},
"reservation": {
"header": "Reservation of {{itemName}}",
"editItemDetails": "Edit item details",
"editItemDetails": "Edit reservation",
"orderID": "Order ID",
"description": "Description",
"location": "Location",
@@ -524,7 +538,7 @@
"reservedAmount": "Reserve amount",
"create": "Create reservation",
"itemToReserve": "Item to reserve",
"quantityPlaceholder": "How many do you want to reserve?",
"quantityPlaceholder": "How much do you want to reserve?",
"descriptionPlaceholder": "What type of reservation is this?",
"successToast": "Reservation was successfully created.",
"updateSuccessToast": "Reservation was successfully updated.",
@@ -554,16 +568,27 @@
},
"customers": {
"domain": "Customers",
"list": {
"noRecordsMessage": "Your customers will show up here."
},
"create": {
"header": "Create Customer",
"hint": "Create a new customer to manage their details.",
"hint": "Create a new customer and manage their details.",
"successToast": "Customer {{email}} was successfully created."
},
"groups": {
"label": "Customer groups",
"remove": "Are you sure you want to remove the customer from \"{{name}}\" customer group?",
"removeMany": "Are you sure you want to customer from following customer groups: {{groups}}?",
"alreadyAddedTooltip": "The customer is already in this customer group."
"alreadyAddedTooltip": "The customer is already in this customer group.",
"list": {
"noRecordsMessage": "This customer doesn't belong to any group."
},
"add": {
"list": {
"noRecordsMessage": "Please create a customer group first."
}
}
},
"edit": {
"header": "Edit Customer",
@@ -585,6 +610,7 @@
},
"customerGroups": {
"domain": "Customer Groups",
"subtitle": "Organize customers into groups. Groups can have different promotions and prices.",
"create": {
"header": "Create Customer Group",
"hint": "Create a new customer group to segment your customers.",
@@ -603,13 +629,19 @@
"alreadyAddedTooltip": "The customer has already been added to the group.",
"add": {
"successToast_one": "Customer was successfully added to the group.",
"successToast_other": "Customers were successfully added to the group."
"successToast_other": "Customers were successfully added to the group.",
"list": {
"noRecordsMessage": "Create a customer first."
}
},
"remove": {
"title_one": "Remove customer",
"title_other": "Remove customers",
"description_one": "You are about to remove {{count}} customer from the customer group. This action cannot be undone.",
"description_other": "You are about to remove {{count}} customers from the customer group. This action cannot be undone."
},
"list": {
"noRecordsMessage": "This group doesn't have customers."
}
}
},
@@ -617,6 +649,9 @@
"domain": "Orders",
"cancelWarning": "You are about to cancel the order {{id}}. This action cannot be undone.",
"onDateFromSalesChannel": "{{date}} from {{salesChannel}}",
"list": {
"noRecordsMessage": "Your orders will show up here."
},
"summary": {
"requestReturn": "Request return",
"allocateItems": "Allocate items",
@@ -927,13 +962,13 @@
},
"calculated": {
"label": "Calculated",
"hint": "The shipping option's price is calculated by the fulfillment provider."
"hint": "The shipping option's price is calculated by the fulfillment provider during checkout."
}
}
},
"enableInStore": {
"label": "Enable in store",
"hint": "Control the visibility of this option to customers in your store."
"hint": "Whether customers can use this option during checkout."
},
"provider": "Fulfillment provider",
"profile": "Shipping profile"
@@ -962,13 +997,14 @@
"successToast": "Areas for {{name}} were successfully updated."
},
"fields": {
"noRecords": "Currently not covered by any service zones.",
"noRecords": "There are no service zones to add shipping options to.",
"tip": "A service zone is a collection of geographical zones or areas. It's used to restrict available shipping options to a defined set of locations."
}
}
},
"shippingProfile": {
"domain": "Shipping Profiles",
"subtitle": "Group products with similar shipping requirements into profiles.",
"create": {
"header": "Create Shipping Profile",
"hint": "Create a new shipping profile to group products with similar shipping requirements.",
@@ -1076,19 +1112,20 @@
},
"edit": {
"title": "Edit Tax Rate",
"description": "Edits tax rate for a tax region"
"description": "Edits the tax rate of a tax region"
},
"create": {
"title": "Create Tax Rate Override",
"description": "Creates tax rate overrides for a tax region"
"description": "Create a tax rate that overrides the default tax rates for selected conditions."
}
},
"taxRegions": {
"domain": "Tax Regions",
"subtitle": "Manage tax rates and settings for each region.",
"description": "Manage your region's tax structure",
"create": {
"title": "Create Tax Region",
"description": "Creates a tax region with default tax rate"
"description": "Creates a tax region with a default tax rate."
},
"create-child": {
"title": "Create Default Rate for Province",
@@ -1102,7 +1139,7 @@
},
"is_combinable": {
"name": "Is combinable",
"hint": "If this tax rate can be combined with the default rate from province or parent"
"hint": "Whether this tax rate can be combined with the default rate from province or parent tax region."
}
}
},
@@ -1112,12 +1149,11 @@
"details": "Promotion Details"
},
"tabs": {
"template": "Template",
"promotion": "Promotion",
"template": "Type",
"details": "Details",
"campaign": "Campaign"
},
"fields": {
"method": "Method",
"type": "Type",
"value_type": "Value Type",
"value": "Value",
@@ -1131,11 +1167,11 @@
"conditions": {
"rules": {
"title": "Who can use this code?",
"description": "Is the customer allowed to add the promotion code? Discount code can be used by all customers if left untouched."
"description": "Which customer is allowed to use the promotion code? Promotion code can be used by all customers if left untouched."
},
"target-rules": {
"title": "What will the promotion be applied to?",
"description": "The promotion will be applied to items that match the following conditions"
"title": "What items will the promotion be applied to?",
"description": "The promotion will be applied to items that match the following conditions."
},
"buy-rules": {
"title": "What needs to be in the cart to unlock the promotion?",
@@ -1144,7 +1180,7 @@
}
},
"tooltips": {
"campaignType": "Select the currency code in the promotion tab to enable it."
"campaignType": "The currency code must be selected in the promotion to set a spend budget."
},
"errors": {
"requiredField": "Required field",
@@ -1157,20 +1193,20 @@
"edit": {
"title": "Edit Promotion Details",
"rules": {
"title": "Edit rules"
"title": "Edit usage conditions"
},
"target-rules": {
"title": "Edit target rules"
"title": "Edit item conditions"
},
"buy-rules": {
"title": "Edit buy rules"
}
},
"addToCampaign": {
"title": "Add Promotion To Campaign"
"title": "Promotion's Campaign"
},
"campaign_currency": {
"tooltip": "Currency is carried over from the promotion. Change it on the promotions tab."
"tooltip": "This is the promotion's currency. Change it from the Details tab."
},
"form": {
"required": "Required",
@@ -1179,11 +1215,11 @@
"campaign": {
"existing": {
"title": "Existing Campaign",
"description": "Would you like to add promotion to an existing campaign?"
"description": "Add promotion to an existing campaign."
},
"new": {
"title": "New Campaign",
"description": "Would you like to create a new campaign with this promotion?"
"description": "Create a new campaign for this promotion."
},
"none": {
"title": "Without Campaign",
@@ -1196,16 +1232,16 @@
"method": {
"code": {
"title": "Promotion code",
"description": "Customers must enter this at checkout"
"description": "Customers must enter this code at checkout"
},
"automatic": {
"title": "Automatic",
"description": "Customers will see this at checkout"
"description": "Customers will see this promotion at checkout"
}
},
"max_quantity": {
"title": "Maximum Quantity",
"description": "Maximum quantity of items this promotion applies to"
"description": "Maximum quantity of items this promotion applies to."
},
"type": {
"standard": {
@@ -1237,25 +1273,31 @@
"value_type": {
"fixed": {
"title": "Promotion Value",
"description": "eg. 100"
"description": "The amount to be discounted. eg. 100"
},
"percentage": {
"title": "Promotion Value",
"description": "eg. 8%"
"description": "The percentage to discount off the amount. eg. 8%"
}
}
},
"deleteWarning": "You are about to delete the promotion {{code}}. This action cannot be undone.",
"createPromotionTitle": "Create Promotion",
"type": "Promotion type"
"type": "Promotion type",
"conditions": {
"add": "Add condition",
"list": {
"noRecordsMessage": "Add a condition to restrict what items the promotion applies to."
}
}
},
"campaigns": {
"domain": "Campaigns",
"details": "Campaign details",
"status": {
"active": "active",
"expired": "expired",
"scheduled": "scheduled"
"active": "Active",
"expired": "Expired",
"scheduled": "Scheduled"
},
"delete": {
"title": "Are you sure?",
@@ -1267,7 +1309,7 @@
"successToast": "Campaign '{{name}}' was successfully updated."
},
"create": {
"hint": "Create a promotional campaign",
"hint": "Create a promotional campaign.",
"header": "Create Campaign",
"successToast": "Campaign '{{name}}' was successfully created."
},
@@ -1280,12 +1322,12 @@
"total_used": "Budget used",
"budget_limit": "Budget limit",
"campaign_id": {
"hint": "A list of campaigns with the same currency code as the promotion"
"hint": "Only campaigns with the same currency code as the promotion are shown in this list."
}
},
"budget": {
"create": {
"hint": "Create a budget for the campaign",
"hint": "Create a budget for the campaign.",
"header": "Campaign Budget"
},
"details": "Campaign budget",
@@ -1298,12 +1340,15 @@
"type": {
"spend": {
"title": "Spend",
"description": "Limit usage based on a currency value"
"description": "Set a limit on the total discounted amount of all promotion usages."
},
"usage": {
"title": "Usage",
"description": "Limit usage based on how many times its used"
"description": "Set a limit on how many times the promotion can be used."
}
},
"edit": {
"header": "Edit Campaign Budget"
}
},
"promotions": {
@@ -1316,6 +1361,14 @@
"currencyMismatch": "Currency of the promotion and campaign doesn't match",
"toast": {
"success": "Successfully added {{count}} promotion(s) to campaign"
},
"add": {
"list": {
"noRecordsMessage": "Create a promotion first."
}
},
"list": {
"noRecordsMessage": "There are no promotions in the campaign."
}
},
"deleteCampaignWarning": "You are about to delete the campaign {{name}}. This action cannot be undone.",
@@ -1323,6 +1376,7 @@
},
"priceLists": {
"domain": "Price Lists",
"subtitle": "Create sales or override prices for specific conditions.",
"delete": {
"confirmation": "You are about to delete the price list {{title}}. This action cannot be undone.",
"successToast": "Price list {{title}} was successfully deleted."
@@ -1335,7 +1389,12 @@
"products": "Products",
"prices": "Prices"
},
"successToast": "Price list {{title}} was successfully created."
"successToast": "Price list {{title}} was successfully created.",
"products": {
"list": {
"noRecordsMessage": "Create a product first."
}
}
},
"edit": {
"header": "Edit Price List",
@@ -1415,14 +1474,14 @@
},
"profile": {
"domain": "Profile",
"manageYourProfileDetails": "Manage your profile details",
"manageYourProfileDetails": "Manage your profile details.",
"fields": {
"languageLabel": "Language",
"usageInsightsLabel": "Usage insights"
},
"edit": {
"header": "Edit Profile",
"languageHint": "The language you want to use in the admin dashboard. This will not change the language of your store.",
"languageHint": "The language you want to use in the admin dashboard. This doesn't change the language of your store.",
"languagePlaceholder": "Select language",
"usageInsightsHint": "Share usage insights and help us improve Medusa. You can read more about what we collect and how we use it in our <0>documentation</0>."
},
@@ -1481,18 +1540,19 @@
},
"regions": {
"domain": "Regions",
"subtitle": "A region is an area that you sell products in. It can cover multipe countries, and has different tax rates, providers, and currency.",
"createRegion": "Create Region",
"createRegionHint": "Manage tax rates and providers for a set of countries.",
"addCountries": "Add countries",
"editRegion": "Edit Region",
"countriesHint": "Add the countries that should be included in this region.",
"countriesHint": "Add the countries included in this region.",
"deleteRegionWarning": "You are about to delete the region {{name}}. This action cannot be undone.",
"removeCountriesWarning_one": "You are about to remove {{count}} country from the region. This action cannot be undone.",
"removeCountriesWarning_other": "You are about to remove {{count}} countries from the region. This action cannot be undone.",
"removeCountryWarning": "You are about to remove the country {{name}} from the region. This action cannot be undone.",
"automaticTaxesHint": "When enabled taxes will only be calculated at checkout based on the shipping address.",
"taxInclusiveHint": "When enabled prices in the region will be tax inclusive.",
"providersHint": " Add which payment providers should be available in this region.",
"automaticTaxesHint": "When enabled, taxes will only be calculated at checkout based on the shipping address.",
"taxInclusiveHint": "When enabled, prices in the region will be tax inclusive.",
"providersHint": " Add which payment providers are available in this region.",
"shippingOptions": "Shipping Options",
"deleteShippingOptionWarning": "You are about to delete the shipping option {{name}}. This action cannot be undone.",
"return": "Return",
@@ -1500,6 +1560,9 @@
"priceType": "Price Type",
"flatRate": "Flat Rate",
"calculated": "Calculated",
"list": {
"noRecordsMessage": "Create a region for the areas that you sell in."
},
"toast": {
"delete": "Region deleted successfully",
"edit": "Region edit saved",
@@ -1524,7 +1587,7 @@
},
"availability": {
"adminOnly": "Admin only",
"adminOnlyHint": "When enabled the shipping option will only be available in the admin dashboard, and not in the storefront."
"adminOnlyHint": "When enabled, the shipping option will only be available in the admin dashboard, and not in the storefront."
},
"taxInclusiveHint": "When enabled, the shipping option's price will be tax inclusive.",
"requirements": {
@@ -1595,13 +1658,15 @@
},
"reservations": {
"domain": "Reservations",
"subtitle": "Manage the reserved quantity of inventory items.",
"deleteWarning": "You are about to delete a reservation. This action cannot be undone."
},
"salesChannels": {
"domain": "Sales Channels",
"subtitle": "Manage the online and offline channels you sell products on.",
"createSalesChannel": "Create Sales Channel",
"createSalesChannelHint": "Create a new sales channel to sell your products on.",
"enabledHint": "Specify if the sales channel is enabled or disabled.",
"enabledHint": "Specify whether the sales channel is enabled.",
"removeProductsWarning_one": "You are about to remove {{count}} product from {{sales_channel}}.",
"removeProductsWarning_other": "You are about to remove {{count}} products from {{sales_channel}}.",
"addProducts": "Add Products",
@@ -1612,6 +1677,16 @@
"create": "Sales channel created successfully",
"update": "Sales channel updated successfully",
"delete": "Sales channel deleted successfully"
},
"products": {
"list": {
"noRecordsMessage": "There are no products in the sales channel."
},
"add": {
"list": {
"noRecordsMessage": "Create a product first."
}
}
}
},
"apiKeyManagement": {
@@ -1619,6 +1694,10 @@
"publishable": "Publishable API Keys",
"secret": "Secret API Keys"
},
"subtitle": {
"publishable": "Manage API keys used in the storefront to limit the scope of requests to specific sales channels.",
"secret": "Manage API keys used to authenticate admin users in admin applications."
},
"status": {
"active": "Active",
"revoked": "Revoked"
@@ -1631,7 +1710,7 @@
"createPublishableHeader": "Create Publishable API Key",
"createPublishableHint": "Create a new publishable API key to limit the scope of requests to specific sales channels.",
"createSecretHeader": "Create Secret API Key",
"createSecretHint": "Create a new secret API key to access the Medusa API.",
"createSecretHint": "Create a new secret API key to access the Medusa API as an authenticated admin user.",
"secretKeyCreatedHeader": "Secret Key Created",
"secretKeyCreatedHint": "Your new secret key has been generated. Copy and securely store it now. This is the only time it will be displayed.",
"copySecretTokenSuccess": "Secret key was copied to clipboard.",
@@ -1645,7 +1724,10 @@
"salesChannels": {
"successToast_one": "{{count}} sales channel was successfully added to the API key.",
"successToast_other": "{{count}} sales channels were successfully added to the API key.",
"alreadyAddedTooltip": "The sales channel has already been added to the API key."
"alreadyAddedTooltip": "The sales channel has already been added to the API key.",
"list": {
"noRecordsMessage": "There are no sales channels in the publishable API key's scope."
}
},
"delete": {
"warning": "You are about to delete the API key {{title}}. This action cannot be undone.",
@@ -1655,6 +1737,11 @@
"warning": "You are about to revoke the API key {{title}}. This action cannot be undone.",
"successToast": "API key {{title}} was successfully revoked."
},
"addSalesChannels": {
"list": {
"noRecordsMessage": "Create a sales channel first."
}
},
"removeSalesChannel": {
"warning": "You are about to remove the sales channel {{name}} from the API key. This action cannot be undone.",
"warningBatch_one": "You are about to remove {{count}} sales channel from the API key. This action cannot be undone.",
@@ -1727,11 +1814,15 @@
},
"workflowExecutions": {
"domain": "Workflows",
"subtitle": "View and keep track of workflow executions in your Medusa application.",
"transactionIdLabel": "Transaction ID",
"workflowIdLabel": "Workflow ID",
"progressLabel": "Progress",
"stepsCompletedLabel_one": "{{completed}} of {{count}} step",
"stepsCompletedLabel_other": "{{completed}} of {{count}} steps",
"list": {
"noRecordsMessage": "No workflows have been executed, yet."
},
"history": {
"sectionTitle": "History",
"runningState": "Running...",
@@ -1766,6 +1857,7 @@
},
"productTypes": {
"domain": "Product Types",
"subtitle": "Organize your products into types.",
"create": {
"header": "Create Product Type",
"hint": "Create a new product type to categorize your products.",
@@ -1808,7 +1900,7 @@
"title": "Title",
"customTitle": "Custom title",
"manageInventory": "Manage inventory",
"inventoryKit": "Inventory kit",
"inventoryKit": "Has inventory kit",
"inventoryItems": "Inventory items",
"inventoryItem": "Inventory item",
"requiredQuantity": "Required quantity",

View File

@@ -140,6 +140,9 @@ export const ApiKeySalesChannelSection = ({
pageSize={PAGE_SIZE}
pagination
search
noRecords={{
message: t("apiKeyManagement.salesChannels.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
@@ -52,11 +52,18 @@ export const ApiKeyManagementListTable = ({
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading level="h2">
{keyType === "publishable"
? t(`apiKeyManagement.domain.publishable`)
: t("apiKeyManagement.domain.secret")}
</Heading>
<div>
<Heading level="h2">
{keyType === "publishable"
? t(`apiKeyManagement.domain.publishable`)
: t("apiKeyManagement.domain.secret")}
</Heading>
<Text className="text-ui-fg-subtle" size="small">
{keyType === "publishable"
? t(`apiKeyManagement.subtitle.publishable`)
: t("apiKeyManagement.subtitle.secret")}
</Text>
</div>
<Link to="create">
<Button variant="secondary" size="small">
{t("actions.create")}

View File

@@ -156,6 +156,11 @@ export const ApiKeySalesChannelsForm = ({
queryObject={raw}
orderBy={["name", "created_at", "updated_at"]}
layout="fill"
noRecords={{
message: t(
"apiKeyManagement.addSalesChannels.list.noRecordsMessage"
),
}}
/>
</RouteFocusModal.Body>
</form>

View File

@@ -11,10 +11,7 @@ import { useMemo, useState } from "react"
import { useForm } from "react-hook-form"
import { useTranslation } from "react-i18next"
import * as zod from "zod"
import {
RouteFocusModal,
useRouteModal,
} from "../../../../components/modals"
import { RouteFocusModal, useRouteModal } from "../../../../components/modals"
import { DataTable } from "../../../../components/table/data-table"
import { useAddOrRemoveCampaignPromotions } from "../../../../hooks/api/campaigns"
import { usePromotions } from "../../../../hooks/api/promotions"
@@ -151,6 +148,9 @@ export const AddCampaignPromotionsForm = ({
layout="fill"
pagination
search
noRecords={{
message: t("campaigns.promotions.add.list.noRecordsMessage"),
}}
/>
</RouteFocusModal.Body>
</form>

View File

@@ -18,7 +18,7 @@ export const CampaignBudgetEdit = () => {
return (
<RouteDrawer>
<RouteDrawer.Header>
<Heading>{t("campaigns.edit.header")}</Heading>
<Heading>{t("campaigns.budget.edit.header")}</Heading>
</RouteDrawer.Header>
{!isLoading && campaign && <EditCampaignBudgetForm campaign={campaign} />}

View File

@@ -115,6 +115,9 @@ export const CampaignPromotionSection = ({
shortcut: "r",
},
]}
noRecords={{
message: t("campaigns.promotions.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -141,6 +141,9 @@ export const CategoryProductSection = ({
navigateTo={(row) => `/products/${row.id}`}
isLoading={isLoading}
queryObject={raw}
noRecords={{
message: t("categories.products.list.noRecordsMessage"),
}}
/>
<CommandBar open={!!Object.keys(selection).length}>
<CommandBar.Bar>

View File

@@ -1,6 +1,6 @@
import { PencilSquare, Trash } from "@medusajs/icons"
import { AdminProductCategoryResponse } from "@medusajs/types"
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { createColumnHelper } from "@tanstack/react-table"
import { useMemo } from "react"
@@ -64,7 +64,12 @@ export const CategoryListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("categories.domain")}</Heading>
<div>
<Heading>{t("categories.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("categories.subtitle")}
</Text>
</div>
<div className="flex items-center gap-x-2">
<Button size="small" variant="secondary" asChild>
<Link to="organize">{t("categories.organize.action")}</Link>

View File

@@ -129,6 +129,9 @@ export const CollectionProductSection = ({
shortcut: "r",
},
]}
noRecords={{
message: t("collections.products.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
@@ -44,7 +44,12 @@ export const CollectionListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("collections.domain")}</Heading>
<div>
<Heading>{t("collections.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("collections.subtitle")}
</Text>
</div>
<Link to="/collections/create">
<Button size="small" variant="secondary">
{t("actions.create")}

View File

@@ -173,6 +173,9 @@ export const AddCustomersForm = ({
layout="fill"
search
queryObject={raw}
noRecords={{
message: t("customerGroups.customers.add.list.noRecordsMessage"),
}}
/>
</RouteFocusModal.Body>
</form>

View File

@@ -126,6 +126,9 @@ export const CustomerGroupCustomerSection = ({
shortcut: "r",
},
]}
noRecords={{
message: t("customerGroups.customers.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -1,5 +1,12 @@
import { PencilSquare, Trash } from "@medusajs/icons"
import { Button, Container, Heading, toast, usePrompt } from "@medusajs/ui"
import {
Button,
Container,
Heading,
toast,
usePrompt,
Text,
} from "@medusajs/ui"
import { createColumnHelper } from "@tanstack/react-table"
import { useMemo } from "react"
import { useTranslation } from "react-i18next"
@@ -50,7 +57,12 @@ export const CustomerGroupListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading level="h2">{t("customerGroups.domain")}</Heading>
<div>
<Heading level="h2">{t("customerGroups.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("customerGroups.subtitle")}
</Text>
</div>
<Link to="/customer-groups/create">
<Button size="small" variant="secondary">
{t("actions.create")}

View File

@@ -149,6 +149,9 @@ export const CustomerGroupSection = ({
},
]}
queryObject={raw}
noRecords={{
message: t("customers.groups.list.noRecordsMessage")
}}
/>
</Container>
)

View File

@@ -74,6 +74,9 @@ export const CustomerListTable = () => {
navigateTo={(row) => row.original.id}
search
queryObject={raw}
noRecords={{
message: t("customers.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -183,6 +183,9 @@ export const AddCustomerGroupsForm = ({
layout="fill"
search
queryObject={raw}
noRecords={{
message: t("customers.groups.add.list.noRecordsMessage"),
}}
/>
</RouteFocusModal.Body>
</form>

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { InventoryTypes } from "@medusajs/types"
import { DataTable } from "../../../../components/table/data-table"
@@ -48,7 +48,12 @@ export const InventoryListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("inventory.domain")}</Heading>
<div>
<Heading>{t("inventory.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("inventory.subtitle")}
</Text>
</div>
<Button size="small" variant="secondary" asChild>
<Link to="create">{t("actions.create")}</Link>
</Button>

View File

@@ -61,6 +61,9 @@ export const OrderListTable = () => {
pageSize={PAGE_SIZE}
orderBy={["display_id", "created_at", "updated_at"]}
queryObject={raw}
noRecords={{
message: t("orders.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -17,6 +17,7 @@ import { useProductTableQuery } from "../../../../../hooks/table/query/use-produ
import { useDataTable } from "../../../../../hooks/use-data-table"
import { PriceListCreateProductsSchema } from "../../../common/schemas"
import { PricingCreateSchemaType } from "./schema"
import { useTranslation } from "react-i18next"
type PriceListProductsFormProps = {
form: UseFormReturn<PricingCreateSchemaType>
@@ -33,6 +34,7 @@ function getInitialSelection(products: { id: string }[]) {
}
export const PriceListProductsForm = ({ form }: PriceListProductsFormProps) => {
const { t } = useTranslation()
const { control, setValue } = form
const selectedIds = useWatch({
@@ -128,6 +130,9 @@ export const PriceListProductsForm = ({ form }: PriceListProductsFormProps) => {
pagination
search
queryObject={raw}
noRecords={{
message: t("priceLists.create.products.list.noRecordsMessage"),
}}
/>
</div>
)

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
@@ -43,7 +43,12 @@ export const PriceListListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("priceLists.domain")}</Heading>
<div>
<Heading>{t("priceLists.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("priceLists.subtitle")}
</Text>
</div>
<Button size="small" variant="secondary" asChild>
<Link to="create">{t("actions.create")}</Link>
</Button>

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
@@ -42,7 +42,12 @@ export const ProductTypeListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("productTypes.domain")}</Heading>
<div>
<Heading>{t("productTypes.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("productTypes.subtitle")}
</Text>
</div>
<Button size="small" variant="secondary" asChild>
<Link to="create">{t("actions.create")}</Link>
</Button>

View File

@@ -319,7 +319,7 @@ export const CategoryCombobox = forwardRef<
{query ? (
<Trans
i18n={i18n}
i18nKey={"general.noSearchResultsFor"}
i18nKey={"general.noResultsTitle"}
tOptions={{
query: query,
}}
@@ -328,7 +328,7 @@ export const CategoryCombobox = forwardRef<
]}
/>
) : (
t("general.noRecordsFound")
t("general.noResultsTitle")
)}
</Text>
</div>

View File

@@ -10,10 +10,7 @@ import { Divider } from "../../../../../components/common/divider"
import { Form } from "../../../../../components/common/form"
import { Combobox } from "../../../../../components/inputs/combobox"
import { CountrySelect } from "../../../../../components/inputs/country-select"
import {
RouteDrawer,
useRouteModal,
} from "../../../../../components/modals"
import { RouteDrawer, useRouteModal } from "../../../../../components/modals"
import { useCreateProductVariant } from "../../../../../hooks/api/products"
import { castNumber } from "../../../../../lib/cast-number"
import { optionalInt } from "../../../../../lib/validation"
@@ -150,21 +147,6 @@ export const CreateProductVariantForm = ({
)
}}
/>
<Form.Field
control={form.control}
name="material"
render={({ field }) => {
return (
<Form.Item>
<Form.Label optional>{t("fields.material")}</Form.Label>
<Form.Control>
<Input {...field} />
</Form.Control>
<Form.ErrorMessage />
</Form.Item>
)
}}
/>
{product.options.map((option: any) => {
return (
<Form.Field
@@ -357,6 +339,21 @@ export const CreateProductVariantForm = ({
)}
<div className="flex flex-col gap-y-4">
<Heading level="h2">{t("products.attributes")}</Heading>
<Form.Field
control={form.control}
name="material"
render={({ field }) => {
return (
<Form.Item>
<Form.Label optional>{t("fields.material")}</Form.Label>
<Form.Control>
<Input {...field} />
</Form.Control>
<Form.ErrorMessage />
</Form.Item>
)
}}
/>
<Form.Field
control={form.control}
name="weight"

View File

@@ -75,6 +75,9 @@ export const ProductListTable = () => {
queryObject={raw}
navigateTo={(row) => `${row.original.id}`}
orderBy={["title", "created_at", "updated_at"]}
noRecords={{
message: t("products.list.noRecordsMessage"),
}}
/>
<Outlet />
</Container>

View File

@@ -6,10 +6,7 @@ import { useForm, useWatch } from "react-hook-form"
import { Trans, useTranslation } from "react-i18next"
import * as zod from "zod"
import { Form } from "../../../../../components/common/form"
import {
RouteDrawer,
useRouteModal,
} from "../../../../../components/modals"
import { RouteDrawer, useRouteModal } from "../../../../../components/modals"
import { useUpdatePromotion } from "../../../../../hooks/api/promotions"
import { CreateCampaignFormFields } from "../../../../campaigns/common/components/create-campaign-form-fields"
import { CampaignDetails } from "./campaign-details"
@@ -54,7 +51,7 @@ export const AddCampaignPromotionFields = ({
render={({ field }) => {
return (
<Form.Item>
<Form.Label>Method</Form.Label>
<Form.Label>{t("promotions.fields.campaign")}</Form.Label>
<Form.Control>
<RadioGroup

View File

@@ -357,7 +357,7 @@ export const CreatePromotionForm = () => {
className="w-full"
value={Tab.PROMOTION}
>
{t("promotions.tabs.promotion")}
{t("promotions.tabs.details")}
</ProgressTabs.Trigger>
<ProgressTabs.Trigger className="w-full" value={Tab.CAMPAIGN}>
@@ -627,7 +627,7 @@ export const CreatePromotionForm = () => {
/>
)}
<div className="flex gap-y-4 gap-x-2">
<div className="flex gap-x-2 gap-y-4">
{!currentTemplate?.hiddenFields?.includes(
"application_method.value"
) && (

View File

@@ -13,17 +13,17 @@ type RuleProps = {
function RuleBlock({ rule }: RuleProps) {
return (
<div className="bg-ui-bg-subtle shadow-borders-base flex justify-around rounded-md p-2 align-center">
<div className="flex text-ui-fg-subtle txt-compact-xsmall whitespace-nowrap items-center">
<div className="bg-ui-bg-subtle shadow-borders-base align-center flex justify-around rounded-md p-2">
<div className="text-ui-fg-subtle txt-compact-xsmall flex items-center whitespace-nowrap">
<Badge
size="2xsmall"
key="rule-attribute"
className="mx-1 txt-compact-xsmall-plus tag-neutral-text truncate inline-block"
className="txt-compact-xsmall-plus tag-neutral-text mx-1 inline-block truncate"
>
{rule.attribute_label}
</Badge>
<span className="mx-1 txt-compact-2xsmall inline-block">
<span className="txt-compact-2xsmall mx-1 inline-block">
{rule.operator_label}
</span>
@@ -80,9 +80,12 @@ export const PromotionConditionsSection = ({
{!rules.length && (
<NoRecords
className="h-[180px]"
title="No records yet."
message="Please check back later or add a target condition today"
action={{ to: `${ruleType}/edit`, label: "Add condition" }}
title={t("general.noRecordsTitle")}
message={t("promotions.conditions.list.noRecordsMessage")}
action={{
to: `${ruleType}/edit`,
label: t("promotions.conditions.add"),
}}
buttonVariant="transparentIconLeft"
/>
)}

View File

@@ -61,7 +61,7 @@ export const PromotionGeneralSection = ({
[PromotionStatus.EXPIRED]: ["red", t("statuses.expired")],
}[getPromotionStatus(promotion)] as [
"grey" | "orange" | "green" | "red",
string,
string
]
return (
@@ -100,7 +100,7 @@ export const PromotionGeneralSection = ({
<div className="text-ui-fg-subtle grid grid-cols-2 items-start px-6 py-4">
<Text size="small" weight="plus" leading="compact">
{t("promotions.fields.method")}
{t("promotions.fields.campaign")}
</Text>
<Text size="small" leading="compact" className="text-pretty">

View File

@@ -1,6 +1,13 @@
import { PencilSquare, Trash } from "@medusajs/icons"
import type { HttpTypes } from "@medusajs/types"
import { Button, Container, Heading, toast, usePrompt } from "@medusajs/ui"
import {
Button,
Container,
Heading,
toast,
usePrompt,
Text,
} from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { createColumnHelper } from "@tanstack/react-table"
import { useMemo } from "react"
@@ -56,7 +63,12 @@ export const RegionListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("regions.domain")}</Heading>
<div>
<Heading>{t("regions.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("regions.subtitle")}
</Text>
</div>
<Link to="/settings/regions/create">
<Button size="small" variant="secondary">
{t("actions.create")}
@@ -76,6 +88,9 @@ export const RegionListTable = () => {
pagination
search
queryObject={raw}
noRecords={{
message: t("regions.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { DataTable } from "../../../../../components/table/data-table"
import { Link } from "react-router-dom"
@@ -41,7 +41,12 @@ export const ReservationListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("reservations.domain")}</Heading>
<div>
<Heading>{t("reservations.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("reservations.subtitle")}
</Text>
</div>
<Button variant="secondary" size="small" asChild>
<Link to="create">{t("actions.create")}</Link>
</Button>

View File

@@ -11,10 +11,7 @@ import { useMemo, useState } from "react"
import { useForm } from "react-hook-form"
import { useTranslation } from "react-i18next"
import * as zod from "zod"
import {
RouteFocusModal,
useRouteModal,
} from "../../../../components/modals"
import { RouteFocusModal, useRouteModal } from "../../../../components/modals"
import { DataTable } from "../../../../components/table/data-table"
import { useProducts } from "../../../../hooks/api/products"
import { useSalesChannelAddProducts } from "../../../../hooks/api/sales-channels"
@@ -168,6 +165,9 @@ export const AddProductsToSalesChannelForm = ({
layout="fill"
pagination
search
noRecords={{
message: t("salesChannels.products.add.list.noRecordsMessage"),
}}
/>
</RouteFocusModal.Body>
</form>

View File

@@ -149,6 +149,9 @@ export const SalesChannelProductSection = ({
isLoading={isLoading}
orderBy={["title", "variants", "status", "created_at", "updated_at"]}
queryObject={raw}
noRecords={{
message: t("salesChannels.products.list.noRecordsMessage"),
}}
/>
</Container>
)

View File

@@ -1,6 +1,13 @@
import { PencilSquare, Trash } from "@medusajs/icons"
import { SalesChannelDTO } from "@medusajs/types"
import { Button, Container, Heading, toast, usePrompt } from "@medusajs/ui"
import {
Button,
Container,
Heading,
toast,
usePrompt,
Text,
} from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { createColumnHelper } from "@tanstack/react-table"
import { useMemo } from "react"
@@ -52,7 +59,12 @@ export const SalesChannelListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading level="h2">{t("salesChannels.domain")}</Heading>
<div>
<Heading level="h2">{t("salesChannels.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("salesChannels.subtitle")}
</Text>
</div>
<Link to="/settings/sales-channels/create">
<Button size="small" variant="secondary">
{t("actions.create")}

View File

@@ -1,4 +1,4 @@
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { Link } from "react-router-dom"
import { keepPreviousData } from "@tanstack/react-query"
@@ -43,7 +43,12 @@ export const ShippingProfileListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("shippingProfile.domain")}</Heading>
<div>
<Heading>{t("shippingProfile.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("shippingProfile.subtitle")}
</Text>
</div>
<div>
<Button size="small" variant="secondary" asChild>
<Link to="create">{t("actions.create")}</Link>

View File

@@ -1,6 +1,6 @@
import { Trash } from "@medusajs/icons"
import { AdminTaxRegionResponse } from "@medusajs/types"
import { Button, Container, Heading } from "@medusajs/ui"
import { Button, Container, Heading, Text } from "@medusajs/ui"
import { createColumnHelper } from "@tanstack/react-table"
import { t } from "i18next"
import { useMemo } from "react"
@@ -47,7 +47,12 @@ export const TaxRegionListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading level="h2">{t("taxes.domain")}</Heading>
<div>
<Heading level="h2">{t("taxes.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t("taxRegions.subtitle")}
</Text>
</div>
<Button size="small" variant="secondary" asChild>
<Link to="/settings/taxes/create">{t("actions.create")}</Link>
</Button>

View File

@@ -1,4 +1,4 @@
import { Container, Heading } from "@medusajs/ui"
import { Container, Heading, Text } from "@medusajs/ui"
import { keepPreviousData } from "@tanstack/react-query"
import { useTranslation } from "react-i18next"
import { DataTable } from "../../../../../components/table/data-table"
@@ -55,7 +55,12 @@ export const WorkflowExecutionListTable = () => {
return (
<Container className="divide-y p-0">
<div className="flex items-center justify-between px-6 py-4">
<Heading>{t("workflowExecutions.domain")}</Heading>
<div>
<Heading>{t("workflowExecutions.domain")}</Heading>
<Text className="text-ui-fg-subtle" size="small">
{t(`workflowExecutions.subtitle`)}
</Text>
</div>
</div>
<DataTable
table={table}
@@ -67,6 +72,9 @@ export const WorkflowExecutionListTable = () => {
search
pagination
queryObject={raw}
noRecords={{
message: t("workflowExecutions.list.noRecordsMessage"),
}}
/>
</Container>
)