Add PowerSearch example config

Summary: Project doc: https://docs.google.com/document/d/1miofxds9DJgWScj0zFyBbdpRH5Rj0T9FqiCapof5-vU

Reviewed By: lblasa

Differential Revision: D48468962

fbshipit-source-id: e86be373be324b44656f2ed0d9f66bf969d47a6b
This commit is contained in:
Andrey Goncharov
2023-08-30 07:26:35 -07:00
committed by Facebook GitHub Bot
parent d54bd8938a
commit 839653c8fa
2 changed files with 322 additions and 1 deletions

View File

@@ -0,0 +1,318 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {OperatorConfig, PowerSearchConfig} from './PowerSearchTypes';
const MyStatusEnum = {
NEEDS_REVIEW: 'Needs review',
NEEDS_REVISION: 'Waiting for author',
ACCEPTED: 'Accepted',
CLOSED: 'Closed',
ABANDONED: 'Abandoned',
CHANGES_PLANNED: 'Changes planned',
IN_PREPARATION: 'Unpublished',
};
const MyMacroEnum = {
SURE_WHY_NOT: 'surewhynot',
DOGSCIENCE: 'dogscience',
TEST_IN_PROD: 'testinproduction',
'': '',
};
const operators = {
in: {
label: 'is any of',
key: 'in',
valueType: 'STRING_SET',
},
not_in: {
label: 'is none of',
key: 'not_in',
valueType: 'STRING_SET',
},
contain: {
label: 'contains',
key: 'contain',
valueType: 'STRING',
},
not_contain: {
label: 'does not contain',
key: 'not_contain',
valueType: 'STRING',
},
greater_than: {
label: '>',
key: 'greater_than',
valueType: 'INTEGER',
},
greater_than_float: {
label: '>',
key: 'greater_than_float',
valueType: 'FLOAT',
},
less_than: {
label: '<',
key: 'less_than',
valueType: 'INTEGER',
},
less_than_float: {
label: '<',
key: 'less_than_float',
valueType: 'FLOAT',
},
status_any: {
label: 'is any of',
key: 'status_any',
valueType: 'ENUM_SET',
enumLabels: MyStatusEnum,
},
status_not_any: {
label: 'is not any of',
key: 'status_not_any',
valueType: 'ENUM_SET',
enumLabels: MyStatusEnum,
},
ent_class_any_with_arbitrary_strings: {
label: 'is any of (arbitrary allowed)',
key: 'ent_class_any_with_arbitrary_strings',
valueType: 'STRING_SET',
allowArbitraryEntries: true,
},
caller_is: {
label: 'is',
key: 'caller_is',
valueType: 'STRING',
},
macro_is: {
label: 'is',
key: 'macro_is',
valueType: 'ENUM',
enumLabels: MyMacroEnum,
},
macro_is_not: {
label: 'is not',
key: 'macro_is_not',
valueType: 'ENUM',
enumLabels: MyMacroEnum,
},
predictive_contain: {
label: 'contains',
key: 'predictive_contain',
valueType: 'STRING',
},
predictive_not_contain: {
label: 'does not contain',
key: 'predictive_not_contain',
valueType: 'STRING',
allowArbitraryEntries: true,
},
newer_than_relative_date: {
key: 'newer_than_relative_date',
label: 'is newer than',
isNegative: false,
valueType: 'RELATIVE_DATE',
allowableTenses: 'PAST_AND_FUTURE',
},
newer_than_absolute_date: {
key: 'newer_than_absolute_date',
label: 'is after',
isNegative: false,
valueType: 'ABSOLUTE_DATE',
dateOnly: false,
},
newer_than_absolute_date_no_time: {
key: 'newer_than_absolute_date_no_time',
label: 'is after the day',
isNegative: false,
valueType: 'ABSOLUTE_DATE',
dateOnly: true,
},
time_after: {
label: 'is after',
key: 'time_after',
valueType: 'TIME',
},
filtered_time_after: {
label: 'is after',
key: 'filtered_time_after',
valueType: 'TIME',
// TODO: Fix me
// Only show times between 4 - 11:59PM
minValue: undefined,
maxValue: undefined,
},
unread: {
key: 'unread',
label: '',
valueType: 'NO_VALUE',
},
} satisfies {[key: string]: OperatorConfig};
export const config: PowerSearchConfig = {
name: 'FlipperPowerSearchExampleConfig',
fields: {
id: {
key: 'id',
label: 'ID',
operators: {
in: operators.in,
not_in: operators.not_in,
},
operatorMenuDisplayOrder: ['in', 'not_in'],
},
title: {
key: 'title',
label: 'Title',
operators: {
contain: operators.contain,
not_contain: operators.not_contain,
},
operatorMenuDisplayOrder: ['contain', 'not_contain'],
},
description: {
key: 'description',
label: 'Description',
operators: {
contain: operators.contain,
not_contain: operators.not_contain,
},
operatorMenuDisplayOrder: ['contain', 'not_contain'],
},
placeholder: {
key: 'placeholder',
label: 'Placeholder',
operators: {
predictive_contain: operators.predictive_contain,
predictive_not_contain: operators.predictive_not_contain,
},
operatorMenuDisplayOrder: [
'predictive_contain',
'predictive_not_contain',
],
},
lines: {
key: 'lines',
label: 'Line count',
operators: {
greater_than: operators.greater_than,
less_than: operators.less_than,
},
operatorMenuDisplayOrder: ['greater_than', 'less_than'],
},
cost: {
key: 'cost',
label: 'Cost',
operators: {
greater_than_float: operators.greater_than_float,
less_than_float: operators.less_than_float,
},
operatorMenuDisplayOrder: ['greater_than_float', 'less_than_float'],
},
status: {
key: 'status',
label: 'Status',
operators: {
status_any: operators.status_any,
status_not_any: operators.status_not_any,
},
operatorMenuDisplayOrder: ['status_any', 'status_not_any'],
},
caller: {
key: 'caller',
label: 'Caller',
operators: {
caller_is: operators.caller_is,
},
operatorMenuDisplayOrder: ['caller_is'],
},
macro: {
key: 'macro',
label: 'Macro',
operators: {
macro_is: operators.macro_is,
macro_is_not: operators.macro_is_not,
},
operatorMenuDisplayOrder: ['macro_is', 'macro_is_not'],
},
time: {
key: 'time',
label: 'Time',
operators: {
time_after: operators.time_after,
},
operatorMenuDisplayOrder: ['time_after'],
},
filtered_time: {
key: 'filtered_time',
label: 'Time After 4PM',
operators: {
filtered_time_after: operators.filtered_time_after,
},
operatorMenuDisplayOrder: ['filtered_time_after'],
},
last_update: {
key: 'last_update',
label: 'Last Update',
operators: {
newer_than_relative_date: operators.newer_than_relative_date,
newer_than_absolute_date: operators.newer_than_absolute_date,
newer_than_absolute_date_no_time:
operators.newer_than_absolute_date_no_time,
},
operatorMenuDisplayOrder: [
'newer_than_relative_date',
'newer_than_absolute_date',
'newer_than_absolute_date_no_time',
],
},
unread_only: {
key: 'unread_only',
label: 'Unread Only',
operators: {
unread: operators.unread,
},
operatorMenuDisplayOrder: ['unread_only'],
},
NESTED_FIELD: {
key: 'NESTED_FIELD',
label: '',
operators: {
AND: {
key: 'AND',
label: 'All of',
valueType: 'NESTED',
},
NOT: {
key: 'NOT',
label: 'None of',
valueType: 'NESTED',
},
OR: {
key: 'OR',
label: 'Any of',
valueType: 'NESTED',
},
},
operatorMenuDisplayOrder: ['AND', 'NOT', 'OR'],
},
CONTEXT_TOKEN: {
key: 'CONTEXT_TOKEN',
label: 'Context Token',
operators: {
CONTEXT_TOKEN: {
key: 'CONTEXT_TOKEN',
label: '',
valueType: 'NO_VALUE',
},
},
operatorMenuDisplayOrder: [],
},
},
};

View File

@@ -31,6 +31,7 @@ export type StringOperatorConfig = {
valueType: StringFilterValueType;
key: string;
label: string;
allowArbitraryEntries?: boolean;
};
export type EnumOperatorConfig = {
@@ -50,6 +51,7 @@ export type RelativeDateOperatorConfig = {
key: string;
label: string;
allowableTenses: InternPowerSearchRelativeDateAllowableTensesType;
isNegative?: boolean;
};
export type AbsoluteDateOperatorConfig = {
@@ -59,6 +61,7 @@ export type AbsoluteDateOperatorConfig = {
dateOnly?: boolean;
minValue?: Date;
maxValue?: Date;
isNegative?: boolean;
};
export type TimeOperatorConfig = {
@@ -67,6 +70,7 @@ export type TimeOperatorConfig = {
label: string;
minValue?: Date;
maxValue?: Date;
isNegative?: boolean;
};
export type OperatorConfig =
@@ -82,7 +86,6 @@ export type FieldConfig = {
label: string;
operators: {[key: string]: OperatorConfig};
operatorMenuDisplayOrder: string[];
typeaheadOperators: string[];
};
export type PowerSearchConfig = {