feat: edit API keys (name, rights); quick dump text above its buttons; inline note badges
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m33s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m33s
- PATCH /keys/{id} renames a key or changes its scopes; the secret stays. Settings → API gets an
edit button per key with the same switches as for a new key.
- Quick dump: a multiline text gets the full width, the buttons move to their own row below; the
bar only goes back to one line once the text is clearly shorter (no flip-flopping).
- Notes: the "Erweitert"/"Unteraufgabe" badges sit right after the checkbox text.
v0.38.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6f2eb08489
commit
1e3ac9786f
14 files changed
+266
-76
No files matched your search
@@ -59,6 +59,9 @@ export const InstantCaptureBar: React.FC<InstantCaptureBarProps> = ({
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const [justSavedLabel, setJustSavedLabel] = useState<string | null>(null);
|
||||
const [isMultiline, setIsMultiline] = useState(false);
|
||||
// Text length at which the bar became multiline: there the buttons move below the text and the field
|
||||
// gets wider, so it only goes back to one line once the text is clearly shorter (no flip-flopping)
|
||||
const multilineAtRef = useRef(0);
|
||||
|
||||
const inputRef = useRef<HTMLTextAreaElement>(null);
|
||||
const containerRef = useRef<HTMLFormElement>(null);
|
||||
@@ -88,7 +91,16 @@ export const InstantCaptureBar: React.FC<InstantCaptureBarProps> = ({
|
||||
if (targetEl.value) {
|
||||
const scrollH = targetEl.scrollHeight;
|
||||
targetEl.style.height = `${Math.min(scrollH, 140)}px`;
|
||||
setIsMultiline(targetEl.value.includes('\n') || scrollH > 28);
|
||||
const len = targetEl.value.length;
|
||||
const wraps = targetEl.value.includes('\n') || scrollH > 28;
|
||||
setIsMultiline((was) => {
|
||||
if (!was && wraps) {
|
||||
multilineAtRef.current = len;
|
||||
return true;
|
||||
}
|
||||
if (was && !wraps) return len >= multilineAtRef.current - 8;
|
||||
return wraps;
|
||||
});
|
||||
setIsOverMaxHeight(scrollH > 140);
|
||||
} else {
|
||||
setIsMultiline(false);
|
||||
@@ -256,7 +268,7 @@ export const InstantCaptureBar: React.FC<InstantCaptureBarProps> = ({
|
||||
{/* Quick-Capture Input Bar (Radius controlled by --radius-pill / multiline) */}
|
||||
<div
|
||||
className={`flex ${
|
||||
isMultiline ? 'items-end py-1.5 min-h-[36px]' : 'items-center h-9'
|
||||
isMultiline ? 'flex-wrap items-start py-1.5 min-h-[36px]' : 'items-center h-9'
|
||||
} pl-1.5 pr-1.5 bg-panel border capture-pill ${
|
||||
isMultiline ? 'capture-bar-multiline' : 'rounded-full'
|
||||
} transition-all duration-150 ${
|
||||
@@ -304,7 +316,7 @@ export const InstantCaptureBar: React.FC<InstantCaptureBarProps> = ({
|
||||
? 'Notiz erfassen…'
|
||||
: 'Quick Dump…'
|
||||
}
|
||||
className={`w-full bg-transparent text-main placeholder-faint text-xs sm:text-sm focus:outline-none resize-none leading-5 py-0.5 ${
|
||||
className={`flex-1 min-w-0 w-full bg-transparent text-main placeholder-faint text-xs sm:text-sm focus:outline-none resize-none leading-5 py-0.5 ${
|
||||
isOverMaxHeight ? 'overflow-y-auto' : 'overflow-hidden'
|
||||
}`}
|
||||
style={{ minHeight: '22px', maxHeight: '140px' }}
|
||||
@@ -312,8 +324,9 @@ export const InstantCaptureBar: React.FC<InstantCaptureBarProps> = ({
|
||||
/>
|
||||
|
||||
<div
|
||||
className={`flex items-center gap-1 ml-2 flex-shrink-0 ${
|
||||
isMultiline ? 'self-end mb-0.5' : ''
|
||||
className={`flex items-center gap-1 flex-shrink-0 ${
|
||||
// Multiline: the buttons get their own row under the text, so the text keeps the full width
|
||||
isMultiline ? 'basis-full justify-end mt-1 animate-in fade-in slide-in-from-top-1 duration-150' : 'ml-2'
|
||||
}`}
|
||||
>
|
||||
{/* Target & Options Toggle Pill (Hidden when target picker is disabled) */}
|
||||
|
||||
Reference in new issue
Block a user