mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-09-20 02:29:28 +00:00

# Description of Changes - Add features to BulkSelectionPanel to allow more versatility when selecting pages - Make changes to Tooltip to: Remove non-existent props delayAppearance, fixed defaults no hardcoded maxWidth, and documented new props (closeOnOutside, containerStyle, minWidth). Clarify pinned vs. unpinned outside-click logic, hover/focus interactions, and event/ref preservation. - Made top controls show full text always rather than dynamically display the text only for the selected items --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details.
105 lines
2.8 KiB
TypeScript
105 lines
2.8 KiB
TypeScript
import { useState } from 'react';
|
|
import { Button, Text, NumberInput, Group } from '@mantine/core';
|
|
import classes from './BulkSelectionPanel.module.css';
|
|
|
|
interface SelectPagesProps {
|
|
title: string;
|
|
placeholder: string;
|
|
onApply: (value: number) => void;
|
|
maxPages: number;
|
|
validationFn?: (value: number) => string | null;
|
|
isRange?: boolean;
|
|
rangeEndValue?: number | '';
|
|
onRangeEndChange?: (value: string | number) => void;
|
|
rangeEndPlaceholder?: string;
|
|
}
|
|
|
|
const SelectPages = ({
|
|
title,
|
|
placeholder,
|
|
onApply,
|
|
validationFn,
|
|
isRange = false,
|
|
rangeEndValue,
|
|
onRangeEndChange,
|
|
rangeEndPlaceholder,
|
|
}: SelectPagesProps) => {
|
|
const [value, setValue] = useState<number | ''>('');
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
const handleValueChange = (val: string | number) => {
|
|
const next = typeof val === 'number' ? val : '';
|
|
setValue(next);
|
|
|
|
if (validationFn && typeof next === 'number') {
|
|
setError(validationFn(next));
|
|
} else {
|
|
setError(null);
|
|
}
|
|
};
|
|
|
|
const handleApply = () => {
|
|
if (value === '' || typeof value !== 'number') return;
|
|
onApply(value);
|
|
setValue('');
|
|
setError(null);
|
|
};
|
|
|
|
const isDisabled = Boolean(error) || value === '';
|
|
|
|
return (
|
|
<div className={classes.advancedCard}>
|
|
<Text size="sm" fw={600} c="var(--text-secondary)" mb="xs">{title}</Text>
|
|
{error && (<Text size="xs" c="var(--text-brand-accent)" mb="xs">{error}</Text>)}
|
|
<div className={classes.inputGroup}>
|
|
<Group gap="sm" align="flex-end" wrap="nowrap">
|
|
{isRange ? (
|
|
<>
|
|
<div style={{ flex: 1 }}>
|
|
<NumberInput
|
|
size="sm"
|
|
value={value}
|
|
onChange={handleValueChange}
|
|
min={1}
|
|
placeholder={placeholder}
|
|
error={Boolean(error)}
|
|
/>
|
|
</div>
|
|
<div style={{ flex: 1 }}>
|
|
<NumberInput
|
|
size="sm"
|
|
value={rangeEndValue}
|
|
onChange={onRangeEndChange}
|
|
min={1}
|
|
placeholder={rangeEndPlaceholder}
|
|
error={Boolean(error)}
|
|
/>
|
|
</div>
|
|
</>
|
|
) : (
|
|
<NumberInput
|
|
size="sm"
|
|
value={value}
|
|
onChange={handleValueChange}
|
|
min={1}
|
|
placeholder={placeholder}
|
|
className={classes.fullWidthInput}
|
|
error={Boolean(error)}
|
|
/>
|
|
)}
|
|
<Button
|
|
size="sm"
|
|
className={classes.applyButton}
|
|
onClick={handleApply}
|
|
disabled={isDisabled}
|
|
>
|
|
Apply
|
|
</Button>
|
|
</Group>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default SelectPages;
|