Skip to content

Commit 5d5c82d

Browse files
dimfeldtechniq
authored andcommitted
Move format function definitions onto settings to avoid calling getSettings after component initialization (#191)
* move format functions onto settings object * update uses of formatting functions to fit new settings paradigm * start transferring to store-based locale settings * checkpoint * update templates, add back custom date formatting * upadte format samples * update number tests * clean up custom variant a bit, improve format function type definition * remove date and number subformatters * fixes * fix missing style * better label * allow setting locale to one not explicitly supported * fix a few old format calls * add function type possibility to column format
1 parent a1d3cf7 commit 5d5c82d

File tree

25 files changed

+681
-585
lines changed

25 files changed

+681
-585
lines changed

packages/svelte-ux/src/lib/components/DateButton.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import { DateToken, getDateFuncsByPeriodType, PeriodType } from '../utils/date';
77
import type { SelectedDate } from '../utils/date';
88
import { cls } from '../utils/styles';
9+
import { getSettings } from './settings';
910
import { getComponentClasses } from './theme';
10-
import { format as format_ux } from '../utils';
1111
1212
const dispatch = createEventDispatcher();
1313
@@ -19,6 +19,7 @@
1919
export let fade: boolean = false;
2020
export let format = getCustomFormat(periodType);
2121
22+
const { format: format_ux } = getSettings();
2223
const settingsClasses = getComponentClasses('DateButton');
2324
2425
function getCustomFormat(periodType: PeriodType) {
@@ -102,6 +103,6 @@
102103
dispatch('dateChange', date);
103104
}}
104105
>
105-
{format_ux(date, periodType, { custom: format })}
106+
{$format_ux(date, periodType, { custom: format })}
106107
</Button>
107108
</div>

packages/svelte-ux/src/lib/components/DateField.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { createEventDispatcher } from 'svelte';
33
import { parse as parseDate } from 'date-fns';
4-
import { PeriodType, format as format_ux } from '../utils';
4+
import { PeriodType } from '../utils';
55
import { getSettings } from './settings';
66
77
import Field from './Field.svelte';
@@ -10,8 +10,10 @@
1010
import DatePickerField from './DatePickerField.svelte';
1111
import { getComponentClasses } from './theme';
1212
13+
const { format: format_ux } = getSettings();
14+
1315
export let value: Date | null = null;
14-
export let format = getSettings().formats?.dates?.baseParsing ?? 'MM/dd/yyyy';
16+
export let format = $format_ux.settings.formats.dates.baseParsing ?? 'MM/dd/yyyy';
1517
export let mask = format.toLowerCase();
1618
export let replace = 'dmyh';
1719
export let picker = false;
@@ -63,7 +65,7 @@
6365
let:id
6466
>
6567
<Input
66-
value={value ? format_ux(value, PeriodType.Day, { custom: format }) : inputValue}
68+
value={value ? $format_ux(value, PeriodType.Day, { custom: format }) : inputValue}
6769
{mask}
6870
{replace}
6971
{id}

packages/svelte-ux/src/lib/components/DatePickerField.svelte

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
import { DateToken, getDateFuncsByPeriodType, PeriodType } from '../utils/date';
1010
import DateSelect from './DateSelect.svelte';
1111
import { getComponentClasses } from './theme';
12-
import { format } from '../utils';
13-
import { getDictionary } from './settings';
12+
import { getSettings } from './settings';
1413
1514
const dispatch = createEventDispatcher();
1615
@@ -33,6 +32,8 @@
3332
export let center = false;
3433
3534
const settingsClasses = getComponentClasses('DatePickerField');
35+
const { format } = getSettings();
36+
$: dictionary = $format.settings.dictionary;
3637
3738
let open: boolean = false;
3839
@@ -64,7 +65,7 @@
6465
<Button icon={mdiCalendar} on:click={() => (open = true)} {...$$restProps} />
6566
{:else}
6667
<Field
67-
label={label ?? format(value, PeriodType.Day, { custom: secondaryFormat })}
68+
label={label ?? $format(value, PeriodType.Day, { custom: secondaryFormat })}
6869
{icon}
6970
{error}
7071
{hint}
@@ -98,7 +99,7 @@
9899
on:click={() => (open = true)}
99100
{id}
100101
>
101-
{format(value, PeriodType.Day, { custom: primaryFormat })}
102+
{$format(value, PeriodType.Day, { custom: primaryFormat })}
102103
</button>
103104

