1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-10-27 11:02:16 +01:00
Commit Graph

14408 Commits

Author SHA1 Message Date
David Leek
c39b4cd1b0
feat: add a suggestion banner at the bottom of empty feature-environments (#10725) 2025-10-06 09:02:15 +02:00
Mateusz Kwasniewski
c65a336783
feat: milestone start time update (#10730) 2025-10-03 14:09:49 +02:00
Mateusz Kwasniewski
f670505e56
feat: milestones started at migration (#10729) 2025-10-03 13:38:32 +02:00
Mateusz Kwasniewski
3ef2a7f93b
feat: add histogram to impact metrics (#10728) 2025-10-03 10:13:12 +02:00
Tymoteusz Czech
adada932b9
fix: clearing lifecycle filter when switching to archived view (#10726)
"Lifecycle" filter should never be enabled when viewing archive.
2025-10-03 09:29:02 +02:00
Gastón Fournier
a927f1f42b
chore: new method that considers users updated at the same time (#10723)
We could have users updated at the exact same time, so we need to
include that timestamp in the next fetch to avoid missing users, but
also include the latest user id so we can exclude the ones already
fetched.

The following test shows how to process pages with this new method:

c03df86ee0/src/lib/features/users/user-updates-read-model.test.ts (L39-L65)
2025-10-03 09:24:53 +02:00
Tymoteusz Czech
1e5de5b8b7
feat: new invoice billing page view (#10721)
Mockup of more detailed summary of used traffic on hosted offer.
See previous PR #10718
2025-10-03 07:24:27 +00:00
Tymoteusz Czech
9b5324ac92
feat: flag traffic billing display feature (#10718)
Feature flag and initial changes in Billing UI
2025-10-03 09:18:39 +02:00
Nuno Góis
df67c041fc
chore: new confirmation dialog for replacing release plans (#10720)
https://linear.app/unleash/issue/2-3931/add-a-confirmation-dialog-when-replacing-existing-release-plan

Adds a confirmation dialog when replacing an already active release
plan.

<img width="706" height="325" alt="image"
src="https://github.com/user-attachments/assets/f682809c-f563-4dca-9924-be1e9188c698"
/>
2025-10-02 15:48:27 +01:00
Mateusz Kwasniewski
6c6d4c0ccc
chore: milestone progression flag (#10719) 2025-10-02 14:28:37 +02:00
Gastón Fournier
fb5d4cc7a1
fix: constraints should not be null (#10717)
## About the changes
In our code, we're not expecting constraints to be null:
https://github.com/search?q=repo%3AUnleash%2Funleash%20jsonb_array_elements(constraints)&type=code

It's unlikely to get a null value in constraints when using our API or
UI, but there might be cases where this can happen, as we saw in our
logs:
```
error: select "context_fields"."name", "context_fields"."description", "context_fields"."stickiness", "context_fields"."sort_order", "context_fields"."legal_values", "context_fields"."created_at", COUNT(DISTINCT CASE
                        WHEN features.archived_at IS NULL
                        THEN feature_strategies.project_name
                    END) AS used_in_projects, COUNT(DISTINCT CASE
                        WHEN features.archived_at IS NULL
                        THEN feature_strategies.feature_name
                    END) AS used_in_features from "context_fields" LEFT JOIN feature_strategies ON EXISTS (
                        SELECT 1
                        FROM jsonb_array_elements(feature_strategies.constraints) AS elem
                        WHERE elem ->> 'contextName' = context_fields.name
                      ) left join "features" on "features"."name" = "feature_strategies"."feature_name" group by "context_fields"."name", "context_fields"."description", "context_fields"."stickiness", "context_fields"."sort_order", "context_fields"."created_at" order by "name" asc - cannot extract elements from a scalar
```
which is likely due to:
`jsonb_array_elements(feature_strategies.constraints)` with null
constraints

For this reason, it seems reasonable to enforce the constraint at the
database level.
2025-10-02 12:45:53 +02:00
dependabot[bot]
562f7c5aaa
chore(deps): bump vite from 6.3.5 to 6.3.6 (#10642) 2025-10-02 11:45:02 +02:00
Tymoteusz Czech
f5af92b5ee
feat: change "archived" flags filter placement on project flags list (#10710)
Archived flags link will now it will show up on the right side, next to
import/export, which makes it more in line with flags overview.

Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-10-02 11:44:57 +02:00
unleash-bot[bot]
da22cb0d65
chore(AI): etagVariant flag cleanup (#10714)
This PR cleans up the etagVariant flag. These changes were automatically
generated by AI and should be reviewed carefully.

Fixes #10711

## 🧹 AI Flag Cleanup Summary
This PR removes the `etagVariant` feature flag, making the versioned
ETag format
(`v2`) the default and only behavior for the client features API.
### 🚮 Removed
- **Feature Flag**
- Removed the `etagVariant` flag definition from `experimental.ts`.
- Removed conditional logic for ETag generation in
`client-feature-toggle.controller.ts`.
- **Testing**
- Removed parameterized tests for both states of the flag in
`feature.optimal304.e2e.test.ts`.
- Removed configuration of the `etagVariant` flag in test setup.
### 🛠 Kept
- **ETag Generation**
- The logic to generate ETags with a version suffix (`v1`) is now the
standard
behavior.
- **Testing**
- Tests have been updated to exclusively assert the presence of the `v1`
suffix in ETags.
### 📝 Why
The `etagVariant` feature flag has been successfully rolled out and is
now
considered complete. By removing the flag, we are simplifying the
codebase by
eliminating conditional paths and making the improved ETag format
permanent.
This change ensures all client API responses for features include a
versioned
ETag, which helps with cache-busting when the ETag format changes in the
future.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Gastón Fournier <gaston@getunleash.io>
2025-10-02 11:26:53 +02:00
Mateusz Kwasniewski
c2b598d8d9
refactor: centralize number formatting (#10716) 2025-10-02 09:36:27 +02:00
Mateusz Kwasniewski
921130a9c0
fix: impact metrics formatting (#10715) 2025-10-01 16:33:58 +02:00
Tymoteusz Czech
b409cc8034
feat: add placeholder for empty change requests table (#10706) 2025-10-01 14:22:04 +02:00
Tymoteusz Czech
c7eb79038e
chore: add flags for UI filter refactor (#10708) 2025-10-01 09:20:25 +00:00
Nuno Góis
7462465a0b
chore: resource limits service (#10709)
https://linear.app/unleash/issue/2-3927/implement-resource-limits-service

Implements a resource limits service.

The implementation looks trivial (or even redundant) in OSS, but by
implementing a resource limits service we can make this potentially
dynamic and overridable.
2025-10-01 09:57:18 +01:00
Tymoteusz Czech
9d996f14d9
feat: improve flag filters on project page (#10705) 2025-10-01 10:11:02 +02:00
Tymoteusz Czech
c12aca72db
Refactor flag filters (#10703)
Refactored and simplified code around flag filters, in preparation for
UI improvements. It's split into 2 PRs in order to simplify what needs
to be behind a flag and what doesn't.

- `ExperimentalColumnsMenu` moved to `ColumnsMenu`, old unused
`ColumnsMenu` removed
- Parts of the code moved to `ProjectFeaturesColumnsMenu`
- Moved `FlagCreationButton` to a separate file
- Removed part behind archived flag (`projectOverviewRefactorFeedback`)
2025-10-01 09:30:36 +02:00
Nuno Góis
e46f8881d1
chore: extract UI config logic into its own service (#10704)
https://linear.app/unleash/issue/2-3921/extract-ui-config-logic-into-its-own-service

Extracts UI config logic into its own service.

This is the first step to accomplish resource limits and license key
resources alignment.
2025-09-30 11:04:20 +01:00
Nuno Góis
b865ee44f3
chore: address UX feedback for add strategy modal (#10698)
https://linear.app/unleash/issue/2-3911/address-new-ux-feedback

Addresses UX feedback regarding new "add strategy" modal:
- "View more strategies" instead of "View more"
- Avoid horizontal scroll
- Fix responsiveness
- Prevent flicker when navigating between strategy and preview modals
2025-09-26 14:54:08 +01:00
Thomas Heartman
99c4f7111a
feat: add change request table filter buttons (#10679)
Adds filter buttons for filtering between "CRs created by me" and "CRs
where I've been requested as an approver".

The current implementation is fairly simplistic and the buttons are not
connected to the actual table state directly (instead being set up with
their own simple state and onChange hooks), but it covers the simple
scenario. I want to defer a more complex solution until we know we need
it and until we know exactly what we need. The implementation is based
on the lifecycle filters that we have on the project flags page.

The current logic is such that: when you land on the page, there's no
query params in the URL, but the data fetch applies `createdBy:IS<your
user>`. If you switch to "approval requested" (and back again), the URL
will reflect this.

For reference, the github workflow works like this, where each URL has a
set of default filters, e.g.:
- `/pulls`: `is:open is:pr assignee:thomasheartman archived:false`
- `/pulls/review-requested`: `is:open is:pr
review-requested:thomasheartman archived:false`

But if you change the default filters or add new ones, the URL will
update to `pulls?<query-string>` (e.g.
`/pulls?q=is%3Aopen+is%3Apr+review-requested%3Athomasheartman+archived%3Atrue`)

So this takes a similar approach, but better suited to the way we do
tables in general.

Rendered:

<img width="1816" height="791" alt="image"
src="https://github.com/user-attachments/assets/60935900-488d-4ca9-b110-39f3568a08a6"
/>

<img width="1855" height="329" alt="image"
src="https://github.com/user-attachments/assets/5e865a2e-8fdc-41ab-ba38-bbe6776d04ad"
/>
2025-09-26 12:42:47 +02:00
Thomas Heartman
7f97121c3b
fix: fall back to count === 0 if undefined / don't show "0 of undefined" (#10687)
If the total number of flag is undefined, we've previously shown "0 of
undefined". However, I don't think that's sensible. Instead, we should
show "0".

Before:
<img width="386" height="114" alt="image"
src="https://github.com/user-attachments/assets/5da61c05-16d2-4722-9874-63c1d011884b"
/>

After:
<img width="224" height="103" alt="image"
src="https://github.com/user-attachments/assets/c6c0711b-f3ce-45e3-8302-bfe9377112a8"
/>
2025-09-25 11:26:53 +02:00
Thomas Heartman
81b643cada
chore: rename variable for clarity (#10694)
entriesToLeave is more ambiguous than entriesToKeep, so let's go with
the latter.
2025-09-25 11:17:05 +02:00
Mateusz Kwasniewski
58c0076f22
feat: display aggregation mode automatically (#10696) 2025-09-24 18:02:26 +02:00
Gastón Fournier
e0cdf6addd
feat: add users updated read model (#10693)
## About the changes
This adds a user read model using the updated_at new field in the users
table.
2025-09-24 17:39:03 +02:00
Mateusz Kwasniewski
413847374e
feat: using histogram metrics (#10695) 2025-09-24 17:02:29 +02:00
Thomas Heartman
59bf19bf96
chore: use params object for swr cache clearing functions (#10692)
With three and four different parameters (of which two are strings that
are easily interchanged), it makes sense to rewrite these two functions
to take named parameters instead. This is a follow-up to
https://github.com/Unleash/unleash/pull/10689 based on one of the review
comments.
2025-09-24 15:17:25 +02:00
Thomas Heartman
e3fc88b11f
fix: cache eviction bug and the eternal loading screen (#10689)
Fixes an issue where the project feature list (and potentially other
places in the app that use the `useClearSWRCache` hook) would end up in
an infinite loading screen because the latest entry that we want to show
was overwritten.

The primary reason this happened is that we used `keysToDelete =
array.slice(SWR_CACHE_SIZE - 1)`. Because the map keys are returned in
insertion order, this would make us never delete the oldest keys, but
always anything after the cache reached it's maximum size. The fix was
to instead do `slice(0, -(SWR_CACHE_SIZE - 1))`, unless that is `0, 0`.
If so, then just delete the entire filtered keys set.

As a bonus: this PR also deduplicates cache entries that have the same
query params but in different order for the feature search. This further
reduces the cache space needed.
2025-09-24 14:37:58 +02:00
Mateusz Kwasniewski
3bb317ad6d
feat: node sdk with histogram (#10690) 2025-09-24 14:17:16 +02:00
Nuno Góis
3d9f5581d5
chore: limit total custom strategies displayed (#10688)
https://linear.app/unleash/issue/2-3897/limit-custom-strategies-like-were-doing-with-release-templates

Limits total custom strategies displayed, like we're doing for release
templates, in the new "add strategy" modal.

Added a more generic logic to `FeatureStrategyMenuCardsSection.tsx` so
we can reuse it for both.

We can also do it for other sections in the modal, but that feels like a
premature optimization. These 2 categories are the ones that are user
owned, and can have many items.
2025-09-24 13:06:49 +01:00
Nuno Góis
e98b511bb2
chore: add quick filter for custom strategies (#10686)
https://linear.app/unleash/issue/2-3896/add-quick-filter-for-custom-strategies

Adds a quick filter for custom strategies in the new "add strategy"
modal.

<img width="793" height="234" alt="image"
src="https://github.com/user-attachments/assets/b7190ff1-ef92-44b2-ad78-f3b283bdf6a2"
/>
2025-09-24 12:29:37 +01:00
Nuno Góis
27af5cb0b9
chore: update view more templates button design (#10685)
https://linear.app/unleash/issue/2-3898/update-the-design-of-the-view-more-button

Updates the design of the "view more templates" button in the new "add
strategy" modal.

<img width="925" height="221" alt="image"
src="https://github.com/user-attachments/assets/2a790828-aac5-4c56-bbac-bcb254dc6049"
/>
2025-09-24 12:02:26 +01:00
Mateusz Kwasniewski
efdfb67c9f
feat: histogram impact metric UI (#10684) 2025-09-24 10:53:58 +02:00
Nuno Góis
b4ad9c964f
chore: adjust add strategy modal height (#10677)
https://linear.app/unleash/issue/2-3893/set-a-minimum-height-in-the-release-template-preview-dialog

Adjusts the "add strategy" and "release template preview" modal heights,
ensuring better visual consistency between them.
2025-09-23 16:25:51 +01:00
Gastón Fournier
907727947a
Revert "feat: enforce email null when deleted is set" (#10682)
Reverts Unleash/unleash#10680

SCIM protocol requires us to keep the email stored, so this constraint
doesn't hold.
2025-09-23 17:25:39 +02:00
Nuno Góis
63b0006b46
chore: update strategy cards background color (#10681)
https://linear.app/unleash/issue/2-3895/update-cards-background-color

Updates the strategy cards background color to match the designs.

<img width="985" height="569" alt="image"
src="https://github.com/user-attachments/assets/6b6e1dd3-b811-4841-8858-4046f3c79717"
/>
2025-09-23 13:54:25 +01:00
Gastón Fournier
d33e57a05f
feat: enforce email null when deleted is set (#10680)
## About the changes
When deleting a user we set the email to null and deleted_at to the
current date, there's no case where email is set and deleted_at is also
set.

We found some situations where this happens, specifically when SAML and
SCIM are used in conjunction
2025-09-23 14:43:53 +02:00
Thomas Heartman
4dd97b97f4
chore: use paginated table for change request list (#10660)
Adds a paginated table to the change request overview page and
integrates it with the search API hook.

The current implementation still has some rough edges to work out, but
it's getting closer.

There's no sort buttons in this implementation. I've got it working on
the side, but TS is complaining about types not matching up, so I'm
spinning that out to a separate PR.

<img width="1808" height="1400" alt="image"
src="https://github.com/user-attachments/assets/bdee97b7-ee2a-46c0-8460-a8b8e14d3c92"
/>
2025-09-23 12:05:11 +00:00
Nuno Góis
c824b3e26b
chore: bump slack/web-api dependency (#10678)
https://linear.app/unleash/issue/2-3894/bump-slackweb-api-to-7100

Bumps `@slack/web-api` dependency to `^7.10.0`.

Ran a few manual tests just to be sure, and everything seems to be
working as intended.
2025-09-23 11:50:27 +01:00
dependabot[bot]
1ab047859f
chore(deps): bump mermaid from 11.4.1 to 11.10.1 in /website (#10525) 2025-09-23 12:14:17 +02:00
Thomas Heartman
6be5e6c969
fix: don't call location hook conditionally in CR badge (#10676)
Fixes a bug where I added a conditional hook call in
https://github.com/Unleash/unleash/pull/10651.
2025-09-23 10:46:23 +02:00
dependabot[bot]
38de4db3e2
chore(deps): bump sha.js from 2.4.11 to 2.4.12 in /website (#10520) 2025-09-22 18:42:48 +02:00
dependabot[bot]
250d308dee
chore(deps): bump axios from 1.8.2 to 1.12.0 in /website (#10666) 2025-09-22 18:09:53 +02:00
dependabot[bot]
dd3ed156da
chore(deps): bump axios from 1.11.0 to 1.12.2 (#10669) 2025-09-22 18:08:47 +02:00
Gastón Fournier
a628755506
fix: SSO auto create with SCIM tend to override each other (#10675)
## About the changes
Having SCIM enabled with SAML and auto-create can generate issues with
each protocol stepping into the other protocol's toes.

This PR adds protection to avoid updating SCIM-managed users with SAML
data (cause SCIM will override this data later).

It also adds a new method in the store to check if we have cases where
deleted_at is set but the email is not cleared, and there's no delete
event in the audit log (we've found one case, and we believe it might be
related to interoperability issues between SAML and SCIM)
2025-09-22 17:55:22 +02:00
Mateusz Kwasniewski
8d03ce340d
feat: histogram impact metric ingestion (#10674) 2025-09-22 17:14:07 +02:00
Nuno Góis
f36b39b721
chore: update release template preview dialog (#10673)
https://linear.app/unleash/issue/2-3888/update-the-release-templates-preview-dialog-to-match-the-new-designs

Updates the release template preview dialog when using the new "add
strategy" modal, so it better matches the new design.

Used the legacy file pattern to leave the previous modal component
unchanged.

<img width="992" height="467" alt="image"
src="https://github.com/user-attachments/assets/fd000822-c987-47be-b8a4-3f137e0291ec"
/>

<img width="979" height="576" alt="image"
src="https://github.com/user-attachments/assets/02a27d5c-4480-4a49-88ae-0d573ff0f640"
/>
2025-09-22 14:55:24 +01:00