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

6344 Commits

Author SHA1 Message Date
Thomas Heartman
fabf76e12c
feat: global change requests table (#10650)
Adds basic table layout for the global change requests page and makes
the page accessible at `/change-requests`.

The table is based on the project-based change request table, but with a
slightly different set of columns.

Uses mock data for now. 

There's still some styling to be done for the column widths and handling
narrower screens.

<img width="1386" height="671" alt="image"
src="https://github.com/user-attachments/assets/b24ed625-d3f6-4281-ba44-30744d5063f3"
/>

If the flag is disabled, we render nothing useful.
<img width="1429" height="287" alt="image"
src="https://github.com/user-attachments/assets/289b5707-4389-4c08-bf68-55d63e186ba5"
/>


closes 1-4076
2025-09-11 10:15:57 +03:00
Thomas Heartman
d3e7e67b91
Fix: use locale string for change request time badge. (#10651)
Uses the user's preferred date / time formatting for the scheduled at
time in CR schedule badges.

Before (en-US formatting):
<img width="291" height="58" alt="image"
src="https://github.com/user-attachments/assets/edb04292-4678-4bfd-93a1-8fd2a3f01a1f"
/>

After (ja formatting):
<img width="308" height="106" alt="image"
src="https://github.com/user-attachments/assets/9828355f-0c23-4b8f-bef3-a0173e92c306"
/>
2025-09-11 09:13:26 +02:00
renovate[bot]
c4525b63c9
chore(deps): update dependency vite to v5.4.20 [security] (#10653)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`5.4.19` ->
`5.4.20`](https://renovatebot.com/diffs/npm/vite/5.4.19/5.4.20) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/vite/5.4.20?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/5.4.19/5.4.20?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-58752](https://redirect.github.com/vitejs/vite/security/advisories/GHSA-jqfw-vq24-v9c3)

### Summary
Any HTML files on the machine were served regardless of the `server.fs`
settings.

### Impact

Only apps that match the following conditions are affected:

- explicitly exposes the Vite dev server to the network (using --host or
[server.host config
option](https://vitejs.dev/config/server-options.html#server-host))
- `appType: 'spa'` (default) or `appType: 'mpa'` is used

This vulnerability also affects the preview server. The preview server
allowed HTML files not under the output directory to be served.

### Details
The
[serveStaticMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L123))
function is in charge of serving static files from the server. It
returns the
[viteServeStaticMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L136))
function which runs the needed tests and serves the page. The
viteServeStaticMiddleware function [checks if the extension of the
requested file is
".html"](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L144)).
If so, it doesn't serve the page. Instead, the server will go on to the
next middlewares, in this case
[htmlFallbackMiddleware](9719497ade/packages/vite/src/node/server/middlewares/htmlFallback.ts (L14)),
and then to
[indexHtmlMiddleware](9719497ade/packages/vite/src/node/server/middlewares/indexHtml.ts (L438)).
These middlewares don't perform any test against allow or deny rules,
and they don't make sure that the accessed file is in the root directory
of the server. They just find the file and send back its contents to the
client.

### PoC
Execute the following shell commands:

```
npm  create  vite@latest
cd vite-project/
echo  "secret" > /tmp/secret.html
npm install
npm run dev
```

Then, in a different shell, run the following command:

`curl -v --path-as-is
'http://localhost:5173/../../../../../../../../../../../tmp/secret.html'`

The contents of /tmp/secret.html will be returned.

This will also work for HTML files that are in the root directory of the
project, but are in the deny list (or not in the allow list). Test that
by stopping the running server (CTRL+C), and running the following
commands in the server's shell:

```
echo  'import path from "node:path"; import { defineConfig } from "vite"; export default defineConfig({server: {fs: {deny: [path.resolve(__dirname, "secret_files/*")]}}})'  >  [vite.config.js](http://vite.config.js)
mkdir secret_files
echo "secret txt" > secret_files/secret.txt
echo "secret html" > secret_files/secret.html
npm run dev

```

Then, in a different shell, run the following command:

`curl -v --path-as-is 'http://localhost:5173/secret_files/secret.txt'`

You will receive a 403 HTTP Response,  because everything in the
secret_files directory is denied.

Now in the same shell run the following command:

`curl -v --path-as-is 'http://localhost:5173/secret_files/secret.html'`

You will receive the contents of secret_files/secret.html.

####
[CVE-2025-58751](https://redirect.github.com/vitejs/vite/security/advisories/GHSA-g4jq-h2w9-997c)

### Summary
Files starting with the same name with the public directory were served
bypassing the `server.fs` settings.

### Impact
Only apps that match the following conditions are affected:

- explicitly exposes the Vite dev server to the network (using --host or
[`server.host` config
option](https://vitejs.dev/config/server-options.html#server-host))
- uses [the public directory
feature](https://vite.dev/guide/assets.html#the-public-directory)
(enabled by default)
- a symlink exists in the public directory

### Details
The
[servePublicMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L79))
function is in charge of serving public files from the server. It
returns the
[viteServePublicMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L106))
function which runs the needed tests and serves the page. The
viteServePublicMiddleware function [checks if the publicFiles variable
is
defined](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L111)),
and then uses it to determine if the requested page is public. In the
case that the publicFiles is undefined, the code will treat the
requested page as a public page, and go on with the serving function.
[publicFiles may be undefined if there is a symbolic link anywhere
inside the public
directory](9719497ade/packages/vite/src/node/publicDir.ts (L21)).
In that case, every requested page will be passed to the public serving
function. The serving function is based on the
[sirv](https://redirect.github.com/lukeed/sirv) library. Vite patches
the library to add the possibility to test loading access to pages, but
when the public page middleware [disables this
functionality](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L89))
since public pages are meant to be available always, regardless of
whether they are in the allow or deny list.

In the case of public pages, the serving function is [provided with the
path to the public
directory](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L85))
as a root directory. The code of the sirv library [uses the join
function to get the full path to the requested
file](d061616827/packages/sirv/index.mjs (L42)).
For example, if the public directory is "/www/public", and the requested
file is "myfile", the code will join them to the string
"/www/public/myfile". The code will then pass this string to the
normalize function. Afterwards, the code will [use the string's
startsWith
function](d061616827/packages/sirv/index.mjs (L43))
to determine whether the created path is within the given directory or
not. Only if it is, it will be served.

Since [sirv trims the trailing slash of the public
directory](d061616827/packages/sirv/index.mjs (L119)),
the string's startsWith function may return true even if the created
path is not within the public directory. For example, if the server's
root is at "/www", and the public directory is at "/www/p", if the
created path will be "/www/private.txt", the startsWith function will
still return true, because the string "/www/private.txt" starts with 
"/www/p". To achieve this, the attacker will use ".." to ask for the
file "../private.txt". The code will then join it to the "/www/p"
string, and will receive "/www/p/../private.txt". Then, the normalize
function will return "/www/private.txt", which will then be passed to
the startsWith function, which will return true, and the processing of
the page will continue without checking the deny list (since this is the
public directory middleware which doesn't check that).

### PoC
Execute the following shell commands:

```
npm  create  vite@latest
cd vite-project/
mkdir p
cd p
ln -s a b
cd ..
echo  'import path from "node:path"; import { defineConfig } from "vite"; export default defineConfig({publicDir: path.resolve(__dirname, "p/"), server: {fs: {deny: [path.resolve(__dirname, "private.txt")]}}})' > vite.config.js
echo  "secret" > private.txt
npm install
npm run dev
```

Then, in a different shell, run the following command:

`curl -v --path-as-is 'http://localhost:5173/private.txt'`

You will receive a 403 HTTP Response,  because private.txt is denied.

Now in the same shell run the following command:

`curl -v --path-as-is 'http://localhost:5173/../private.txt'`

You will receive the contents of private.txt.

### Related links
-
f0113f3f82

---

### Release Notes

<details>
<summary>vitejs/vite (vite)</summary>

###
[`v5.4.20`](https://redirect.github.com/vitejs/vite/compare/v5.4.19...v5.4.20)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v5.4.19...v5.4.20)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" in timezone Europe/Madrid,
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/Unleash/unleash).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-10 14:33:31 +00:00
Thomas Heartman
aec3461159
chore: change from "change requests" to "open" in project change request tabs (#10648)
For some reason, the two change request tabs are called "Change
Requests" and "Closed", instead of "Open" and "Closed".

I suspect this may be an error, but this fixes it. 

Before:
<img width="383" height="176" alt="image"
src="https://github.com/user-attachments/assets/faf95827-f384-4187-bc0b-f32b8fbbef41"
/>

After:
<img width="372" height="166" alt="image"
src="https://github.com/user-attachments/assets/67528024-7783-42e3-b014-bad4f7bc871b"
/>
2025-09-10 16:05:22 +02:00
Thomas Heartman
509dd80f86
chore: Update from "toggles" to "flags" (#10647)
Updates the features cell text when you have lots of flags affected.

Looks like we missed this one in a previous renaming attempt.

Before:
<img width="245" height="154" alt="image"
src="https://github.com/user-attachments/assets/922334f4-a0f1-4dee-9d14-3c9b3f77f32c"
/>

After:
<img width="275" height="170" alt="image"
src="https://github.com/user-attachments/assets/7fa0f454-e695-46aa-918b-c22b97e94187"
/>
2025-09-10 16:05:18 +02:00
Nuno Góis
a5adac5d8d
chore: add quick filters to add strategy modal (#10641)
https://linear.app/unleash/issue/2-3868/add-strategy-filters-at-the-top

Adds quick filters to our "add strategy" modal.

`FeatureStrategyMenuCards.tsx` was getting increasingly complex, so this
includes some refactoring.

My quick filters implementation was generic enough that I added
`QuickFilters.tsx` as a common component, maybe we can reuse it in the
future.

<img width="991" height="663" alt="image"
src="https://github.com/user-attachments/assets/352b6d2d-c975-4cb1-9799-163dfb153ccb"
/>

<img width="985" height="358" alt="image"
src="https://github.com/user-attachments/assets/a7d20dab-2774-409f-8940-f0d1a980b819"
/>
2025-09-10 12:14:14 +01:00
Thomas Heartman
0ea006f72c
Add globalChangeRequestList flag to Unleash (#10645)
Add a flag for the new CR list feature.
2025-09-10 11:11:10 +00:00
Mateusz Kwasniewski
b55a961da0
refactor: centralize pagination options (#10636) 2025-09-09 14:00:55 +02:00
Mateusz Kwasniewski
6198900014
fix: limit reset when no pagination bar (#10634) 2025-09-09 13:18:33 +02:00
Nuno Góis
2cd8135988
chore: new add strategy modal design (#10633)
https://linear.app/unleash/issue/2-3870/new-modal-design

New "add strategy" modal base design.

We're still missing a few details, like the new card design and the
filters at the top, but those will come in follow-up PRs.

### New layout

<img width="986" height="597" alt="image"
src="https://github.com/user-attachments/assets/2bc83117-97a8-4b59-a187-73ef9a7d0469"
/>

### Default strategy tooltip, with a link to the default strategy
settings

<img width="326" height="119" alt="image"
src="https://github.com/user-attachments/assets/45da60cb-088b-4b6e-bead-f9ef13a2540b"
/>

### Default strategy with a custom title

<img width="318" height="163" alt="image"
src="https://github.com/user-attachments/assets/9c9862db-f21d-409f-8dc1-63673f00ba2e"
/>
2025-09-09 10:57:06 +01:00
Tymoteusz Czech
edaea80f0c
refactor: new endpoint for global impact metrics saving (#10631)
Use `impact-metrics/config` for saving global charts.
2025-09-09 09:22:43 +02:00
Nuno Góis
b8cdd1d004
chore: add newStrategyModal flag (#10629)
https://linear.app/unleash/issue/2-3865/add-newstrategymodal-feature-flag

Adds `newStrategyModal` feature flag.

The approach here is to duplicate the existing
`FeatureStrategyMenuCards` into a `LegacyFeatureStrategyMenuCards`.
We'll continue working on the `FeatureStrategyMenuCards` component while
leaving `LegacyFeatureStrategyMenuCards` untouched. Once we're done with
the implementation and remove the flag we can drop the legacy file.

I think it's easier to reduce our add strategy buttons to a single one
right away (like we did with the `addConfiguration` flag in
https://github.com/Unleash/unleash/pull/10420). This allows us to focus
on the end result instead of having to implement things like "clicking
the 'add release template' button should show the modal filtered to only
release templates".

<img width="735" height="126" alt="image"
src="https://github.com/user-attachments/assets/6d10fab2-d091-40f3-9c36-05a6f28f7dda"
/>

<img width="995" height="742" alt="image"
src="https://github.com/user-attachments/assets/a0fb9366-89b5-44e1-a684-47ee30d6d36c"
/>
2025-09-08 12:16:27 +01:00
unleash-bot[bot]
9540ed6e3d
chore(AI): addConfiguration flag cleanup (#10628)
This PR cleans up the addConfiguration flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10627

## 🧹 AI Flag Cleanup Summary
This change removes the `addConfiguration` feature flag. The feature was
discarded, so this cleanup reverts the UI to its state before the
`addConfiguration` flag was introduced. The primary change is in the
strategy
menu, where the single "Add configuration" button is removed and the
original
"Use template," "Add strategy," and "More" buttons are restored.
### 🚮 Removed
- **Flag Definitions**
- `addConfiguration` flag from `experimental.ts` on the backend.
- `addConfiguration` flag from `uiConfig.ts` on the frontend.
- `addConfiguration: true` from the `server-dev.ts` config.
- **UI Components & Logic**
- The conditional rendering in `FeatureStrategyMenu.tsx` that showed an
"Add
configuration" button.
- The `useUiFlag('addConfiguration')` hook call and its import from
`FeatureStrategyMenu.tsx`.
### 🛠 Kept
- **UI Components & Logic**
- The original set of buttons in `FeatureStrategyMenu.tsx`: "Use
template",
"Add strategy", and a "More strategies" icon button. This was the code
path for
when the flag was disabled.
### 📝 Why
The `addConfiguration` feature flag was marked as completed with the
outcome
"discarded". This cleanup removes the flag and all related code,
preserving only
the intended code path, which is the UI behavior from before the flag
was
introduced.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Nuno Góis <github@nunogois.com>
2025-09-08 07:38:10 -03:00
Tymoteusz Czech
ea4c0a0941
feat: handle global impact metrics in frontend api hook (#10626) 2025-09-05 10:24:48 +00:00
Tymoteusz Czech
82c79a8216
feat: add borders and spacing to feature impact metrics (#10625) 2025-09-05 10:10:25 +00:00
Mateusz Kwasniewski
33d898f684
feat: change flag impact metrics url structure (#10624) 2025-09-05 11:28:35 +02:00
Tymoteusz Czech
29dc6c746d
feat: split impact metrics label filter into sections (#10623) 2025-09-05 09:26:23 +02:00
Mateusz Kwasniewski
4e4950adb7
feat: grid layout for flag impact metrics (#10619) 2025-09-04 15:09:49 +02:00
Mateusz Kwasniewski
4a00792f1e
feat: rename impact metrics fields to match prometheus and grafana (#10616) 2025-09-04 11:51:29 +02:00
Tymoteusz Czech
e96f981816
refactor: LabelFilterItem "select all" functionality (#10610) 2025-09-04 10:03:21 +02:00
Mateusz Kwasniewski
3b1592b329
feat: flag impact metrics use update feature permission (#10615) 2025-09-04 09:58:45 +02:00
Mateusz Kwasniewski
f8990a40ba
feat: edit impact metrics (#10614) 2025-09-03 16:55:34 +02:00
Mateusz Kwasniewski
cc8a950348
feat: delete flag impact metrics (#10613) 2025-09-03 15:58:39 +02:00
Thomas Heartman
295a3abd59
fix: Only show "not enough data" text when there isn't enough data. (#10604)
The previous implementation had a small bug where it would show "not
enough data" even if the graph was loading. This commit fixes that.

While working, I thought that maybe we should keep the current data
while we're fetching new data instead of adding a cover, but all the
other graphs use a cover when loading, so I've not made any changes to
that effect.
2025-09-03 12:23:36 +02:00
Nuno Góis
fb40bb07c4
chore: slight update to unknown flags alert text (#10602)
https://linear.app/unleash/issue/2-3850/update-unknown-flag-alert

Small update to the unknown flags alert text.

<img width="994" height="776" alt="image"
src="https://github.com/user-attachments/assets/a69cdc63-b0f8-4b1b-9323-7cfdb4ba5b31"
/>
2025-09-03 10:17:17 +01:00
Thomas Heartman
778eaa9873
chore: Add a cover for when we don't have enough data to show the chart (#10599)
Adds a cover to the archived vs created flag chart if we don't have
enough data or if the data is loading. Follows the pattern established
in the other analytics charts.

Because the values for a placeholder bar chart are different than for a
placeholder line chart, I've added in actual placeholder values. This
also makes the gives the chart in question two bars per category, even
in the placeholder data, which matches nicely with the actual graph.

Before:
<img width="2272" height="974" alt="image"
src="https://github.com/user-attachments/assets/3336717f-acc8-4d23-a208-138259d6d3c7"
/>


After: 
<img width="1131" height="487" alt="image"
src="https://github.com/user-attachments/assets/5189e323-c636-4089-b4eb-30b231b09b8b"
/>

In context with the other charts: 
<img width="1392" height="1744" alt="image"
src="https://github.com/user-attachments/assets/7809669c-dae8-496b-b89b-0913fab85c17"
/>
2025-09-03 09:02:10 +02:00
Nuno Góis
9a7f2c520a
chore: add server-side search to archived flags (#10600)
https://linear.app/unleash/issue/2-3842/archived-flag-not-showing

Adds server-side search to archived flags.

In the future we'll probably want to dedicate a project to this page, to
bring it up to speed with the flags overview page. In the meantime, this
bandaid fix at least allows us to search outside the 50 results limit.

Also added a small alert to better explain the current behavior: 

<img width="902" height="275" alt="image"
src="https://github.com/user-attachments/assets/ab3da3ca-3408-471a-a74a-abb65e95e012"
/>
2025-09-02 16:44:28 +01:00
Thomas Heartman
c69634fda0
chore: Use custom highlighter for archive:creation chart (#10589)
Uses the same custom highlighter that we've used for the other analytics
charts, but customizes it for the archive : creation ratio chart. Also
removes the color change on hover from the bars.

Because this plugin (or a version of it) is also used in the network
traffic graphs, I've consolidated all the uses into a more configurable
one (because I was mistakenly working in the wrong file).

Before:
<img width="596" height="392" alt="image"
src="https://github.com/user-attachments/assets/d4270a6d-b1c6-47ff-8e98-424d0e7fe089"
/>


After:

<img width="1141" height="476" alt="image"
src="https://github.com/user-attachments/assets/aa10aa87-e111-4a75-8dce-4a2fec7af8ad"
/>
2025-09-02 15:20:12 +02:00
unleash-bot[bot]
dfa89d7d58
chore(AI): reportUnknownFlags flag cleanup (#10596)
This PR cleans up the reportUnknownFlags flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10595

## 🧹 AI Flag Cleanup Summary
This change removes the `reportUnknownFlags` feature flag and makes its
functionality a permanent part of the application. The "Unknown flags"
feature
is now always enabled.
### 🚮 Removed
- **Flag Definitions**
- Removed `reportUnknownFlags` from `IFlagKey` and `UiFlags` types.
- Removed `reportUnknownFlags` from the experimental flags configuration
in `src/lib/types/experimental.ts`.
- Removed the flag from development and test configurations
(`src/server-dev.ts`, `unknown-flags.e2e.test.ts`).
- **Conditional Logic**
- Removed conditional checks for `reportUnknownFlags` in backend
services
(`UnknownFlagsService`, `ClientMetricsServiceV2`) and API controllers
(`UnknownFlagsController`).
- Removed `useUiFlag('reportUnknownFlags')` and related conditional
rendering from frontend components (`UnknownFlagsTable`,
`FeatureToggleListTable`). The UI elements are now always visible.
- Modified the `useUnknownFlags` hook to always fetch data.
### 🛠 Kept
- **Core Functionality**
- The feature to report and display unknown flags is now always active.
- The "Unknown flags" link is now permanently visible on the feature
flags
overview page.
- Backend logic for processing and storing unknown flags is now always
executed.
### 📝 Why
The `reportUnknownFlags` feature flag was marked as completed with the
feature
being kept. This cleanup removes the flag and its associated conditional
logic,
simplifying the code and making the unknown flags reporting a permanent
feature.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Nuno Góis <github@nunogois.com>
2025-09-02 14:18:35 +01:00
Thomas Heartman
5b7f069705
fix: show first date in archived to created chart (#10598)
Ensures that the first date of the data is also shown.

Before:
<img width="1144" height="441" alt="image"
src="https://github.com/user-attachments/assets/33da968a-4f44-4ca9-825e-d19471cff00a"
/>


After:
<img width="1132" height="435" alt="image"
src="https://github.com/user-attachments/assets/65d009d4-5bcb-40d0-abb6-05be81c9a361"
/>
2025-09-02 12:21:01 +00:00
Mateusz Kwasniewski
88d384573f
feat: read feature impact metrics (#10597) 2025-09-02 13:16:57 +02:00
Jaanus
6c11b57c53
fix: remove lifecycle backfill on every startup 2025-09-02 13:55:18 +03:00
Nuno Góis
597456d4b5
chore: make create feature flag button in unknown flags a text button (#10592)
https://linear.app/unleash/issue/2-3835/make-create-feature-flag-a-variant=text-button-instead-of-an-icon

Makes "create feature flag" button in unknown flags a text button.

<img width="1130" height="480" alt="image"
src="https://github.com/user-attachments/assets/2a5cb8f9-d0d1-486e-aaf9-cc02f39a2b6f"
/>
2025-09-02 11:52:43 +01:00
Nuno Góis
ed28d9f2b4
chore: one unknown flag per row (#10590)
https://linear.app/unleash/issue/2-3833/show-one-flag-name-per-row

Groups unknown flags by flag name, showing a single flag name per row.
This greatly simplifies the way we show unknown flags.

Just to be safe, we're limiting the app names we're showing to 20, and
environments per app name to 10.

Required some plumbing.

### Basic example
<img width="1350" height="866" alt="image"
src="https://github.com/user-attachments/assets/ad8ee198-e5f8-45e4-8e3b-f2d8b7701cf9"
/>

### App name search example, with highlight

<img width="367" height="204" alt="image"
src="https://github.com/user-attachments/assets/a1cc27ee-9ca1-4980-a3af-c08302c1d617"
/>
2025-09-02 10:47:02 +01:00
unleash-bot[bot]
547f7ac14e
chore(AI): changeRequestApproverEmails flag cleanup (#10572) 2025-09-02 08:51:00 +02:00
Nuno Góis
9ef81be488
chore: add unknown flags link in flags overview (#10591)
https://linear.app/unleash/issue/2-3834/add-link-to-unknown-flags-in-flags-overview

Adds an "Unknown flags" link on the top right corner of the flags
overview page.

Even though we're planning to remove the flag soon, this is still
controlled by the flag, just in case.

<img width="1370" height="311" alt="image"
src="https://github.com/user-attachments/assets/073725c3-35af-47fb-b7d4-5bc70c0c68cf"
/>
2025-09-01 18:18:07 +01:00
Mateusz Kwasniewski
bc075a4915
chore: orval feature impact metrics (#10588) 2025-09-01 16:10:54 +02:00
Thomas Heartman
7cc3c32eb2
fix: date localizations for chart (#10581)
Adds date localization to the charts on the analytics page. In doing so,
I have extracted the default locales that we allow the user to set into
constants, so that we can reference it from other places. I have also
sorted the list and added my personal favorite format (ja) to it.

Because we have multiple charts on the analytics page, it felt weird
that only one chart should follow your preferred format. It also aligns
the existing charts' tooltip date format with the new one (`P` instead
of `PPP`).

In short: previously, the charts would show you only your system locale
(I think), which for me defaults to en-US, regardless of what setting
you'd set in your profile. Now we respect your setting as long as it's
one of the default ones.

Before (date formatting is en-US):
<img width="1444" height="1658" alt="image"
src="https://github.com/user-attachments/assets/99a893c7-efb6-4e55-b47c-9df66bf97636"
/>


After (date formatting is sv-SE):
<img width="1383" height="1653" alt="image"
src="https://github.com/user-attachments/assets/d408afd9-a8a7-46f3-8c13-9f7fde608cc4"
/>
2025-09-01 09:29:45 +00:00
Thomas Heartman
c7cb5465ff
chore: chart bar adjustments (#10555)
Updates chart bars with explicit border radii.

Before:
<img width="995" height="425" alt="image"
src="https://github.com/user-attachments/assets/d52c56a7-e022-4d27-8651-8897a49012e6"
/>


After:
<img width="1120" height="490" alt="image"
src="https://github.com/user-attachments/assets/b8660eb2-580b-48b7-8800-c5711b8a45a5"
/>
2025-09-01 10:30:27 +02:00
Thomas Heartman
5c74c34cbf
chore: Add date to archive vs creation tooltip (#10578)
Makes it easier to understand what piece of data you're looking at. The
raw date isn't available directly, but we have the formatted version for
the tooltip, so we'll display that.

This PR changes the format to be more in line with the UX sketches (just
numbers and separators instead of words). In theory, it should also be
possible to [adjust the
locale](https://www.npmjs.com/package/chartjs-adapter-date-fns#locale-support-via-scale-options)
(in this case, it should be to the user's chosen locale), but I can't
seem to make that option work. I don't want to spend more time on that
right now, unless we get feedback on it. However, _yes_ the format is
american, and _yes_, that puts months ahead of days. However, you also
have the date in longer form on the x axis, so I think you'll be able to
work it out.


Before:
<img width="279" height="139" alt="image"
src="https://github.com/user-attachments/assets/5c71e708-9d9f-412a-acbb-7d28e5071d5a"
/>


After: 
<img width="246" height="154" alt="image"
src="https://github.com/user-attachments/assets/13a4f5b3-281b-4003-8aae-a248578fead8"
/>
2025-09-01 07:19:47 +00:00
Thomas Heartman
a7c8f527bd
chore: show N/A for ratio if we can't calculate it (#10580)
Also, change the widget title to reflect the order of the ratio.

Before:
<img width="214" height="105" alt="image"
src="https://github.com/user-attachments/assets/0e08e107-b142-4913-af06-a8ab7eed8cb7"
/>

<img width="280" height="153" alt="image"
src="https://github.com/user-attachments/assets/967ff1b4-ec44-4811-9a34-ad4979dbb761"
/>



After:
<img width="242" height="117" alt="image"
src="https://github.com/user-attachments/assets/ff43efee-81ad-4c6c-8513-960656b095b8"
/>

<img width="249" height="153" alt="image"
src="https://github.com/user-attachments/assets/47271484-1ba4-42c3-a85f-5db62e6560c3"
/>


Closes 1-4039
2025-09-01 09:14:02 +02:00
Thomas Heartman
758ea69f4f
Update chart colors to increase contrasts between the A series. (#10579)
Makes it easier to tell the difference between a1 and a2 in particular.

Before: 
<img width="1468" height="499" alt="image"
src="https://github.com/user-attachments/assets/a77c4e61-33c1-4c87-8b39-f9919122137d"
/>

After:
<img width="1384" height="486" alt="image"
src="https://github.com/user-attachments/assets/b35e856a-e6d3-44b4-adea-dfeb15bcdfcc"
/>
2025-09-01 08:22:44 +02:00
Nuno Góis
0035f18370
chore: allows you to add a flag from the unknown flags list (#10569)
https://linear.app/unleash/issue/2-3826/allow-you-to-create-the-flag-from-the-unknown-flags-list

Allows you to add a flag from the unknown flags list.

<img width="1515" height="896" alt="image"
src="https://github.com/user-attachments/assets/4dc20639-9bdb-457d-aef3-9df74fb9566c"
/>

<img width="1391" height="662" alt="image"
src="https://github.com/user-attachments/assets/c6531b62-3379-4bf9-b6a8-4da3a3cc8340"
/>
2025-08-29 12:19:28 +01:00
Thomas Heartman
718a731d2f
fix: Show 100% instead of Infinity% if you've not created any flags (#10575)
JS gives you positive infinity if you divide a positive number by 0,
which isn't very helpful here. Instead, let's show 100%. If you divide 0
by 0, then you get NaN, which we also need to handle explicitly because
it doesn't work with math.min.

Before:
<img width="472" height="273" alt="image"
src="https://github.com/user-attachments/assets/006ba5c1-4783-4794-b876-f64085937258"
/>

<img width="1365" height="484" alt="image"
src="https://github.com/user-attachments/assets/beec7e18-758c-49eb-97c8-febe6cb63119"
/>


After:
<img width="388" height="252" alt="image"
src="https://github.com/user-attachments/assets/bc326c25-ee63-4055-a765-a6016b51e35a"
/>
<img width="1365" height="488" alt="image"
src="https://github.com/user-attachments/assets/eaafc5c3-79d6-49a3-b1f2-cd42c5d16dae"
/>


Fixes 1-4033.
2025-08-29 09:31:13 +00:00
Mateusz Kwasniewski
924325f623
feat: make impact metrics config save call (#10576) 2025-08-29 11:26:11 +02:00
Mateusz Kwasniewski
c36d1554c7
chore: orval with impact metrics (#10573) 2025-08-29 09:23:38 +02:00
unleash-bot[bot]
af28fb110d
chore(AI): filterFlagsToArchive flag cleanup (#10565)
---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
2025-08-29 08:44:28 +02:00
Nuno Góis
4c5b869140
chore: show release templates in license info in the UI (#10563)
https://linear.app/unleash/issue/2-3823/show-release-templates-in-license-info-in-ui

Shows release templates in license info in the UI.

<img width="1173" height="687" alt="image"
src="https://github.com/user-attachments/assets/b93cb510-282d-4027-bd39-2269ec138cc6"
/>
2025-08-28 15:23:48 +01:00
Thomas Heartman
709a890bd8
fix: incorrect current calculation of ratio (#10567)
Looks like the sinner was looking at the last entry of each data list,
when they are sorted by most recent first.
2025-08-28 15:53:25 +02:00
Thomas Heartman
016d269675
Chore: Use step size of 1 for created vs archived. (#10566)
You can't archive half a flag.

Closes 1-4034.
2025-08-28 15:53:04 +02:00
Thomas Heartman
b071b17dd6
Fix: created vs archived rendering errors; memoize options (#10562)
Fixes the rendering / max update depth exceeded errors we were seeing in
the console for this chart by memoizing the options.

<img width="1710" height="1420" alt="image"
src="https://github.com/user-attachments/assets/9a24d4e5-b563-4a3c-9a76-915e0a5fda24"
/>

Now the chart doesn't throw any errors anymore.
2025-08-28 14:48:53 +02:00
David Leek
7fb523e348
chore: add release plans/templates count to instance stats (#10540) 2025-08-28 14:44:24 +02:00
Thomas Heartman
9eb872de82
Show tooltip on group instead of single graph bar (#10546)
The tooltip should show you the ratio of the group and the numbers for
both archived and created.

The tooltip's position is averaged between all the bars in the group.

<img width="335" height="262" alt="image"
src="https://github.com/user-attachments/assets/d62a4bdc-ba07-4eea-8cbf-6e42793804b2"
/>


This still throws the same errors as before. Not sure exactly what's
going on with the custom tooltip, but I'll investigate it in a
follow-up.

Closes 1-4017.
2025-08-28 10:26:46 +02:00
Gastón Fournier
8ba36ee9a2
fix: consider both client and backend token types from the DB (#10552)
## About the changes
In the previous fix: https://github.com/Unleash/unleash/pull/10543, we
made sure client token types were displayed in the UI. Here, we're also
making sure that the Backend token types are displayed as well.

1. A test validates that if a backend token exists in the db it will be
returned in the API response.
2. The UI has been adapted to also consider backend token types
2025-08-28 04:02:56 -03:00
Mateusz Kwasniewski
64eaf21928
feat: add impact metrics flag modal (#10550) 2025-08-27 15:28:03 +02:00
Mateusz Kwasniewski
32392f201f
feat: add feature impact metrics initial area (#10548) 2025-08-27 13:24:41 +02:00
Mateusz Kwasniewski
a28f38e06a
feat: exposure metrics header (#10545) 2025-08-27 11:27:26 +02:00
Nuno Góis
7c4bada7a7
chore: disable browser autocomplete on commandbar (#10544)
https://linear.app/unleash/issue/2-3819/disable-browser-autocomplete-on-our-command-bar

Disables browser autocomplete on our CommandBar:

### Before

<img width="424" height="352" alt="image"
src="https://github.com/user-attachments/assets/597bbb9f-6391-4bb9-9f80-4fa80cb5c00c"
/>

### After

<img width="421" height="351" alt="image"
src="https://github.com/user-attachments/assets/ef5409b2-5cfd-4780-b33c-63a8f740feda"
/>
2025-08-26 17:55:50 +01:00
Nuno Góis
d11e8b2c81
chore: UX adjustments in new unknown flag table headers (#10535)
https://linear.app/unleash/issue/2-3816/further-ux-adjustments-to-new-table-headers

Smaller UX adjustments to the new unknown flag table headers.
2025-08-26 16:21:43 +01:00
unleash-bot[bot]
0792125bb7
chore(AI): releasePlans flag cleanup (#10537)
This PR cleans up the releasePlans flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10536

## 🧹 AI Flag Cleanup Summary
The `releasePlans` feature flag has been removed, making the feature
permanently
available for Enterprise customers. All conditional logic and checks
related to
this flag have been removed from the codebase.
This change ensures that Release Plans are an integral part of the
Unleash
Enterprise offering.
### 🚮 Removed
- **Flag Definitions**
- `releasePlans` flag from `experimental.ts` in the backend.
- `releasePlans` flag from `uiConfig.ts` in the frontend.
- `releasePlans` flag from `server-dev.ts` development config.
- **Conditional Logic**
- Removed checks for `releasePlansEnabled` in components and hooks,
including
`ReleaseManagement.tsx`, `FeatureStrategyMenu.tsx`, and
`NewInUnleash.tsx`.
- Removed `useUiFlag('releasePlans')` calls from all frontend files.
- Removed the `flag: 'releasePlans'` property from route definitions in
`routes.ts`.
### 🛠 Kept
- **Feature Functionality**
- All UI and logic related to Release Plans and Release Templates are
now
unconditionally enabled for Enterprise users.
### 📝 Why
The `releasePlans` feature has been successfully rolled out and is now a
stable
part of the product. This cleanup removes the artık feature flag to
simplify the
codebase and reduce complexity.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Nuno Góis <github@nunogois.com>
2025-08-26 14:48:19 +01:00
Mateusz Kwasniewski
f375ae4694
fix: pagination limit and placeholder (#10533) 2025-08-26 14:39:03 +02:00
Thomas Heartman
0cd64780fa
Simplify created numbers (don't show count by flag type) and update colors (#10531)
Simplifies the data we show for the archive vs creation chart by not
showing the created count by flag type. Instead, all we show is the
total.

Also, in doing this, updates the colors we use for the bars (to A1, and
A2). The contrast is a little low between A1 and A2, so we should look
at that before taking this into production.

The created tooltip colors are wrong, but we'll need to update the
tooltip in a later PR, so not tackling that now.

Before:
<img width="1115" height="456" alt="image"
src="https://github.com/user-attachments/assets/13626295-1aa5-42be-b8dd-cea9912effe0"
/>
<img width="564" height="311" alt="image"
src="https://github.com/user-attachments/assets/7a02eec0-e018-49fd-8b1f-92aa3376a6cc"
/>



After: 
<img width="1179" height="481" alt="image"
src="https://github.com/user-attachments/assets/1ba6584a-d7e2-4ae4-81ec-38260c1f0e07"
/>

<img width="420" height="159" alt="image"
src="https://github.com/user-attachments/assets/e4433c32-eaa4-41d2-a5ef-af84a9725c30"
/>

Closes 1-4018, 1-4013, 1-4014
2025-08-25 16:09:44 +02:00
Thomas Heartman
434ed4cf63
adjust chart color names so that they all have numbers (#10530)
This makes it easier to add more variation of each of the non-A colors
later too.
2025-08-25 14:31:24 +02:00
Thomas Heartman
0223437f49
Remove ratio graph & column to the right (#10529)
This PR removes the flags archived / flags created trend line as well as
the right-hand column.

Before:
<img width="1107" height="459" alt="image"
src="https://github.com/user-attachments/assets/f6bcbef0-7b71-44c1-b8a0-db5ebaff01ed"
/>


After:
<img width="1128" height="450" alt="image"
src="https://github.com/user-attachments/assets/e55bd335-cc8c-4b88-8e3c-dafecf134742"
/>

I'm not deleting the tooltip yet, because I think we'll want to re-use
that for the group tooltip.
2025-08-25 14:27:07 +02:00
Thomas Heartman
2ee92d8c78
Use new chart colors for current lifecycle stage. (#10528)
Takes the green from the current lifecycle charts and replaces it with
charts.A2. Also stabilizes the colors between the dark and light.
2025-08-25 11:44:21 +02:00
unleash-bot[bot]
8ddeed09fb
chore(AI): projectListViewToggle flag cleanup (#10527)
This PR cleans up the projectListViewToggle flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10526

## 🧹 AI Flag Cleanup Summary
This change removes the `projectListViewToggle` feature flag and
hardcodes its
behavior. The feature, which allows toggling between card and list views
for
projects, is now permanently enabled.
### 🚮 Removed
- **Flag Definitions**
- Removed `projectListViewToggle` from `src/server-dev.ts`,
`src/lib/types/experimental.ts`, and
`frontend/src/interfaces/uiConfig.ts`.
- **Hooks & Conditionals**
- Removed `useUiFlag('projectListViewToggle')` calls from
`ProjectGroup.tsx`
and `ProjectList.tsx`.
- Removed conditional rendering logic based on the flag in
`ProjectGroup.tsx`
and `ProjectList.tsx`.
### 🛠 Kept
- **Project List View**
- The project list view functionality is now always available for
non-OSS
versions of Unleash.
- The `ProjectsListViewToggle` component is now always rendered when not
in an
OSS environment.
### 📝 Why
The `projectListViewToggle` feature flag was marked as completed and its
intended outcome was to be kept. The code has been updated to reflect
this by
removing the flag and making the feature a permanent part of the
application.
This simplifies the codebase by removing dead code paths and feature
flag
checks.

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
2025-08-25 09:01:59 +01:00
Nuno Góis
885d3e1817
chore: implement unknown flags UX feedback (#10519)
https://linear.app/unleash/issue/2-3809/implement-the-latest-feedback-from-ux

Implements the latest feedback from UX regarding **unknown flags**.

Bit unsure about our column headers. E.g. instead of "Last seen" and
"Seen in Unleash" we could call them "Reported" and "Last event".

<img width="1490" height="838" alt="image"
src="https://github.com/user-attachments/assets/30ca2570-1395-429f-8d60-ccc6fe83ba92"
/>
2025-08-22 14:04:01 +01:00
Thomas Heartman
d76b676fb8
Add chart colors to colors definitions (#10521)
Adds new chart colors to the theme definitions: A1 through A5, and B
through E.
2025-08-22 14:56:41 +02:00
Thomas Heartman
9d18b0022b
Delete legacy insights charts components and remove unused colors (#10522)
Deletes the legacy insights charts component (which should have been
removed with the flag earlier this week), and also removes the colors
associated with charts that we no longer have.
2025-08-22 12:46:56 +02:00
Thomas Heartman
b321bfba99
Add .vite to biome's ignore lists (formatting and linting) (#10518)
Also fixes an auto-fixable issue reported by biome.
2025-08-22 07:36:56 +00:00
unleash-bot[bot]
02ee94c38f
chore(AI): createFlagDialogCache flag cleanup (#10509)
This PR cleans up the createFlagDialogCache flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10504

## 🧹 AI Flag Cleanup Summary
This change removes the `createFlagDialogCache` feature flag, making its
functionality permanent. The create-feature-flag dialog will now always
cache
its state in local storage.
### 🚮 Removed
- **TypeScript Definitions**
- Removed `createFlagDialogCache` from `UiFlags` in
`frontend/src/interfaces/uiConfig.ts`.
- Removed `createFlagDialogCache` from `IFlagKey` in
`src/lib/types/experimental.ts`.
- **Flag Configuration**
- Removed the `createFlagDialogCache` flag definition from
`src/lib/types/experimental.ts`.
- **Conditional Logic**
- Removed the `useUiFlag` hook and conditional logic for caching in

`frontend/src/component/project/Project/PaginatedProjectFeatureToggles/ProjectFe
atureTogglesHeader/CreateFeatureDialog.tsx`.
### 🛠 Kept
- **Feature Functionality**
- The feature of caching the create-flag dialog's form state in local
storage
is now always enabled.
### 📝 Why
The `createFlagDialogCache` feature has been successfully rolled out and
is now
considered stable. This cleanup removes the obsolete feature flag and
hardcodes
the enabled behavior, simplifying the codebase.

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-08-21 12:43:43 +00:00
unleash-bot[bot]
170ed87fcb
chore(AI): lifecycleMetrics flag cleanup (#10511)
This PR cleans up the lifecycleMetrics flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10505

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-08-21 14:35:11 +02:00
Nuno Góis
edae8801d8
chore: release template resource limits (#10514)
https://linear.app/unleash/issue/2-3790/use-resource-limits-to-limit-the-amount-of-release-templates-you-can

Adds a new resource limit for release templates.

Needs a follow-up PR in Enterprise.
2025-08-21 11:52:09 +01:00
unleash-bot[bot]
d2452b91f2
chore(AI): crDiffView flag cleanup (#10487)
This PR cleans up the crDiffView flag. These changes were automatically
generated by AI and should be reviewed carefully.

Fixes #10484



🧹 AI Flag Cleanup Summary

This PR removes the crDiffView feature flag and its associated legacy
components
for displaying changes in a Change Request. The flag has been enabled
and the
new diff view is now permanent.

This involved removing the feature flag from the configuration and code,
deleting several legacy components, and updating the components that
used them
to only use the new versions.

🚮 Removed

• Feature Flag Logic
• All checks for the crDiffView flag.
• The flag definition in uiConfig.ts, experimental.ts, and
server-dev.ts.
• Legacy Components
• LegacyStrategyChange.tsx
• StrategyTooltipLink.tsx
• LegacyReleasePlanChange.tsx
• SegmentTooltipLink.tsx
• LegacySegmentChangeDetails.tsx
• LegacyArchiveFeatureChange from ArchiveFeatureChange.tsx
• LegacyDependencyChange from DependencyChange.tsx
• LegacyToggleStatusChange from ToggleStatusChange.tsx

🛠 Kept

• New Components
• The new change request diff view components (StrategyChange,
ReleasePlanChange, etc.) are now used directly.
• The UI for displaying changes in a Change Request now consistently
uses
the improved diff view.

📝 Why

The crDiffView feature flag was deemed complete and ready for permanent
implementation. The cleanup follows standard procedure to remove the
flag and
associated dead code, simplifying the codebase and making it easier to
maintain.
This change makes the improved diff view for change requests the only
available
view.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-08-21 12:33:19 +02:00
unleash-bot[bot]
d6ddc95c1e
chore(AI): improvedJsonDiff flag cleanup (#10486)
This PR cleans up the improvedJsonDiff flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10483

## 🧹 AI Flag Cleanup Summary
This PR removes the `improvedJsonDiff` feature flag, making the enhanced
JSON
diffing component the default and only option. The now-unused legacy
diff
component and all related feature flag logic have been removed to
streamline the
codebase.
### 🚮 Removed
- **Components**
- `OldEventDiff` component was removed, along with its helper types and
constants.
- **Flag Logic**
- All conditional rendering based on the `improvedJsonDiff` flag was
removed.
- The `sort` prop from `EventDiff` was removed as it was only used by
the
legacy component.
- **Configuration**
- `improvedJsonDiff` flag definition was removed from `uiConfig.ts`,
`experimental.ts`, and `server-dev.ts`.
- **Tests**
- Mock configuration for `improvedJsonDiff` in tests was removed.
### 🛠 Kept
- **Components**
- `NewEventDiff` was renamed to `EventDiff` and is now the standard
implementation.
### 📝 Why
The `improvedJsonDiff` feature flag was marked as completed with its
outcome
being "kept". This cleanup finalizes the feature rollout by removing the
flag
and associated legacy code, simplifying the implementation and reducing
code
complexity.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-08-21 09:50:48 +00:00
unleash-bot[bot]
229379ed15
chore(AI): timestampsInChangeRequestTimeline flag cleanup (#10492)
This PR cleans up the timestampsInChangeRequestTimeline flag. These
changes were automatically generated by AI and should be reviewed
carefully.

Fixes #10491

## 🧹 AI Flag Cleanup Summary
This PR removes the `timestampsInChangeRequestTimeline` feature flag.
The
feature is now permanently enabled.
⚠️ No conditional logic for this flag was found in the provided files.
The
changes are limited to removing flag definitions and configurations. The
actual
logic may reside in other parts of the codebase not included in this
operation.
### 🚮 Removed
- **Flag Definitions & Configuration**
- Removed `timestampsInChangeRequestTimeline` from `IFlagKey` type in
`src/lib/types/experimental.ts`.
- Removed `timestampsInChangeRequestTimeline` flag configuration from
`src/lib/types/experimental.ts`.
- Removed `timestampsInChangeRequestTimeline` from the `UiFlags`
interface in
`frontend/src/interfaces/uiConfig.ts`.
- Removed the flag from the experimental flags in `src/server-dev.ts`.
### 🛠 Kept
- **Feature Functionality**
- The behavior previously enabled by the
`timestampsInChangeRequestTimeline`
flag is now the default and only behavior.
### 📝 Why
The `timestampsInChangeRequestTimeline` feature flag was marked as
completed
with an intended outcome of "kept". This means the feature has been
rolled out
successfully and should be permanent. This cleanup removes the obsolete
flag and
its related configurations, simplifying the code and adhering to best
practices
for feature flag lifecycle management.

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
2025-08-21 09:49:37 +02:00
Tymoteusz Czech
7f6b09fa1e
Measure adoption of a reminder for project cleanup (#10502) 2025-08-19 15:33:43 +02:00
Fredrik Strand Oseberg
a99e5bc4b4
feat: add truncation and tooltips (#10498)
This PR uses the existing Truncator component to add truncation and
tooltips for long names.
2025-08-18 13:16:52 +02:00
Jaanus Sellin
05ea405bf6
chore: update ux styling for lifecycle charts (#10497)
<img width="1442" height="492" alt="image"
src="https://github.com/user-attachments/assets/4ec76d72-3bfb-4525-ac63-c3e995f7638b"
/>
2025-08-15 15:23:25 +03:00
Jaanus Sellin
b6ea8a3849
chore: move consumption UI behind separate flag (#10495)
Move consumption UI to separate flag.
2025-08-14 14:25:36 +03:00
David Leek
f94801ab45
fix: move update approvers after cr change state (#10490) 2025-08-12 09:16:07 +02:00
Tymoteusz Czech
918e792af6
fix: health to technical debt on projects list (#10485) 2025-08-11 11:45:27 +02:00
Jaanus Sellin
e43cdcf034
chore: update ux styling for lifecycle charts (#10481)
Some small ux tweaks to lifecycle charts.


1. Removed vertical lines
2. Styled the legend to have round dots, not square.
<img width="1891" height="656" alt="image"
src="https://github.com/user-attachments/assets/b2c09085-7a2e-4e14-92e0-b3e83edf201d"
/>
2025-08-08 10:25:58 +03:00
Nuno Góis
937cba4c1a
chore: make project list table take less horizontal space (#10480)
https://linear.app/unleash/issue/2-3761/address-ux-feedback-make-table-take-less-horizontal-space-to-prevent

Addresses UX feedback by making the project list table take less
horizontal space. This should prevent us from having to scroll
horizontally in most cases.

<img width="1103" height="647" alt="image"
src="https://github.com/user-attachments/assets/e5cc22a2-5eda-4cb5-a226-c54993c019ce"
/>
2025-08-08 08:03:02 +01:00
Nuno Góis
57424312b5
chore: timeagocell default fallback (#10475)
https://linear.app/unleash/issue/2-3759/set-timeagocell-default-fallback-to-never

Sets the default `emptyText` fallback to 'Never'. This should help with
consistency and DRYness.

Also noticed some of our TimeAgoCell `title` properties were redundant,
so I removed them for simplicity.

Examples:

<img width="1268" height="1063" alt="image"
src="https://github.com/user-attachments/assets/b7a8118b-bd73-45bc-8823-fa9f211f9ea9"
/>

<img width="793" height="366" alt="image"
src="https://github.com/user-attachments/assets/f494e1de-2bbb-46c8-ad87-adc7a1d4ea56"
/>
2025-08-07 18:05:28 +01:00
dependabot[bot]
456365f2eb
chore(deps): bump tmp from 0.2.3 to 0.2.4 in /frontend (#10470) 2025-08-07 07:32:15 -03:00
Nuno Góis
63622618b4
fix: environment name cell (#10474)
https://linear.app/unleash/issue/2-3758/fix-environment-name-cell-after-the-latest-changes-to-textcell

Noticed the environment name cell acted differently after
[adjusting](https://github.com/Unleash/unleash/pull/10466/files#diff-485a5be6a3a5d639b56c3b29488125db051ce6b8a0e3561368d657d62dee4975R28)
the span inside TextCell to be `display: inline-flex`.

By wrapping the contents of our TextCell here into a single div we
explicitly declare this to be a single row of elements.
2025-08-07 11:32:06 +01:00
Tymoteusz Czech
98bbf85421
feat: add "cleanup" action to other flag lifecycle stages (#10471) 2025-08-07 11:54:33 +02:00
Tymoteusz Czech
ac67a50693
feat: project-level cleanup reminders (#10464) 2025-08-07 11:44:08 +02:00
Nuno Góis
54a0f68c9c
chore: add project-list-view-toggle Plausible event (#10468)
https://linear.app/unleash/issue/2-3754/add-plausible-event-project-list-view-toggle-with-view

Adds a `project-list-view-toggle` Plausible event with a `view` prop so
we can track if and how the new toggle is used.
2025-08-06 13:47:03 +02:00
Nuno Góis
18c9ea1d7d
chore: if flag is disabled automatically revert to showing cards (#10467)
https://linear.app/unleash/issue/2-3753/fix-if-the-flag-is-disabled-we-should-automatically-revert-back-to

If the flag is disabled we should automatically revert back to showing
cards.
2025-08-06 10:58:07 +00:00
Nuno Góis
44650e4e2f
chore: project list table view (#10466)
https://linear.app/unleash/issue/2-3740/implement-the-project-list-view

Implements the list (table) view of the projects page.

<img width="1300" height="956" alt="image"
src="https://github.com/user-attachments/assets/603bc9a8-21a9-4888-8804-1be23e2d63ee"
/>

<img width="1300" height="681" alt="image"
src="https://github.com/user-attachments/assets/67f6e8e9-cedf-4a70-ba95-b9c73e8d29a8"
/>
2025-08-06 11:36:21 +01:00
Tymoteusz Czech
e1b6979627
Feat: filter flags by "last seen at" (#10449)
This lets users filter features by when they were last reported in metrics.
2025-08-04 14:50:21 +02:00
Nuno Góis
bd5a8539c0
chore: add project list view toggle with respective flag (#10452)
https://linear.app/unleash/issue/2-3746/add-project-list-view-toggle-with-respective-flag

Adds a project list view toggle hidden behind a feature flag:
`projectListViewToggle`.

This is already part of the persistent project list page state.

Even though the view mode switching logic is in place, this isn't really
doing anything else. We'll leave the actual visual changes (tables) for
a follow up PR.

<img width="1412" height="406" alt="image"
src="https://github.com/user-attachments/assets/793d0bd9-9874-4630-98b4-0ee364f50241"
/>
2025-08-04 08:53:04 +01:00
Nuno Góis
91f138349e
chore: fix interactive demo steps around constraint values (#10451)
https://linear.app/unleash/issue/2-3744/fix-interactive-demo-steps-around-constraint-values

I noticed our interactive demo was broken around the constraint value
steps.

This isn't a great fix, but it at least allows us to complete the
interactive demo for now.
2025-08-01 10:56:37 +00:00
Tymoteusz Czech
2629705501
chore: re-generate openapi (#10450)
Update documentation to replace 'server-side' with 'backend' in API schemas
2025-08-01 05:50:03 -03:00
Nuno Góis
0ac997e63e
chore: overhaul project list pages (#10447)
https://linear.app/unleash/issue/2-3743/overhaul-project-list-pages

This is essentially scouting work on our project list pages so we have a
better baseline before proceeding with the cards/list view toggle.

Includes refactoring, fixes and visual improvements ensuring better
consistency and alignment with our designs.

Took some liberties, so feel free to tell me I'm wrong.

### Searching

<img width="1224" height="667" alt="image"
src="https://github.com/user-attachments/assets/3f1bf700-7323-4c00-81db-7b57d125810b"
/>

### Search results only in one of the groups

<img width="1216" height="384" alt="image"
src="https://github.com/user-attachments/assets/f67536e3-42de-4371-9725-c38a6fe0889a"
/>

### No results found

<img width="1218" height="347" alt="image"
src="https://github.com/user-attachments/assets/c15c3555-1f37-473e-8a3e-8a549bd24966"
/>

### Helper text

<img width="334" height="114" alt="image"
src="https://github.com/user-attachments/assets/c9150c9c-22c6-4f73-8989-b9cba4b52793"
/>

### Title truncation with tooltip

<img width="333" height="192" alt="image"
src="https://github.com/user-attachments/assets/1f88d82d-67b2-4327-9301-808fef1e11ac"
/>

### Archived projects

<img width="1075" height="351" alt="image"
src="https://github.com/user-attachments/assets/87b10618-b7c4-4351-87d3-3e678ddd20ae"
/>
2025-08-01 09:46:48 +01:00
Tymoteusz Czech
ddd503952b
feat: add lifecycle stage filter to project feature toggles (#10448)
Backend API is already implemented and ready to be used.

[issue/CTO-244](https://linear.app/unleash/issue/CTO-244/filter-by-lifecycle-on-project-page)
2025-08-01 10:22:32 +02:00
Nuno Góis
3338ea4300
chore: clear unknown flags every 24h instead of every 7d (#10446)
https://linear.app/unleash/issue/2-3738/clear-unknown-flags-every-24h-instead-of-every-7d

Clears unknown flags every 24h instead of every 7d.

This ensures the list stays more relevant by removing stale entries
sooner, allowing users to focus on actively reported unknown flags.

Also includes small improvements, including a new paragraph on the
unknown flags page that better explains the concept of unknown flag
reports.
2025-07-31 11:22:40 +01:00
Thomas Heartman
02d4edbf40
feat: Display example date for date formatting reasons (#10444)
Adds an example date as a detail of the locale picker, so that the user
can see what effect their chosen locale would have on date formatting:

<img width="436" height="157" alt="image"
src="https://github.com/user-attachments/assets/d5757380-3cda-4857-99d7-bac8866d31f5"
/>

The example wraps on smaller screens: 

<img width="291" height="207" alt="image"
src="https://github.com/user-attachments/assets/e3ef1678-6846-4027-b563-253195e2de99"
/>


The example date is the **date and time of the very first commit in the
Unleash repo**. By some stroke of luck, it happens to have everything
we're looking for:
- A date that is more than the 12th (to clearly differentiate between
days and months)
- A month that is less than 10 (to show whether leading zeroes are shown
or not)
- An hour that is more than 11 to show whether it's a 24-hour clock or
an AM/PM system

The date string is without a time zone offset because that means it'll
always be interpreted as local time for the user. MDN's [docs on Date
and what happens when you call it with a time
string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format)
state that:

> When the time zone offset is absent, date-only forms are interpreted
as a UTC time and **date-time forms are interpreted as a local time**.

I've checked this by changing my locale. With the timezone offset, the
time changes based on my timezone, but without it, it always shows as
the expected value.
2025-07-31 11:07:32 +02:00