Nuno Góis
7093b49962
feat: add billing page to admin ( #993 )
...
* feat: add billing page to admin
* some adjustments to billing page
* add BillingHistory, remove invoices, misc improvements
* refactor based on instanceStatus logic, add dialog
* fix: cleanup
* some refactoring and alignment with figma
* add extend, isBilling, refactoring and misc improvements
* fix: update tests
* refactor: reorganize billing into smaller components, misc improvements
* add STRIPE flag, some refactoring and adapting to comments and discussion
* adapt BillingHistory slightly, refactor TextCell
* Update src/hooks/api/getters/useInstanceStatus/useInstanceStatus.ts
Co-authored-by: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
* refactor: address PR comments
* fix: adjust divider color
* fix: update snaps
* refactor: address PR comments
* fix: update snaps
* fix: amountFormatted typo
Co-authored-by: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-05-25 23:26:05 +02:00
Fredrik Strand Oseberg
ded3c22bb1
Feat/new addons table ( #1021 )
...
* feat: initial list of available addons
* feat: add columns
* fix: update referential equality
* fix: remove search
* fix: remove unused imports
* fix: padding
* fix: imports
* refactor: based on comments
2022-05-25 15:37:32 +02:00
olav
76ea65b65c
refactor: port health reports to react-table ( #1017 )
...
* refactor: fix table header sort button focus styles
* refactor: extract FeatureNameCell component
* refactor: port health reports to react-table
* refactor: hide columns on small screens
* refactor: sort features by name
2022-05-25 12:45:30 +02:00
olav
34f848ce8a
refactor: replace react-dnd with custom implementation ( #988 )
...
* refactor: replace react-dnd with custom implementation
* refactor: add TextCell, IconCell, and ActionCell
* refactor: port environments list to react-table
* refactor: change OfflineBolt to PowerSettingsNew
* refactor: simplify environment toast text
* refactor: improve IToast type type
* refactor: improve useSearchHighlightContext naming
* refactor: clarify enableDragAndDrop logic
2022-05-25 11:40:20 +02:00
Tymoteusz Czech
a11cb72d99
Persistent table query ( #999 )
...
* feat: persistent table query
* project overview sort query
* refactor: api methods as hook callbacks
* persitent columns in project overview
* enable new project overview
* fix: refactor feature state change in overview
* add type to sort
* update e2e tests
now takes 10% less time with use of cypress session
* prevent sort reset on features list
* fix feature toggle list loading
* fix: update column state saving
* update local storage hook test
2022-05-25 08:14:22 +00:00
olav
b742a69c4c
refactor: improve OpenAPI refs ( #1005 )
...
* refactor: regenerate OpenAPI client
* refactor: update usage of OpenAPI client
2022-05-24 08:37:46 +02:00
Tymoteusz Czech
6d130f61f6
feat: new contexts table ( #998 )
...
* feat: new contexts table
* improve context list actions
* refactor: disabled icon colors
* fix: update snapshots
* fix: icons
* fix: context fields typo
2022-05-20 08:29:23 +00:00
Fredrik Strand Oseberg
1caf9a924c
fix: user search pagination ( #997 )
2022-05-19 14:27:19 +02:00
olav
2e367b3a04
feat: add trial expiration warning banner ( #985 )
...
* refactor: simplify useApiGetter cache keys
* refactor: simplify basePath helpers
* refactor: add UNLEASH_BASE_PATH frontend env var
* refactor: make sure AnnouncerElement does not affect the layout
* refactor: draw texture image above footer
* refactor: extract domain check helpers
* refactor: fix a few ts-expect-errors
* feat: add trial expiration warning banner
* refactor: fix IInstanceStatus interface prefix
* refactor: use ConditionallyRender in InstanceStatus
* refactor: simplify env helper functions
* refactor: use FC in InstanceStatus
* refactor: warn about expired trials
* refactor: fix eslint warnings
* refactor: disable banner outside of localhost
* refactor: use new instance state field name
2022-05-19 14:06:18 +02:00
Tymoteusz Czech
06b0a29ea8
Project features list update ( #991 )
...
* refactor: column icon position
* project overview horizontal scroll
* updated table headers styles
* fix: feature overview switch title
* refactor: cleanup of sortable header styles
* fix: z-index issue in test
* fix: html semantics after review
2022-05-18 11:56:55 +02:00
olav
98b6214c28
fix: avoid erasing previous environments data on refetch ( #990 )
...
* refactor: avoid duplicate useLoading call
* fix: avoid erasing previous environments data on refetch
* refactor: keep mutataion logic within useEnvironments
2022-05-18 11:26:38 +02:00
olav
159c54ed37
fix: resolve issues around changing a toggle's project ( #978 )
...
* refactor: show save button before using the dropdown
* refactor: simplify FeatureSettingsProject toast message
* refactor: fix FeatureProjectSelect filter prop type
* refactor: hide change project page for non-enterprise
* refactor: derive move targets from projects list instead of from permissions
* refactor: align frontend project compat check with backend
* refactor: fix useProject object stability
* refactor: disable the save button for the current project
* refactor: require equal environments when moving toggles
* refactor: improve arraysHaveSameItems name
2022-05-18 11:07:19 +02:00
Tymoteusz Czech
b1166bb2f4
Project overview feature toggles list ( #971 )
...
* refactor: page container
* refactor: table page header
* feat: new feature toggles list in project overview
* feat: sortable enviromnents in project overview
* feat: project overview toggles search
* feat: project overview features column actions
* project overview table column sizing
* project overview feature actions permissions
* project overview archive feature action
* project overview toggle state strategy fallback
* remove previous project overview implementation
* fix: remove additional prop in sortable table
* fix: stale feature refetch
* improvements after review
* feat: manage visible columns in project overview
* improve project overview columns selection
* fix: simplify columns
* Revert "remove previous project overview implementation"
This reverts commit 98b051ff6a5a4fb8a9a0921b661514e15a00249a.
* restore legacy project overview table
2022-05-13 14:51:22 +02:00
Tymoteusz Czech
cd37624de4
Theme consistency updates ( #960 )
...
* fix: theme palette and shape
* fix: update snapshots
* fix: adjust after review
2022-05-09 12:01:12 +02:00
olav
ae51e979cd
refactor: add Plausible tracker on SaaS domain ( #956 )
...
* feat: add Plausible tracker on SaaS domain
* refactor: check uiFlags.T instead of the domain
2022-05-06 14:04:09 +02:00
Nuno Góis
5872a1c82c
refactor: adapt to Vite ( #940 )
...
* chore: adapt to vite
* remove react-scripts
* add jsdom dep, update snaps
* fix tests
* fix: formatting
* fix: vercel rewrite
* fix: regeneratorRuntime is not defined
Co-authored-by: Tymoteusz Czech <tymek+gpg@getunleash.ai>
Co-authored-by: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
2022-05-05 16:15:22 +01:00
Nuno Góis
004ded8f74
feat: add last seen col to admin users list ( #949 )
...
* feat: add last seen col to admin users list
* fix: header hover effect, duplicate title from TimeAgo
* fix: use YMD format, never logged
* fix: small tooltip change
* refactor: adapt to review suggestions
2022-05-05 14:53:28 +01:00
Tymoteusz Czech
1772997d28
Feature list table ( #908 )
...
* experiment with generic table
* feat: example implementation of sortable table interfaces
* add enhanced table header
Co-authored-by: Nuno Góis <github@nunogois.com>
* table cleanup
Co-authored-by: Nuno Góis
Co-authored-by: Fredrik Strand Oseberg
* useSort hook interface surface
Co-authored-by: Nuno Góis <github@nunogois.com>
* sort handler initial implementation
Co-authored-by: Tymoteusz Czech <Tymek@users.noreply.github.com>
* new table unified components
* feature flags table components
Co-authored-by: Nuno Góis <github@nunogois.com>
* feat: new table sort hook
* feat: table sort
* useSearch hook implementation
* update new sort hook tests
* sortable headers hook
* feat: add sort to other table features
* move experimental table hooks to a directory
* update new table header styles
* fix: header, tableActions
* add some details like pagination and highlighter so we keep them in mind
* feature table cells
* update new table sort logic
* new pagination
* fix formatting and remove unused component
* fix: adapt useSearch default search to text instead of regex (PR #924 )
* fix: update table title based on visible rows
* fix: remove test route
* refactor: move table experiment files
* features table experimentation
* feat: enhanced feature flags table
* fix: features default sort
* feat: enhanced table loading
* fix: table theme after mui5 update
* features list placeholder
* add react-table
* update snapshots after theme change
* remove unused files
* fix: improve features table after review
* refactor: rename feature type cell variables
Co-authored-by: Fredrik Oseberg <fredrik.no@gmail.com>
Co-authored-by: Nuno Góis <github@nunogois.com>
Co-authored-by: Tymoteusz Czech <Tymek@users.noreply.github.com>
2022-05-05 15:34:46 +02:00
olav
d8143c6ff4
chore: update react-router to v6 ( #946 )
...
* refactor: fix child selector warnings
* refactor: update react-router-dom
* refactor: use BrowserRouter as in react-router docs
* refactor: replace Redirect with Navigate
* refactor: replace Switch with Routes
* refactor: replace useHistory with useNavigate
* refactor: replace useParams types with useRequiredPathParam
* refactor: replace NavLink activeStyle with callback
* refactor: fix matchPath arg order
* refactor: Remove unused link state
* refactor: delete broken snapshot test
* refactor: render 404 page without redirect
* refactor: normalize path parameter names
* refactor: fix Route component usage
2022-05-05 13:42:18 +02:00
olav
35262e404b
refactor: clean up strategy parameter types ( #944 )
...
* refactor: fix splash page button background color
* refactor: regenerate OpenAPI client
* refactor: clean up strategy parameter types
* refactor: remove index signature from IConstraint
* refactor: fix never-seen status in features list
2022-05-04 15:16:34 +02:00
olav
7b60ef2aa6
refactor: misc type improvements ( #945 )
...
* refactor: improve ChangePassword types
* refactor: improve usePagination types
* refactor: improve UsersList types
2022-05-04 08:14:49 +02:00
Nuno Góis
9ffc421252
feat: show archived toggles on a project level ( #942 )
...
* feat: show archived toggles on a project level
* Update src/component/feature/FeatureToggleList/FeatureToggleListActions/FeatureToggleListActions.tsx
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
* refactor: adapt code to PR comments, clarity
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-05-03 15:27:43 +01:00
olav
24c11332b5
chore: update MUI to v5 ( #923 )
...
* refactor: update mui packages
* refactor: run mui codemods
* refactor: format files after codemods
* refactor: fix broken types
* refactor: clean up theme
* refactor: fix broken tests
* refactor: replace @mui/styles with tss-react
* refactor: move breakpoints into classes for tss
* refactor: fix crash on missing feature description
* refactor: remove void classNames
* refactor: adjust styles to new defaults
* refactor: remove broken rollout slider e2e test
* refactor: fix duplicate e2e testid
* refactor: update makeStyles after rebase
* refactor: add missing snapshot after rebase
* refactor: fix TableCellSortable focus styles
* refactor: use 1.4 as the default line-height
* refactor: hide webkit search field icons
* refactor: fix select box label
* refactor: make AutocompleteBox smaller
* refactor: make heading smaller
* refactor: fix toast close icon color
* refactor: update snapshots
* refactor: add missing test event awaits
* refactor: fix default button line-height
2022-05-02 15:52:41 +02:00
Tymoteusz Czech
23a874d051
Refactor: convert jsx files to typescript ( #881 )
...
* refactor: convert remaining js files to typescript
* refactor: conditionally render remove index
* refactor: dialog component to tsx
* refactor: migrate some files from jsx to tsx
* refactor: convert dropdown element to tsx
* refactor: feature toggle list to tsx
* refactor: update context name in use overrides
* refactor: variant overrides to tsx
refactor: remove unused strategy constraint file
* fix: tsx imports
* fix: update refectored components after rebase
* refactor: rename report list files to tsx
* fix: project health list types
* refactor: addon form - add types
* refactor: copy feature component types
* fix: projects toggle style after tsx refactor
* refactor: update ts types from openapi
* fix: ts refactor changes after review
* fix: header title prop
* fix: update after PR comments
* add test to useoverrides hook
* fix conditionally render time ago
* fix: toggle list empty tooltip
* fix: remove unused variable
* remove unused variable
* fix: remove faulty snapshot
2022-05-02 12:52:33 +02:00
Nuno Góis
860656a95e
fix: user search by text instead of regex ( #924 )
...
* fix: user search by text instead of regex
* refactor: better clarity
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-04-29 13:14:17 +02:00
olav
f7266cde10
fix: announce navigation to screen readers ( #911 )
...
* refactor: unify page titles
* refactor: update page title on navigation
* refactor: add AnnouncerContext to test contexts
* fix: announce navigation to screen readers
2022-04-27 09:14:44 +02:00
olav
5785557af8
fix: add missing refetch after feature strategy create/edit ( #909 )
2022-04-26 11:21:35 +02:00
olav
8f1900f32b
feat: generate an OpenAPI client (2) ( #875 )
...
* feat: add a script that generates an OpenAPI client
* feat: generate an OpenAPI client
* feat: use the generated OpenAPI client
* refactor: add an OpenAPI section to the readme
* refactor: fix missing interface prefixes
* refactor: regenerate OpenAPI client
2022-04-26 10:53:46 +02:00
olav
49a63173f8
fix: avoid constraint accordion close on focus ( #907 )
...
* fix: avoid constraint accordion close on focus
* refactor: fix mutate cache key mismatch
2022-04-26 09:54:16 +02:00
olav
2e5e25bfe5
refactor: improve icon labels and tooltips ( #884 )
2022-04-21 08:26:49 +02:00
Nuno Góis
fdd683813a
feat: add user table sort and search ( #879 )
...
* add user sort and filter hooks, adapt table to match design
* refactor: abstract away TableActions and TableCellSortable into components, small fixes and improvements
* feat: implement search
* feat: add search word highlighter to match design
* refactor: small UI/UX improvements
* fix: rounded corners for th on responsive breakpoints
* refactor: small UI/UX improvements
* Update src/hooks/useUsersSort.ts
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
* refactor: clearer arg name in users filter
* refactor: specify transition properties
* refactor: add theme v2 properties and cleanup styles
* refactor: create lightweight highlighter component
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-04-20 13:22:50 +01:00
olav
49b8e7329e
refactor: convert auth tests from Cypress to Jest ( #864 )
...
* refactor: replace data-test with data-testid
* refactor: add Jest tests for auth pages
* refactor: remove Cypress tests for auth pages
* refactor: remove questionable snapshots
* refactor: share test server setup/teardown
* refactor: restore auth page flex layout
* refactor: use toBeInTheDocument
* refactor: change recent data-test attrs to data-testid
2022-04-08 13:13:45 +02:00
Nuno Góis
1132a79f6d
fix: reject duplicate segment names ( #855 )
...
* fix: reject duplicate segment names
* fix: useSegmentValidation now takes into account initial value
* refactor: add segments e2e test
* refactor: add github action from segments e2e test
* refactor: use enterprise edition for all e2e tests
* refactor: use enterprise edition for all e2e tests
2022-04-08 11:34:59 +01:00
Tymoteusz Czech
b23226370a
feat: multi-project api access tokens ( #857 )
...
* fix: general select component typings
* custom multi-select for projects
* autocomplete element for token projects
* project multi-select with error handling
* projects in tokens list update
* multi-project tokens - select all button
* fix conflicting typescript changes
* improve multi-projects tokens form after review
* refactor multi-project select code structure
* test api token list projects column element
* simplify test renderer
2022-04-08 12:26:44 +02:00
olav
fb8d0e7efc
fix: use the first project if there's no default project ( #859 )
...
* refactor: extract FeatureToggleListCreate component
* fix: use the first project if there's no default project
2022-04-07 11:08:05 +02:00
olav
a088866124
refactor: port some things to TS ( #843 )
...
* refactor: port useSort to TS
* refactor: port loadingFeatures to TS
* refactor: port admin index to TS
* refactor: port TagTypeList to TS
* refactor: merge route interfaces
* refactor: port common utils to TS
* refactor: fix snapshot date typo
* refactor: port Reporting utils to TS
* refactor: improve PermissionIconButton prop types
2022-04-06 12:22:24 +02:00
olav
dbb62631a6
feat: add FeedbackCES component ( #826 )
...
* refactor: add screen-reader-only util class
* refactor: move FeedbackNPS component
* feat: add FeedbackCES component
* refactor: improve hidden checkbox styles
* refactor: fix IFeedbackEndpointRequestBody source type
* refactor: remove unnecessary event.persist() calls
* refactor: remove disableEscapeKeyDown from FeedbackCES modal
* refactor: make textarea label customizable
* refactor: store feedback state on the backend
* refactor: add FeedbackCESForm snapshot test
* refactor: use extant IAuthFeedback type
* refactor: fix showNPSFeedback logic for multiple feedback types
2022-03-31 09:23:46 +02:00
Youssef Khedher
eeda7ab5e4
feat: add segments ( #780 )
...
* feat: create segmentation structure and list
* feat: remove unused deps and change route
* feat: change header style and add renderNoSegments
* fix: style table header
* feat: create useSegments hook
* feat: add segmentApi hook
* feat: create segment
* fix: errors
* feat: add contextfields list
* fix: remove user from create segment api
* feat: add form structure
* feat: add SegmentFormStepOne
* fix: tests and routes
* feat: add constraint view
* feat: UI to match the sketch
* feat: add constraint on context select
* fix: duplication
* fix adding constraints
Co-authored-by: olav <mail@olav.io>
* fix: input date not showing up in constraint view
Co-authored-by: olav <mail@olav.io>
* fix: minor bugs
Co-authored-by: olav <mail@olav.io>
* fix: create context modal in segment page
Co-authored-by: olav <mail@olav.io>
* fix: validate constraint before create segment
Co-authored-by: olav <mail@olav.io>
* feat: create useSegment hook
Co-authored-by: olav <mail@olav.io>
* feat: create edit component
Co-authored-by: olav <mail@olav.io>
* refactor: move constraint validation endpoint
* refactor: add missing route snapshot
* refactor: fix segment constraints unsaved/editing state
* refactor: remove create segment from mobile header menu
* refactor: update segments form description
* refactor: extract SegmentFormStepList component
* refactor: add an optional FormTemplate docs link label
* refactor: fix update segment payload
* feat: finish edit component
Co-authored-by: olav <mail@olav.io>
* refactor: move step list above segment form
* fix: update PR based on feedback
Co-authored-by: olav <mail@olav.io>
* refactor: fix constraint validation endpoint path
* refactor: improve constraint state field name
* refactor: extract AutocompleteBox component
* feat: add strategy segment selection
* refactor: add strategy segment previews
* refactor: fix double section separator line
* feat: disable deleting a usable segment
* refactor: warn about segments without constraints
* refactor: update text in delete segment dialogue
* refactur: improve arg names
* refactor: improve index var name
* refactor: clarify steps list logic
* refactor: use a required prop for the segment name
* refactor: use ConditionallyRender for segment deletion
* refactor: fix segments refetch
* refactor: improve CreateUnleashContext component names
* refactor: adjust segment form styles
* refactor: adjust text
* refactor: fix info icon tooltip hover target
* refactor: add missing aria attrs to preview button
* refactor: add strat name to delete segment modal
* refactor: fix segment chip text alighment
* refactor: use bulk endpoint for strategy segments
* refactor: fix imports after merge
Co-authored-by: Fredrik Oseberg <fredrik.no@gmail.com>
Co-authored-by: olav <mail@olav.io>
2022-03-29 09:30:57 +02:00
Youssef Khedher
85950f104a
chore: update paths 🧼 ( #820 )
2022-03-28 09:49:59 +01:00
Youssef Khedher
4589a19e03
fix: misc UI improvements ( #806 )
...
* fix: link color in project features
Co-authored-by: olav <mail@olav.io>
* fix: link in health page
Co-authored-by: olav <mail@olav.io>
* fix: keep sorting state in project toggles list
Co-authored-by: olav <mail@olav.io>
* fix: style link in the toggle list project
Co-authored-by: olav <mail@olav.io>
* refactor: update browser list
Co-authored-by: olav <mail@olav.io>
Co-authored-by: olav <mail@olav.io>
2022-03-25 15:30:52 +01:00
olav
cfc2338e78
refactor: use camel case for files and dirs ( #817 )
2022-03-25 12:34:20 +01:00
olav
2ca88b019a
refactor: restrict API tokens to enabled environments ( #809 )
...
* refactor: add missing Tooltip wrapper elements
* refactor: rewrite useEnvironments
* refactor: disable environments in select box
* refactor: make sure initial environment is enabled
2022-03-23 12:55:00 +01:00
olav
d1e96501ec
refactor: test useFeaturesFilter ( #795 )
2022-03-16 13:51:01 +01:00
Youssef Khedher
bee9fadbc9
feat: segments ( #776 )
...
* feat: create segmentation structure and list
* feat: remove unused deps and change route
* feat: change header style and add renderNoSegments
* fix: style table header
* feat: create useSegments hook
* feat: add segmentApi hook
* fix: ts and style errors
* feat: update PR based on feedback
* feat: add flag
* fix: test and formating
* fix: update PR based on feedback
* fix: add correct permission
* fix: mobile view for segments
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-03-16 13:19:27 +01:00
olav
9798cfd888
refactor: fix search crash on missing values ( #794 )
...
* refactor: fix search crash on missing values
* Update src/hooks/useFeaturesFilter.ts
* Update src/hooks/useFeaturesFilter.ts
* fix: update regex
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-03-16 11:26:08 +01:00
Fredrik Strand Oseberg
f52ca03b55
fix: show invalid token page when token error is received ( #785 )
2022-03-15 16:00:13 +01:00
olav
f0aa764d3e
refactor: wait for UI config for CO flag ( #781 )
2022-03-11 16:18:38 +01:00
olav
419f655ef5
refactor: improve feature not found page ( #774 )
...
* refactor: improve feature not found page
* refactor: fix feature cache mutation mismatch
2022-03-10 10:52:50 +01:00
olav
baae88c7a5
feat: add new feature strategy create/edit pages ( #739 )
...
* refactor: add param helper hooks
* refactor: remove first add strategy link
* refactor: add more types to useStrategies
* refactor: port strategy utils to TS
* refactor: replace rollout strategy icon
* refactor: use a named export for useFeature
* refactor: add more types to useFeature
* refactor: adjust code box styles
* refactor: add missing PermissionButton variant prop
* refactor: add missing button icon label
* refactor: move common feature components
* refactor: fix StrategyConstraints error prop types
* refactor: fix GeneralStrategy prop types
* feat: add new feature strategy create/edit pages
* refactor: remove feature strategies page
* refactor: fix types in GeneralStrategy
* refactor: use ConstraintAccordion on the new pages
* refactor: use ConditionallyRender for remove button
* refactor: rename FeatureStrategyForm component
* refactor: use the Edit icon for feature strategies
* refactor: fix initial edit mode for new constraints
* refactor: add FeatureStrategyMenu to closed accordions
* refactor: allow editing multiple constraints
* refactor: show single-valued constraint value
* refactor: increase feature overview strategy width
* refactor: add remove button to feature overview strategies
* refactor: move createEmptyConstraint to own file
* refactor: disable submit button for invalid constraints
* refactor: fix nested paragraphs on the metrics page
* refactor: move create/edit feature strategy to modal
* refactor: always open new constraints in edit mode
* refactor: use a PermissionButton for the save button
* refactor: remvoe unsaved constraints on cancel
* refactor: clarify useConstraintsValidation logic
* refactor: remove unused strategy descriptions
* refactor: restore Rollout icon
* refactor: remove sidebar modal slide animation
* refactor: avoid constraint accordion toggle on edit/delete
* refactor: truncate long strategy names
* refactor: find the correct remove button
2022-03-09 14:59:24 +01:00
Youssef Khedher
ea401f3ec5
feat: add changeRole ( #768 )
...
* feat: add changeRole in project
* fix: update PR based on feedback
Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-03-07 09:26:31 +01:00