import { useState } from 'react'; import { IconButton, Box, Button, styled, useTheme, Link, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, } from '@mui/material'; import { OpenInNew } from '@mui/icons-material'; import { TranslationFields } from './TranslationFields'; import { LanguageSelect } from './LanguageSelect'; import { LoadingButton } from '../common/LoadingButton'; import { ScreenshotGallery } from './ScreenshotGallery/ScreenshotGallery'; import { ScFieldTitle } from '../common/FieldTitle'; import { useDialogContext, useDialogActions } from './dialogContext'; import { NsSelect } from './NsSelect'; import { DEVTOOLS_Z_INDEX, TOLGEE_RESTRICT_ATTRIBUTE } from '../../constants'; import { Tags } from './Tags/Tags'; import { PluralFormCheckbox } from './PluralFormCheckbox'; import { CharLimitCheckbox } from './CharLimitCheckbox'; import { ErrorAlert } from './ErrorAlert/ErrorAlert'; import { HttpError } from '../client/HttpError'; import { Tooltip } from '../common/Tooltip'; import { FilterTagMissingInfo } from './Tags/FilterTagMissingInfo'; import { KeyName } from '../common/KeyName'; import type { SubmitKind } from './dialogContext/tools'; const ScContainer = styled('div')` font-family: Rubik, Roboto, Arial; padding: 20px; box-sizing: border-box; max-width: 100%; width: 700px; display: flex; flex-direction: column; `; const ScHeading = styled('div')` display: flex; align-items: center; gap: 5px; `; const ScHeadingTitle = styled('div')` display: flex; margin: 0px; font-size: 19px; `; const ScHeadingRight = styled('div')` display: flex; justify-content: flex-end; align-items: center; flex-grow: 1; `; const ScTitle = styled(ScFieldTitle)` justify-content: start; gap: 4px; align-items: center; `; const ScValue = styled('p')` margin: 0px; `; const ScHint = styled('span')` color: ${({ theme }) => theme.palette.text.secondary}; `; const ScDescription = styled('p')` margin: 2px 0 0; font-size: 13px; color: ${({ theme }) => theme.palette.text.secondary}; white-space: pre-wrap; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; overflow: hidden; `; const ScLinkIcon = styled(Link)` display: grid; font-size: 16px; margin: 0px 0px; `; const ScFieldsWrapper = styled('div')` margin-top: 10px; `; const ScTagsWrapper = styled('div')` margin-top: 5px; `; const ScGalleryWrapper = styled('div')` margin-top: 10px; `; const ScControls = styled('div')` display: flex; justify-content: flex-end; margin-top: 20px; min-height: 36px; `; const SUBMIT_LABELS: Record = { save: 'Save', suggest: 'Suggest', saveAndSuggest: 'Save & suggest', }; const SUCCESS_LABELS: Record = { save: 'Saved! ✓', suggest: 'Suggested! ✓', saveAndSuggest: 'Saved & suggested! ✓', }; export const KeyForm = () => { const theme = useTheme(); const { setUseBrowserWindow, onClose, onSubmit, setSelectedNs } = useDialogActions(); const pluralsSupported = useDialogContext((c) => c.pluralsSupported); const linkToPlatform = useDialogContext((c) => c.linkToPlatform); const useBrowserWindow = useDialogContext((c) => c.useBrowserWindow); const input = useDialogContext((c) => c.input); const keyData = useDialogContext((c) => c.keyData); const formDisabled = useDialogContext((c) => c.formDisabled); const suggestionNeedsKey = useDialogContext( (c) => c.permissions.suggestionNeedsKey ); const credentialBlocksSubmit = useDialogContext( (c) => c.permissions.credentialBlocksSubmit ); const readOnly = useDialogContext((c) => c.readOnly); const loading = useDialogContext((c) => c.loading); const error = useDialogContext((c) => c.error); const submitError = useDialogContext((c) => c.submitError); const submitKind = useDialogContext((c) => c.submitKind); const nothingToSuggest = useDialogContext((c) => c.nothingToSuggest); const suggestOnly = useDialogContext((c) => c.suggestOnly); const saving = useDialogContext((c) => c.saving); const success = useDialogContext((c) => c.success); const keyExists = useDialogContext((c) => c.keyExists); const fallbackNamespaces = useDialogContext((c) => c.fallbackNamespaces); const selectedNs = useDialogContext((c) => c.selectedNs); const permissions = useDialogContext((c) => c.permissions); const filterTagMissing = useDialogContext((c) => c.filterTagMissing); const isOverCharLimit = useDialogContext((c) => c.isOverCharLimit); const branch = useDialogContext((c) => c.uiProps.branch); const [showCharLimitConfirmation, setShowCharLimitConfirmation] = useState(false); const screenshotsView = permissions.canViewScreenshots; const viewPluralCheckbox = permissions.canEditPlural && pluralsSupported; const ready = !loading && !error; const generalError = error || submitError; const isExistingKey = keyData?.keyId !== undefined; const handleSaveClick = () => { if (isOverCharLimit && isExistingKey) { setShowCharLimitConfirmation(true); } else { onSubmit(); } }; const handleConfirmSave = () => { setShowCharLimitConfirmation(false); onSubmit(); }; return ( Quick translation {!useBrowserWindow && ( setUseBrowserWindow(true)} color="inherit" size="small" > )} {!loading && } {branch && ( <> Branch {branch} )} Key {linkToPlatform && ( )} {!keyExists && ready && " (key doesn't exist yet)"} {keyData?.keyDescription && ( {keyData.keyDescription} )} {ready && !suggestOnly && ( Tags {filterTagMissing && } )} {ready && ( {viewPluralCheckbox && } {permissions.canEditCharLimit && } )} {!error && ( )} {screenshotsView && ready && ( )} {formDisabled && ready && ( )} {generalError && } {success ? SUCCESS_LABELS[success] : isExistingKey ? SUBMIT_LABELS[submitKind] : 'Create'} {showCharLimitConfirmation && ( setShowCharLimitConfirmation(false)} > Translation length is exceeded Character limit for translation is exceeded. Are you sure you want to save it? )} ); };