Files
medusa-store/packages/medusa/src/api/admin/translations/validators.ts
Nicolas Gorga 3d1330ebb9 feat: Translations UI (#14217)
* Add Translations route and guard it with feature flag. Empty TranslationsList main component to test route.

* Translation list component

* Add translations namespace to js-sdk

* Translations hook

* Avoid incorrectly throwing when updating and locale not included

* Translations bulk editor component v1

* Add batch method to translations namespace in js-sdk

* Protect translations edit route with feature flag

* Handle reference_id search param

* Replace entity_type entity_id for reference reference_id

* Manage translations from product detail page

* Dynamically resolve base hook for retrieving translations

* Fix navigation from outside settings/translations

* Navigation to bulk editor from product list

* Add Translations to various product module types

* Type useVariants hook

* Handle product module entities translations in bulk editor

* Fix categories issue in datagrid due to column clash

* Translations bulk navigation from remaining entities detail pages

* Add remaining bulk editor navigation for list components. Fix invalidation query for variants

* Expandable text cell v1

* Popover approach

* Add *supported_locales.locale to default fields in stores list endpoint

* Make popover more aligned to excell approach

* Correctly tie the focused cell anchor to popover

* Rework translations main component UI

* Fix link def export

* Swap axis for translations datagrid

* Add original column to translations data grid

* Remove is_default store locale from backend

* Remove ldefault locale from ui

* Type

* Add changeset

* Comments

* Remove unused import

* Add translations to admin product categories endpoint allowed fields

* Default locale removal

* Lazy loading with infinite scroll data grid

* Infinite list hook and implementation for products and variants

* Translation bulk editor lazy loaded datagrid

* Prevent scroll when forcing focus, to avoid scrollTop reset on infinite loading

* Confgiure placeholder data

* Cleanup logs and refactor

* Infinite query hooks for translatable entities

* Batch requests for translation batch endpoint

* Clean up

* Update icon

* Add query param validator in settings endpoint

* Settings endpoint param type

* JS sdk methods for translation settings and statistics

* Retrieve translatable fields and entities dynamically. Remove hardcoded information from tranlations list

* Resolve translation aggregate completion dynamically

* Format label

* Resolve bulk editor header label dynamically

* Include type and collection in translations config

* Avoid showing product option and option values in translatable entities list

* Translations

* Make translations bulk editor content columns wider

* Disable hiding Original column in translations bulk editor

* Adjust translations completion styles

* Fix translations config screen

* Locale selector switcher with conditional locale column rendering

* Batch one locale at a time

* Hooks save actions to footer buttons

* Reset dirty state on save

* Dynamic row heights for translations bulk editor. Replace expandable cell for text cell, with additional isMultiLine config

* Make columns take as much responsive width as possible and divide equally

* more padding to avoid unnecessary horizontal scrollbar

* Update statistics graphs

* Translations

* Statistics graphs translations

* Translation, text sizes and weight in stat graphs

* Conditionally show/hide column visibility dropdown in datagrid

* Allow to pass component to place in DataGrid header and use it in translations bulk editor

* Center text regardless of multiLine config

* Apply full height to datagrid cell regardles of multiSelect config

* Colors and fonts

* Handle key down for text area in text cell

* MultilineCell with special keydown handling

* Rework form schema to match new single locale edit flow

* Update created translations to include id, to avoid duplication issue on subsequent calls

* Handle space key for text cells

* Finish hooking up multiline cell with key and mouse events

* Disable remaining buttons when batch is ongoing

* Style updates

* Update style

* Refactor to make form updates and sync/comparison with server data more comprehensive and robust

* Update styles

* Bars and labels alignment

* Add languages tooltip

* Styles and translation

* Navigation update

* Disable edit translations button when no reference count

* Invert colors

---------

Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
Co-authored-by: Adrien de Peretti <adrien.deperetti@gmail.com>
2025-12-17 13:36:50 +01:00

74 lines
2.2 KiB
TypeScript

import { applyAndAndOrOperators } from "../../utils/common-validators"
import {
createBatchBody,
createFindParams,
createSelectParams,
} from "../../utils/validators"
import { z } from "zod"
export const AdminGetTranslationParams = createSelectParams()
export const AdminGetTranslationParamsFields = z.object({
q: z.string().optional(),
reference_id: z.union([z.string(), z.array(z.string())]).optional(),
reference: z.string().optional(),
locale_code: z.string().optional(),
})
export type AdminGetTranslationsParamsType = z.infer<
typeof AdminGetTranslationsParams
>
export const AdminGetTranslationsParams = createFindParams({
limit: 20,
offset: 0,
})
.merge(AdminGetTranslationParamsFields)
.merge(applyAndAndOrOperators(AdminGetTranslationParamsFields))
export type AdminCreateTranslationType = z.infer<typeof AdminCreateTranslation>
export const AdminCreateTranslation = z.object({
reference_id: z.string(),
reference: z.string(),
locale_code: z.string(),
translations: z.record(z.string()),
})
export type AdminUpdateTranslationType = z.infer<typeof AdminUpdateTranslation>
export const AdminUpdateTranslation = z.object({
id: z.string(),
reference_id: z.string().optional(),
reference: z.string().optional(),
locale_code: z.string().optional(),
translations: z.record(z.string()).optional(),
})
export type AdminBatchTranslationsType = z.infer<typeof AdminBatchTranslations>
export const AdminBatchTranslations = createBatchBody(
AdminCreateTranslation,
AdminUpdateTranslation
)
export type AdminTranslationStatisticsType = z.infer<
typeof AdminTranslationStatistics
>
export const AdminTranslationStatistics = z
.object({
locales: z.union([z.string(), z.array(z.string())]),
entity_types: z.union([z.string(), z.array(z.string())]),
})
.transform((data) => ({
// Normalize to arrays for consistent handling
locales: Array.isArray(data.locales) ? data.locales : [data.locales],
entity_types: Array.isArray(data.entity_types)
? data.entity_types
: [data.entity_types],
}))
export type AdminTranslationSettingsParamsType = z.infer<
typeof AdminTranslationSettingsParams
>
export const AdminTranslationSettingsParams = z.object({
entity_type: z.string().optional(),
})