src/types/schema.ts had drifted from the official schema contract: a `clientOnly` field had been added to `FilterEnum` to support client-side log filtering. Restored it to match upstream exactly and moved the deviation-only type into a new intersection type in src/lib/schemaDeviationTypes.ts instead. Audited the codebase for every place the UI does something the official schema doesn't support and tagged each with `// SCHEMA-DEVIATION: <id>`, documented in the new SCHEMA_DEVIATIONS.md registry (what, why, and the ideal server-side fix): - log-client-filters: Level/Event filters on Log Entries, applied client-side because x:Log/query rejects them as JMAP filters. - account-quota-usage-column: synthetic quotaUsage column on the Accounts list. - mailbox-client-hierarchy-sort: full-fetch + client-side sort to reconstruct mailbox parent/child hierarchy. - webapp-enabled-column-fallback: synthetic "Enabled" column label for x:Application when the schema list doesn't define one. Other viewName/objectName special cases (x:OtpAuth, x:Expression, x:Rate, x:Action, x:Trace, CustomComponent/*) were checked against upstream and are pre-existing architecture, not fork deviations.
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <hello@stalw.art>
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
|
*/
|
|
|
|
import type { Schema } from '@/types/schema';
|
|
import type { ClientOnlyFilterEnum } from './schemaDeviationTypes';
|
|
|
|
/**
|
|
* SCHEMA-DEVIATION: log-client-filters (see SCHEMA_DEVIATIONS.md)
|
|
*
|
|
* The Stalwart JMAP backend rejects `level`/`event` as filter conditions on
|
|
* `x:Log/query` (`unsupportedFilter`), even though both properties are
|
|
* already returned per row. Until the backend adds real support, these two
|
|
* filters are appended client-side and applied entirely in the browser
|
|
* (see the `clientOnly` flag consumed by DynamicList) instead of being sent
|
|
* to the server.
|
|
*/
|
|
export function withClientLogFilters(schema: Schema): Schema {
|
|
const logList = schema.lists['x:Log'];
|
|
if (!logList || !schema.enums['TracingLevel'] || !schema.enums['EventType']) return schema;
|
|
|
|
const levelFilter: ClientOnlyFilterEnum = {
|
|
type: 'enum',
|
|
field: 'level',
|
|
enumName: 'TracingLevel',
|
|
label: 'Level',
|
|
clientOnly: true,
|
|
};
|
|
const eventFilter: ClientOnlyFilterEnum = {
|
|
type: 'enum',
|
|
field: 'event',
|
|
enumName: 'EventType',
|
|
label: 'Event',
|
|
clientOnly: true,
|
|
};
|
|
|
|
return {
|
|
...schema,
|
|
lists: {
|
|
...schema.lists,
|
|
'x:Log': {
|
|
...logList,
|
|
filters: [...(logList.filters ?? []), levelFilter, eventFilter],
|
|
},
|
|
},
|
|
};
|
|
}
|