chore: update Angular cache and TypeScript build info files
This commit is contained in:
parent
20cc6e9215
commit
cf4a3b60eb
2
.angular/cache/20.3.3/app/.tsbuildinfo
vendored
2
.angular/cache/20.3.3/app/.tsbuildinfo
vendored
File diff suppressed because one or more lines are too long
@ -453,14 +453,15 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="relative w-full lg:flex-1 lg:max-w-none lg:min-w-0">
|
||||
<svg class="pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-obs-l-text-muted dark:text-obs-d-text-muted" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /></svg>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Rechercher dans la voûte..."
|
||||
[(ngModel)]="sidebarSearchTerm"
|
||||
(ngModelChange)="activeView.set('search')"
|
||||
class="w-full rounded-full border border-obs-l-border bg-obs-l-bg-secondary/60 pl-11 pr-4 py-2.5 text-sm text-obs-l-text-main placeholder:text-obs-l-text-muted shadow-sm focus:outline-none focus:ring-2 focus:ring-obs-l-accent dark:border-obs-d-border dark:bg-obs-d-bg-secondary/60 dark:text-obs-d-text-main dark:placeholder:text-obs-d-text-muted dark:focus:ring-obs-d-accent"
|
||||
aria-label="Rechercher dans la voûte"
|
||||
<app-search-input-with-assistant
|
||||
[value]="sidebarSearchTerm()"
|
||||
(valueChange)="updateSearchTerm($event, true)"
|
||||
(submit)="onSearchSubmit($event)"
|
||||
[placeholder]="'Rechercher dans la voûte...'"
|
||||
[context]="'vault-sidebar'"
|
||||
[showSearchIcon]="true"
|
||||
[showExamples]="false"
|
||||
[inputClass]="'w-full rounded-full border border-border bg-bg-muted/70 py-2.5 pr-4 text-sm text-text-main placeholder:text-text-muted shadow-subtle focus:outline-none focus:ring-2 focus:ring-ring transition-all dark:border-gray-600 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder-gray-400 dark:focus:ring-blue-500'"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -195,8 +195,9 @@
|
||||
(submit)="onSearchSubmit($event)"
|
||||
[placeholder]="'Rechercher dans la voûte...'"
|
||||
[context]="'vault-sidebar'"
|
||||
[showSearchIcon]="false"
|
||||
[inputClass]="'input'"
|
||||
[showSearchIcon]="true"
|
||||
[showExamples]="false"
|
||||
[inputClass]="'w-full rounded-full border border-border bg-bg-muted/70 py-2.5 pr-4 text-sm text-text-main placeholder:text-text-muted shadow-subtle focus:outline-none focus:ring-2 focus:ring-ring transition-all dark:border-gray-600 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder-gray-400 dark:focus:ring-blue-500'"
|
||||
/>
|
||||
</div>
|
||||
@if (activeTagDisplay(); as tagDisplay) {
|
||||
|
@ -559,8 +559,7 @@ export class AppComponent implements OnDestroy {
|
||||
|
||||
onSearchSubmit(query: string): void {
|
||||
if (query && query.trim()) {
|
||||
// Add to history
|
||||
this.searchHistoryService.add('vault-search', query);
|
||||
// History is already handled by SearchInputWithAssistant using its [context]
|
||||
// Update search term and switch to search view
|
||||
this.sidebarSearchTerm.set(query);
|
||||
this.activeView.set('search');
|
||||
|
@ -1,23 +1,27 @@
|
||||
import { Component, ChangeDetectionStrategy, input, output } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { SearchInputWithAssistantComponent } from '../../../../components/search-input-with-assistant/search-input-with-assistant.component';
|
||||
import { GraphConfig } from '../../graph-settings.types';
|
||||
|
||||
@Component({
|
||||
selector: 'app-graph-filters-section',
|
||||
standalone: true,
|
||||
imports: [CommonModule, FormsModule],
|
||||
imports: [CommonModule, FormsModule, SearchInputWithAssistantComponent],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
template: `
|
||||
<div class="space-y-3">
|
||||
<!-- Search input -->
|
||||
<div>
|
||||
<input
|
||||
type="text"
|
||||
[ngModel]="config().search"
|
||||
(ngModelChange)="onSearchChange($event)"
|
||||
placeholder="Search files..."
|
||||
class="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors">
|
||||
<app-search-input-with-assistant
|
||||
[placeholder]="'Search files...'"
|
||||
[value]="config().search || ''"
|
||||
[context]="'graph-filters'"
|
||||
[showSearchIcon]="true"
|
||||
[showExamples]="false"
|
||||
(valueChange)="onSearchChange($event)"
|
||||
(submit)="onSearchChange($event)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Toggle options -->
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Component, ChangeDetectionStrategy, input, output, inject, effect } from '@angular/core';
|
||||
import { Component, ChangeDetectionStrategy, input, output, inject, effect, signal } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { GraphConfig } from '../graph-settings.types';
|
||||
import { GraphSettingsService } from '../graph-settings.service';
|
||||
@ -52,99 +52,82 @@ import { GraphForcesSectionComponent } from './sections/forces-section.component
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
<section class="section">
|
||||
<button type="button" (click)="toggleSection('filter')" class="section-header">
|
||||
<div class="flex items-center gap-2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
|
||||
</svg>
|
||||
<span>Filters</span>
|
||||
</div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transition-transform" [class.rotate-180]="!config()['collapse-filter']" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
<p-accordion
|
||||
class="graph-settings-accordion"
|
||||
[multiple]="true"
|
||||
[value]="accordionValue()"
|
||||
(valueChange)="onAccordionValueChange($event)">
|
||||
|
||||
@if (!config()['collapse-filter']) {
|
||||
<div class="section-content">
|
||||
<p-accordion-panel value="filters">
|
||||
<p-accordion-header>
|
||||
<span class="header-content">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
|
||||
</svg>
|
||||
<span>Filters</span>
|
||||
</span>
|
||||
</p-accordion-header>
|
||||
<p-accordion-content>
|
||||
<app-graph-filters-section
|
||||
[config]="config()"
|
||||
(configChange)="onConfigChange($event)">
|
||||
</app-graph-filters-section>
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
</p-accordion-content>
|
||||
</p-accordion-panel>
|
||||
|
||||
<section class="section">
|
||||
<button type="button" (click)="toggleSection('color-groups')" class="section-header">
|
||||
<div class="flex items-center gap-2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" />
|
||||
</svg>
|
||||
<span>Groups</span>
|
||||
</div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transition-transform" [class.rotate-180]="!config()['collapse-color-groups']" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
@if (!config()['collapse-color-groups']) {
|
||||
<div class="section-content">
|
||||
<p-accordion-panel value="groups">
|
||||
<p-accordion-header>
|
||||
<span class="header-content">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" />
|
||||
</svg>
|
||||
<span>Groups</span>
|
||||
</span>
|
||||
</p-accordion-header>
|
||||
<p-accordion-content>
|
||||
<app-graph-groups-section
|
||||
[config]="config()"
|
||||
(configChange)="onConfigChange($event)">
|
||||
</app-graph-groups-section>
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
</p-accordion-content>
|
||||
</p-accordion-panel>
|
||||
|
||||
<section class="section">
|
||||
<button type="button" (click)="toggleSection('display')" class="section-header">
|
||||
<div class="flex items-center gap-2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
|
||||
</svg>
|
||||
<span>Display</span>
|
||||
</div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transition-transform" [class.rotate-180]="!config()['collapse-display']" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
@if (!config()['collapse-display']) {
|
||||
<div class="section-content">
|
||||
<p-accordion-panel value="display">
|
||||
<p-accordion-header>
|
||||
<span class="header-content">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
|
||||
</svg>
|
||||
<span>Display</span>
|
||||
</span>
|
||||
</p-accordion-header>
|
||||
<p-accordion-content>
|
||||
<app-graph-display-section
|
||||
[config]="config()"
|
||||
(configChange)="onConfigChange($event)"
|
||||
(animateRequested)="animateRequested.emit()">
|
||||
</app-graph-display-section>
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
</p-accordion-content>
|
||||
</p-accordion-panel>
|
||||
|
||||
<section class="section">
|
||||
<button type="button" (click)="toggleSection('forces')" class="section-header">
|
||||
<div class="flex items-center gap-2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
|
||||
</svg>
|
||||
<span>Forces</span>
|
||||
</div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transition-transform" [class.rotate-180]="!config()['collapse-forces']" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
@if (!config()['collapse-forces']) {
|
||||
<div class="section-content">
|
||||
<p-accordion-panel value="forces">
|
||||
<p-accordion-header>
|
||||
<span class="header-content">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
|
||||
</svg>
|
||||
<span>Forces</span>
|
||||
</span>
|
||||
</p-accordion-header>
|
||||
<p-accordion-content>
|
||||
<app-graph-forces-section
|
||||
[config]="config()"
|
||||
(configChange)="onConfigChange($event)">
|
||||
</app-graph-forces-section>
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
</p-accordion-content>
|
||||
</p-accordion-panel>
|
||||
</p-accordion>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@ -204,53 +187,76 @@ import { GraphForcesSectionComponent } from './sections/forces-section.component
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 1rem;
|
||||
border: 1px solid #E5E7EB;
|
||||
border-radius: 0.5rem;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-panel {
|
||||
border: 1px solid rgba(148, 163, 184, 0.35);
|
||||
border-radius: 0.85rem;
|
||||
background-color: #ffffff;
|
||||
overflow: hidden;
|
||||
margin-bottom: 0.875rem;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
:host-context(.dark) .section {
|
||||
border-color: #374151;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-panel:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.section-header {
|
||||
width: 100%;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-header {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
color: #1e293b;
|
||||
padding: 0.95rem 1.2rem;
|
||||
background: linear-gradient(180deg, rgba(248, 250, 252, 0.9) 0%, rgba(248, 250, 252, 0.6) 100%);
|
||||
}
|
||||
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-header .header-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0.75rem 1rem;
|
||||
background-color: #F9FAFB;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
color: #111827;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
border: none;
|
||||
text-align: left;
|
||||
gap: 0.6rem;
|
||||
}
|
||||
|
||||
.section-header:hover {
|
||||
background-color: #F3F4F6;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-header:hover {
|
||||
background: rgba(241, 245, 249, 0.9);
|
||||
}
|
||||
|
||||
:host-context(.dark) .section-header {
|
||||
background-color: #374151;
|
||||
color: #F3F4F6;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-toggle-icon {
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
:host-context(.dark) .section-header:hover {
|
||||
background-color: #4B5563;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-panel-active {
|
||||
border-color: rgba(59, 130, 246, 0.45);
|
||||
box-shadow: 0 12px 24px -16px rgba(15, 23, 42, 0.35);
|
||||
}
|
||||
|
||||
.section-content {
|
||||
padding: 1rem;
|
||||
background-color: white;
|
||||
:host ::ng-deep .graph-settings-accordion .p-accordion-content {
|
||||
background-color: #ffffff;
|
||||
padding: 1.1rem 1.25rem 1.25rem;
|
||||
}
|
||||
|
||||
:host-context(.dark) .section-content {
|
||||
background-color: #1F2937;
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-panel {
|
||||
border-color: rgba(71, 85, 105, 0.5);
|
||||
background-color: rgba(30, 41, 59, 0.9);
|
||||
}
|
||||
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-panel-active {
|
||||
border-color: rgba(96, 165, 250, 0.6);
|
||||
box-shadow: 0 12px 28px -12px rgba(2, 132, 199, 0.35);
|
||||
}
|
||||
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-header {
|
||||
color: #f8fafc;
|
||||
background: linear-gradient(180deg, rgba(30, 41, 59, 0.95) 0%, rgba(30, 41, 59, 0.75) 100%);
|
||||
}
|
||||
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-header:hover {
|
||||
background: rgba(30, 41, 59, 0.9);
|
||||
}
|
||||
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-toggle-icon {
|
||||
color: #e2e8f0;
|
||||
}
|
||||
|
||||
:host-context(.dark) ::ng-deep .graph-settings-accordion .p-accordion-content {
|
||||
background-color: rgba(15, 23, 42, 0.9);
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
@ -258,10 +264,6 @@ import { GraphForcesSectionComponent } from './sections/forces-section.component
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.rotate-180 {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
`]
|
||||
})
|
||||
export class GraphSettingsPanelComponent {
|
||||
@ -272,35 +274,49 @@ export class GraphSettingsPanelComponent {
|
||||
private settingsService = inject(GraphSettingsService);
|
||||
|
||||
config = this.settingsService.config;
|
||||
accordionValue = signal<string[]>([]);
|
||||
|
||||
constructor() {
|
||||
// Listen to Escape key globally when panel is open
|
||||
effect(() => {
|
||||
if (this.isOpen()) {
|
||||
const handler = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
this.close.emit();
|
||||
}
|
||||
};
|
||||
document.addEventListener('keydown', handler);
|
||||
|
||||
return () => document.removeEventListener('keydown', handler);
|
||||
if (!this.isOpen()) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
const handler = (e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
this.close.emit();
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('keydown', handler);
|
||||
|
||||
return () => document.removeEventListener('keydown', handler);
|
||||
});
|
||||
}
|
||||
|
||||
onConfigChange(patch: Partial<GraphConfig>): void {
|
||||
this.settingsService.save(patch);
|
||||
}
|
||||
// Keep accordion state in sync with persisted collapse flags
|
||||
effect(() => {
|
||||
const currentConfig = this.config();
|
||||
const active: string[] = [];
|
||||
|
||||
toggleSection(section: 'filter' | 'color-groups' | 'display' | 'forces'): void {
|
||||
this.settingsService.toggleCollapse(section);
|
||||
}
|
||||
if (!currentConfig['collapse-filter']) {
|
||||
active.push('filters');
|
||||
}
|
||||
|
||||
if (!currentConfig['collapse-color-groups']) {
|
||||
active.push('groups');
|
||||
}
|
||||
|
||||
if (!currentConfig['collapse-display']) {
|
||||
active.push('display');
|
||||
}
|
||||
|
||||
if (!currentConfig['collapse-forces']) {
|
||||
active.push('forces');
|
||||
}
|
||||
|
||||
this.accordionValue.set(active);
|
||||
});
|
||||
|
||||
onResetAll(): void {
|
||||
if (confirm('Reset all graph settings to defaults?')) {
|
||||
this.settingsService.resetToDefaults();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ import { SearchOptions } from '../../core/search/search-parser.types';
|
||||
(keydown.enter)="onEnter()"
|
||||
(keydown.escape)="onEscape()"
|
||||
[class]="inputClass"
|
||||
[style.padding-left]="showSearchIcon ? '2.5rem' : '0.75rem'"
|
||||
[style.padding-left]="showSearchIcon ? '2.75rem' : '1rem'"
|
||||
[style.padding-right]="'7rem'"
|
||||
[attr.aria-label]="placeholder"
|
||||
autocomplete="off"
|
||||
@ -112,7 +112,9 @@ import { SearchOptions } from '../../core/search/search-parser.types';
|
||||
[context]="context"
|
||||
[currentQuery]="query"
|
||||
[anchorElement]="anchorElement"
|
||||
[showExamples]="showExamples"
|
||||
(queryChange)="onQueryChange($event)"
|
||||
(previewChange)="onPreviewChange($event)"
|
||||
(querySubmit)="onQuerySubmit($event)"
|
||||
/>
|
||||
</div>
|
||||
@ -131,8 +133,9 @@ import { SearchOptions } from '../../core/search/search-parser.types';
|
||||
export class SearchBarComponent implements AfterViewInit, OnInit {
|
||||
@Input() placeholder: string = 'Search in vault...';
|
||||
@Input() context: string = 'vault';
|
||||
@Input() showExamples: boolean = true;
|
||||
@Input() showSearchIcon: boolean = true;
|
||||
@Input() inputClass: string = 'w-full px-3 py-2 text-sm border border-border dark:border-gray-600 rounded-lg bg-bg-primary dark:bg-gray-800 text-text-main dark:text-gray-100 placeholder-text-muted dark:placeholder-gray-500 focus:ring-2 focus:ring-accent dark:focus:ring-blue-500 transition-all';
|
||||
@Input() inputClass: string = 'w-full rounded-full border border-border bg-bg-muted/70 py-2.5 pr-4 text-sm text-text-main placeholder:text-text-muted shadow-subtle focus:outline-none focus:ring-2 focus:ring-ring transition-all dark:border-gray-600 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder-gray-400 dark:focus:ring-blue-500';
|
||||
@Input() initialQuery: string = '';
|
||||
|
||||
@Output() search = new EventEmitter<{ query: string; options: SearchOptions }>();
|
||||
@ -157,6 +160,16 @@ export class SearchBarComponent implements AfterViewInit, OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle preview changes from assistant: update visible input only.
|
||||
*/
|
||||
onPreviewChange(preview: string): void {
|
||||
this.query = preview;
|
||||
if (this.searchInputRef) {
|
||||
this.searchInputRef.nativeElement.value = preview;
|
||||
}
|
||||
}
|
||||
|
||||
ngAfterViewInit(): void {
|
||||
this.anchorElement = this.hostElement.nativeElement;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ import { SearchHistoryService } from '../../core/search/search-history.service';
|
||||
<div class="relative">
|
||||
<svg
|
||||
*ngIf="showSearchIcon"
|
||||
class="pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-text-muted"
|
||||
class="pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-text-muted dark:text-gray-400"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
@ -47,6 +47,7 @@ import { SearchHistoryService } from '../../core/search/search-history.service';
|
||||
(blur)="onBlur()"
|
||||
(keydown.enter)="onEnter()"
|
||||
[class]="inputClass"
|
||||
[style.padding-left]="showSearchIcon ? '2.75rem' : '1rem'"
|
||||
[attr.aria-label]="placeholder"
|
||||
/>
|
||||
|
||||
@ -67,7 +68,9 @@ import { SearchHistoryService } from '../../core/search/search-history.service';
|
||||
[context]="context"
|
||||
[currentQuery]="value"
|
||||
[anchorElement]="anchorElement"
|
||||
[showExamples]="showExamples"
|
||||
(queryChange)="onQueryChange($event)"
|
||||
(previewChange)="onPreviewChange($event)"
|
||||
(querySubmit)="onQuerySubmit($event)"
|
||||
/>
|
||||
</div>
|
||||
@ -83,7 +86,8 @@ export class SearchInputWithAssistantComponent implements AfterViewInit {
|
||||
@Input() value: string = '';
|
||||
@Input() context: string = 'default';
|
||||
@Input() showSearchIcon: boolean = true;
|
||||
@Input() inputClass: string = 'w-full px-3 py-2 text-sm border border-border rounded-md bg-bg-primary text-text-main placeholder-text-muted focus:outline-none focus:ring-2 focus:ring-accent';
|
||||
@Input() inputClass: string = 'w-full rounded-full border border-border bg-bg-muted/70 py-2.5 pr-4 text-sm text-text-main placeholder:text-text-muted shadow-subtle focus:outline-none focus:ring-2 focus:ring-ring transition-all dark:border-gray-600 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder-gray-400 dark:focus:ring-blue-500';
|
||||
@Input() showExamples: boolean = true;
|
||||
|
||||
@Output() valueChange = new EventEmitter<string>();
|
||||
@Output() submit = new EventEmitter<string>();
|
||||
@ -170,6 +174,17 @@ export class SearchInputWithAssistantComponent implements AfterViewInit {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle preview change from assistant (keyboard navigation):
|
||||
* only update the visible input value without emitting or recomputing.
|
||||
*/
|
||||
onPreviewChange(query: string): void {
|
||||
this.value = query;
|
||||
if (this.searchInputRef) {
|
||||
this.searchInputRef.nativeElement.value = query;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle query submit from assistant
|
||||
*/
|
||||
|
@ -33,6 +33,7 @@ import { VaultService } from '../../services/vault.service';
|
||||
[placeholder]="placeholder"
|
||||
[context]="context"
|
||||
[showSearchIcon]="true"
|
||||
[showExamples]="false"
|
||||
(search)="onSearch($event)"
|
||||
(queryChange)="onQueryChange($event)"
|
||||
/>
|
||||
|
@ -82,7 +82,7 @@ type NavigationItem =
|
||||
{{ option.description }}
|
||||
</div>
|
||||
<span
|
||||
*ngIf="option.example"
|
||||
*ngIf="showExamples && option.example"
|
||||
class="text-[11px] text-text-muted dark:text-gray-500 font-mono ml-2 truncate"
|
||||
>
|
||||
{{ option.example }}
|
||||
@ -180,8 +180,10 @@ export class SearchQueryAssistantComponent {
|
||||
@Input() context: string = 'default'; // Search context (vault, graph, etc.)
|
||||
@Input() currentQuery: string = '';
|
||||
@Input() anchorElement: HTMLElement | null = null;
|
||||
@Input() showExamples: boolean = true;
|
||||
@Output() queryChange = new EventEmitter<string>();
|
||||
@Output() querySubmit = new EventEmitter<string>();
|
||||
@Output() previewChange = new EventEmitter<string>();
|
||||
|
||||
@ViewChild('popover') popoverRef?: ElementRef;
|
||||
|
||||
@ -482,7 +484,8 @@ export class SearchQueryAssistantComponent {
|
||||
}
|
||||
|
||||
this.currentQuery = previewQuery ?? this.currentQuery;
|
||||
this.queryChange.emit(this.currentQuery);
|
||||
// Emit preview change instead of confirmed change to avoid recomputing options in parent
|
||||
this.previewChange.emit(this.currentQuery);
|
||||
}
|
||||
|
||||
isSelected(type: NavigationItem['type'], index: number): boolean {
|
||||
|
4
vault/.obsidian/graph.json.bak
vendored
4
vault/.obsidian/graph.json.bak
vendored
@ -1,7 +1,7 @@
|
||||
{
|
||||
"collapse-filter": false,
|
||||
"search": "",
|
||||
"showTags": true,
|
||||
"search": "file:",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": false,
|
||||
|
Loading…
x
Reference in New Issue
Block a user