giseldo/neodataset huggingface dataset:
FE: Add types to spaceweather api

The spaceweather lib needs some extra work regarding api and types:
- not all api route _params_ are defined, add them all. Missing example:
```
  getEventList: (params): Promise<{ data: SWEvent[] }> => {
      return axiosInstance.get('/notification/eventList', { params });
    },
```
- The fakeApi does not have all routes defined. Should be added there as well with some dummy data
- When this is done, we can use the `fakeApi` in tests without having to cast it everytime. Try to make `unknown as SpaceWeatherApi` and `as SpaceWeatherApi` not findable if possible
- See if we ignore some more api types at places, for example the `useStreams` hook:
```
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const useStreams = (api): [[], () => void] => {
  const [streams, setStreams] = React.useState([]);
  const [streamsDict, setStreamsDict] = React.useState(null);
  const prevStreams = usePrevious(streams);
```

Story points: 3.0
BE: expand readme in presets-be for testing dev-branches

In the [README.md of presets-backend](https://gitlab.com/opengeoweb/backend-services/presets-backend/-/blob/main/README.md) a description can be found to test presets-be with a locally composed docker in local FE. 

It would help as well to expand/add a description of testing versions of presets-be that have been _deployed_ with the help of the [presets-backend deployment repository](https://gitlab.com/KNMI/geoweb/backend-services/deploy-presets-backend). 

After deployment, an additional step is needed to be able to test the presets-be functionalities in the FE: a dev-branch of the `geoweb-serverless-backend` should be deployed, in order to be able to log into a dev environment.

After this, a `config.json` can be composed with the following fields:
```
...

GW_PRESET_BACKEND_URL

...
```

It would be helpful to add these steps to the README's of the presets-backend and/or deploy-presets-backend.

Story points: 2.0
BE: Make sure development cognito userpool does not get deleted by cleanup script

- Change stackname of dev userpool deployment from -dev- to -development-, that will make sure cleanup script does not delete the stack after 7 days.
- Update the stackname in geoweb-serverless backend as well, in order to make the import value statement correctly relate to the new stack.
- Re-populate all users, incl smoketest user

Story points: 1.0
BE: fix deployments in deploy-presets-BE

deployment of all branches fail, investigate and fix the deployment.

`E1019 Parameter DatabaseCluster.Endpoint.Address for Fn::Sub not found at Resources/PresetsBackendTaskDefinition/Properties/ContainerDefinitions/0/Environment/0/Value/Fn::Sub
./cloudformation.cfn.yaml:197:15
E1019 Parameter DatabaseCluster.Endpoint.Address for Fn::Sub not found at Resources/PresetsBackendTaskDefinition/Properties/ContainerDefinitions/1/Environment/0/Value/Fn::Sub
./cloudformation.cfn.yaml:214:15
E1010 Invalid GetAtt DatabaseCluster.Endpoint.Address for resource DatabaseUser
./cloudformation.cfn.yaml:610:9`


**hint:** database creates many snapshots. there is a limited number of snapshots available. if limit exceeded, no new databases can be created. potential additional/follow-up action: automatic cleanup of snapshots

Story points: 5.0
FE/BE: fix nginx configuration in opengeoweb dockerfile

* Currently, signing in is not possible. To do this, need to configure nxinx correctly in the dockerfile of opengeoweb
* Create/add an nginx.conf file to the opengeoweb repository
* For example, you can look at the nginx.conf file in the geoweb serverless backend
* Add a statement in dockerfile to copy nginx.conf file to correct place


**What to test:** you should be able to sign into the geoweb application. 

**Hint to test**: After running the docker file locally: `https://localhost/code` should show the application with an error (code invalid or something), but not a 404 error.

Story points: 3.0
FE: use openSnackbar inside presets

Show snackbar for the following actions:
- save as: New map preset successfully saved
- save: Map preset successfully saved
- delete: Map preset successfully deleted

Follow the design:
https://app.zeplin.io/project/5ecf84a3c6ae1047a368f393/screen/627286258f6a9f110b0a7be9

Story points: 3.0
FE: use snackbar inside TAF

Wrap TAF with a redux provider. Wrap TAF with snackbar Wrapper. Use `openSnackbar` for the following use actions:

1. TAF is properly saved as draft
1. TAF is properly published
1. TAF is properly cancelled
1. TAF is properly corrected
1. TAF is properly amended
2. TAF is autosaved

Story points: 3.0
FE: create redux store for snackbar

Create redux store called `snackbar`. Use `createEntityAdapter` to create the store, this will create the `byId` and `allIds`, every time openSnackbar is triggered, it will erase the store and only show the latest message, and will reset the timer interval. When the timer interval is complete, it will clear the store as well. Probably the interval on the `SnackBar` should be set to an infinite duration. The saga will take care of the timer

Create a saga. When a new openSnackbar is triggered, it first closeSnackbar, after they are gone it will trigger openSnackbar. Wrap the new SnackBarWrapperConnect component with a ReduxModuleWrapper, so everytime we use it it will create the `snackbar` store instance. 

The component only shows the snackbar if the `getCurrentSnackbarMessage` selector returns something. The timeout will be handled by saga

2 actions:
- openSnackbar ({message: string})
- closeSnackbar (use this action on the closeButton)

1 selector:
- getCurrentSnackbarMessage

Story points: 3.0
FE: create a snackbar wrapper component inside core

Create a simple snackbar wrapper that wraps components. See https://mui.com/material-ui/react-snackbar/ for an example. The storybook should be a simple example with a button (without redux), to have a basic example. It should be able to render children. If you press the button a message should show. Default timeout `4000` ms. Close button should close it 

~~Wrap the HomePage also with this component, although it can't show anything yet.~~

hint: see https://mui.com/material-ui/react-snackbar/#consecutive-snackbars

Story points: 3.0
BE: TBD: fix vulnerability of presets

![image](/uploads/5c8ca402a9efedf3e15d453f2d9a3358/image.png)

* high priority to fix before going to prd
* first, cleanup of unused images in ECR 
  * you can check acc/prd pipeline to see which images are used in acc/prd
  * presets-be shorter repository names should be removed
* fix vulnerabilities in remaining ones in **follow up** [ticket](https://gitlab.com/opengeoweb/opengeoweb/-/issues/2527)

---
* **Step 1:** clean up registry --> done 30-9-2022, see [comment](https://gitlab.com/opengeoweb/opengeoweb/-/issues/2491#note_1081041275).
* After first step, in `knmi/geoweb-presets-backend-gwpresetsbe/presets-backend` only 1 high vulnerability remains ([CVE-2019-8457](https://security-tracker.debian.org/tracker/CVE-2019-8457)) which is whitelisted in [.gitlab-ci.yml](https://gitlab.com/KNMI/geoweb/backend-services/deploy-presets-backend/-/blob/master/.gitlab-ci.yml)

Story points: 3.0
BE/FE: change message label to warning if you are no longer editor of taf

Follow up of this [comment](https://gitlab.com/KNMI/geoweb/geoweb-serverless-backend/-/merge_requests/319#note_1076101182) in [MR](https://gitlab.com/KNMI/geoweb/geoweb-serverless-backend/-/merge_requests/319)

For FE it would help if this label would be changed to 'WarningMessage' instead of 'ErrorMessage': currently the FE filters for the message string to display the warning as it is labelled as an error. More robust if the label were changed and FE could filter for WarningMessage

Story points: 2.0
BE: CellWarn data from EWC dev team using S3/SNS

Update the adgaguc configuration to retrieve CellWarn data with the SNS topic. Old/current CellWarn configuration should not be overwritten.


S3/SNS the ARN: arn:aws:sns:eu-west-1:401110613659:knmi-cell-tracking-output-event-prd

Bucket: knmi-cell-tracking-output-prd

The result should be two active CellWarn datasets in GeoWeb: the original one, distributed by VIVID, named cell-tracking and the new one, distributed by S3/SNS named CellWarn

Story points: 3.0
FE: Create CustomIconButton

- extend MUI IconButtonProps
- add prop variant
- add tooltip 
- make sure all currently used IconButton are now using CustomIconButton
- use CustomIconButton instead of ManagerButton
- for active/selected styling use className `. Mui-selected`
- snapshots
- should have no custom colors
- can use size=small for toolButtons 

Check in render template:

```
if(tooltip){
 return <TOoltipWrapper><Icon></TooltipWrapper>
}
return <Icon>
```

Story points: 3.0
FE map is moving while typing in the abstract field

Happening after selecting a workspace, and splitting a view:

tested in Chrome

See what the problem is, and make sure we come up with a solution that also works for future

![Screen_Recording_2023-04-20_at_11.08.20](/uploads/3df6868a48dff70fd635d660de90facc/Screen_Recording_2023-04-20_at_11.08.20.mov)

Story points: 3.0
FE: don't use WorkspacePresetAction directly for title naming

We use the following type for our titles:
```
export enum WorkspacePresetAction {
  DELETE = 'Delete',
  EDIT = 'Edit',
  SAVE = 'Save',
  SAVE_AS = 'Save as ',
  DUPLICATE = 'Save as',
}
```
This works ok until you have the same values. As a quick fix, I used a empty space to differentiate, but we should not use these keys as titles. 

Possible solution, use the same values as keys, and map the key to a string (`DELETE = 'DELETE' etc)

Story points: 2.0
FE: MUI: update @mui/x-date-pickers package

1. Check the latest version with `npm outdated`
1. Run `npm install` for all listed packages & specify version if latest needs higher major version
   * for example: `npm install @mui/x-date-pickers@6`
1. Check that application works, tests don't fail
1. Fix errors and problems

Packages included in this dev task:

* @mui/x-date-pickers

Story points: 3.0
FE: Create unique screen id after splitting view

Splitting a view creates a new view id, `screen_x`. If `screen_1` is already as view defined in your workspace as a start, the screenmanager will crash after you want to split the view.

steps to reproduce:
- go to /workspace
- open a workspace
- split the view
- save it
- refresh page and open same workspace again with new split view
- split again; the error will appear

No matter which unique name we come up, it could give issues. Probably when creating the id, we should check if the id exist. If it does, it should regenerate and check again until it is unique.

Story points: 2.0
FE: Allow save as option for `New workspace` option in list

We cannot "Save as" the`New workspace` as the BE tries to find the view preset it includes and that is not stored in the BE. 

To prevent errors showing, the save as option has been disabled.

Re-enable it again and use the emptyMap view preset when sending the new workspace to the BE from the `WorkspacePresetsFormDialog.tsx`

Use the details as stored in the emptyMapWorkspace but replace the view with `[{mosaicNodeId: 'emptyMapView', viewPresetId: 'emptyMap'}]`.

Also re-enable test in WorkspaceSelectListConnect.spec.tsx

Story points: 3.0
FE: workspace show selected viewPreset as active after fetching workspace

When opening a workspace, the selected viewPreset should be visible in the preset list. This way we can later easier store the workspace as we know which viewPreset belongs to which view. When nothing is selected, we can use the emptyMap as id to store  

![Screenshot_2023-04-18_at_09.56.34](/uploads/d3b1bd129d68f9bb6e330f0b46f99351/Screenshot_2023-04-18_at_09.56.34.png)

Story points: 2.0
FE: Add delete option from workspace menu (options)

Add the delete option from the workspace menu options:

Deleting a workspace preset from within the workspace menu, can be done by clicking on the workspace menu and select 'Delete'

* user is asked to confirm the delete action
* when confirmed, the workspace preset is removed
* if the current workspace do no longer refer to an existing workspace preset, then the name in the workspace menu is changed to `New workspace (not saved)`, the content of the workspace should not be changed.

### Test criteria

* open a workspace
* open the workspace menu and select `workspace that needs to be deleted `Delete\`
* the user gets a warning
* if user confirms deleting
* the name in the workspace menu is changed to `New workspace` -> update URL
* snackbar will confirm delete action
* If user cancels deleting
  * Nothing happens

Story points: 2.0
BE: geoweb-adaguc-server: Prevent individual time steps listing in WOWDATA

# Prevent individual time steps listing in WOWDATA

The GetCapabilities document of the WOWDATA set is huge. See

https://adaguc-server-geoweb.geoweb.knmi.cloud/adagucserver?dataset=WOWDATA&service=WMS&request=GetCapabilities

(Currently 3.5 mb)

This is causing performance issues in opengeoweb, as all these values are loaded into the redux store. We should prevent individual time steps listing in WOWDATA.

We should configure a interval time configuration in the dataset at:

https://gitlab.com/KNMI/geoweb/geoweb-adaguc-server/-/blob/master/adaguc-config/WOWDATA.xml

This will list a start/stop/resolution Dimension in the GetCapabilties, thus resulting in a much smaller and more managable file.

It will probably something like 

```
  <Dimension name="time" interval="PT5M">time</Dimension>
```
for each layer.

See https://github.com/KNMI/adaguc-server/blob/master/doc/configuration/Dimension.md for documentation.

Story points: 1.0
FE: Detect changes for workspace presets part 2

Don't use sagas, but use reducer and listen to the following actions and set hasChanges to true:

- [x] updateScreenManagerViews
- [x] addScreenManagerView
- [x] deleteScreenManagerView
- [x] mapPresets/selectMapPreset
- [x] Syncgroup changes:

      - synchronizationGroupsReducer/syncGroupRemoveTarget
      - synchronizationGroupsReducer/syncGroupAddTarget

Story points: 2.0
FE: Allow for reuse of mosaicNodeIds between workspace presets

Currently the mosaicNodeIds need to be unique even between workspace presets otherwise the check in screenmanager/reducer line 113 fails:

```
const duplicateIdBetweenPresets = draft.views.allIds.some((id) =>
        newViews.allIds.includes(id),
      ); 

if (duplicateIdBetweenPresets || duplicateIdWithinPreset.length) {
        console.warn('Invalid preset: duplicate viewId found.');
        return initialState;
      }
```

We need to ensure the ids of the mosaicNodeIds within a workspace have to be unique but BETWEEN workspaces they can be the same. Possibly this has already been fixed due to the fact that when toggling between workspaces it quickly sets an empty preset before changing to the new one. Check if this already fixes this.

- Try to fix in the screenmanager reducer and not in the sagas
- CHECK THAT WHEN TOGGLING BETWEEN WORKSPACE PRESETS THE VIEWS GET PROPERLY UPDATED
- Also follow the instructions from the linked user story to check that works correctly now
- Create a story in which the getWorkspaceList call is mocked so we can test this easily, in this getList call, add two workspaces which use the same mosaicNodeIds but different viewPresetId so we can test the toggling between them.

```
[
  {
    "id": "emptyMap",
    "title": "Empty map",
    "scope": "system",
    "abstract": "This can contain an abstract",
    "viewType": "singleWindow",
    "views": [
      { "mosaicNodeId": "screenA", "viewPresetId": "emptyMap" },
    ],
    "mosaicNode": "screenA"
  },
{
    "id": "radar2",
    "title": "Radar 2",
    "scope": "system",
    "abstract": "This can contain an abstract",
    "viewType": "singleWindow",
    "views":  [
      { "mosaicNodeId": "screenA", "viewPresetId": "radar" },
    ],
    "mosaicNode": "screenA"
  },
]
```

Story points: 3.0
FE: sigmet/airmet textfields sends empty strings

Kristian noticed them when trying to save drafts with only a few fields filled 

for sigmets the only fields that ended up being passed as "" were
```
isObservationOrForecast
change
levelInfoMode
movementType
```
for airmets the fields with "" were
```
isObservationOrForecast
movementType
change
visibilityCause
```

- When one of these fields is empty, should not be send to the backend. 
- Add tests to make sure it won't happen again

Story points: 3.0
BE: Deploy TAF BE - Review Memory and CPU for all containers

Follow-up for this comment: https://gitlab.com/KNMI/geoweb/backend-services/aviation-taf-deployment/-/merge_requests/9#note_1349518685

#### Intro:
After all micro-services in the TAF BE have been set up, we should review the CPU and memory allocated for each instances.

During deployment of dev-branches, sometimes an issue was encountered that insufficient CPU or Memory was available in the container instances in the KNMI cluster. Therefore, the CPU and memory was decreased for all services.

With everything set up, review the current settings and see where CPU and/or memory should be decreased or increased. Compare this with the availability in the cluster. Or try another approach

#### Latest configuration:
Please note, instead of this configuration, now the entire task was given 1 CPU and 1 GB to share in between. But before that, CPU & memory were divided like (you can check out cloudformation!):

| Container | CPU | Memory | Temp   |
| ------ | ------ | ------ | ------ | 
| admin  |  .25   |  256   |  yes   |
| tafbe  |  .25   |  256   |  no    |
| nginx  |  .25   |  256   |  no    |
| avimsg |  .25   |  256   |  no    |
| placeh.|  .125  |  256   |  no    |
| publish|  .125  |  256   |  no    |
| total-1 |  1.25 CPU | 1.5GB  |  yes   |
| total-2 |  1 CPU  | 1.25GB  |    no    |

1=total of all containers including temporary admin
2=total of "final" status

#### Example of issue:
![image](/uploads/02aaec9ec4d249f62b53623b51c34ccd/image.png)

##### In ECS > Cluster > Infrastructure you can see the available CPU and memory per container instance
![image](/uploads/dedd6353fcf66df252a6637e8c52f884/image.png)

Story points: 3.0
BE: investigate TAF form issue

Follow-up of reported bug occurrence. Meteorologists were able to save a draft of a TAF with the following field contents:
![image](/uploads/be5e01895e0db0a50d14222884b6051b/image.png)

Which made publishing the TAF impossible as BE validation failed. Try to find out why/how this slipped through FE validation and try to find the logs in the BE when this was saved as draft.

Look for timestamps between 18.30 - 19.00 on the 9th of April:

https://eu-west-1.console.aws.amazon.com/cloudwatch/home?region=eu-west-1#logsV2:log-groups/log-group/$252Faws$252Flambda$252Fgeoweb-taf-prd/log-events/2023$252F04$252F09$252F$255B$2524LATEST$255D7cb97357b30b490fafd3cc8fd8520052

Story points: 3.0
BE: fix opening sigmet/airmet on master opengeoweb

Currently when you open a sigmet you will see this error:

![Screenshot_2023-04-11_at_15.30.20](/uploads/50055f11edf4488c1051cc8afc6d4d3a/Screenshot_2023-04-11_at_15.30.20.png)

- cleanup data from brussel FIR in tst. check for both sigmet as airmet.

Story points: 2.0
FE: Support/Help atmos with the configurable layermanager

Setup separate repository with atmos where we work on making the layermanager configurable. Use opengeoweb as library inside this repository.

![Screenshot_2023-04-11_at_14.53.33](/uploads/bd025e86d3601225fbc77501e8ec66c6/Screenshot_2023-04-11_at_14.53.33.png)

Goal: get geoweb maximal configurable with the least amount of impact

Questions
- how many dependencies to use geoweb? and which?
- how about styling with custom theme?

To do:
- see MR
- should KNMI create a geoweb consumer application somewhere?
- Buttons should be easier to style overwrite via theme https://gitlab.com/opengeoweb/opengeoweb/-/issues/3551

Story points: 3.0
BE: Meeting about BE ticket splitting strategy.

- Please note that not all comments need to be resolved in the same MR/dev task. As a reviewer indicate whether this can be picked up in a follow up ticket.
- It is OK to split the dev task during working on it.
- Be aware of splitting too much?: https://gitlab.com/KNMI/geoweb/backend-services/aviation-taf-deployment/-/merge_requests/11#note_1349567570

Story points: 2.0
FE: Detect changes for workspace presets part 1


- Add a new property to the screenmanager reducer `hasChanges` and reset this on on `screenManagerActions.changePreset`.
- Make a selector `hasWorkspaceChanges`
- Follow the design to update the tab title if there are changes.


Listening to changes will be part of the follow-up ticket https://gitlab.com/opengeoweb/opengeoweb/-/issues/3597

Story points: 2.0
FE: Implement save existing functionality

- Enable the `save` option in the menu for personal workspace presets
- Make it work ;) :tada:
- URL does not need to be be updated.
- Saga should do the PUT workspacepreset request to the backend.
- Show snackbar and reset the hasChanges property (if already implemented https://gitlab.com/opengeoweb/opengeoweb/-/issues/3563)

Story points: 3.0
FE: Support new workspace preset structure

- Create a new workspace preset type (ScreenmanagerPresetFromBE)
- Update the fakeApi with the new workspace preset structure. Adjust API to use the new type.
- Add an example with using the same preset in two views
- Ensure all stories still work
- Mention in the MR title that this will be a breaking change

When opening MR warn other institutes that master will no longer work with the BE.

The workspace preset should have the following structure:

```json
{
    "id": "screenConfigRadarTemp",
    "title": "Radar and temperature",
    "scope": "system",
    "abstract": "This can contain an abstract",
    "viewType": "multiWindow",
    "views": [
      { "mosaicNodeId": "A", "viewPresetId": "radar" },
      { "mosaicNodeId": "B", "viewPresetId": "radar" },
      { "mosaicNodeId": "C", "viewPresetId": "emptytaf" }
    ],
    "syncGroups": [
      { "id": "Area_RadarTemp", "type": "SYNCGROUPS_TYPE_SETBBOX" },
      { "id": "Time_RadarTemp", "type": "SYNCGROUPS_TYPE_SETTIME" }
    ],
    "mosaicNode": {
      "direction": "row",
      "first": "A",
      "second": {
        "direction": "row",
        "first": "B",
        "second": "C",
        "splitPercentage": 33
      },
      "splitPercentage": 33
    }
  },
```

Story points: 5.0
FE: Save as workspace preset from workspace menu (options)

See user story full description.

A workspace consists of view presets. If a 

Make a selector `getworkspacedata` which returns the data according to the `ScreenmanagerPresetFromBE` type and contains the following information:
- See exact structure in https://gitlab.com/opengeoweb/opengeoweb/-/issues/3560
- Use emptyMapView as empty preset to indicate a empty map view
- Enable the save as option in the menu.
- Use the action `toggleWorkspaceDialog` as used in `WorkSpacePresetFormDialog` in `WorkspaceTabConnect`. Then the snackbar onSucces should automatically work, ensure onSucces is adjusted so it loads the new workspace and updates the url (ideas: 1; pass origin, or 2; create a new onSucces method).
- If you press saveas then it should use the new id and new url (should be automatic).

Story points: 5.0
FE: list item icon has the wrong color when li is selected in light theme

1. the list item icon should have the same color as the text when selected


Probably you can do this by fixing it inside theme utils, if you have the `MuiListItem` item, you can add a selector to overwrite the button style (only for active, maybe something like `.Mui-Selected .MuiIcon`)


![image](/uploads/2026e791ad642c7e4a48fe52ab65f03a/image.png)

Story points: 2.0