Skip to content

Commit 4d49db9

Browse files
committed
resolve readonly assignment errors in global preferences utils and loader
1 parent 8f7c0ae commit 4d49db9

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

specifyweb/frontend/js_src/lib/components/Preferences/globalPreferencesLoader.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,41 @@ function mergeMissingFromRemote(
3131

3232
const remoteFormatting = remote.formatting?.formatting;
3333
if (remoteFormatting !== undefined) {
34-
const currentFormatting = existing.formatting?.formatting ?? {};
35-
const updatedFormatting: Partial<GlobalPreferenceValues['formatting']['formatting']> = {
36-
...currentFormatting,
34+
const currentFormatting = existing.formatting?.formatting;
35+
const updatedFormatting: Record<
36+
keyof GlobalPreferenceValues['formatting']['formatting'],
37+
string | undefined
38+
> = {
39+
fullDateFormat: currentFormatting?.fullDateFormat,
40+
monthYearDateFormat: currentFormatting?.monthYearDateFormat,
3741
};
3842

3943
(['fullDateFormat', 'monthYearDateFormat'] as const).forEach((key) => {
4044
const remoteValue = remoteFormatting[key];
4145
if (
4246
remoteValue !== undefined &&
43-
updatedFormatting[key] === undefined &&
47+
(updatedFormatting[key] ?? undefined) === undefined &&
4448
remoteValue !== DEFAULT_VALUES.formatting.formatting[key]
4549
) {
4650
updatedFormatting[key] = remoteValue;
4751
changed = true;
4852
}
4953
});
5054

51-
if (changed)
55+
if (changed) {
56+
const formattingPayload: Record<string, unknown> = {};
57+
if (updatedFormatting.fullDateFormat !== undefined)
58+
formattingPayload.fullDateFormat = updatedFormatting.fullDateFormat;
59+
if (updatedFormatting.monthYearDateFormat !== undefined)
60+
formattingPayload.monthYearDateFormat = updatedFormatting.monthYearDateFormat;
61+
5262
merged = {
5363
...merged,
5464
formatting: {
55-
formatting: updatedFormatting as GlobalPreferenceValues['formatting']['formatting'],
65+
formatting: formattingPayload as GlobalPreferenceValues['formatting']['formatting'],
5666
},
5767
};
68+
}
5869
}
5970

6071
return { merged, changed };

specifyweb/frontend/js_src/lib/components/Preferences/globalPreferencesUtils.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -111,26 +111,26 @@ function hasProperties<T extends Record<string, unknown>>(object: T): object is
111111
export function partialPreferencesFromMap(
112112
map: Readonly<Record<string, string>>
113113
): Partial<GlobalPreferenceValues> {
114-
const partial: Partial<GlobalPreferenceValues> = {};
114+
const partial: Record<string, unknown> = {};
115115

116-
const auditing: Partial<GlobalPreferenceValues['auditing']['auditing']> = {};
116+
const auditingValues: Record<string, unknown> = {};
117117
const enableAuditLog = parseBoolean(map[PREFERENCE_KEYS.enableAuditLog]);
118-
if (enableAuditLog !== undefined) auditing.enableAuditLog = enableAuditLog;
118+
if (enableAuditLog !== undefined) auditingValues.enableAuditLog = enableAuditLog;
119119

120120
const logFieldLevelChanges = parseBoolean(map[PREFERENCE_KEYS.logFieldLevelChanges]);
121121
if (logFieldLevelChanges !== undefined)
122-
auditing.logFieldLevelChanges = logFieldLevelChanges;
122+
auditingValues.logFieldLevelChanges = logFieldLevelChanges;
123123

124-
if (hasProperties(auditing)) {
124+
if (hasProperties(auditingValues)) {
125125
partial.auditing = {
126-
auditing: auditing as GlobalPreferenceValues['auditing']['auditing'],
126+
auditing: auditingValues,
127127
};
128128
}
129129

130-
const formatting: Partial<GlobalPreferenceValues['formatting']['formatting']> = {};
130+
const formattingValues: Record<string, unknown> = {};
131131
const fullDateFormatRaw = map[PREFERENCE_KEYS.fullDateFormat];
132132
if (fullDateFormatRaw !== undefined)
133-
formatting.fullDateFormat = normalizeFormat(fullDateFormatRaw);
133+
formattingValues.fullDateFormat = normalizeFormat(fullDateFormatRaw);
134134

135135
const monthYearDateFormatRaw = map[PREFERENCE_KEYS.monthYearDateFormat];
136136
if (monthYearDateFormatRaw !== undefined) {
@@ -140,29 +140,29 @@ export function partialPreferencesFromMap(
140140
monthYearFormat as (typeof MONTH_YEAR_FORMAT_OPTIONS)[number]
141141
)
142142
)
143-
formatting.monthYearDateFormat = monthYearFormat;
143+
formattingValues.monthYearDateFormat = monthYearFormat;
144144
}
145145

146-
if (hasProperties(formatting)) {
146+
if (hasProperties(formattingValues)) {
147147
partial.formatting = {
148-
formatting: formatting as GlobalPreferenceValues['formatting']['formatting'],
148+
formatting: formattingValues,
149149
};
150150
}
151151

152-
const attachments: Partial<GlobalPreferenceValues['attachments']['attachments']> = {};
152+
const attachmentValues: Record<string, unknown> = {};
153153
const attachmentThumbnailSize = parseNumber(
154154
map[PREFERENCE_KEYS.attachmentThumbnailSize]
155155
);
156156
if (attachmentThumbnailSize !== undefined)
157-
attachments.attachmentThumbnailSize = attachmentThumbnailSize;
157+
attachmentValues.attachmentThumbnailSize = attachmentThumbnailSize;
158158

159-
if (hasProperties(attachments)) {
159+
if (hasProperties(attachmentValues)) {
160160
partial.attachments = {
161-
attachments: attachments as GlobalPreferenceValues['attachments']['attachments'],
161+
attachments: attachmentValues,
162162
};
163163
}
164164

165-
return partial;
165+
return partial as Partial<GlobalPreferenceValues>;
166166
}
167167

168168
export function mergeWithDefaultValues(

0 commit comments

Comments
 (0)