mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-16 12:53:32 +00:00
0e6d6cd416
* refactor: allow secondary rundowns * ui: move dropdown * feat: follow loaded * ui: background edit warning ui: fix disable radio button * feat(ui): add loaded sufix in the rundown list * feat(ui): add direct link to background edit from rundown manager * fix: better fallback * fix: default to is isCurrentRundown for nav bar colour * chore: rename navigate to cuesheet --------- Co-authored-by: alex-arc <ac@omnivox.dk>
69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
import { memo } from 'react';
|
|
|
|
import Button from '../../../../common/components/buttons/Button';
|
|
import Input from '../../../../common/components/input/input/Input';
|
|
|
|
import style from './EditableImage.module.scss';
|
|
|
|
interface EditableImageProps {
|
|
initialValue: string;
|
|
readOnly?: boolean;
|
|
updateValue: (newValue: string) => void;
|
|
}
|
|
|
|
export default memo(EditableImage);
|
|
|
|
function EditableImage({ initialValue, readOnly, updateValue }: EditableImageProps) {
|
|
const handleUpdate = (newValue: string) => {
|
|
if (newValue === initialValue) {
|
|
return;
|
|
}
|
|
if (newValue !== '' && !newValue.startsWith('http')) {
|
|
return;
|
|
}
|
|
updateValue(newValue);
|
|
};
|
|
|
|
const openInNewTab = () => {
|
|
if (initialValue) {
|
|
window.open(initialValue, '_blank', 'noopener,noreferrer');
|
|
}
|
|
};
|
|
|
|
if (!initialValue && readOnly) {
|
|
return null;
|
|
}
|
|
|
|
if (!initialValue) {
|
|
return (
|
|
<Input
|
|
variant='ghosted'
|
|
className={style.imageInput}
|
|
fluid
|
|
placeholder='Paste image URL'
|
|
onBlur={(event) => handleUpdate(event.currentTarget.value)}
|
|
onKeyDown={(event) => {
|
|
if (event.key === 'Enter') {
|
|
handleUpdate(event.currentTarget.value);
|
|
}
|
|
}}
|
|
defaultValue={initialValue}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className={style.imageCell}>
|
|
{!readOnly && (
|
|
<div className={style.overlay}>
|
|
<Button onClick={openInNewTab}>Preview</Button>
|
|
<Button variant='subtle-destructive' onClick={() => handleUpdate('')}>
|
|
Delete
|
|
</Button>
|
|
</div>
|
|
)}
|
|
{Boolean(initialValue) && <img loading='lazy' src={initialValue} className={style.image} />}
|
|
</div>
|
|
);
|
|
}
|