diff --git a/app/admin/baseline/page.tsx b/app/admin/baseline/page.tsx index efd148d4..8fc3b13f 100644 --- a/app/admin/baseline/page.tsx +++ b/app/admin/baseline/page.tsx @@ -46,14 +46,12 @@ export default function ComponentsPage() { '*:inline-flex *:gap-1 [&_input]:-translate-y-0.5', )}> setShouldShowBaselineGrid?.(e === 'true')} /> } /> ); diff --git a/src/admin/AdminBatchUploadActions.tsx b/src/admin/AdminBatchUploadActions.tsx index 937910d6..64ed3020 100644 --- a/src/admin/AdminBatchUploadActions.tsx +++ b/src/admin/AdminBatchUploadActions.tsx @@ -43,11 +43,14 @@ export default function AdminBatchUploadActions({ }) { const { updateAdminData } = useAppState(); - const [buttonText, setButtonText] = useState('Add All Uploads'); - const [showTags, setShowTags] = useState(false); + const [showBulkSettings, setShowBulkSettings] = useState(false); const [tags, setTags] = useState(''); - const [actionErrorMessage, setActionErrorMessage] = useState(''); + const [favorite, setFavorite] = useState('false'); + const [hidden, setHidden] = useState('false'); const [tagErrorMessage, setTagErrorMessage] = useState(''); + + const [buttonText, setButtonText] = useState('Add All Uploads'); + const [actionErrorMessage, setActionErrorMessage] = useState(''); const [addingProgress, setAddingProgress] = useState(); const [isAddingComplete, setIsAddingComplete] = useState(false); @@ -58,7 +61,11 @@ export default function AdminBatchUploadActions({ try { const stream = await addAllUploadsAction({ uploadUrls, - tags: showTags ? tags : undefined, + ...showBulkSettings && { + tags, + favorite, + hidden, + }, takenAtLocal: generateLocalPostgresString(), takenAtNaiveLocal: generateLocalNaivePostgresString(), shouldRevalidateAllKeysAndPaths: isFinalBatch, @@ -116,29 +123,43 @@ export default function AdminBatchUploadActions({ 'grow', tagErrorMessage ? 'text-error' : 'text-main', )}> - {showTags - ? tagErrorMessage || 'Add tags to all uploads' + {showBulkSettings + ? tagErrorMessage || 'Apply to all uploads' : `Found ${storageUrls.length} uploads`} setShowTags(value === 'true')} + value={showBulkSettings ? 'true' : 'false'} + onChange={value => setShowBulkSettings(value === 'true')} readOnly={isAdding} /> - {showTags && !actionErrorMessage && - } + {showBulkSettings && !actionErrorMessage && +
+ + + +
}
(urls); diff --git a/src/admin/PhotoTagFieldset.tsx b/src/admin/PhotoTagFieldset.tsx index ce932924..87f1a892 100644 --- a/src/admin/PhotoTagFieldset.tsx +++ b/src/admin/PhotoTagFieldset.tsx @@ -15,7 +15,6 @@ export default function PhotoTagFieldset(props: { 'tagOptions' >>) { const { - id, tags, tagOptions, onChange, @@ -42,7 +41,7 @@ export default function PhotoTagFieldset(props: { { diff --git a/src/components/FieldSetWithStatus.tsx b/src/components/FieldSetWithStatus.tsx index 22c056a9..25b146a7 100644 --- a/src/components/FieldSetWithStatus.tsx +++ b/src/components/FieldSetWithStatus.tsx @@ -7,9 +7,10 @@ import { clsx } from 'clsx/lite'; import { FieldSetType, AnnotatedTag } from '@/photo/form'; import TagInput from './TagInput'; import { FiChevronDown } from 'react-icons/fi'; +import { parameterize } from '@/utility/string'; export default function FieldSetWithStatus({ - id, + id: _id, label, note, error, @@ -34,8 +35,8 @@ export default function FieldSetWithStatus({ hideLabel, checkboxAccessory, }: { - id: string - label?: string + id?: string + label: string note?: string error?: string value: string @@ -59,6 +60,8 @@ export default function FieldSetWithStatus({ hideLabel?: boolean checkboxAccessory?: React.ReactNode }) { + const id = _id || parameterize(label); + const { pending } = useFormStatus(); const renderInput = @@ -66,13 +69,13 @@ export default function FieldSetWithStatus({ ref={inputRef} id={id} name={id} + type={type} value={value} checked={type === 'checkbox' ? value === 'true' : undefined} placeholder={placeholder} onChange={e => onChange?.(type === 'checkbox' ? e.target.value === 'true' ? 'false' : 'true' : e.target.value)} - type={type} spellCheck={spellCheck} autoComplete="off" autoCapitalize={!capitalize ? 'off' : undefined} diff --git a/src/photo/actions.ts b/src/photo/actions.ts index dcc1e6a8..507e165c 100644 --- a/src/photo/actions.ts +++ b/src/photo/actions.ts @@ -89,12 +89,16 @@ export const createPhotoAction = async (formData: FormData) => export const addAllUploadsAction = async ({ uploadUrls, tags, + favorite, + hidden, takenAtLocal, takenAtNaiveLocal, shouldRevalidateAllKeysAndPaths = true, }: { uploadUrls: string[] tags?: string + favorite?: string + hidden?: string takenAtLocal: string takenAtNaiveLocal: string shouldRevalidateAllKeysAndPaths?: boolean @@ -106,7 +110,7 @@ export const addAllUploadsAction = async ({ let currentUploadUrl = ''; let progress = 0; - const stream = createStreamableValue(); + const stream = createStreamableValue>(); const streamUpdate = ( statusMessage: string, @@ -157,6 +161,8 @@ export const addAllUploadsAction = async ({ title, caption, tags: tags || aiTags, + hidden, + favorite, semanticDescription, takenAt: formDataFromExif.takenAt || takenAtLocal, takenAtNaive: formDataFromExif.takenAtNaive || takenAtNaiveLocal,