chore: added stauts_history
This commit is contained in:
parent
5ff8fc1d83
commit
9f9b335557
@ -33,6 +33,7 @@ data class Application(
|
|||||||
var recruiter: String,
|
var recruiter: String,
|
||||||
var message: String,
|
var message: String,
|
||||||
var linked_application: String,
|
var linked_application: String,
|
||||||
|
var status_history: String,
|
||||||
var flairs: List<Flair>,
|
var flairs: List<Flair>,
|
||||||
var views: List<View>,
|
var views: List<View>,
|
||||||
) {
|
) {
|
||||||
@ -52,6 +53,7 @@ data class Application(
|
|||||||
rs.getString("recruiter"),
|
rs.getString("recruiter"),
|
||||||
rs.getString("message"),
|
rs.getString("message"),
|
||||||
rs.getString("linked_application"),
|
rs.getString("linked_application"),
|
||||||
|
rs.getString("status_history"),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
)
|
)
|
||||||
@ -182,6 +184,7 @@ class ApplicationsController(
|
|||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
"",
|
||||||
emptyList(),
|
emptyList(),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
)
|
)
|
||||||
@ -259,6 +262,13 @@ class ApplicationsController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
application.status = info.status
|
application.status = info.status
|
||||||
|
val status_string = "${info.status}";
|
||||||
|
var status_history = application.status_history.split(",").filter { it.length >= 1 }
|
||||||
|
if (status_history.indexOf(status_string) == -1) {
|
||||||
|
status_history = status_history.plus("${info.status}");
|
||||||
|
}
|
||||||
|
|
||||||
|
application.status_history = status_history.joinToString(",") { it }
|
||||||
|
|
||||||
applicationService.update(application)
|
applicationService.update(application)
|
||||||
|
|
||||||
@ -466,7 +476,7 @@ class ApplicationService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
db.update(
|
db.update(
|
||||||
"insert into applications (id, url, original_url, unique_url, title, user_id, extra_data, payrange, status, company, recruiter, message, linked_application) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);",
|
"insert into applications (id, url, original_url, unique_url, title, user_id, extra_data, payrange, status, company, recruiter, message, linked_application, status_history) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);",
|
||||||
application.id,
|
application.id,
|
||||||
application.url,
|
application.url,
|
||||||
application.original_url,
|
application.original_url,
|
||||||
@ -480,6 +490,7 @@ class ApplicationService(
|
|||||||
application.recruiter,
|
application.recruiter,
|
||||||
application.message,
|
application.message,
|
||||||
application.linked_application,
|
application.linked_application,
|
||||||
|
application.status_history,
|
||||||
)
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -516,7 +527,7 @@ class ApplicationService(
|
|||||||
|
|
||||||
public fun update(application: Application): Application {
|
public fun update(application: Application): Application {
|
||||||
db.update(
|
db.update(
|
||||||
"update applications set url=?, original_url=?, unique_url=?, title=?, user_id=?, extra_data=?, payrange=?, status=?, company=?, recruiter=?, message=?, linked_application=? where id=?",
|
"update applications set url=?, original_url=?, unique_url=?, title=?, user_id=?, extra_data=?, payrange=?, status=?, company=?, recruiter=?, message=?, linked_application=?, status_history=? where id=?",
|
||||||
application.url,
|
application.url,
|
||||||
application.original_url,
|
application.original_url,
|
||||||
application.unique_url,
|
application.unique_url,
|
||||||
@ -529,6 +540,7 @@ class ApplicationService(
|
|||||||
application.recruiter,
|
application.recruiter,
|
||||||
application.message,
|
application.message,
|
||||||
application.linked_application,
|
application.linked_application,
|
||||||
|
application.status_history,
|
||||||
application.id,
|
application.id,
|
||||||
)
|
)
|
||||||
return application
|
return application
|
||||||
|
@ -20,6 +20,7 @@ create table if not exists applications (
|
|||||||
recruiter text,
|
recruiter text,
|
||||||
title text,
|
title text,
|
||||||
mesasge text default '',
|
mesasge text default '',
|
||||||
|
status_history text default '',
|
||||||
user_id text,
|
user_id text,
|
||||||
extra_data text,
|
extra_data text,
|
||||||
status integer,
|
status integer,
|
||||||
|
@ -80,6 +80,7 @@ async function startup() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
browser.menus.onClicked.addListener(async function (e, tab) {
|
browser.menus.onClicked.addListener(async function (e, tab) {
|
||||||
|
console.log("here")
|
||||||
if (e.menuItemId === "mark-page") {
|
if (e.menuItemId === "mark-page") {
|
||||||
console.log("set mark-page", tab.id)
|
console.log("set mark-page", tab.id)
|
||||||
await browser.storage.local.set({
|
await browser.storage.local.set({
|
||||||
@ -90,4 +91,4 @@ async function startup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
browser.runtime.onInstalled.addListener(startup);
|
browser.runtime.onInstalled.addListener(startup);
|
||||||
browser.runtime.onStartup.addListener(startup);
|
browser.runtime.onConnect.addListener(startup);
|
||||||
|
@ -9,7 +9,8 @@ export const ApplicationStatus = Object.freeze({
|
|||||||
Ignore: 2,
|
Ignore: 2,
|
||||||
ApplyedButSaidNo: 3,
|
ApplyedButSaidNo: 3,
|
||||||
Applyed: 4,
|
Applyed: 4,
|
||||||
Expired: 5
|
Expired: 5,
|
||||||
|
TasksToDo: 6,
|
||||||
});
|
});
|
||||||
|
|
||||||
export const ApplicationStatusMaping: Record<
|
export const ApplicationStatusMaping: Record<
|
||||||
@ -21,7 +22,8 @@ export const ApplicationStatusMaping: Record<
|
|||||||
2: 'Ignore',
|
2: 'Ignore',
|
||||||
3: 'Applyed But Said No',
|
3: 'Applyed But Said No',
|
||||||
4: 'Applyed',
|
4: 'Applyed',
|
||||||
5: 'Expired'
|
5: 'Expired',
|
||||||
|
6: 'Tasks To Do',
|
||||||
});
|
});
|
||||||
|
|
||||||
export type View = {
|
export type View = {
|
||||||
@ -51,9 +53,12 @@ export type Application = {
|
|||||||
function createApplicationStore() {
|
function createApplicationStore() {
|
||||||
let applications: Application[] = $state([]);
|
let applications: Application[] = $state([]);
|
||||||
let applyed: Application[] = $state([]);
|
let applyed: Application[] = $state([]);
|
||||||
|
let tasksToDo: Application[] = $state([]);
|
||||||
|
|
||||||
let dragApplication: Application | undefined = $state(undefined);
|
let dragApplication: Application | undefined = $state(undefined);
|
||||||
|
|
||||||
|
let loadItem: Application | undefined = $state(undefined);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/**
|
/**
|
||||||
* @throws {Error}
|
* @throws {Error}
|
||||||
@ -69,12 +74,22 @@ function createApplicationStore() {
|
|||||||
* @throws {Error}
|
* @throws {Error}
|
||||||
*/
|
*/
|
||||||
async loadAplyed(force = false) {
|
async loadAplyed(force = false) {
|
||||||
if (!force && applications.length > 1) {
|
if (!force && applyed.length > 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
applyed = await post('application/list', { status: ApplicationStatus.Applyed });
|
applyed = await post('application/list', { status: ApplicationStatus.Applyed });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws {Error}
|
||||||
|
*/
|
||||||
|
async loadTasksToDo(force = false) {
|
||||||
|
if (!force && tasksToDo.length > 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tasksToDo = await post('application/list', { status: ApplicationStatus.TasksToDo });
|
||||||
|
},
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
applications = [];
|
applications = [];
|
||||||
},
|
},
|
||||||
@ -97,7 +112,19 @@ function createApplicationStore() {
|
|||||||
|
|
||||||
get applyed() {
|
get applyed() {
|
||||||
return applyed;
|
return applyed;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
get tasksToDo() {
|
||||||
|
return tasksToDo;
|
||||||
|
},
|
||||||
|
|
||||||
|
get loadItem() {
|
||||||
|
return loadItem;
|
||||||
|
},
|
||||||
|
|
||||||
|
set loadItem(item: Application | undefined) {
|
||||||
|
loadItem = item;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
import ApplicationsList from './ApplicationsList.svelte';
|
import ApplicationsList from './ApplicationsList.svelte';
|
||||||
import WorkArea from './work-area/WorkArea.svelte';
|
import WorkArea from './work-area/WorkArea.svelte';
|
||||||
import AppliyedList from './AppliyedList.svelte';
|
import AppliyedList from './AppliyedList.svelte';
|
||||||
|
import TasksToDoList from './TasksToDoList.svelte';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<HasUser redirect="/cv">
|
<HasUser redirect="/cv">
|
||||||
@ -14,6 +15,7 @@
|
|||||||
<ApplicationsList />
|
<ApplicationsList />
|
||||||
<WorkArea />
|
<WorkArea />
|
||||||
</div>
|
</div>
|
||||||
|
<TasksToDoList />
|
||||||
<AppliyedList />
|
<AppliyedList />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11,18 +11,17 @@
|
|||||||
<h1>Applied</h1>
|
<h1>Applied</h1>
|
||||||
<div class="overflow-auto flex-grow">
|
<div class="overflow-auto flex-grow">
|
||||||
{#each applicationStore.applyed as item}
|
{#each applicationStore.applyed as item}
|
||||||
<div
|
<button
|
||||||
class="card p-2 my-2 bg-slate-100"
|
class="card p-2 my-2 bg-slate-100 w-full text-left"
|
||||||
draggable="true"
|
onclick={() => {
|
||||||
ondragstart={() => applicationStore.dragStart(item)}
|
applicationStore.loadItem = item;
|
||||||
ondragend={() => {
|
window.scrollTo({
|
||||||
window.requestAnimationFrame(() => {
|
top: 0,
|
||||||
applicationStore.dragEnd();
|
behavior: 'smooth',
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
role="none"
|
|
||||||
>
|
>
|
||||||
<div class:animate-pulse={applicationStore.dragging?.id === item.id}>
|
<div>
|
||||||
<h2 class="text-lg text-blue-500">
|
<h2 class="text-lg text-blue-500">
|
||||||
{item.title}
|
{item.title}
|
||||||
{#if item.company}
|
{#if item.company}
|
||||||
@ -38,7 +37,7 @@
|
|||||||
{item.url}
|
{item.url}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</button>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
45
site/src/routes/TasksToDoList.svelte
Normal file
45
site/src/routes/TasksToDoList.svelte
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { applicationStore } from '$lib/ApplicationsStore.svelte';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
applicationStore.loadTasksToDo();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if applicationStore.tasksToDo.length > 0}
|
||||||
|
<div class="card p-3 rounded-lg flex flex-col">
|
||||||
|
<h1>Tasks To Do</h1>
|
||||||
|
<div class="overflow-auto flex-grow">
|
||||||
|
{#each applicationStore.tasksToDo as item}
|
||||||
|
<button
|
||||||
|
class="card p-2 my-2 bg-slate-100 w-full text-left"
|
||||||
|
onclick={() => {
|
||||||
|
applicationStore.loadItem = item;
|
||||||
|
window.scrollTo({
|
||||||
|
top: 0,
|
||||||
|
behavior: 'smooth'
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<h2 class="text-lg text-blue-500">
|
||||||
|
{item.title}
|
||||||
|
{#if item.company}
|
||||||
|
<div class="text-violet-800">
|
||||||
|
@ {item.company}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</h2>
|
||||||
|
<a
|
||||||
|
href={item.url}
|
||||||
|
class="text-violet-600 overflow-hidden whitespace-nowrap block"
|
||||||
|
>
|
||||||
|
{item.url}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
@ -31,6 +31,7 @@
|
|||||||
[ApplicationStatus.ApplyedButSaidNo]: 0,
|
[ApplicationStatus.ApplyedButSaidNo]: 0,
|
||||||
[ApplicationStatus.Expired]: 0,
|
[ApplicationStatus.Expired]: 0,
|
||||||
[ApplicationStatus.Applyed]: 0,
|
[ApplicationStatus.Applyed]: 0,
|
||||||
|
[ApplicationStatus.TasksToDo]: 0,
|
||||||
Linkedin: 0,
|
Linkedin: 0,
|
||||||
Glassdoor: 0,
|
Glassdoor: 0,
|
||||||
'Unknown Source': 0,
|
'Unknown Source': 0,
|
||||||
@ -51,6 +52,11 @@
|
|||||||
source: ApplicationStatus.Applyed,
|
source: ApplicationStatus.Applyed,
|
||||||
target: ApplicationStatus.ApplyedButSaidNo,
|
target: ApplicationStatus.ApplyedButSaidNo,
|
||||||
value: 1
|
value: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
source: ApplicationStatus.Applyed,
|
||||||
|
target: ApplicationStatus.TasksToDo,
|
||||||
|
value: 1
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -63,7 +69,7 @@
|
|||||||
nodeTypes['Unknown Source'] += 1;
|
nodeTypes['Unknown Source'] += 1;
|
||||||
}
|
}
|
||||||
nodeTypes[a.status] += 1;
|
nodeTypes[a.status] += 1;
|
||||||
if (a.status === ApplicationStatus.ApplyedButSaidNo) {
|
if ([ApplicationStatus.ApplyedButSaidNo, ApplicationStatus.TasksToDo].includes(a.status) ) {
|
||||||
nodeTypes[ApplicationStatus.Applyed] += 1;
|
nodeTypes[ApplicationStatus.Applyed] += 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
import DropZone from './DropZone.svelte';
|
import DropZone from './DropZone.svelte';
|
||||||
import { userStore } from '$lib/UserStore.svelte';
|
import { userStore } from '$lib/UserStore.svelte';
|
||||||
import LinkApplication from './LinkApplication.svelte';
|
import LinkApplication from './LinkApplication.svelte';
|
||||||
|
import ApplicationsList from '../ApplicationsList.svelte';
|
||||||
|
|
||||||
let activeItem: Application | undefined = $state();
|
let activeItem: Application | undefined = $state();
|
||||||
|
|
||||||
@ -148,6 +149,14 @@
|
|||||||
loadActive();
|
loadActive();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
if (!applicationStore.loadItem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
activeItem = applicationStore.loadItem;
|
||||||
|
applicationStore.loadItem = undefined;
|
||||||
|
});
|
||||||
|
|
||||||
async function moveStatus(status: number) {
|
async function moveStatus(status: number) {
|
||||||
if (!activeItem) return;
|
if (!activeItem) return;
|
||||||
// Deactivate active item
|
// Deactivate active item
|
||||||
@ -372,7 +381,13 @@
|
|||||||
{#if activeItem.original_url != null}
|
{#if activeItem.original_url != null}
|
||||||
<button class="btn-danger" onclick={resetUrl}> Reset Url </button>
|
<button class="btn-danger" onclick={resetUrl}> Reset Url </button>
|
||||||
{/if}
|
{/if}
|
||||||
<button class:btn-primary={drag} class:btn-danger={!drag} onclick={() => (drag = !drag)}> 👋 </button>
|
<button
|
||||||
|
class:btn-primary={drag}
|
||||||
|
class:btn-danger={!drag}
|
||||||
|
onclick={() => (drag = !drag)}
|
||||||
|
>
|
||||||
|
👋
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if applicationStore.dragging}
|
{#if applicationStore.dragging}
|
||||||
@ -384,48 +399,69 @@
|
|||||||
icon="box-arrow-down"
|
icon="box-arrow-down"
|
||||||
ondrop={() => {
|
ondrop={() => {
|
||||||
moveStatus(ApplicationStatus.ToApply);
|
moveStatus(ApplicationStatus.ToApply);
|
||||||
|
applicationStore.loadAplyed(true);
|
||||||
|
applicationStore.loadTasksToDo(true);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
To apply
|
To apply
|
||||||
</DropZone>
|
</DropZone>
|
||||||
|
|
||||||
<!-- Ignore -->
|
{#if activeItem.status === ApplicationStatus.WorkingOnIt}
|
||||||
<DropZone
|
<!-- Ignore -->
|
||||||
icon="trash-fill"
|
<DropZone
|
||||||
ondrop={() => {
|
icon="trash-fill"
|
||||||
moveStatus(ApplicationStatus.Ignore);
|
ondrop={() => {
|
||||||
}}
|
moveStatus(ApplicationStatus.Ignore);
|
||||||
>
|
}}
|
||||||
Ignore it
|
>
|
||||||
</DropZone>
|
Ignore it
|
||||||
|
</DropZone>
|
||||||
|
|
||||||
<!-- Expired -->
|
<!-- Expired -->
|
||||||
<DropZone
|
<DropZone
|
||||||
icon="clock-fill text-orange-500"
|
icon="clock-fill text-orange-500"
|
||||||
ondrop={() => {
|
ondrop={() => {
|
||||||
if (activeItem && activeItem.status === ApplicationStatus.Expired) {
|
if (activeItem && activeItem.status === ApplicationStatus.Expired) {
|
||||||
moveStatus(ApplicationStatus.ToApply);
|
moveStatus(ApplicationStatus.ToApply);
|
||||||
} else {
|
} else {
|
||||||
moveStatus(ApplicationStatus.Expired);
|
moveStatus(ApplicationStatus.Expired);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Mark as expired
|
Mark as expired
|
||||||
</DropZone>
|
</DropZone>
|
||||||
|
|
||||||
<!-- Repeated -->
|
<!-- Repeated -->
|
||||||
<DropZone icon="trash-fill text-danger" ondrop={() => remove()}>Delete it</DropZone>
|
<DropZone icon="trash-fill text-danger" ondrop={() => remove()}
|
||||||
|
>Delete it</DropZone
|
||||||
|
>
|
||||||
|
|
||||||
<!-- Applyed -->
|
<!-- Applyed -->
|
||||||
<DropZone
|
<DropZone
|
||||||
icon="server text-confirm"
|
icon="server text-confirm"
|
||||||
ondrop={async () => {
|
ondrop={async () => {
|
||||||
await moveStatus(ApplicationStatus.Applyed);
|
await moveStatus(ApplicationStatus.Applyed);
|
||||||
applicationStore.loadAplyed(true);
|
applicationStore.loadAplyed(true);
|
||||||
}}
|
applicationStore.loadTasksToDo(true);
|
||||||
>
|
}}
|
||||||
Apply
|
>
|
||||||
</DropZone>
|
Apply
|
||||||
|
</DropZone>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{#if activeItem.status === ApplicationStatus.Applyed}
|
||||||
|
<!-- Tasks to do -->
|
||||||
|
<DropZone
|
||||||
|
icon="server text-confirm"
|
||||||
|
ondrop={async () => {
|
||||||
|
await moveStatus(ApplicationStatus.TasksToDo);
|
||||||
|
applicationStore.loadTasksToDo(true);
|
||||||
|
applicationStore.loadAplyed(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Tasks To Do
|
||||||
|
</DropZone>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<!-- Rejected -->
|
<!-- Rejected -->
|
||||||
<DropZone
|
<DropZone
|
||||||
|
Loading…
Reference in New Issue
Block a user