mirror of
https://github.com/Unleash/unleash.git
synced 2025-08-04 13:48:56 +02:00
This PR takes two steps towards better constraint handling: ## New type: `IConstraintWithId` Introduces a new type, `IConstraintWithId`. This is the same as an `IConstraint`, except the constraint id property is required. The idea is that the list of editable constraints should move towards using this instead of just `IConstraint`. That should prevent us (on a type-level) from seeing more of the same kind of errors we saw with the segment constraints yesterday. I don't want to go ahead and update all the upstream uses of this to IConstraintWithId in this PR, so I'll look at that separately. ## API payload constraint replacer Introduces an api payload constraint "replacer", which we can use for [JSON.stringify's `replacer` parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#the_replacer_parameter). The current implementation works both for strategies and for segments and has been added to edit + create forms for both of these resources. This has a couple benefits: 1. We can clearly state exactly how we want them to be rendered, including property order. I've decided to go with context -> operator -> value(s) as the main one (check the screenie), as I believe this is the most logical reading order. 2. We can exclude value/values (whichever one doesn't work with the operator) 3. It doesn't matter how we treat constraints internally, we can still present the payload how we want 4. Importantly: this only affects the stringification for the user-facing API payload, so it's very low risk. It does not affect anything that we actually send to the api. Here's what it can look like with ordered properties: <img width="392" alt="image" src="https://github.com/user-attachments/assets/f46f77c8-0b5a-4ded-b13a-bb567df60bd3" />
24 lines
688 B
TypeScript
24 lines
688 B
TypeScript
import { constraintId } from 'constants/constraintId';
|
|
import { isDateOperator } from 'constants/operators';
|
|
import type { IConstraintWithId } from 'interfaces/strategy';
|
|
import { operatorsForContext } from 'utils/operatorsForContext';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
export const createEmptyConstraint = (
|
|
contextName: string,
|
|
): IConstraintWithId => {
|
|
const operator = operatorsForContext(contextName)[0];
|
|
|
|
const value = isDateOperator(operator) ? new Date().toISOString() : '';
|
|
|
|
return {
|
|
contextName,
|
|
operator,
|
|
value,
|
|
values: [],
|
|
caseInsensitive: false,
|
|
inverted: false,
|
|
[constraintId]: uuidv4(),
|
|
};
|
|
};
|