104105
<div slot="append">
@@ -138,10 +139,10 @@
138139
transition:slide
139140
>
140141
<div class="text-sm opacity-50">
141-
{format(currentValue, PeriodType.Day, { custom: secondaryFormat })}
142+
{$format(currentValue, PeriodType.Day, { custom: secondaryFormat })}
142143
</div>
143144
<div class="text-3xl">
144-
{format(currentValue, PeriodType.Day, { custom: primaryFormat })}
145+
{$format(currentValue, PeriodType.Day, { custom: primaryFormat })}
145146
</div>
146147
</div>
147148
{/if}
@@ -163,13 +164,13 @@
163164
dispatch('change', value);
164165
}}
165166
variant="fill"
166-
color="primary">{getDictionary().Ok}</Button
167+
color="primary">{dictionary.Ok}</Button
167168
>
168169
<Button
169170
on:click={() => {
170171
open = false;
171172
currentValue = value;
172-
}}>{getDictionary().Cancel}</Button
173+
}}>{dictionary.Cancel}</Button
173174
>
174175
</div>
175176
</Dialog>

packages/svelte-ux/src/lib/components/DateRange.svelte

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
getDateFuncsByPeriodType,
88
hasDayOfWeek,
99
replaceDayOfWeek,
10-
getPeriodTypeName,
11-
getDayOfWeekName,
1210
} from '../utils/date';
13-
import { format } from '../utils';
1411
import { getDateRangePresets } from '../utils/dateRange';
1512
import type { DateRange } from '../utils/dateRange';
1613
import { cls } from '../utils/styles';
@@ -22,7 +19,7 @@
2219
import ToggleOption from './ToggleOption.svelte';
2320
import { getComponentClasses } from './theme';
2421
import { mdScreen } from '$lib/stores/matchMedia';
25-
import { getSettings } from '.';
22+
import { getSettings } from './settings';
2623
2724
export let selected: DateRange | null = { from: null, to: null, periodType: null };
2825
@@ -40,16 +37,18 @@
4037
export let getPeriodTypePresets = getDateRangePresets;
4138
4239
const settingsClasses = getComponentClasses('DateRange');
40+
const { format } = getSettings();
4341
4442
let selectedPeriodType = selected?.periodType ?? periodTypes[0];
4543
let selectedPreset: string | null = null;
46-
let selectedDayOfWeek: DayOfWeek = getSettings().formats?.dates?.weekStartsOn ?? DayOfWeek.Sunday;
44+
let selectedDayOfWeek: DayOfWeek =
45+
$format.settings.formats.dates.weekStartsOn ?? DayOfWeek.Sunday;
4746
let activeDate: 'from' | 'to' = 'from';
4847
4948
$: periodTypeOptions = periodTypes.map((pt) => {
5049
const value = adjustPeriodType(pt);
5150
return {
52-
label: getPeriodTypeName(adjustPeriodType(pt)),
51+
label: $format.getPeriodTypeName(adjustPeriodType(pt)),
5352
value,
5453
};
5554
});
@@ -174,7 +173,7 @@
174173
<ToggleOption value="from" class="flex-1">
175174
<div class="text-xs text-surface-content/50">Start</div>
176175
{#if selected?.from}
177-
<div class="font-medium">{format(selected.from, PeriodType.Day)}</div>
176+
<div class="font-medium">{$format(selected.from, PeriodType.Day)}</div>
178177
{:else}
179178
<div class="italic">Empty</div>
180179
{/if}
@@ -196,7 +195,7 @@
196195
<ToggleOption value="to" class="flex-1">
197196
<div class="text-xs text-surface-content/50">End</div>
198197
{#if selected?.to}
199-
<div class="font-medium">{format(selected.to, PeriodType.Day)}</div>
198+
<div class="font-medium">{$format(selected.to, PeriodType.Day)}</div>
200199
{:else}
201200
<div class="italic">Empty</div>
202201
{/if}
@@ -288,12 +287,7 @@
288287
classes={{ root: 'bg-surface-100', option: 'px-0' }}
289288
>
290289
{#each [DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday] as day}
291-
<ToggleOption value={day}
292-
>{getDayOfWeekName(
293-
day,
294-
getSettings().formats?.dates?.locales ?? 'en'
295-
)}</ToggleOption
296-
>
290+
<ToggleOption value={day}>{$format.getDayOfWeekName(day)}</ToggleOption>
297291
{/each}
298292
</ToggleGroup>
299293
</div>

packages/svelte-ux/src/lib/components/DateRangeDisplay.svelte

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<script lang="ts">
22
import { PeriodType, getDateFuncsByPeriodType, type FormatDateOptions } from '../utils/date';
33
import type { DateRange } from '../utils/dateRange';
4-
5-
import { format as format_ux } from '../utils';
4+
import { getSettings } from './settings';
65
76
export let value: DateRange | null | undefined;
87
8+
const { format: format_ux } = getSettings();
9+
910
let showToValue = false;
1011
$: if (value?.to) {
1112
if (value?.from && value?.periodType) {
@@ -66,12 +67,12 @@
6667
</script>
6768

6869
{#if value?.from}
69-
{format_ux(value.from, getPeriodType(value), { variant: 'long' })}
70+
{$format_ux(value.from, getPeriodType(value), { variant: 'long' })}
7071
{:else}
7172
<div>&nbsp;</div>
7273
{/if}
7374

7475
{#if value?.to && showToValue}
7576
<span> - </span>
76-
{format_ux(value.to, getPeriodType(value), { variant: 'long' })}
77+
{$format_ux(value.to, getPeriodType(value), { variant: 'long' })}
7778
{/if}

packages/svelte-ux/src/lib/components/DateRangeField.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import { PeriodType, getDateFuncsByPeriodType, getPeriodTypeName } from '../utils/date';
1212
import { getDateRangePresets, type DateRange as DateRangeType } from '../utils/dateRange';
1313
import { cls } from '../utils/styles';
14+
import { getSettings } from './settings';
1415
1516
const dispatch = createEventDispatcher();
17+
const settings = getSettings();
1618
1719
const _defaultValue: DateRangeType = {
1820
from: null,
@@ -58,7 +60,7 @@
5860
</script>
5961

6062
<Field
61-
label={label ?? (value.periodType ? getPeriodTypeName(value.periodType) : '')}
63+
label={label ?? (value.periodType ? getPeriodTypeName(settings, value.periodType) : '')}
6264
{icon}
6365
{error}
6466
{hint}
@@ -151,7 +153,7 @@
151153
>
152154
<div class="flex flex-col justify-center bg-primary text-primary-content px-6 h-24">
153155
<div class="text-sm opacity-50">
154-
{currentValue.periodType ? getPeriodTypeName(currentValue.periodType) : ''}&nbsp;
156+
{currentValue.periodType ? getPeriodTypeName(settings, currentValue.periodType) : ''}&nbsp;
155157
</div>
156158
<div class="text-xl sm:text-2xl">
157159
<DateRangeDisplay value={currentValue} />

packages/svelte-ux/src/lib/components/Month.svelte

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
1616
import { getMonthDaysByWeek, PeriodType } from '../utils/date';
1717
import type { SelectedDate } from '../utils/date';
18-
import { format } from '../utils';
1918
import { hasKeyOf } from '../types/typeGuards';
2019
2120
import Button from './Button.svelte';
@@ -33,8 +32,11 @@
3332
startOfMonthFunc(selected.from)) ||
3433
startOfMonthFunc(new Date());
3534
35+
const { format } = getSettings();
36+
$: dateFormat = $format.settings.formats.dates;
37+
3638
$: endOfMonth = endOfMonthFunc(startOfMonth);
37-
$: monthDaysByWeek = getMonthDaysByWeek(startOfMonth, getSettings().formats?.dates?.weekStartsOn);
39+
$: monthDaysByWeek = getMonthDaysByWeek(startOfMonth, dateFormat.weekStartsOn);
3840
3941
/**
4042
* Hide controls and date. Useful to control externally
@@ -92,7 +94,7 @@
9294
/>
9395

9496
<div class="flex flex-1 items-center justify-center">
95-
<span>{format(startOfMonth, PeriodType.MonthYear)}</span>
97+
<span>{$format(startOfMonth, PeriodType.MonthYear)}</span>
9698
</div>
9799

98100
<Button
@@ -107,7 +109,7 @@
107109
{#each monthDaysByWeek[0] ?? [] as day (day.getDate())}
108110
<div class="flex-1 text-center">
109111
<span class="text-xs text-surface-content/50">
110-
{format(day, PeriodType.Day, { custom: 'eee' })}
112+
{$format(day, PeriodType.Day, { custom: 'eee' })}
111113
</span>
112114
</div>
113115
{/each}

packages/svelte-ux/src/lib/components/Pagination.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
44
import type paginationStore from '../stores/paginationStore';
55
import { cls } from '../utils/styles';
6-
import { format as formatValue } from '../utils/format';
76
import type { StoresValues } from '../types/typeHelpers';
87
98
import Button from './Button.svelte';
@@ -13,6 +12,7 @@
1312
import Toggle from './Toggle.svelte';
1413
import Tooltip from './Tooltip.svelte';
1514
import { getComponentClasses } from './theme';
15+
import { getSettings } from './settings';
1616
1717
type Pagination = ReturnType<typeof paginationStore>;
1818
@@ -39,6 +39,7 @@
3939
pagination?: string;
4040
perPage?: string;
4141
} = {};
42+
const { format: formatValue } = getSettings();
4243
const settingsClasses = getComponentClasses('Pagination');
4344
</script>
4445

@@ -128,7 +129,7 @@
128129
selected={$pagination.perPage === option}
129130
on:click={() => pagination.setPerPage(option)}
130131
>
131-
{formatValue(option, 'integer')}
132+
{$formatValue(option, 'integer')}
132133
</MenuItem>
133134
{/each}
134135
</Menu>

packages/svelte-ux/src/lib/components/SpringValue.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
<script lang="ts">
22
import { spring } from 'svelte/motion';
3-
import { format as formatUtil, type FormatType } from '../utils/format';
3+
import type { FormatType } from '../utils/format';
4+
import { getSettings } from './settings';
45
56
type T = $$Generic;
67
type SpringOptions = Parameters<typeof spring<T>>[1];
78
89
export let value: T | 0;
9-
export let format: FormatType = undefined;
10+
export let format: FormatType | undefined = undefined;
1011
export let options: SpringOptions = undefined;
1112
export let disabled = false;
1213
14+
const { format: formatUtil } = getSettings();
1315
const springValue = spring(value, options);
1416
$: $springValue = value ?? 0;
1517
$: displayValue = disabled || value == null ? value : $springValue;
1618
</script>
1719

1820
<slot value={displayValue}>
1921
{#if format}
20-
{formatUtil(displayValue, format)}
22+
{$formatUtil(displayValue, format)}
2123
{:else}
2224
{displayValue}
2325
{/if}

packages/svelte-ux/src/lib/components/Table.svelte

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@
55
import type { ColumnDef } from '../types/table';
66
import { cls } from '../utils/styles';
77
8-
import {
9-
getCellValue,
10-
getCellContent,
11-
getCellHeader,
12-
getHeaders,
13-
getRowColumns,
14-
} from '../utils/table';
8+
import { getCellValue, getCellHeader, getHeaders, getRowColumns } from '../utils/table';
159
1610
import TableOrderIcon from './TableOrderIcon.svelte';
1711
import { getComponentClasses } from './theme';
12+
import { getSettings } from './settings';
1813
1914
const dispatch = createEventDispatcher();
2015
@@ -70,6 +65,20 @@
7065
},
7166
};
7267
});
68+
69+
const { format } = getSettings();
70+
$: getCellContent = (column: ColumnDef, rowData: any, rowIndex: number) => {
71+
let value = getCellValue(column, rowData, rowIndex);
72+
if (column.format) {
73+
if (typeof column.format === 'function') {
74+
return column.format(value, rowData, rowIndex);
75+
} else {
76+
return $format(value, column.format);
77+
}
78+
} else {
79+
return value;
80+
}
81+
};
7382
</script>
7483

7584
<!-- svelte-ignore a11y-click-events-have-key-events -->

0 commit comments

Comments
 (0)