Fix filter transform with logic operators (#5269)
Various fixes
- Remote objects are read-only for now, we already hide and block most
of the write actions but the button that allows you to add a new record
in an empty collection was still visible.
- CreatedAt is not mandatory on remote objects (at least for now) so it
was breaking the show page, it now checks if createdAt exists and is not
null before trying to display the human readable format `Added x days
ago`
- The filters are overwritten in query-runner-args.factory.ts to handle
NUMBER field type, this was only working with filters like
```
{
"id": {
"in": [
1
]
}
```
but not with more depth such as
```
"and": [
{},
{
"id": {
"in": [
1
]
}
}
]
```
- Fixes CREATE FOREIGN TABLE raw query which was missing ",".
This commit is contained in:
@ -81,6 +81,8 @@ export const RecordTableWithWrappers = ({
|
|||||||
|
|
||||||
const objectLabel = foundObjectMetadataItem?.labelSingular;
|
const objectLabel = foundObjectMetadataItem?.labelSingular;
|
||||||
|
|
||||||
|
const isRemote = foundObjectMetadataItem?.isRemote ?? false;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EntityDeleteContext.Provider value={deleteOneRecord}>
|
<EntityDeleteContext.Provider value={deleteOneRecord}>
|
||||||
<ScrollWrapper>
|
<ScrollWrapper>
|
||||||
@ -113,25 +115,27 @@ export const RecordTableWithWrappers = ({
|
|||||||
recordTableId={recordTableId}
|
recordTableId={recordTableId}
|
||||||
tableBodyRef={tableBodyRef}
|
tableBodyRef={tableBodyRef}
|
||||||
/>
|
/>
|
||||||
{!isRecordTableInitialLoading && numberOfTableRows === 0 && (
|
{!isRecordTableInitialLoading &&
|
||||||
<AnimatedPlaceholderEmptyContainer>
|
numberOfTableRows === 0 &&
|
||||||
<AnimatedPlaceholder type="noRecord" />
|
!isRemote && (
|
||||||
<AnimatedPlaceholderEmptyTextContainer>
|
<AnimatedPlaceholderEmptyContainer>
|
||||||
<AnimatedPlaceholderEmptyTitle>
|
<AnimatedPlaceholder type="noRecord" />
|
||||||
Add your first {objectLabel}
|
<AnimatedPlaceholderEmptyTextContainer>
|
||||||
</AnimatedPlaceholderEmptyTitle>
|
<AnimatedPlaceholderEmptyTitle>
|
||||||
<AnimatedPlaceholderEmptySubTitle>
|
Add your first {objectLabel}
|
||||||
Use our API or add your first {objectLabel} manually
|
</AnimatedPlaceholderEmptyTitle>
|
||||||
</AnimatedPlaceholderEmptySubTitle>
|
<AnimatedPlaceholderEmptySubTitle>
|
||||||
</AnimatedPlaceholderEmptyTextContainer>
|
Use our API or add your first {objectLabel} manually
|
||||||
<Button
|
</AnimatedPlaceholderEmptySubTitle>
|
||||||
Icon={IconPlus}
|
</AnimatedPlaceholderEmptyTextContainer>
|
||||||
title={`Add a ${objectLabel}`}
|
<Button
|
||||||
variant={'secondary'}
|
Icon={IconPlus}
|
||||||
onClick={createRecord}
|
title={`Add a ${objectLabel}`}
|
||||||
/>
|
variant={'secondary'}
|
||||||
</AnimatedPlaceholderEmptyContainer>
|
onClick={createRecord}
|
||||||
)}
|
/>
|
||||||
|
</AnimatedPlaceholderEmptyContainer>
|
||||||
|
)}
|
||||||
</StyledTableContainer>
|
</StyledTableContainer>
|
||||||
</StyledTableWithHeader>
|
</StyledTableWithHeader>
|
||||||
</RecordUpdateContext.Provider>
|
</RecordUpdateContext.Provider>
|
||||||
|
|||||||
@ -112,7 +112,11 @@ export const ShowPageSummaryCard = ({
|
|||||||
</StyledAvatarWrapper>
|
</StyledAvatarWrapper>
|
||||||
<StyledInfoContainer>
|
<StyledInfoContainer>
|
||||||
<StyledTitle>{title}</StyledTitle>
|
<StyledTitle>{title}</StyledTitle>
|
||||||
<StyledDate id={dateElementId}>Added {beautifiedCreatedAt}</StyledDate>
|
{beautifiedCreatedAt && (
|
||||||
|
<StyledDate id={dateElementId}>
|
||||||
|
Added {beautifiedCreatedAt}
|
||||||
|
</StyledDate>
|
||||||
|
)}
|
||||||
<StyledTooltip
|
<StyledTooltip
|
||||||
anchorSelect={`#${dateElementId}`}
|
anchorSelect={`#${dateElementId}`}
|
||||||
content={exactCreatedAt}
|
content={exactCreatedAt}
|
||||||
|
|||||||
@ -131,30 +131,46 @@ export class QueryRunnerArgsFactory {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const createArgPromiseByArgKey = Object.entries(filter).map(
|
const overrideFilter = (filterObject: RecordFilter) => {
|
||||||
([key, value]) => {
|
return Object.entries(filterObject).reduce((acc, [key, value]) => {
|
||||||
const fieldMetadata = fieldMetadataMap.get(key);
|
if (key === 'and' || key === 'or') {
|
||||||
|
acc[key] = value.map((nestedFilter: RecordFilter) =>
|
||||||
if (!fieldMetadata) {
|
overrideFilter(nestedFilter),
|
||||||
return [key, value];
|
);
|
||||||
|
} else if (key === 'not') {
|
||||||
|
acc[key] = overrideFilter(value);
|
||||||
|
} else {
|
||||||
|
acc[key] = this.transformValueByType(key, value, fieldMetadataMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
const createFilterByKey = Object.entries(value).map(
|
return acc;
|
||||||
([filterKey, filterValue]) => {
|
}, {});
|
||||||
switch (fieldMetadata.type) {
|
};
|
||||||
case FieldMetadataType.NUMBER:
|
|
||||||
return [filterKey, Number(filterValue)];
|
return overrideFilter(filter);
|
||||||
default:
|
}
|
||||||
return [filterKey, filterValue];
|
|
||||||
}
|
private transformValueByType(
|
||||||
},
|
key: string,
|
||||||
|
value: any,
|
||||||
|
fieldMetadataMap: Map<string, FieldMetadataInterface>,
|
||||||
|
) {
|
||||||
|
const fieldMetadata = fieldMetadataMap.get(key);
|
||||||
|
|
||||||
|
if (!fieldMetadata) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
switch (fieldMetadata.type) {
|
||||||
|
case 'NUMBER':
|
||||||
|
return Object.fromEntries(
|
||||||
|
Object.entries(value).map(([filterKey, filterValue]) => [
|
||||||
|
filterKey,
|
||||||
|
Number(filterValue),
|
||||||
|
]),
|
||||||
);
|
);
|
||||||
|
default:
|
||||||
return [key, Object.fromEntries(createFilterByKey)];
|
return value;
|
||||||
},
|
}
|
||||||
);
|
|
||||||
|
|
||||||
return Object.fromEntries(createArgPromiseByArgKey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async overrideValueByFieldMetadata(
|
private async overrideValueByFieldMetadata(
|
||||||
|
|||||||
@ -495,11 +495,9 @@ export class WorkspaceMigrationRunnerService {
|
|||||||
)
|
)
|
||||||
.join(', ');
|
.join(', ');
|
||||||
|
|
||||||
let serverOptions = '';
|
const serverOptions = Object.entries(foreignTable.referencedTable)
|
||||||
|
.map(([key, value]) => `${key} '${value}'`)
|
||||||
Object.entries(foreignTable.referencedTable).forEach(([key, value]) => {
|
.join(', ');
|
||||||
serverOptions += ` ${key} '${value}'`;
|
|
||||||
});
|
|
||||||
|
|
||||||
await queryRunner.query(
|
await queryRunner.query(
|
||||||
`CREATE FOREIGN TABLE ${schemaName}."${name}" (${foreignTableColumns}) SERVER "${foreignTable.foreignDataWrapperId}" OPTIONS (${serverOptions})`,
|
`CREATE FOREIGN TABLE ${schemaName}."${name}" (${foreignTableColumns}) SERVER "${foreignTable.foreignDataWrapperId}" OPTIONS (${serverOptions})`,
|
||||||
|
|||||||
Reference in New Issue
Block a user