mirror of
https://github.com/johannesjo/super-productivity.git
synced 2026-01-23 02:36:05 +00:00
fix(mentions): resolve TypeScript compilation errors
- Remove duplicate MentionItem interface definition from mention-config.ts - Fix TemplateRef type to match Angular's expected template context structure - Update type casting for TagCopy and ProjectCopy arrays in add-task-bar component - Remove unused CustomEvent interface from mention directive - Fix syntax error in electron main-window.ts 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> # Conflicts: # electron/main-window.ts
This commit is contained in:
parent
3cbe3eef68
commit
7417cd9b65
5 changed files with 90 additions and 36 deletions
|
|
@ -19,9 +19,9 @@ import { error, log } from 'electron-log/main';
|
|||
import { GlobalConfigState } from '../src/app/features/config/global-config.model';
|
||||
import { IS_MAC } from './common.const';
|
||||
import {
|
||||
showOverlayWindow,
|
||||
hideOverlayWindow,
|
||||
destroyOverlayWindow,
|
||||
hideOverlayWindow,
|
||||
showOverlayWindow,
|
||||
} from './overlay-indicator/overlay-indicator';
|
||||
|
||||
let mainWin: BrowserWindow;
|
||||
|
|
@ -119,7 +119,9 @@ export const createWindow = ({
|
|||
|
||||
// NOTE this is needed for GitHub api requests to work :(
|
||||
// office365 needs a User-Agent as well (#4677)
|
||||
if (new URL(details.url).hostname in ['github.com', 'office365.com', 'outlook.live.com']) {
|
||||
if (
|
||||
new URL(details.url).hostname in ['github.com', 'office365.com', 'outlook.live.com']
|
||||
) {
|
||||
removeKeyInAnyCase(requestHeaders, 'User-Agent');
|
||||
}
|
||||
callback({ requestHeaders });
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import {
|
|||
} from '@angular/core';
|
||||
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { MentionConfig, MentionModule } from '../../../ui/mentions';
|
||||
import { MentionConfig, MentionModule, MentionItem } from '../../../ui/mentions';
|
||||
import { MatInput } from '@angular/material/input';
|
||||
import { MatIconButton } from '@angular/material/button';
|
||||
import { MatIcon } from '@angular/material/icon';
|
||||
|
|
@ -243,7 +243,7 @@ export class AddTaskBarComponent implements AfterViewInit, OnInit, OnDestroy {
|
|||
const mentions: Mentions[] = [];
|
||||
if (cfg.isEnableTag) {
|
||||
mentions.push({
|
||||
items: tagSuggestions || [],
|
||||
items: (tagSuggestions as unknown as MentionItem[]) || [],
|
||||
labelKey: 'title',
|
||||
triggerChar: '#',
|
||||
});
|
||||
|
|
@ -257,7 +257,7 @@ export class AddTaskBarComponent implements AfterViewInit, OnInit, OnDestroy {
|
|||
}
|
||||
if (cfg.isEnableProject) {
|
||||
mentions.push({
|
||||
items: projectSuggestions || [],
|
||||
items: (projectSuggestions as unknown as MentionItem[]) || [],
|
||||
labelKey: 'title',
|
||||
triggerChar: '+',
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
// configuration structure, backwards compatible with earlier versions
|
||||
|
||||
export interface MentionItem {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
import { MentionItem } from './mention-types';
|
||||
|
||||
export { MentionItem } from './mention-types';
|
||||
|
||||
export interface MentionConfig<T = MentionItem> extends Mentions<T> {
|
||||
// nested config
|
||||
|
|
@ -13,7 +13,7 @@ export interface MentionConfig<T = MentionItem> extends Mentions<T> {
|
|||
}
|
||||
|
||||
export interface Mentions<T = MentionItem> {
|
||||
// an array of strings or objects to suggest
|
||||
// an array of strings or objects to suggest - can be any array for flexibility
|
||||
items?: T[] | string[];
|
||||
|
||||
// the character that will trigger the menu behavior
|
||||
|
|
|
|||
38
src/app/ui/mentions/mention-types.ts
Normal file
38
src/app/ui/mentions/mention-types.ts
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
// Type definitions for mention functionality
|
||||
|
||||
export interface MentionItem {
|
||||
[key: string]: string | number | boolean | null | undefined;
|
||||
}
|
||||
|
||||
export interface MentionEvent extends Partial<Event> {
|
||||
keyCode?: number;
|
||||
key?: string;
|
||||
which?: number;
|
||||
shiftKey?: boolean;
|
||||
metaKey?: boolean;
|
||||
altKey?: boolean;
|
||||
ctrlKey?: boolean;
|
||||
isComposing?: boolean;
|
||||
data?: string;
|
||||
wasClick?: boolean;
|
||||
inputEvent?: boolean;
|
||||
preventDefault?(): void;
|
||||
stopPropagation?(): void;
|
||||
stopImmediatePropagation?(): void;
|
||||
}
|
||||
|
||||
export interface CaretPositionNode extends Node {
|
||||
anchorNode: Node | null;
|
||||
getRangeAt(index: number): Range;
|
||||
rangeCount: number;
|
||||
}
|
||||
|
||||
export interface MentionSelection {
|
||||
anchorNode: Node | null;
|
||||
}
|
||||
|
||||
// Type for the startNode which can be either a text node or element
|
||||
export type MentionNode = Node | Element | null;
|
||||
|
||||
// Utility type for HTML elements that can contain text
|
||||
export type TextInputElement = HTMLInputElement | HTMLTextAreaElement;
|
||||
|
|
@ -20,15 +20,17 @@ import {
|
|||
isInputOrTextAreaElement,
|
||||
} from './mention-utils';
|
||||
|
||||
import { MentionConfig, MentionItem } from './mention-config';
|
||||
import { MentionConfig } from './mention-config';
|
||||
import { MentionListComponent } from './mention-list.component';
|
||||
import { Log } from '../../core/log';
|
||||
import {
|
||||
MentionItem,
|
||||
MentionEvent,
|
||||
MentionNode,
|
||||
TextInputElement,
|
||||
} from './mention-types';
|
||||
|
||||
// Custom types for mention events
|
||||
interface CustomEvent extends Event {
|
||||
wasClick?: boolean;
|
||||
}
|
||||
|
||||
interface CustomKeyboardEvent extends KeyboardEvent {
|
||||
inputEvent?: boolean;
|
||||
wasClick?: boolean;
|
||||
|
|
@ -165,7 +167,7 @@ export class MentionDirective implements OnChanges {
|
|||
|
||||
private searchString: string | null = null;
|
||||
private startPos: number = -1;
|
||||
private startNode: Node | null = null;
|
||||
private startNode: MentionNode = null;
|
||||
private searchList?: MentionListComponent;
|
||||
private searching: boolean = false;
|
||||
private iframe: HTMLIFrameElement | null = null; // optional
|
||||
|
|
@ -207,7 +209,7 @@ export class MentionDirective implements OnChanges {
|
|||
// convert strings to objects
|
||||
if (typeof items[0] == 'string') {
|
||||
items = (items as string[]).map((label) => {
|
||||
const object: Record<string, unknown> = {};
|
||||
const object: MentionItem = {};
|
||||
object[config.labelKey || 'label'] = label;
|
||||
return object;
|
||||
});
|
||||
|
|
@ -238,23 +240,34 @@ export class MentionDirective implements OnChanges {
|
|||
this.iframe = iframe;
|
||||
}
|
||||
|
||||
stopEvent(event: CustomEvent): void {
|
||||
stopEvent(event: MentionEvent | null): void {
|
||||
// Handle null or undefined events gracefully
|
||||
if (!event) {
|
||||
return;
|
||||
}
|
||||
//if (event instanceof KeyboardEvent) { // does not work for iframe
|
||||
if (!event.wasClick) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
event.stopImmediatePropagation();
|
||||
// Add defensive checks to ensure methods exist before calling them
|
||||
if (typeof event.preventDefault === 'function') {
|
||||
event.preventDefault();
|
||||
}
|
||||
if (typeof event.stopPropagation === 'function') {
|
||||
event.stopPropagation();
|
||||
}
|
||||
if (typeof event.stopImmediatePropagation === 'function') {
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blurHandler(event: FocusEvent): void {
|
||||
blurHandler(event: MentionEvent): void {
|
||||
this.stopEvent(event);
|
||||
this.stopSearch();
|
||||
}
|
||||
|
||||
inputHandler(
|
||||
event: InputEvent,
|
||||
nativeElement: HTMLInputElement = this._element.nativeElement,
|
||||
event: MentionEvent,
|
||||
nativeElement: TextInputElement = this._element.nativeElement,
|
||||
): void {
|
||||
if (this.lastKeyCode === KEY_BUFFERED && event.data) {
|
||||
const keyCode = event.data.charCodeAt(0);
|
||||
|
|
@ -267,10 +280,10 @@ export class MentionDirective implements OnChanges {
|
|||
|
||||
// @param nativeElement is the alternative text element in an iframe scenario
|
||||
keyHandler(
|
||||
event: CustomKeyboardEvent,
|
||||
nativeElement: HTMLInputElement = this._element.nativeElement,
|
||||
event: MentionEvent,
|
||||
nativeElement: TextInputElement = this._element.nativeElement,
|
||||
): boolean | undefined {
|
||||
this.lastKeyCode = event.keyCode;
|
||||
this.lastKeyCode = event.keyCode || 0;
|
||||
|
||||
if (event.isComposing || event.keyCode === KEY_BUFFERED) {
|
||||
return undefined;
|
||||
|
|
@ -284,7 +297,7 @@ export class MentionDirective implements OnChanges {
|
|||
}
|
||||
let charPressed = event.key;
|
||||
if (!charPressed) {
|
||||
const charCode = event.which || event.keyCode;
|
||||
const charCode = event.which || event.keyCode || 0;
|
||||
if (!event.shiftKey && charCode >= 65 && charCode <= 90) {
|
||||
charPressed = String.fromCharCode(charCode + 32);
|
||||
}
|
||||
|
|
@ -294,7 +307,7 @@ export class MentionDirective implements OnChanges {
|
|||
else {
|
||||
// TODO (dmacfarlane) fix this for non-alpha keys
|
||||
// http://stackoverflow.com/questions/2220196/how-to-decode-character-pressed-from-jquerys-keydowns-event-handler?lq=1
|
||||
charPressed = String.fromCharCode(event.which || event.keyCode);
|
||||
charPressed = String.fromCharCode((event.which || event.keyCode) ?? 0);
|
||||
}
|
||||
}
|
||||
if (event.keyCode == KEY_ENTER && event.wasClick && pos < this.startPos) {
|
||||
|
|
@ -305,7 +318,7 @@ export class MentionDirective implements OnChanges {
|
|||
setCaretPosition(
|
||||
isInputOrTextAreaElement(nativeElement)
|
||||
? nativeElement
|
||||
: (this.startNode as HTMLInputElement),
|
||||
: (this.startNode as HTMLInputElement | HTMLTextAreaElement),
|
||||
pos,
|
||||
this.iframe,
|
||||
);
|
||||
|
|
@ -316,9 +329,10 @@ export class MentionDirective implements OnChanges {
|
|||
if (config) {
|
||||
this.activeConfig = config;
|
||||
this.startPos = event.inputEvent ? pos - 1 : pos;
|
||||
this.startNode =
|
||||
(this.iframe ? this.iframe.contentWindow?.getSelection() : window.getSelection())
|
||||
?.anchorNode || null;
|
||||
const selection = this.iframe
|
||||
? this.iframe.contentWindow?.getSelection()
|
||||
: window.getSelection();
|
||||
this.startNode = selection?.anchorNode || null;
|
||||
this.searching = true;
|
||||
this.searchString = null;
|
||||
this.showSearchList(nativeElement);
|
||||
|
|
@ -435,7 +449,7 @@ export class MentionDirective implements OnChanges {
|
|||
// exposed for external calls to open the mention list, e.g. by clicking a button
|
||||
public startSearch(
|
||||
triggerChar?: string,
|
||||
nativeElement: HTMLInputElement = this._element.nativeElement,
|
||||
nativeElement: TextInputElement = this._element.nativeElement,
|
||||
): void {
|
||||
triggerChar =
|
||||
triggerChar ||
|
||||
|
|
@ -491,7 +505,7 @@ export class MentionDirective implements OnChanges {
|
|||
}
|
||||
}
|
||||
|
||||
showSearchList(nativeElement: HTMLInputElement): void {
|
||||
showSearchList(nativeElement: TextInputElement): void {
|
||||
this.opened.emit();
|
||||
this.listShownChange.emit(true);
|
||||
|
||||
|
|
@ -515,7 +529,7 @@ export class MentionDirective implements OnChanges {
|
|||
this.searchList.dropUp = this.activeConfig!.dropUp || false;
|
||||
this.searchList.styleOff = this.mentionConfig.disableStyle || false;
|
||||
this.searchList.activeIndex = 0;
|
||||
this.searchList.position(nativeElement, this.iframe);
|
||||
this.searchList.position(nativeElement as HTMLInputElement, this.iframe);
|
||||
if (this.searchList) {
|
||||
window.requestAnimationFrame(() => this.searchList!.reset());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue