{"version":3,"file":"TranslationEditSheet.mjs","names":["React","useState","useEffect","useMemo","useCallback","lazy","Suspense","useTranslation","UdpDrawer","UdpDialog","UdpFlexbox","UdpCard","UdpTextInput","UdpButton","UdpText","UdpSpinner","UdpMessageBar","UdpDetailList","UdpDetailListItem","TranslationScopeEnums","DEFAULT_TRANSLATION_BRAND","translateScopeName","UdpTablist","then","m","default","TAB_ID_BY_SCOPE","Brand","Tenant","User","SCOPE_BY_TAB_ID","brand","tenant","user","TranslationEditSheet","open","onClose","entry","languages","unityUserId","fetchLabelTranslations","onCreate","onUpdate","onDelete","onSaved","t","tierRows","setTierRows","loading","setLoading","activeTabId","setActiveTabId","value","setValue","saving","setSaving","feedback","setFeedback","confirmRemove","setConfirmRemove","languageName","lang","find","l","languageId","label","code","loadTiers","resetActiveTab","rows","byScope","forEach","row","scope","loadedScopes","Object","keys","map","Number","base","length","Math","min","max","presentScopes","sort","a","b","baseScope","effectiveScope","effectiveRow","tabs","firstTab","filter","tier","id","endIconName","undefined","activeScope","activeRow","fallbackScope","pop","fallbackRow","firstLoad","handleTabChange","event","nextId","detail","String","handleClose","handleSave","trim","ok","translationId","languageIds","outcome","intent","text","defaultValue","handleRemoveOverride","activeTierName","canRemove","removeConfirmText","Boolean","join","e","target"],"sources":["../../../../src/udp/pages/UdpTranslationsPage/TranslationEditSheet.jsx"],"sourcesContent":["import React, {\n  useState,\n  useEffect,\n  useMemo,\n  useCallback,\n  lazy,\n  Suspense\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { UdpDrawer } from '../../../UI/fluent-web-components/UdpDrawer';\nimport { UdpDialog } from '../../../UI/fluent-web-components/UdpDialog';\nimport { UdpFlexbox } from '../../../UI/fluent-web-components/UdpFlexbox';\nimport { UdpCard } from '../../../UI/fluent-web-components/UdpCard';\nimport { UdpTextInput } from '../../../UI/fluent-web-components/UdpTextInput';\nimport { UdpButton } from '../../../UI/fluent-web-components/UdpButton';\nimport { UdpText } from '../../../UI/fluent-web-components/UdpText';\nimport { UdpSpinner } from '../../../UI/fluent-web-components/UdpSpinner';\nimport { UdpMessageBar } from '../../../UI/fluent-web-components/UdpMessageBar';\nimport { UdpDetailList } from '../../../UI/dataDisplay/UdpDetailList';\nimport { UdpDetailListItem } from '../../../UI/dataDisplay/UdpDetailListItem';\nimport {\n  TranslationScopeEnums,\n  DEFAULT_TRANSLATION_BRAND,\n  translateScopeName\n} from '../../../enums/translationEnums';\n\n// Lazy: the stencil tablist drags in the Fluent web-component runtime.\nconst UdpTablist = lazy(() =>\n  import('../../../UI/fluent-web-components/UdpTablist').then((m) => ({\n    default: m.UdpTablist\n  }))\n);\n\n// Tab ids are strings (the tablist requires string ids); tier names come from\n// translateScopeName so the English name never round-trips through the UI.\nconst TAB_ID_BY_SCOPE = {\n  [TranslationScopeEnums.Brand]: 'brand',\n  [TranslationScopeEnums.Tenant]: 'tenant',\n  [TranslationScopeEnums.User]: 'user'\n};\nconst SCOPE_BY_TAB_ID = {\n  brand: TranslationScopeEnums.Brand,\n  tenant: TranslationScopeEnums.Tenant,\n  user: TranslationScopeEnums.User\n};\n\n/**\n * Tabbed sidesheet for the admin translations page.\n *\n * An entry's BASE is its lowest existing tier; the sheet offers a tab for the\n * base itself (editable - except Product, which is read-only in the UI and\n * managed via db scripts) plus every tier above it:\n * - Product base:  Brand | Tenant | User  (product value shown read-only)\n * - Brand base:    Brand | Tenant | User  (Brand tab edits the entry itself)\n * - Tenant base:   Tenant | User\n * - User base:     no tabs - the sheet edits the user row directly\n *\n * Each tab edits that tier's row for the entry's label+language: saving\n * creates the tier row (POST) or updates it (PATCH), and the remove button\n * deletes that single tier row so lookups fall back down the chain. Cascade /\n * overrides-only deletes live in the grid's delete dialog.\n *\n * Resolution runs User > Tenant > Brand > Product, so the value the app\n * actually renders comes from the HIGHEST tier present - surfaced here as\n * \"In use\" so the sheet answers \"what do people see today?\" before the user\n * edits anything.\n */\nexport const TranslationEditSheet = ({\n  open,\n  onClose,\n  entry, // consolidated grid row: { languageId, label, ... }\n  languages,\n  unityUserId, // current user (for the User tab's override)\n  brand = DEFAULT_TRANSLATION_BRAND,\n  fetchLabelTranslations,\n  onCreate,\n  onUpdate,\n  onDelete,\n  onSaved\n}) => {\n  const { t } = useTranslation();\n\n  const [tierRows, setTierRows] = useState({}); // { [scope]: row }\n  const [loading, setLoading] = useState(false);\n  const [activeTabId, setActiveTabId] = useState('brand');\n  const [value, setValue] = useState('');\n  const [saving, setSaving] = useState(false);\n  const [feedback, setFeedback] = useState(null);\n  // Removing a tier row deletes data with no undo, so it goes through a\n  // confirmation like every other delete on this page.\n  const [confirmRemove, setConfirmRemove] = useState(false);\n\n  const languageName = useMemo(() => {\n    const lang = languages.find((l) => l.languageId === entry?.languageId);\n    return lang?.label || lang?.code || entry?.languageId;\n  }, [languages, entry]);\n\n  const loadTiers = useCallback(\n    async ({ resetActiveTab = false } = {}) => {\n      if (!entry) return;\n      setLoading(true);\n      try {\n        const rows = await fetchLabelTranslations({\n          languageId: entry.languageId,\n          label: entry.label,\n          brand,\n          unityUserId\n        });\n        const byScope = {};\n        rows.forEach((row) => {\n          byScope[row.scope] = row;\n        });\n        setTierRows(byScope);\n        if (resetActiveTab) {\n          // Default to the FIRST tab: the base tier itself (or Brand when the\n          // base is the migration-owned Product tier). Decided from the fetched\n          // rows (not a reactive effect) so the tablist mounts once with the\n          // correct list and selection.\n          const loadedScopes = Object.keys(byScope).map(Number);\n          const base = loadedScopes.length\n            ? Math.min(...loadedScopes)\n            : TranslationScopeEnums.Brand;\n          setActiveTabId(\n            TAB_ID_BY_SCOPE[\n              Math.min(\n                Math.max(base, TranslationScopeEnums.Brand),\n                TranslationScopeEnums.User\n              )\n            ]\n          );\n        }\n      } finally {\n        setLoading(false);\n      }\n    },\n    [entry, brand, unityUserId, fetchLabelTranslations]\n  );\n\n  // The entry's base = lowest tier present.\n  const presentScopes = Object.keys(tierRows)\n    .map(Number)\n    .sort((a, b) => a - b);\n  const baseScope = presentScopes.length ? presentScopes[0] : null;\n\n  // Resolution takes the HIGHEST tier present, so this - not the base - is the\n  // value the running app renders for this label today.\n  const effectiveScope = presentScopes.length\n    ? presentScopes[presentScopes.length - 1]\n    : null;\n  const effectiveRow = effectiveScope != null ? tierRows[effectiveScope] : null;\n\n  // Tabs: the base tier itself (editable) plus every tier above it. A User\n  // base has no tiers above and edits itself without tabs.\n  const tabs = useMemo(() => {\n    if (baseScope == null || baseScope >= TranslationScopeEnums.User) return [];\n    // Product is never a tab: its value is read-only in the UI (db scripts own it).\n    const firstTab = Math.max(baseScope, TranslationScopeEnums.Brand);\n    return [\n      TranslationScopeEnums.Brand,\n      TranslationScopeEnums.Tenant,\n      TranslationScopeEnums.User\n    ]\n      .filter((tier) => tier >= firstTab)\n      .map((tier) => ({\n        id: TAB_ID_BY_SCOPE[tier],\n        label: translateScopeName(t, tier),\n        // Which tiers already hold a value is the whole point of the override\n        // chain, and it was previously only discoverable by clicking each tab.\n        endIconName: tierRows[tier] ? 'checkmark' : undefined\n      }));\n  }, [baseScope, tierRows, t]);\n\n  const activeScope = tabs.length\n    ? SCOPE_BY_TAB_ID[activeTabId]\n    : TranslationScopeEnums.User;\n  const activeRow = tierRows[activeScope];\n\n  // What this tier inherits when it has no row of its own: the nearest LOWER\n  // tier that does - not necessarily the base, since a middle tier can sit\n  // between them.\n  const fallbackScope =\n    presentScopes.filter((scope) => scope < activeScope).pop() ?? null;\n  const fallbackRow = fallbackScope != null ? tierRows[fallbackScope] : null;\n\n  // First load only: later loads (after a save) keep the previous rows on\n  // screen rather than blinking the sheet back to a spinner.\n  const firstLoad = loading && presentScopes.length === 0;\n\n  useEffect(() => {\n    if (!open) return;\n    setFeedback(null);\n    setTierRows({});\n    loadTiers({ resetActiveTab: true });\n  }, [open, loadTiers]);\n\n  // Sync the input with the active tab's existing override.\n  useEffect(() => {\n    setValue(activeRow?.value ?? '');\n    setFeedback(null);\n  }, [activeTabId, activeRow]);\n\n  const handleTabChange = useCallback((event) => {\n    const nextId = event?.detail?.id ?? event?.detail;\n    if (nextId && SCOPE_BY_TAB_ID[nextId] !== undefined) {\n      setActiveTabId(String(nextId));\n    }\n  }, []);\n\n  const handleClose = useCallback(() => {\n    if (saving) return;\n    onClose?.();\n  }, [saving, onClose]);\n\n  const handleSave = useCallback(async () => {\n    if (!entry || !value.trim()) return;\n    setSaving(true);\n    setFeedback(null);\n    try {\n      if (activeRow) {\n        const ok = await onUpdate({\n          translationId: activeRow.translationId,\n          languageId: activeRow.languageId,\n          label: activeRow.label,\n          value,\n          unityUserId: activeRow.unityUserId ?? null\n        });\n        if (ok) {\n          await loadTiers();\n          onSaved?.({ languageIds: [entry.languageId] });\n        }\n        return;\n      }\n\n      const outcome = await onCreate({\n        languageId: entry.languageId,\n        label: entry.label,\n        value,\n        scope: activeScope,\n        brand,\n        unityUserId:\n          activeScope === TranslationScopeEnums.User ? unityUserId : null\n      });\n      if (outcome === 'created') {\n        await loadTiers();\n        onSaved?.({ languageIds: [entry.languageId] });\n      } else if (outcome === 'duplicate') {\n        setFeedback({\n          intent: 'warning',\n          text: t('translations.editSheet.duplicate', {\n            defaultValue: 'A {{tier}} entry already exists for this label.',\n            tier: translateScopeName(t, activeScope)\n          })\n        });\n      } else {\n        setFeedback({\n          intent: 'error',\n          text: t('translations.overrides.saveFailed', {\n            defaultValue: 'Failed to save override.'\n          })\n        });\n      }\n    } finally {\n      setSaving(false);\n    }\n  }, [\n    entry,\n    value,\n    activeRow,\n    activeScope,\n    brand,\n    unityUserId,\n    onCreate,\n    onUpdate,\n    loadTiers,\n    onSaved,\n    t\n  ]);\n\n  const handleRemoveOverride = useCallback(async () => {\n    if (!activeRow) return;\n    setSaving(true);\n    try {\n      const ok = await onDelete(activeRow.translationId);\n      if (ok) {\n        setConfirmRemove(false);\n        await loadTiers();\n        onSaved?.({ languageIds: [entry.languageId] });\n      }\n    } finally {\n      setSaving(false);\n    }\n  }, [activeRow, entry, onDelete, loadTiers, onSaved]);\n\n  const activeTierName = translateScopeName(t, activeScope);\n\n  // Removable = an override row (a tier above the entry's base). Deleting the\n  // entry itself is the grid delete dialog's job.\n  const canRemove = !!activeRow && activeScope !== baseScope;\n\n  const removeConfirmText = [\n    t('translations.editSheet.removeConfirm', {\n      defaultValue: 'Remove the {{tier}} entry for “{{label}}”?',\n      tier: activeTierName,\n      label: entry?.label\n    }),\n    fallbackRow &&\n      t('translations.editSheet.removeFallback', {\n        defaultValue:\n          'This language then falls back to the {{tier}} value: “{{value}}”.',\n        tier: translateScopeName(t, fallbackScope),\n        value: fallbackRow.value\n      })\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <>\n      <UdpDrawer\n        open={open}\n        drawerTitle={t('translations.sheet.editTitle', {\n          defaultValue: 'Edit Translation'\n        })}\n        size='medium'\n        onDrawerClose={handleClose}\n      >\n        {/* Tier switching is navigation, so it belongs in the drawer's toolbar\n            rather than inline in the body where it scrolls away with the\n            content it controls. */}\n        {/* Mount the tablist only once tiers are loaded: the web component\n            settles its selection at mount, so rendering it mid-fetch (with the\n            provisional two-tab list) leaves the wrong tab visually active. */}\n        {/* Gated on tabs (not loading): tabs are empty until the FIRST load\n            resolves (baseScope is null), which prevents the provisional-mount\n            bug - while save/refresh reloads keep the previous rows in state,\n            so the tablist stays mounted instead of blinking out. */}\n        {tabs.length > 0 && (\n          <Suspense fallback={null}>\n            <UdpTablist\n              slot='toolbar'\n              size='small'\n              tabList={tabs}\n              activeId={activeTabId}\n              onTabChange={handleTabChange}\n            />\n          </Suspense>\n        )}\n\n        <UdpFlexbox direction='column' gap='md' width='100%'>\n          {feedback && (\n            <UdpMessageBar\n              intent={feedback.intent}\n              layout='multiline'\n              dismissible\n              onDismiss={() => setFeedback(null)}\n            >\n              {feedback.text}\n            </UdpMessageBar>\n          )}\n\n          {firstLoad ? (\n            <UdpFlexbox direction='row' justify='center'>\n              <UdpSpinner size='medium' />\n            </UdpFlexbox>\n          ) : (\n            <>\n              <UdpCard\n                appearance='muted'\n                label={t('translations.sheet.detailsSection', {\n                  defaultValue: 'Translation details'\n                })}\n                subtitle={[\n                  t('translations.editSheet.tiersHint', {\n                    defaultValue:\n                      'User overrides Tenant, Tenant overrides Brand, and Brand overrides Product.'\n                  }),\n                  tabs.length > 0 &&\n                    t('translations.editSheet.checkmarkHint', {\n                      defaultValue:\n                        'A checkmark marks tiers that already have a value.'\n                    })\n                ]\n                  .filter(Boolean)\n                  .join(' ')}\n              >\n                <UdpDetailList layout='stack' density='compact'>\n                  <UdpDetailListItem\n                    label={t('translations.fields.label', {\n                      defaultValue: 'Label'\n                    })}\n                    value={entry?.label}\n                  />\n                  <UdpDetailListItem\n                    label={t('translations.fields.language', {\n                      defaultValue: 'Language'\n                    })}\n                    value={languageName}\n                  />\n                  {/* The answer to \"what do people see today?\" - the highest\n                      tier present, named so the source is unambiguous. */}\n                  <UdpDetailListItem\n                    label={\n                      effectiveScope != null\n                        ? t('translations.editSheet.inUseFrom', {\n                            defaultValue: 'In use (from {{tier}})',\n                            tier: translateScopeName(t, effectiveScope)\n                          })\n                        : t('translations.editSheet.inUse', {\n                            defaultValue: 'In use'\n                          })\n                    }\n                    value={effectiveRow?.value}\n                    emphasis='strong'\n                  />\n                </UdpDetailList>\n              </UdpCard>\n\n              <UdpTextInput\n                label={t('translations.editSheet.valueLabel', {\n                  defaultValue: '{{tier}} value',\n                  tier: activeTierName\n                })}\n                value={value}\n                required\n                disabled={loading}\n                hint={\n                  activeRow\n                    ? t('translations.editSheet.editingHint', {\n                        defaultValue: 'Editing the existing {{tier}} entry.',\n                        tier: activeTierName\n                      })\n                    : t('translations.editSheet.noOverrideHint', {\n                        defaultValue:\n                          'No {{tier}} override yet - saving creates one.',\n                        tier: activeTierName\n                      })\n                }\n                onChange={(e) => setValue(e.target.value)}\n              />\n            </>\n          )}\n        </UdpFlexbox>\n\n        {/* No Cancel here - the drawer's own close handles dismissal. */}\n        <UdpFlexbox direction='row' slot='footer' justify='flex-end' gap='sm'>\n          {canRemove && (\n            <UdpButton\n              appearance='outline'\n              onClick={() => setConfirmRemove(true)}\n              disabled={saving}\n            >\n              {t('translations.editSheet.removeOverride', {\n                defaultValue: 'Remove override'\n              })}\n            </UdpButton>\n          )}\n          {/* Label the outcome: on a tier with no row yet, Save would read as\n              editing something that does not exist. */}\n          <UdpButton\n            appearance='primary'\n            onClick={handleSave}\n            disabled={!value.trim() || loading}\n            loading={saving}\n          >\n            {activeRow\n              ? t('common.save', { defaultValue: 'Save' })\n              : t('translations.editSheet.createOverride', {\n                  defaultValue: 'Create override'\n                })}\n          </UdpButton>\n        </UdpFlexbox>\n      </UdpDrawer>\n\n      <UdpDialog\n        open={confirmRemove}\n        dialogTitle={t('translations.editSheet.removeTitle', {\n          defaultValue: 'Remove override'\n        })}\n        onDialogClose={() => setConfirmRemove(false)}\n      >\n        <UdpText>{removeConfirmText}</UdpText>\n        <UdpButton\n          appearance='outline'\n          slot='action'\n          onClick={() => setConfirmRemove(false)}\n          disabled={saving}\n        >\n          {t('common.cancel', { defaultValue: 'Cancel' })}\n        </UdpButton>\n        <UdpButton\n          appearance='primary'\n          slot='action'\n          onClick={handleRemoveOverride}\n          loading={saving}\n        >\n          {t('common.remove', { defaultValue: 'Remove' })}\n        </UdpButton>\n      </UdpDialog>\n    </>\n  );\n};\n"],"mappings":"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"}