Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
332 commits
Select commit Hold shift + click to select a range
fb2df65
Update contexts
kyle-ssg Nov 4, 2025
b064e81
Update contexts
kyle-ssg Nov 4, 2025
27019de
Update contexts
kyle-ssg Nov 4, 2025
96c81d6
Update contexts
kyle-ssg Nov 4, 2025
4a3bafa
Update contexts
kyle-ssg Nov 4, 2025
4b846d9
Update contexts
kyle-ssg Nov 4, 2025
6cbde85
Merge branch 'main' into chore/claude-context
kyle-ssg Nov 4, 2025
dd7b743
Update contexts
kyle-ssg Nov 10, 2025
6a8f202
Update frontend/web/components/feature-page/FeatureFilters.tsx
kyle-ssg Nov 11, 2025
ad8a35d
Update frontend/web/components/feature-page/FeatureFilters.tsx
kyle-ssg Nov 11, 2025
659abf1
return early if key fields are null
kyle-ssg Nov 11, 2025
a00269e
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Nov 11, 2025
ae76a46
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 11, 2025
1b90569
Remove !
kyle-ssg Nov 11, 2025
43e32ad
Remove !
kyle-ssg Nov 11, 2025
7dcb60c
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 11, 2025
0ed455b
Unused import
kyle-ssg Nov 11, 2025
1381fb0
Fix sort order types
kyle-ssg Nov 11, 2025
0ac5ded
Re-add remove segment button
kyle-ssg Nov 11, 2025
df85873
Update claude contexts
kyle-ssg Nov 11, 2025
a26b39a
Update claude contexts
kyle-ssg Nov 11, 2025
9ef5383
Fix sortorder functionality
kyle-ssg Nov 11, 2025
2ed1777
QA feedback
kyle-ssg Nov 11, 2025
e800bcc
QA feedback
kyle-ssg Nov 11, 2025
24572d7
Adjust environment select
kyle-ssg Nov 11, 2025
212de78
Adjust fetching and loading logic
kyle-ssg Nov 11, 2025
f55b8ef
Adjust fetching and loading logic
kyle-ssg Nov 11, 2025
4974a76
Prevent toggle feature from segment page
kyle-ssg Nov 16, 2025
68c09cb
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Nov 18, 2025
1a6b706
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 18, 2025
62262c1
clean up confirm toggle function
kyle-ssg Nov 18, 2025
5b9588a
fix vertical alignment for feature row
kyle-ssg Nov 18, 2025
189b701
Merge branch 'feat/segment-feature-state-view' into chore/create-flag…
kyle-ssg Nov 18, 2025
102d47a
Create flag migration
kyle-ssg Dec 2, 2025
f443064
Highlight segment when opening a feature
kyle-ssg Dec 2, 2025
aae4428
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Dec 2, 2025
454d9b7
Highlight segment when opening a feature
kyle-ssg Dec 2, 2025
a734a6c
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Dec 2, 2025
d4d2f0b
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 2, 2025
01393b4
Merge branch 'refs/heads/feat/segment-feature-state-view' into chore/…
kyle-ssg Dec 2, 2025
142c32e
Migrate tabs
kyle-ssg Dec 2, 2025
752ce06
Add settings and value tabs
kyle-ssg Dec 2, 2025
a4c4c55
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Dec 2, 2025
aec8e29
Revert claude changes
kyle-ssg Dec 2, 2025
8c40502
Merge remote-tracking branch 'origin/chore/create-flag-migration' int…
kyle-ssg Dec 2, 2025
fd08db6
Migrate components
kyle-ssg Dec 2, 2025
2732306
Revert changes
kyle-ssg Dec 2, 2025
1c117d7
feat: segment feature state view (#6137)
kyle-ssg Dec 2, 2025
c3ad50e
Fixes
kyle-ssg Dec 3, 2025
b9f4933
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Dec 3, 2025
cf3119b
Fixes
kyle-ssg Dec 3, 2025
14f7c5b
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
b2b275b
Fixes
kyle-ssg Dec 3, 2025
984e6e3
Fix merge hell
kyle-ssg Dec 3, 2025
51860b9
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
52a2dc7
Fix merge hell
kyle-ssg Dec 3, 2025
2a4a8a5
Fix segment override permission check and project flag cache keys
kyle-ssg Dec 3, 2025
83c5a9f
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
13b67d0
Fix has changed check for overrides
kyle-ssg Dec 3, 2025
99a69bb
Fix has changed check for overrides
kyle-ssg Dec 3, 2025
76251b2
Revert unecessary import changes
kyle-ssg Dec 3, 2025
924424f
Edit change request
kyle-ssg Dec 3, 2025
c39b418
chore: Rename CreateFlag (#6388)
kyle-ssg Dec 9, 2025
fa183df
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 9, 2025
9cb2da0
Merge remote-tracking branch 'origin/chore/create-flag-migration' int…
kyle-ssg Dec 9, 2025
1eccdea
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
76f0d4a
Edit change request permissions
kyle-ssg Dec 16, 2025
1b6e719
Only allow delete / edit your own change request
kyle-ssg Dec 16, 2025
a89df89
Enumerate permission types
kyle-ssg Dec 16, 2025
932be79
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 16, 2025
1316759
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
a81aad6
Fix merge import
kyle-ssg Dec 16, 2025
bd1c041
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
ae5582e
Merge branch 'feat/edit-versioned-change-request' into chore/permissi…
kyle-ssg Dec 16, 2025
c8e5429
Remove unused state
kyle-ssg Dec 16, 2025
7cf7c8b
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
0313fd7
Merge branch 'feat/edit-versioned-change-request' into chore/permissi…
kyle-ssg Dec 16, 2025
7b4029c
Migrate permissions to enum
kyle-ssg Dec 16, 2025
6bc28f1
Migrate permissions to enum
kyle-ssg Dec 16, 2025
512696b
Small typos
kyle-ssg Dec 16, 2025
2afaba5
Fix identity override permission
kyle-ssg Dec 16, 2025
5907ed3
Fix import name
kyle-ssg Dec 16, 2025
a1825eb
Update frontend/common/constants.ts
kyle-ssg Jan 6, 2026
39fa2a4
Update frontend/web/components/modals/create-feature/index.js
kyle-ssg Jan 6, 2026
fc49c2b
Update frontend/web/components/modals/create-feature/index.js
kyle-ssg Jan 6, 2026
42704e8
Merge main into chore/create-flag-migration
kyle-ssg Jan 6, 2026
6f090f5
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
a6e4bf5
Fix import
kyle-ssg Jan 6, 2026
0a90074
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
3a47014
Maintain change request date when editing, improve toast message
kyle-ssg Jan 6, 2026
f23186d
Fix conflict
kyle-ssg Jan 6, 2026
1dd143b
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
cdd78a1
Improve permission types
kyle-ssg Jan 13, 2026
d329c91
Improve permission types
kyle-ssg Jan 13, 2026
58b4245
Refactor permission descriptions
kyle-ssg Jan 13, 2026
6bbf06a
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Jan 13, 2026
62fa702
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 13, 2026
0f3407a
Merge feat/edit-versioned-change-request into chore/permission-types
kyle-ssg Jan 13, 2026
4011328
Typo
kyle-ssg Jan 13, 2026
4e3f18e
Fix alert infinite callback
kyle-ssg Jan 13, 2026
0c1fcb4
Unused imports
kyle-ssg Jan 13, 2026
6d6c865
Refactor Constants.environmentPermissions usages
kyle-ssg Jan 13, 2026
08b2d34
feat: edit versioned change request (#6368)
kyle-ssg Jan 16, 2026
a9d9be3
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Jan 16, 2026
a0960f3
Fix conflict
kyle-ssg Jan 16, 2026
272cce3
Pass identity override to variation options
kyle-ssg Jan 20, 2026
2a5ce5c
Adjust feature state prop
kyle-ssg Jan 20, 2026
474689b
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Jan 20, 2026
74b83fa
Simplify create feature for identity/environment
kyle-ssg Jan 20, 2026
56d52ed
Playwright
kyle-ssg Jan 20, 2026
c9f792e
Playwright
kyle-ssg Jan 20, 2026
a50bb05
Remove unused tests
kyle-ssg Jan 20, 2026
155a2c6
Merge branch 'main' into chore/playwright
kyle-ssg Jan 20, 2026
184194e
Merge package lock
kyle-ssg Jan 20, 2026
6448d43
Use playwright's firefox in dockerfile
kyle-ssg Jan 20, 2026
00ef9f7
Add frontend makefile logging, remove apt-get line
kyle-ssg Jan 20, 2026
0606454
re-add "tags" to tests
kyle-ssg Jan 20, 2026
5ccaa96
Add health check prior to teardown
kyle-ssg Jan 20, 2026
145056b
Add health check prior to teardown
kyle-ssg Jan 20, 2026
bab12a1
Add health check prior to teardown
kyle-ssg Jan 20, 2026
97adfcb
Improve logging, add sticky comment, add artifcats
kyle-ssg Jan 20, 2026
9bcb51d
Fix duplicate artifacts / race conditions
kyle-ssg Jan 20, 2026
3058590
improve artifacts
kyle-ssg Jan 21, 2026
8bfd940
improve artifacts
kyle-ssg Jan 21, 2026
ae098f8
improve tests
kyle-ssg Jan 21, 2026
36e733e
fix duplicate artifact names, only upload artifacts on failure
kyle-ssg Jan 21, 2026
72e262e
Remove testcafe stuff
kyle-ssg Jan 21, 2026
c28be83
Fix piping
kyle-ssg Jan 21, 2026
7397500
Cut down noise
kyle-ssg Jan 21, 2026
72a9a42
Revert teardown token logic
kyle-ssg Jan 21, 2026
a7ad899
Cut down noise, add success comment
kyle-ssg Jan 21, 2026
42c03de
Cut down noise / stability
kyle-ssg Jan 21, 2026
484ee15
Merge branch 'main' into chore/playwright
kyle-ssg Jan 21, 2026
8d9290f
Better retrying / add quiet mode and skip bundle
kyle-ssg Jan 21, 2026
ea337d6
Better retrying / add quiet mode and skip bundle
kyle-ssg Jan 21, 2026
4b6c08a
Fix piping
kyle-ssg Jan 21, 2026
74f3c4d
Fix piping
kyle-ssg Jan 21, 2026
b751344
Fix piping
kyle-ssg Jan 21, 2026
365e8cb
Replace index based lookups with text
kyle-ssg Jan 21, 2026
848435d
refactor(e2e): Replace index-based feature lookups with name-based lo…
kyle-ssg Jan 22, 2026
da2535a
Replace index based lookups with text
kyle-ssg Jan 22, 2026
4b498cb
add ee tests
kyle-ssg Jan 22, 2026
20381b5
Improve commands
kyle-ssg Jan 22, 2026
720f05e
Add better context and a REPEAT mode
kyle-ssg Jan 28, 2026
3ae6241
Refactor
kyle-ssg Jan 28, 2026
10ae51e
improve segment test
kyle-ssg Jan 28, 2026
c633e48
Improve readme and commands so that you can do /e2e 10 to run 10x
kyle-ssg Jan 28, 2026
7d1e121
Improve readmes, add test:report script
kyle-ssg Jan 28, 2026
7a800f4
Bump retries to 2
kyle-ssg Jan 28, 2026
d099d98
Don't run test:report in ci on failures
kyle-ssg Jan 28, 2026
b6a60ce
Only show report on failure outside of ci
kyle-ssg Jan 28, 2026
b3151e7
Remove interactive elements from run-with-retry, clean up context dup…
kyle-ssg Jan 28, 2026
6f2fb4b
revert docker-compose
kyle-ssg Jan 28, 2026
892198f
disable modal transitions in e2e
kyle-ssg Jan 28, 2026
1774f79
Neaten log helper
kyle-ssg Jan 29, 2026
21ea1ee
Split out test hepers
kyle-ssg Jan 29, 2026
571c031
Move command and context to frontend
kyle-ssg Jan 29, 2026
41cf11f
Update frontend/e2e/teardown.ts
kyle-ssg Jan 30, 2026
e99d912
Avoid focus inputs in e2e, select projects by name
kyle-ssg Jan 30, 2026
6180df1
Merge remote-tracking branch 'origin/chore/playwright' into chore/pla…
kyle-ssg Jan 30, 2026
d360e79
Avoid focus inputs in e2e, select projects by name
kyle-ssg Jan 30, 2026
1d3a95e
Fix conflicts
kyle-ssg Jan 30, 2026
c1ca0c7
Fix conflicts
kyle-ssg Jan 30, 2026
d1fdb86
Make create project test enterprise
kyle-ssg Jan 30, 2026
de21cd9
Improve feature actions clicking
kyle-ssg Jan 31, 2026
0d1fd77
Update frontend/package.json
kyle-ssg Feb 3, 2026
9d1e48a
Simplify E2E global setup and require auth token
kyle-ssg Feb 3, 2026
e51312b
Refactor extract-failed-tests with cleaner helper functions
kyle-ssg Feb 3, 2026
baebacc
Simplify global teardown and move slack helper to e2e/helpers
kyle-ssg Feb 3, 2026
0bfd7c8
TEMPORARY: Add staging environment to E2E workflow for Slack testing
kyle-ssg Feb 3, 2026
c263ced
Force failure
kyle-ssg Feb 3, 2026
aff2e25
Add debug logging to global teardown for Slack notifications
kyle-ssg Feb 3, 2026
1869faa
Move Slack notifications from test reporter to CI workflow
kyle-ssg Feb 3, 2026
2f55be5
Add E2E test convenience targets and fix API URL env var
kyle-ssg Feb 3, 2026
ec48ccb
Fix top-level await error in Slack notification step
kyle-ssg Feb 3, 2026
9295834
Update E2E documentation with new convenience commands
kyle-ssg Feb 3, 2026
30022ee
Add debug logging to Slack notification step
kyle-ssg Feb 3, 2026
031e1ba
Remove duplicate slack.ts and use existing notifyFailure
kyle-ssg Feb 3, 2026
46eb812
Simplify Slack notification with dedicated script file
kyle-ssg Feb 3, 2026
091f968
Move Slack notification logic into slack-e2e-reporter.ts
kyle-ssg Feb 3, 2026
ce0830a
Add HTML report upload to Slack notifications
kyle-ssg Feb 3, 2026
418142b
Refactor global-setup to reuse teardown logic
kyle-ssg Feb 3, 2026
df5a27b
Install @slack/web-api before running Slack reporter
kyle-ssg Feb 3, 2026
0d1a490
Combine zip and Slack notification steps
kyle-ssg Feb 3, 2026
4143031
Add branch, test type, and failed tests to Slack notification
kyle-ssg Feb 3, 2026
e61717e
Add PR info to Slack notification
kyle-ssg Feb 3, 2026
cc40e29
Make Slack notification more compact
kyle-ssg Feb 3, 2026
38a2712
Fix shell quoting and add http:// to API URL
kyle-ssg Feb 3, 2026
b7c64fc
Add http:// prefix to FLAGSMITH_API_URL
kyle-ssg Feb 3, 2026
0092249
Remove duplicate Playwright HTML Report comment from file upload
kyle-ssg Feb 3, 2026
f6170b0
Remove temporary staging environment from E2E workflow
kyle-ssg Feb 3, 2026
2cf2ff1
Merge remote-tracking branch 'origin/chore/playwright' into chore/pla…
kyle-ssg Feb 3, 2026
f16861c
Remove E2E Last Request/Error markup
kyle-ssg Feb 3, 2026
d783d82
Set frontend X-E2E-Token header to allow for unlimited project creation
kyle-ssg Feb 3, 2026
c2686ba
Revert docker-compose.yml
kyle-ssg Feb 3, 2026
a115445
Merge branch 'main' into chore/playwright
kyle-ssg Feb 3, 2026
cfefdf2
Migrate create flag file
kyle-ssg Feb 3, 2026
1cde29a
simplify e2e run options
kyle-ssg Feb 3, 2026
8b4ce12
Remove test:bundle command
kyle-ssg Feb 3, 2026
67f1962
default e2e to false
kyle-ssg Feb 3, 2026
9df5481
default e2e to false
kyle-ssg Feb 4, 2026
2aec097
Add unique comment identifiers for OSS vs Private Cloud test results
kyle-ssg Feb 4, 2026
c6329b0
Make e2e comments unique by arch
kyle-ssg Feb 4, 2026
9510e45
use report-tag parameter for uniquely identifying playwright comments
kyle-ssg Feb 4, 2026
8a3d436
Improve PR labelling, merge retry results with failures
kyle-ssg Feb 4, 2026
384eb82
Update frontend/e2e/run-with-retry.ts
kyle-ssg Feb 6, 2026
29a0216
Update frontend/package.json
kyle-ssg Feb 6, 2026
e8d85b4
Remove E2E = true
kyle-ssg Feb 6, 2026
58f343a
Merge remote-tracking branch 'origin/chore/playwright' into chore/pla…
kyle-ssg Feb 6, 2026
b2d394e
Merge branch 'main' into chore/playwright
kyle-ssg Feb 6, 2026
0613679
Remove E2E = true, fix package-lock
kyle-ssg Feb 6, 2026
bf63d34
Merge branch 'main' into chore/playwright
kyle-ssg Feb 18, 2026
5df5089
package lock
kyle-ssg Feb 18, 2026
80ad1ef
Fix account personas tests
kyle-ssg Feb 18, 2026
6576bfc
Fix Playwright ui race condition for E2E variable assignment
kyle-ssg Feb 18, 2026
2145de4
Handle production race conditions
kyle-ssg Feb 18, 2026
06f03fc
Merge branch 'main' into chore/playwright
kyle-ssg Feb 25, 2026
b3951bc
Handle production race conditions
kyle-ssg Feb 25, 2026
2116b61
Fix webpack config
kyle-ssg Feb 25, 2026
f738f40
Fix sentry dependency issue
kyle-ssg Feb 25, 2026
4a8b838
Remove duplicate waits
kyle-ssg Feb 25, 2026
30d15a4
Merge branch 'main' into chore/permission-types
kyle-ssg Feb 25, 2026
72c6dbd
Remove playwright stuff
kyle-ssg Feb 25, 2026
fdc3e31
Fix merge conflicts
kyle-ssg Feb 25, 2026
cd5cdb6
Fix merge conflicts
kyle-ssg Feb 25, 2026
c5a893f
Merge branch 'main' into chore/permission-types
kyle-ssg Feb 25, 2026
667b10e
Fix create flag conflict
kyle-ssg Feb 25, 2026
031319c
Bump typescript, permission type issues
kyle-ssg Feb 25, 2026
95a4716
chore: add feature tests (#6652)
kyle-ssg Feb 25, 2026
8c59abc
Bump typescript, permission type issues
kyle-ssg Feb 25, 2026
ceef160
Add tabs, remove old code, fix types
kyle-ssg Feb 25, 2026
08b5128
Merge branch 'main' into chore/permission-types
kyle-ssg Mar 11, 2026
4289db4
Fix permission types to render with permission
kyle-ssg Mar 11, 2026
18b2827
Merge branch 'main' into chore/permission-types
kyle-ssg Mar 11, 2026
b5a0320
Merge branch 'main' into chore/create-feature-migration-continued
kyle-ssg Mar 11, 2026
b01145d
Migrate flagsmith to @flagsmith/flagsmith and @flagsmith/react-native…
kyle-ssg Mar 11, 2026
5e8777c
Merge branch 'chore/permission-types' into chore/create-feature-migra…
kyle-ssg Mar 11, 2026
d393f10
Migrate create flag
kyle-ssg Mar 11, 2026
8bd06b7
Migrate create flag
kyle-ssg Mar 11, 2026
12f29a8
Fix permission check
kyle-ssg Mar 11, 2026
f1c6066
Fix permission check
kyle-ssg Mar 11, 2026
ba41b02
Comment
kyle-ssg Mar 11, 2026
c99dff2
Update frontend/web/components/modals/create-feature/tabs/IdentityOve…
kyle-ssg Mar 18, 2026
3a67e35
Merge branch 'main' into chore/create-feature-migration-continued
kyle-ssg Mar 18, 2026
54c4023
Fix environment id matches
kyle-ssg Mar 24, 2026
e1f9cff
Merge branch 'main' into chore/create-feature-migration-continued
kyle-ssg Mar 24, 2026
eec9b10
merge conflict
kyle-ssg Mar 24, 2026
4f1c7e8
Type fixes
kyle-ssg Mar 24, 2026
370db47
refactor(IdentityOverridesTab): migrate to RTK Query
kyle-ssg Mar 24, 2026
71dc3b4
fix(IdentityOverridesTab): fix layout and refresh behaviour
kyle-ssg Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion frontend/.claude/commands/e2e-ee.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Run enterprise E2E tests (tagged with @enterprise) and report results.
## Run Command

```bash
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=20 npm run test -- --grep @enterprise --quiet
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=5 npm run test -- --grep @enterprise --quiet
```

## Re-running Failed Enterprise Tests
Expand Down
2 changes: 1 addition & 1 deletion frontend/.claude/commands/e2e-oss.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Run OSS (non-enterprise) E2E tests and report results.
## Run Command

```bash
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=20 npm run test -- --grep @oss --quiet
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=5 npm run test -- --grep @oss --quiet
```

## Workflow
Expand Down
2 changes: 1 addition & 1 deletion frontend/.claude/commands/e2e.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Run all E2E tests (both OSS and enterprise) and report results.
## Run Command

```bash
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=20 npm run test -- --grep "@oss|@enterprise" --quiet
E2E_RETRIES=0 SKIP_BUNDLE=1 E2E_CONCURRENCY=5 npm run test -- --grep "@oss|@enterprise" --quiet
```

## Workflow
Expand Down
2 changes: 1 addition & 1 deletion frontend/.claude/context/e2e.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ E2E_TEST_TOKEN_PROD=<prod-token>
## Environment Variables

- `SKIP_BUNDLE=1` - Skip webpack bundle build for faster iteration
- `E2E_CONCURRENCY=20` - Number of parallel test workers (reduce to 1 for debugging)
- `E2E_CONCURRENCY=5` - Number of parallel test workers (reduce to 1 for debugging)
- `E2E_RETRIES=0` - Disable retries and enable fail-fast mode (stop on first failure)
- `--quiet` - Minimal output
- `--grep @enterprise` - Run only enterprise tests
Expand Down
4 changes: 3 additions & 1 deletion frontend/common/ES6Component.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = function es6Component(context, onUnmount) {
function es6Component(context, onUnmount) {
context._listeners = []

context.listenTo = function listenTo(store, event, callback) {
Expand Down Expand Up @@ -55,3 +55,5 @@ module.exports = function es6Component(context, onUnmount) {
}
}
}

export default es6Component
2 changes: 1 addition & 1 deletion frontend/common/dispatcher/action-constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,4 @@ const Actions = Object.assign({}, require('./base/_action-constants'), {
})

window.Actions = Actions
module.exports = Actions
export default Actions
3 changes: 1 addition & 2 deletions frontend/common/dispatcher/app-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -376,5 +376,4 @@ const AppActions = Object.assign({}, require('./base/_app-actions'), {
},
})

module.exports = AppActions
window.AppActions = AppActions
export default AppActions
16 changes: 16 additions & 0 deletions frontend/common/hooks/useHasGithubIntegration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import AccountStore from 'common/stores/account-store'
import { useGetGithubIntegrationQuery } from 'common/services/useGithubIntegration'

export function useHasGithubIntegration() {
const organisationId = AccountStore.getOrganisation()?.id
const { data } = useGetGithubIntegrationQuery(
{ organisation_id: organisationId },
{ skip: !organisationId },
)

return {
githubId: data?.results?.[0]?.id ?? '',
hasIntegration: !!data?.results?.length,
organisationId,
}
}
2 changes: 1 addition & 1 deletion frontend/common/providers/FeatureListProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,4 @@ FeatureListProvider.propTypes = {
onSave: OptionalFunc,
}

module.exports = FeatureListProvider
export default FeatureListProvider
5 changes: 2 additions & 3 deletions frontend/common/providers/Permission.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import React, { FC, ReactNode, useMemo } from 'react'
import { useGetPermissionQuery } from 'common/services/usePermission'
import AccountStore from 'common/stores/account-store'
import intersection from 'lodash/intersection'
import { cloneDeep } from 'lodash'
import { cloneDeep, intersection } from 'lodash'
import Utils from 'common/utils/utils'
import Constants from 'common/constants'
import {
Expand Down Expand Up @@ -50,7 +49,7 @@ type PermissionType =
| EnvironmentLevelProps

type UseHasPermissionParams = {
id: number | string
id: number | string | undefined | null
level: 'organisation' | 'project' | 'environment'
permission: OrganisationPermission | ProjectPermission | EnvironmentPermission
tags?: number[]
Expand Down
78 changes: 78 additions & 0 deletions frontend/common/services/useIdentityOverride.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { service } from 'common/service'
import { Req } from 'common/types/requests'
import {
EdgeIdentityOverrideItem,
FeatureState,
IdentityOverride,
PagedResponse,
Res,
} from 'common/types/responses'
import Utils from 'common/utils/utils'

export const identityOverrideService = service
.enhanceEndpoints({ addTagTypes: ['IdentityOverride'] })
.injectEndpoints({
endpoints: (builder) => ({
createIdentityOverride: builder.mutation<
FeatureState,
Req['createIdentityOverride']
>({
invalidatesTags: [{ id: 'LIST', type: 'IdentityOverride' }],
query: ({
enabled,
environmentId,
feature_state_value,
featureId,
identityId,
}) => ({
body: {
enabled,
feature: featureId,
feature_state_value: feature_state_value ?? null,
},
method: 'POST',
url: `environments/${environmentId}/${Utils.getIdentitiesEndpoint()}/${identityId}/${Utils.getFeatureStatesEndpoint()}/`,
}),
}),
getIdentityOverrides: builder.query<
Res['identityOverrides'],
Req['getIdentityOverrides']
>({
providesTags: [{ id: 'LIST', type: 'IdentityOverride' }],
query: ({ environmentId, featureId, isEdge, page = 1 }) => ({
url: isEdge
? `environments/${environmentId}/edge-identity-overrides?feature=${featureId}&page=${page}`
: `environments/${environmentId}/${Utils.getFeatureStatesEndpoint()}/?anyIdentity=1&feature=${featureId}&page=${page}`,
}),
transformResponse(
res:
| PagedResponse<EdgeIdentityOverrideItem>
| PagedResponse<FeatureState>,
_,
{ isEdge },
): Res['identityOverrides'] {
if (isEdge) {
const edgeRes = res as PagedResponse<EdgeIdentityOverrideItem>
return {
...edgeRes,
results: edgeRes.results.map((v) => ({
...v.feature_state,
identity: {
id: v.identity_uuid,
identifier: v.identifier,
},
})) as IdentityOverride[],
}
}
return res as PagedResponse<FeatureState>
},
}),
// END OF ENDPOINTS
}),
})

export const {
useCreateIdentityOverrideMutation,
useGetIdentityOverridesQuery,
// END OF EXPORTS
} = identityOverrideService
21 changes: 19 additions & 2 deletions frontend/common/types/requests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
StageActionType,
StageActionBody,
ChangeRequest,
FlagsmithValue,
TagStrategy,
} from './responses'
import { UtmsType } from './utms'
Expand Down Expand Up @@ -234,7 +235,7 @@ export type Req = {
pages?: (string | undefined)[] // this is needed for edge since it returns no paging info other than a key
isEdge: boolean
}>
getPermission: { id: number; level: PermissionLevel }
getPermission: { id: number | string; level: PermissionLevel }
getAvailablePermissions: { level: PermissionLevel }
getTag: { id: number }
getHealthEvents: { projectId: number }
Expand All @@ -250,7 +251,10 @@ export type Req = {
getTags: {
projectId: number
}
createTag: { projectId: number; tag: Omit<Tag, 'id'> }
createTag: {
projectId: number
tag: Omit<Tag, 'id' | 'project' | 'type' | 'is_system_tag' | 'is_permanent'>
}
getSegment: { projectId: number; id: number }
updateAccount: Account
deleteAccount: {
Expand Down Expand Up @@ -883,5 +887,18 @@ export type Req = {
}
}
}
getIdentityOverrides: {
environmentId: string
featureId: number
page?: number
isEdge: boolean
}
createIdentityOverride: {
environmentId: string
identityId: string
featureId: number
enabled: boolean
feature_state_value: FlagsmithValue | null
}
// END OF TYPES
}
13 changes: 13 additions & 0 deletions frontend/common/types/responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,18 @@ export type IdentityFeatureState = {
}[]
}

export type EdgeIdentityOverrideItem = {
feature_state: FeatureState
identity_uuid: string
identifier: string
}

export type IdentityOverride = FeatureState & {
identity: { id: string; identifier: string }
segment?: null
overridden_by?: string | null
}

export type FeatureState = {
change_request?: number
created_at: string
Expand Down Expand Up @@ -1165,6 +1177,7 @@ export type Res = {
identityFeatureStates: IdentityFeatureState[]
cloneidentityFeatureStates: IdentityFeatureState
featureStates: PagedResponse<FeatureState>
identityOverrides: PagedResponse<IdentityOverride>
samlConfiguration: SAMLConfiguration
samlConfigurations: PagedResponse<SAMLConfiguration>
samlMetadata: {
Expand Down
8 changes: 8 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@
"@types/color": "^3.0.3",
"@types/dompurify": "^3.2.0",
"@types/jest": "^30.0.0",
"@types/lodash": "^4.17.24",
"@types/rc-switch": "^1.9.5",
"@types/react-router": "^5.1.20",
"@types/react-router-dom": "^5.3.3",
Expand Down
6 changes: 1 addition & 5 deletions frontend/web/components/RemoveUserOverride.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import ConfirmRemoveFeature from './modals/ConfirmRemoveFeature'
import React from 'react'
import AppActions from 'common/dispatcher/app-actions'
import {
FeatureState,
IdentityFeatureState,
ProjectFlag,
} from 'common/types/responses'
import { IdentityFeatureState, ProjectFlag } from 'common/types/responses'
export const removeUserOverride = ({
cb,
environmentId,
Expand Down
2 changes: 1 addition & 1 deletion frontend/web/components/base/grid/Column.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ Column.propTypes = {
value: OptionalNumber,
}

module.exports = Column
export default Column
2 changes: 1 addition & 1 deletion frontend/web/components/base/grid/Flex.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ Flex.propTypes = {
value: OptionalNumber,
}

module.exports = Flex
export default Flex
13 changes: 5 additions & 8 deletions frontend/web/components/feature-summary/FeatureRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import Button from 'components/base/forms/Button'
import {
Environment,
FeatureListProviderData,
FeatureState,
ProjectFlag,
ReleasePipeline,
} from 'common/types/responses'
Expand All @@ -39,9 +40,7 @@ export interface FeatureRowProps {
removeFlag?: (projectFlag: ProjectFlag) => void | Promise<void>
toggleFlag?: (
projectFlag: ProjectFlag,
environmentFlag:
| FeatureListProviderData['environmentFlags'][number]
| undefined,
environmentFlag: FeatureState | undefined,
onError?: () => void,
) => void | Promise<void>
index: number
Expand Down Expand Up @@ -84,7 +83,7 @@ const FeatureRow: FC<FeatureRowProps> = (props) => {
style,
toggleFlag,
} = props
const protectedTags = useProtectedTags(projectFlag, projectId)
const protectedTags = useProtectedTags(projectFlag, String(projectId))
const history = useHistory()
const { id } = projectFlag

Expand All @@ -99,7 +98,7 @@ const FeatureRow: FC<FeatureRowProps> = (props) => {
} = useFeatureRowState(actualEnabled)

const { data: healthEvents } = useGetHealthEventsQuery(
{ projectId: String(projectFlag.project) },
{ projectId: projectFlag.project },
{ skip: !projectFlag?.project },
)

Expand Down Expand Up @@ -206,7 +205,6 @@ const FeatureRow: FC<FeatureRowProps> = (props) => {
? {
environmentFlag,
environmentId,
flagId: environmentFlag?.id,
history,
noPermissions: !permission,
projectFlag,
Expand All @@ -216,7 +214,6 @@ const FeatureRow: FC<FeatureRowProps> = (props) => {
: {
environmentFlag,
environmentId,
flagId: environmentFlag?.id,
hasUnhealthyEvents:
isFeatureHealthEnabled && !!featureUnhealthyEvents?.length,
hideTagsByType: ['UNHEALTHY'],
Expand Down Expand Up @@ -313,7 +310,7 @@ const FeatureRow: FC<FeatureRowProps> = (props) => {
if (disableControls) return
editFeature(Constants.featurePanelTabs.HISTORY)
},
projectId,
projectId: String(projectId),
protectedTags,
readOnly: isReadOnly,
tags: projectFlag.tags,
Expand Down
5 changes: 4 additions & 1 deletion frontend/web/components/modals/AuditLogWebhooks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ type AuditLogWebhooksType = {

const AuditLogWebhooks: FC<AuditLogWebhooksType> = ({ organisationId }) => {
const { data: webhooks, isLoading: webhooksLoading } =
useGetAuditLogWebhooksQuery({ organisationId }, { skip: !organisationId })
useGetAuditLogWebhooksQuery(
{ organisationId: parseInt(organisationId) },
{ skip: !organisationId },
)
const createWebhook = () => {
openModal(
'New Webhook',
Expand Down
Loading
Loading