lägg till dexie och förbered för att ladda in data
This commit is contained in:
parent
2ae2227a4d
commit
7b6e7c484e
7
package-lock.json
generated
7
package-lock.json
generated
@ -14,6 +14,7 @@
|
||||
"@oslojs/crypto": "^1.0.1",
|
||||
"@oslojs/encoding": "^1.1.0",
|
||||
"@tauri-apps/api": "^2.2.0",
|
||||
"dexie": "^4.0.11",
|
||||
"drizzle-orm": "^0.38.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -4285,6 +4286,12 @@
|
||||
"integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dexie": {
|
||||
"version": "4.0.11",
|
||||
"resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.11.tgz",
|
||||
"integrity": "sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/didyoumean": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
|
||||
|
@ -54,6 +54,7 @@
|
||||
"@oslojs/crypto": "^1.0.1",
|
||||
"@oslojs/encoding": "^1.1.0",
|
||||
"@tauri-apps/api": "^2.2.0",
|
||||
"dexie": "^4.0.11",
|
||||
"drizzle-orm": "^0.38.4"
|
||||
}
|
||||
}
|
||||
|
53
src/db/main.ts
Normal file
53
src/db/main.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import Dexie, { type Table } from "dexie";
|
||||
|
||||
|
||||
export interface SyncInfo {
|
||||
key: string;
|
||||
last_sync: Date;
|
||||
}
|
||||
|
||||
export interface List {
|
||||
id?: number;
|
||||
name: string;
|
||||
type: boolean;
|
||||
updated: Date;
|
||||
}
|
||||
|
||||
export interface Shortform {
|
||||
id?: number;
|
||||
listid: number;
|
||||
shortform: string;
|
||||
phrase: string;
|
||||
used: Date;
|
||||
uses: number;
|
||||
remind: number, // negative if disabled
|
||||
updated: Date;
|
||||
}
|
||||
|
||||
|
||||
export class SkrivertDB extends Dexie {
|
||||
syncInfo!: Table<SyncInfo>;
|
||||
shortforms!: Table<Shortform>;
|
||||
lists!: Table<List>;
|
||||
constructor() {
|
||||
super("skrivertdb");
|
||||
this.version(1).stores({
|
||||
syncInfo: "key, last_sync",
|
||||
shortforms: "++id, listid, shortform, phrase, last_use, uses, remind, updated",
|
||||
lists: "++id, name, type, updated",
|
||||
});
|
||||
this.on("ready", async (db) => {
|
||||
console.log("Do ready stuff...") // Check if we have any local data
|
||||
const localListsCount = await db.table("lists").count();
|
||||
const lastSync = await db.table("syncInfo").get("lastFullSync");
|
||||
const lastSyncTime = lastSync?.lastSync || 0;
|
||||
|
||||
if (localListsCount === 0) {
|
||||
// No local data - perform full download
|
||||
console.log('No local data found. Prompt user to import data or use standard list...');
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const db = new SkrivertDB();
|
10092
src/db/shortforms.se.json
Normal file
10092
src/db/shortforms.se.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,16 @@
|
||||
export const insertText = (textarea, text) => {
|
||||
export const insertText = (textarea: HTMLTextAreaElement, text: string) => {
|
||||
const start = textarea.selectionStart;
|
||||
const end = textarea.selectionStart + text.length;
|
||||
textarea.setRangeText(text, start, end, "end");
|
||||
};
|
||||
|
||||
export const insertExpandedPhrase = (textarea, expander, len, text) => {
|
||||
export const insertExpandedPhrase = (textarea: HTMLTextAreaElement, expander: string, len: number, text: string) => {
|
||||
const start = textarea.selectionStart - len;
|
||||
const end = textarea.selectionStart;
|
||||
textarea.setRangeText(text.concat(expander), start, end, "end");
|
||||
};
|
||||
|
||||
const findIndexOfCurrentWord = (textarea) => {
|
||||
const findIndexOfCurrentWord = (textarea: HTMLTextAreaElement) => {
|
||||
const currentValue = textarea.value;
|
||||
const cursorPos = textarea.selectionStart;
|
||||
|
||||
@ -25,7 +25,7 @@ const findIndexOfCurrentWord = (textarea) => {
|
||||
return startIndex;
|
||||
};
|
||||
|
||||
export const getCurrentWord = (textarea) => {
|
||||
export const getCurrentWord = (textarea: HTMLTextAreaElement) => {
|
||||
const currentValue = textarea.value;
|
||||
const cursorPos = textarea.selectionStart;
|
||||
const startIndex = findIndexOfCurrentWord(textarea);
|
||||
|
11
src/modules/index.d.ts
vendored
Normal file
11
src/modules/index.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
type KeyType = {
|
||||
keyCode: number;
|
||||
shiftKey?: boolean;
|
||||
ctrlKey?: boolean;
|
||||
};
|
||||
|
||||
export type ExpanderType = {
|
||||
key: KeyType;
|
||||
symbol: string;
|
||||
fullstop: boolean;
|
||||
};
|
74
src/modules/keyboard.ts
Normal file
74
src/modules/keyboard.ts
Normal file
@ -0,0 +1,74 @@
|
||||
import type { ExpanderType } from "./index.d.ts";
|
||||
|
||||
export const defaultExpanders: Map<string, ExpanderType> = new Map();
|
||||
|
||||
defaultExpanders.set(" ", {
|
||||
key: { keyCode: 190, shiftKey: false },
|
||||
symbol: " ",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(".", {
|
||||
key: { keyCode: 190, shiftKey: false },
|
||||
symbol: ".",
|
||||
fullstop: true,
|
||||
});
|
||||
defaultExpanders.set("!", {
|
||||
key: { keyCode: 49, shiftKey: true },
|
||||
symbol: "!",
|
||||
fullstop: true,
|
||||
});
|
||||
defaultExpanders.set("?", {
|
||||
key: { keyCode: 187, shiftKey: true },
|
||||
symbol: "?",
|
||||
fullstop: true,
|
||||
});
|
||||
defaultExpanders.set("+", {
|
||||
key: { keyCode: 187, shiftKey: false },
|
||||
symbol: "+",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(",", {
|
||||
key: { keyCode: 188, shiftKey: false },
|
||||
symbol: ",",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set("(", {
|
||||
key: { keyCode: 56, shiftKey: true },
|
||||
symbol: "(",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(")", {
|
||||
key: { keyCode: 57, shiftKey: true },
|
||||
symbol: ")",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set('"', {
|
||||
key: { keyCode: 50, shiftKey: true },
|
||||
symbol: '"',
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set("'", {
|
||||
key: { keyCode: 191, shiftKey: false },
|
||||
symbol: "'",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set("-", {
|
||||
key: { keyCode: 189, shiftKey: false },
|
||||
symbol: "-",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(":", {
|
||||
key: { keyCode: 190, shiftKey: true },
|
||||
symbol: ":",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(",", {
|
||||
key: { keyCode: 188, shiftKey: false },
|
||||
symbol: ",",
|
||||
fullstop: false,
|
||||
});
|
||||
defaultExpanders.set(";", {
|
||||
key: { keyCode: 188, shiftKey: true },
|
||||
symbol: ":",
|
||||
fullstop: false,
|
||||
});
|
@ -1,7 +1,18 @@
|
||||
<script lang="ts">
|
||||
import Textarea from './textarea.svelte';
|
||||
import { db, type Shortform } from '../db/main';
|
||||
|
||||
let cache: Array<Shortform>;
|
||||
db.shortforms
|
||||
.toArray()
|
||||
.then((shortforms) => {
|
||||
cache = shortforms;
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error(err);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="h-full w-full" role="application">
|
||||
<Textarea />
|
||||
<Textarea active-shortforms={cache} />
|
||||
</div>
|
||||
|
@ -9,12 +9,12 @@
|
||||
currentWord: ''
|
||||
};
|
||||
|
||||
let textarea;
|
||||
let textarea: HTMLTextAreaElement;
|
||||
let text = '';
|
||||
|
||||
onMount(() => {
|
||||
if (browser) {
|
||||
let t = document.getElementById('doc');
|
||||
let t = document.getElementById('doc') as HTMLTextAreaElement;
|
||||
if (t != null) {
|
||||
textarea = t;
|
||||
setTimeout(() => {
|
||||
@ -32,7 +32,7 @@
|
||||
}
|
||||
}
|
||||
};
|
||||
const input = (e) => {
|
||||
const input = (e: InputEvent) => {
|
||||
if (e.inputType == 'insertText') {
|
||||
const key = e.data || '';
|
||||
if (e.data == null) return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user