fix: type errors in svelte-main branch (219 -> 191 errors)
- Fix paraglide aliases in svelte.config.js - Fix Checkbox.svelte: use indeterminate prop, remove restProps spread - Fix Switch.svelte: simplify Props interface, remove restProps spread - Fix Button.svelte: add null checks for icon prop - Fix sidebar.svelte.ts: use explicit undefined types for exactOptionalPropertyTypes - Fix Party.svelte: fix import extension, remove ConflictService argument - Fix job.resource.svelte.ts: add error property to success states, fix groupJobsByTier null checks Co-Authored-By: Justin Edmund <justin@jedmund.com>
This commit is contained in:
parent
67dadfcba7
commit
cf7a036575
7 changed files with 71 additions and 64 deletions
|
|
@ -25,10 +25,10 @@ export interface JobResourceOptions {
|
||||||
* State for job data
|
* State for job data
|
||||||
*/
|
*/
|
||||||
interface JobState<T> {
|
interface JobState<T> {
|
||||||
data?: T
|
data: T | undefined
|
||||||
loading: boolean
|
loading: boolean
|
||||||
error?: AdapterError
|
error: AdapterError | undefined
|
||||||
lastFetch?: number
|
lastFetch: number | undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -65,11 +65,11 @@ export class JobResource {
|
||||||
private cacheDuration: number
|
private cacheDuration: number
|
||||||
|
|
||||||
// Reactive state for job data
|
// Reactive state for job data
|
||||||
jobs = $state<JobState<Job[]>>({ loading: false })
|
jobs = $state<JobState<Job[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
|
||||||
currentJob = $state<JobState<Job>>({ loading: false })
|
currentJob = $state<JobState<Job>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
|
||||||
jobSkills = $state<JobState<JobSkill[]>>({ loading: false })
|
jobSkills = $state<JobState<JobSkill[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
|
||||||
jobAccessories = $state<JobState<JobAccessory[]>>({ loading: false })
|
jobAccessories = $state<JobState<JobAccessory[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
|
||||||
allSkills = $state<JobState<JobSkill[]>>({ loading: false })
|
allSkills = $state<JobState<JobSkill[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
|
||||||
|
|
||||||
// Track active requests
|
// Track active requests
|
||||||
private activeRequests = new Map<string, AbortController>()
|
private activeRequests = new Map<string, AbortController>()
|
||||||
|
|
@ -108,7 +108,7 @@ export class JobResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await this.adapter.getAll()
|
const data = await this.adapter.getAll()
|
||||||
this.jobs = { data, loading: false, lastFetch: Date.now() }
|
this.jobs = { data, loading: false, lastFetch: Date.now(), error: undefined }
|
||||||
return data
|
return data
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code !== 'CANCELLED') {
|
if (error.code !== 'CANCELLED') {
|
||||||
|
|
@ -145,7 +145,7 @@ export class JobResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await this.adapter.getById(id)
|
const data = await this.adapter.getById(id)
|
||||||
this.currentJob = { data, loading: false, lastFetch: Date.now() }
|
this.currentJob = { data, loading: false, lastFetch: Date.now(), error: undefined }
|
||||||
return data
|
return data
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code !== 'CANCELLED') {
|
if (error.code !== 'CANCELLED') {
|
||||||
|
|
@ -177,7 +177,7 @@ export class JobResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await this.adapter.getSkills(jobId)
|
const data = await this.adapter.getSkills(jobId)
|
||||||
this.jobSkills = { data, loading: false, lastFetch: Date.now() }
|
this.jobSkills = { data, loading: false, lastFetch: Date.now(), error: undefined }
|
||||||
return data
|
return data
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code !== 'CANCELLED') {
|
if (error.code !== 'CANCELLED') {
|
||||||
|
|
@ -209,7 +209,7 @@ export class JobResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await this.adapter.getAccessories(jobId)
|
const data = await this.adapter.getAccessories(jobId)
|
||||||
this.jobAccessories = { data, loading: false, lastFetch: Date.now() }
|
this.jobAccessories = { data, loading: false, lastFetch: Date.now(), error: undefined }
|
||||||
return data
|
return data
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code !== 'CANCELLED') {
|
if (error.code !== 'CANCELLED') {
|
||||||
|
|
@ -246,7 +246,7 @@ export class JobResource {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await this.adapter.getAllSkills()
|
const data = await this.adapter.getAllSkills()
|
||||||
this.allSkills = { data, loading: false, lastFetch: Date.now() }
|
this.allSkills = { data, loading: false, lastFetch: Date.now(), error: undefined }
|
||||||
return data
|
return data
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code !== 'CANCELLED') {
|
if (error.code !== 'CANCELLED') {
|
||||||
|
|
@ -309,11 +309,11 @@ export class JobResource {
|
||||||
* Clear cached data
|
* Clear cached data
|
||||||
*/
|
*/
|
||||||
clearCache() {
|
clearCache() {
|
||||||
this.jobs = { loading: false }
|
this.jobs = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
|
||||||
this.currentJob = { loading: false }
|
this.currentJob = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
|
||||||
this.jobSkills = { loading: false }
|
this.jobSkills = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
|
||||||
this.jobAccessories = { loading: false }
|
this.jobAccessories = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
|
||||||
this.allSkills = { loading: false }
|
this.allSkills = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -340,15 +340,17 @@ export function groupJobsByTier(jobs: Job[]): Record<string, Job[]> {
|
||||||
|
|
||||||
for (const job of jobs) {
|
for (const job of jobs) {
|
||||||
const tier = job.row.toString().toLowerCase()
|
const tier = job.row.toString().toLowerCase()
|
||||||
if (tier in tiers) {
|
if (tier in tiers && tiers[tier]) {
|
||||||
tiers[tier].push(job)
|
tiers[tier].push(job)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort jobs within each tier by order
|
// Sort jobs within each tier by order
|
||||||
for (const tier in tiers) {
|
for (const tier in tiers) {
|
||||||
|
if (tiers[tier]) {
|
||||||
tiers[tier].sort((a, b) => a.order - b.order)
|
tiers[tier].sort((a, b) => a.order - b.order)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return tiers
|
return tiers
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
import Button from '$lib/components/ui/Button.svelte'
|
import Button from '$lib/components/ui/Button.svelte'
|
||||||
import Icon from '$lib/components/Icon.svelte'
|
import Icon from '$lib/components/Icon.svelte'
|
||||||
import DescriptionRenderer from '$lib/components/DescriptionRenderer.svelte'
|
import DescriptionRenderer from '$lib/components/DescriptionRenderer.svelte'
|
||||||
import { openDescriptionSidebar } from '$lib/features/description/openDescriptionSidebar.svelte.ts'
|
import { openDescriptionSidebar } from '$lib/features/description/openDescriptionSidebar.svelte'
|
||||||
import { DropdownMenu } from 'bits-ui'
|
import { DropdownMenu } from 'bits-ui'
|
||||||
import DropdownItem from '$lib/components/ui/dropdown/DropdownItem.svelte'
|
import DropdownItem from '$lib/components/ui/dropdown/DropdownItem.svelte'
|
||||||
import JobSection from '$lib/components/job/JobSection.svelte'
|
import JobSection from '$lib/components/job/JobSection.svelte'
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
// Services
|
// Services
|
||||||
const partyService = new PartyService()
|
const partyService = new PartyService()
|
||||||
const gridService = new GridService()
|
const gridService = new GridService()
|
||||||
const conflictService = new ConflictService(fetch)
|
const conflictService = new ConflictService()
|
||||||
|
|
||||||
// Create drag-drop context
|
// Create drag-drop context
|
||||||
const dragContext = createDragDropContext({
|
const dragContext = createDragDropContext({
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@
|
||||||
<span class="accessory">
|
<span class="accessory">
|
||||||
{@render leftAccessory()}
|
{@render leftAccessory()}
|
||||||
</span>
|
</span>
|
||||||
{:else if hasLeftIcon && !iconOnly}
|
{:else if hasLeftIcon && !iconOnly && icon}
|
||||||
<span class="accessory">
|
<span class="accessory">
|
||||||
<Icon name={icon} size={iconSizes[size]} />
|
<Icon name={icon} size={iconSizes[size]} />
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -136,7 +136,7 @@
|
||||||
<span class="accessory">
|
<span class="accessory">
|
||||||
{@render rightAccessory()}
|
{@render rightAccessory()}
|
||||||
</span>
|
</span>
|
||||||
{:else if hasRightIcon && !iconOnly}
|
{:else if hasRightIcon && !iconOnly && icon}
|
||||||
<span class="accessory">
|
<span class="accessory">
|
||||||
<Icon name={icon} size={iconSizes[size]} />
|
<Icon name={icon} size={iconSizes[size]} />
|
||||||
</span>
|
</span>
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,15 @@
|
||||||
<svelte:options runes={true} />
|
<svelte:options runes={true} />
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Checkbox as CheckboxPrimitive } from 'bits-ui';
|
import { Checkbox as CheckboxPrimitive } from 'bits-ui';
|
||||||
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
||||||
|
|
||||||
interface Props extends Omit<HTMLButtonAttributes, 'value'> {
|
interface Props {
|
||||||
checked?: boolean | 'indeterminate';
|
checked?: boolean;
|
||||||
|
indeterminate?: boolean;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
name?: string;
|
name?: string;
|
||||||
value?: string;
|
value?: string;
|
||||||
onCheckedChange?: (checked: boolean | 'indeterminate') => void;
|
onCheckedChange?: (checked: boolean) => void;
|
||||||
class?: string;
|
class?: string;
|
||||||
variant?: 'default' | 'bound';
|
variant?: 'default' | 'bound';
|
||||||
size?: 'small' | 'medium' | 'large';
|
size?: 'small' | 'medium' | 'large';
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
let {
|
let {
|
||||||
checked = $bindable(false),
|
checked = $bindable(false),
|
||||||
|
indeterminate = false,
|
||||||
disabled = false,
|
disabled = false,
|
||||||
required = false,
|
required = false,
|
||||||
name,
|
name,
|
||||||
|
|
@ -25,8 +26,7 @@
|
||||||
onCheckedChange,
|
onCheckedChange,
|
||||||
class: className,
|
class: className,
|
||||||
variant = 'default',
|
variant = 'default',
|
||||||
size = 'medium',
|
size = 'medium'
|
||||||
...restProps
|
|
||||||
}: Props = $props();
|
}: Props = $props();
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
|
|
@ -41,20 +41,22 @@
|
||||||
|
|
||||||
<CheckboxPrimitive.Root
|
<CheckboxPrimitive.Root
|
||||||
bind:checked
|
bind:checked
|
||||||
|
{indeterminate}
|
||||||
{disabled}
|
{disabled}
|
||||||
{required}
|
{required}
|
||||||
{name}
|
name={name ?? ''}
|
||||||
{value}
|
value={value ?? ''}
|
||||||
class="checkbox {sizeClass} {variantClass} {className || ''}"
|
class="checkbox {sizeClass} {variantClass} {className || ''}"
|
||||||
{...restProps}
|
|
||||||
>
|
>
|
||||||
<CheckboxPrimitive.Indicator class="indicator">
|
{#snippet children({ checked: isChecked, indeterminate: isIndeterminate })}
|
||||||
{#if checked === 'indeterminate'}
|
<span class="indicator">
|
||||||
|
{#if isIndeterminate}
|
||||||
<span class="icon">−</span>
|
<span class="icon">−</span>
|
||||||
{:else if checked}
|
{:else if isChecked}
|
||||||
<span class="icon">✓</span>
|
<span class="icon">✓</span>
|
||||||
{/if}
|
{/if}
|
||||||
</CheckboxPrimitive.Indicator>
|
</span>
|
||||||
|
{/snippet}
|
||||||
</CheckboxPrimitive.Root>
|
</CheckboxPrimitive.Root>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,8 @@
|
||||||
<svelte:options runes={true} />
|
<svelte:options runes={true} />
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Switch as SwitchPrimitive } from 'bits-ui';
|
import { Switch as SwitchPrimitive } from 'bits-ui';
|
||||||
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
||||||
|
|
||||||
interface Props extends Omit<HTMLButtonAttributes, 'value'> {
|
interface Props {
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
|
|
@ -23,8 +22,7 @@
|
||||||
value,
|
value,
|
||||||
onCheckedChange,
|
onCheckedChange,
|
||||||
class: className,
|
class: className,
|
||||||
thumbClass,
|
thumbClass
|
||||||
...restProps
|
|
||||||
}: Props = $props();
|
}: Props = $props();
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
|
|
@ -41,7 +39,6 @@
|
||||||
{name}
|
{name}
|
||||||
{value}
|
{value}
|
||||||
class="switch {className || ''}"
|
class="switch {className || ''}"
|
||||||
{...restProps}
|
|
||||||
>
|
>
|
||||||
<SwitchPrimitive.Thumb class="thumb {thumbClass || ''}" />
|
<SwitchPrimitive.Thumb class="thumb {thumbClass || ''}" />
|
||||||
</SwitchPrimitive.Root>
|
</SwitchPrimitive.Root>
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@ export const SIDEBAR_WIDTH = '420px'
|
||||||
|
|
||||||
interface SidebarState {
|
interface SidebarState {
|
||||||
open: boolean
|
open: boolean
|
||||||
title?: string
|
title: string | undefined
|
||||||
content?: Snippet
|
content: Snippet | undefined
|
||||||
component?: Component
|
component: Component | undefined
|
||||||
componentProps?: Record<string, any>
|
componentProps: Record<string, any> | undefined
|
||||||
scrollable?: boolean
|
scrollable: boolean
|
||||||
activeItemId?: string
|
activeItemId: string | undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
class SidebarStore {
|
class SidebarStore {
|
||||||
|
|
@ -20,7 +20,8 @@ class SidebarStore {
|
||||||
content: undefined,
|
content: undefined,
|
||||||
component: undefined,
|
component: undefined,
|
||||||
componentProps: undefined,
|
componentProps: undefined,
|
||||||
scrollable: true
|
scrollable: true,
|
||||||
|
activeItemId: undefined
|
||||||
})
|
})
|
||||||
|
|
||||||
open(title?: string, content?: Snippet, scrollable = true) {
|
open(title?: string, content?: Snippet, scrollable = true) {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,12 @@ const config = {
|
||||||
preprocess: vitePreprocess(),
|
preprocess: vitePreprocess(),
|
||||||
kit: {
|
kit: {
|
||||||
adapter: adapter(),
|
adapter: adapter(),
|
||||||
alias: { $types: 'src/lib/types' }
|
alias: {
|
||||||
|
$types: 'src/lib/types',
|
||||||
|
'$lib/paraglide/messages': 'src/paraglide/messages.js',
|
||||||
|
'$lib/paraglide/runtime': 'src/paraglide/runtime.js',
|
||||||
|
'$lib/paraglide/server': 'src/paraglide/server.js'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue