GGCE Server issueshttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues2024-03-28T11:53:04+01:00https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/476Error handling for Genesys upload2024-03-28T11:53:04+01:00Matija ObrezaError handling for Genesys uploadWhen uploading passport data to Genesys the code now stops the upload when there are more then 10 errors reported by Genesys API.
```java
// If more than 10 errors, stop uploading, report error
if (opErrors.size() > 10) {
```
If there ...When uploading passport data to Genesys the code now stops the upload when there are more then 10 errors reported by Genesys API.
```java
// If more than 10 errors, stop uploading, report error
if (opErrors.size() > 10) {
```
If there are less than 10 errors then those errors are not reported to the client, giving the impression that upload was successful. The code should still stop the upload at 10 errors, but it should collect error messages reported by Genesys API and make them available to the client as part of `UploadState.errors`:
```java
@Data
class UploadState
...
/** Errors reported by Genesys API */
private Map<AccessionInfo, String> errors;
```
## UI update
The upload progress dialog should include display of the number of errors found (in red) and display the error table linking to accessions:
|Accession|Error|
|--|--|
|[TMe-419](https://demo.ggce.genesys-pgr.org)|*Error message here...*|2024.2Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/475Workflow support2024-03-27T11:38:02+01:00Matija ObrezaWorkflow supportA **workflow** in GGCE is designed on top of `...Actions` and GGCE automatically schedules the next action(s) in the workflow when an action of the workflow is completed (not canceled as described in #474).
A workflow operates on **one ...A **workflow** in GGCE is designed on top of `...Actions` and GGCE automatically schedules the next action(s) in the workflow when an action of the workflow is completed (not canceled as described in #474).
A workflow operates on **one type** of `AbstractAction` declared in `actionType` (e.g. `org.gringlobal.model.InventoryAction`):
```java
class Workflow extends CoooperatorOwnedModel {
/** Is this workflow active? */
@Column(name = "is_active", nullable = false)
@Pattern("^Y|N$")
private String isActive;
/** Unique workflow code/key */
@Column(length = 100, unique = true, nullable = false, modifiable = false)
public String code;
/** Contains the class name of target actions. For example "org.gringlobal.model.InventoryAction" **/
@Column(name = "action_type", length = 100, nullable = false, modifiable = false)
public String actionType;
```
A workflow is composed of a number of **workflow steps** and a step is defined as:
```java
class WorkflowStep extends CoooperatorOwnedModel {
@ManyToOne
private Workflow workflow;
}
/**
* Every workflow needs to have exactly one start step.
*/
class WorkflowStartStep extends WorkflowStep {
}
/**
* Every workflow needs to have at least one end step.
*/
class WorkflowEndStep extends WorkflowStep {
}
/**
* {@code ActionStep} schedules a follow-up action when some action in this workflow is completed (not canceled).
*/
class ActionStep extends WorkflowStep {
/** The action to be scheduled in this workflow step. */
@Column(nullable = false, modifiable = false)
private String actionNameCode;
/** The assignee of the action scheduled in this workflow step. */
@Column(nullable = true, modifiable = false)
private AclSid actionAssignee;
}
```
The flow between workflow steps is defined as a `List<WorkflowTransition> transitions`:
```
/**
* A directional link between two workflow steps.
*/
class WorkflowTransition {
/** Source step in workflow */
@ManyToOne(optional = false)
@JoinColumn(updatable = false)
private WorkflowStep origin;
/** Target step in the same workflow */
@ManyToOne(optional = false)
@JoinColumn(updatable = false)
private WorkflowStep target;
}
```
All workflow steps must appear at least once as an **origin** and a **target**, except `WorkflowStartStep` which has no `origin` and `WorkflowEndStep` with no `target`.
## Updating workflows
- New steps can always be added to a workflow.
- A workflow can be removed if there are no `workflowStepId` foreign key constraint problems
- We should have a way to "disconnect selected actions from a workflow" somewhere in the UI
## Running the workflows
To initiate the workflow we find its `WorkflowStartStep` and find the relevant list of transitions.targets to "execute". For `ActionStep` we schedule a new action with `actionStep.actionNameCode` (add it to the database). All newly scheduled actions have `assignee = nextActionAsignee`.
We need to keep track of which workflow step registered the action. This requires that we add `private WorkflowStep workflowStep` to `AbstractAction`. This allows us to find all actions associated with this workflow or any specific workflow step.
When any action is completed (with `isDone = 'Y'`) anywhere in GGCE we inspect if has a `workflowStep` then look for the next `WorkflowStep`s in the corresponding workflow where `transitions.origin == action.workflowStep` and "execute" them (e.g. adding the next action). If `isDone != 'Y'` then nothing happens and that branch of the workflow ends.
To run workflows we should inject the handling logic somewhere where we have access to both previous `target` and `updated` action data so we can check if there was a change in the data. This could be an aspect on `BaseActionSupport#update` and `BaseActionSupport#updateFast`, ~~or perhaps on `Firehose` (no, it doesn't have access to previous state)~~.2024.4Vladyslava MokliakVladyslava Mokliakhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/474Canceling actions2024-03-27T11:37:58+01:00Matija ObrezaCanceling actionsActions in GGCE can be scheduled/pending, started or completed. We need a mechanism that allows users to **cancel an action** regardless of its state (instead of deleting it from the database).
A **canceled action** is an action that wa...Actions in GGCE can be scheduled/pending, started or completed. We need a mechanism that allows users to **cancel an action** regardless of its state (instead of deleting it from the database).
A **canceled action** is an action that was started, but could not be executed for some reason (recorded in `action.note`). Or it was scheduled, never started and will never start for some other reason. Canceled actions are completed in the sense that they don't need to be performed.
The implementation for **canceling an action** is the same as the one for completing an action: the `completedDate` is set but we need a way to express that the action was not "done". `isDone` is a new property of `AbstractAction`:
```java
@Column(name = "is_done", nullable = true, length = 1)
@Pattern("^Y|N") // ?
protected String isDone;
```
- `isDone == null` means the action is still scheduled or in progress,
- `isDone == 'Y'` means that the action was completed, while
- `isDone == 'N'` means that the action was canceled.
## Changes
Listing completed actions must exclude those where `isDone == 'N'`. All completed actions that are already in the database must have their `isDone` set to `Y` in liquibase, since they are all completed.
We need a new API endpoint to list canceled actions `where completedDate.isNotNull().and(isDone.eq("N"))` so that we can display them in the UI.
## UI
- Add a new tab for **Canceled** actions.
- Include field in action forms.
- If we have "complete selected actions" button, then we should also have "cancel selected actions" button.2024.4Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/473Assigning actions2024-03-22T01:21:59+01:00Matija ObrezaAssigning actionsThis ticket adds support for assigning `...Action` to a specific user (`SysUser`), user group (`SysGroup`) or any other SID for that matter.
```java
public abstract class AbstractAction ... {
@ManyToOne
@JoinColumn(nullable = true, .....This ticket adds support for assigning `...Action` to a specific user (`SysUser`), user group (`SysGroup`) or any other SID for that matter.
```java
public abstract class AbstractAction ... {
@ManyToOne
@JoinColumn(nullable = true, ...)
private AclSid assignee;
...
}
```
`ActionFilter` should allow for filtering by `assignee`.
## UI
Include **Assignee** in all action tables, forms and search filters. Filtering uses the same approach as `modifiedBy`:
![image](/uploads/779c8cbf517a5b03279479b9cfe5a497/image.png)
Add support to select multiple actions and "Assign selected actions" to some `SysUser` or `SysGroup`.2024.4Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/472Custom subscriber list for scheduled notifications2024-03-27T06:34:45+01:00Matija ObrezaCustom subscriber list for scheduled notificationsThis ticket adds support for **user-defined subscriptions** to scheduled notifications. Instead of using a building the list of recipients in code as described in https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/468#n...This ticket adds support for **user-defined subscriptions** to scheduled notifications. Instead of using a building the list of recipients in code as described in https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/468#notification-recipients, we allow the *Administrator* to define a list of subscribers for each `NotificationSchedule` record separately:
```java
class NotificationSchedule ... {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "notificationSchedule")
private List<NotificationScheduleSubscriber> subscribers = new ArrayList<NotificationScheduleSubscriber>();
}
@Table(name = "notification_schedule_subscriber")
public static class NotificationScheduleSubscriber {
@ManyToOne
NotificationSchedule notificationSchedule;
@ManyToOne(fetch = FetchType.EAGER)
AclSid sid;
}
```
## Executing scheduled tasks
Instead of calling the `notificationSchedule.generator` method directly in the Spring scheduler, we want to call a wrapper method `NotificationScheduleServiceImpl.executeScheduledTask(long notificationScheduleId)` instead. This method then:
1. Loads the `NotificationSchedule`
2. Generates the list of `SysUser` subscribers from `notificationSchedule.subscribers` by merging subscribed user groups and subscribed users, and keeping only active users.
3. If the subscribe list is empty, skips execution.
4. Calls the `notificationSchedule.generator` method with argument `List<SysUser> recipients`.
## UI
In GGCE Web *Admin tools* in **Scheduler** the Adminstrator is able to manage the `subscribers` for each `NotificationSchedule` record.2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/471Action notifications2024-03-15T10:24:40+01:00Matija ObrezaAction notificationsThis ticket adds new notification generators `org.gringlobal.notification.AccessionActionNotifications`, `org.gringlobal.notification.InventoryActionNotifications` and `org.gringlobal.notification.OrderRequestNotifications` that send the...This ticket adds new notification generators `org.gringlobal.notification.AccessionActionNotifications`, `org.gringlobal.notification.InventoryActionNotifications` and `org.gringlobal.notification.OrderRequestNotifications` that send the relevant action schedules to the subscribers. The scheduling is described in #470 and subscriber list in #472.
`AccessionActionNotifications` will use `accession-schedule.mustache` template and look like:
```java
@ScheduledNotification(value = "sendWeeklyAccessionSchedule")
@Transactional(readOnly = true)
public void generateWeeklyAccessionSchedule() {
// Load AccessionActions for next 7 days (from today at 00:00 - to today+8days at 00:00)
// Use accession-schedule.mustache to generate the body
}
@ScheduledNotification(value = "sendMonthlyAccessionSchedule")
@Transactional(readOnly = true)
public void generateMonthlyAccessionSchedule() {
// Load AccessionActions for this month (from 1st of this month at 00:00 - to 1st of next month at 00:00)
// Use accession-schedule.mustache to generate the body
}
```
The default templates should generate a table of actions similar to that in the UI:
> ## Accession action schedule {{fromInstant}} to {{toInstant}}
>
> View it in GGCE +Link to GGCE UI
>
> ![image](/uploads/c1474b01658b5580bf2adf17e5283458/image.png)
>
Template customization follows the logic in #4692024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/470Custom schedule of email notifications2024-03-28T12:07:03+01:00Matija ObrezaCustom schedule of email notificationsThis ticket adds support for **user-defined schedule** for running `KPINotifications`. Instead of fixed `@Scheduled` on the method in code, we allow the *Administrator* to define a custom schedule.
The custom schedule is stored in `@Tab...This ticket adds support for **user-defined schedule** for running `KPINotifications`. Instead of fixed `@Scheduled` on the method in code, we allow the *Administrator* to define a custom schedule.
The custom schedule is stored in `@Table("notification_schedule") public class NotificationSchedule extends VersionedModel` entity. It's properties include:
- the cron expression `String cron`
- the bean `String generator` and the method in the bean execute `String method`
- The combination of `cron + generator + method` forms a unique constraint
GGCE will inspect this table on startup and add `active = true` entries to its Spring scheduler.
On any change to `NotificationSchedule` the Spring scheduler will be updated, removing the task when deleted or `active = false`, and adjusting the `cron` if `active = true`. This can be done in the `update/create` methods in the `NotificationScheduleServiceImpl`.
The API controller is at */api/v2/admin/schedule* and follows `FilteredCRUDService2Impl` (with DTO, etc).
The API needs to be able to inform the UI which methods are available for scheduling. A new annotation `@ScheduledNotification` is added to `KPINotifications` and this annotation determines which methods can be included in the custom schedule.
```java
@ScheduledNotification(value = "sendAllKPIs")
@Transactional(readOnly = true)
public void generateLastKPIExecutions() {
for (var execution : executionRepository.listActiveExecutions()) {
notifyLastKPIExecution(execution.getName())
}
}
```
We convert from `@Scheduled` to a new `NotificationSchedule` record in `ApplicationStartup` using a programmable liquibase change.
## UI
In GGCE Web *Admin tools* a new section (menu) **Scheduler** is added. It allows the Adminstrator to manage `NotificationSchedule` records.
Multiple schedules can exist for the same `@ScheduledNotification`: for example one that runs on Mondays, and one on Fridays.2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/469Customizable KPI notification template2024-03-27T15:10:53+01:00Matija ObrezaCustomizable KPI notification templateAfter #468 we wish to support **template customization**.
Templates are stored in `AppResources`. `ApplicationStartup` should add `kpi-execution-template.mustache` as one of dynamic liquibase changesets. Then we can load it with:
```ja...After #468 we wish to support **template customization**.
Templates are stored in `AppResources`. `ApplicationStartup` should add `kpi-execution-template.mustache` as one of dynamic liquibase changesets. Then we can load it with:
```java
var template = appResourceService.getResource(AppResourceService.APP_NAME_GG_CE, "kpi.execution.template", Locale.getDefault());
if (template == null) { // Use resource
```2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/468Send KPI execution results on a schedule2024-03-27T14:25:41+01:00Matija ObrezaSend KPI execution results on a scheduleWe would like to send the latest KPI execution results by email to all `SysUsers` that have `READ` permission on that `Execution`.
The schedule is fixed and runs every Sunday at 12:00 UTC.
## Implementation
Add a new class `org.gringl...We would like to send the latest KPI execution results by email to all `SysUsers` that have `READ` permission on that `Execution`.
The schedule is fixed and runs every Sunday at 12:00 UTC.
## Implementation
Add a new class `org.gringlobal.notification.KPINotifications` with:
```java
@Scheduled(...)
@Transactional(readOnly = true)
public void generateLastKPIExecutions() {
for (var execution : executionRepository.listActiveExecutions()) {
notifyLastKPIExecution(execution.getName())
}
}
@Transactional(readOnly = true)
public void notifyLastKPIExecution(String executionName) {
var execution = executionService.load...
var sysUserRecipients = makeRecipientList(execution)
if (sysUserRecipients.isEmpty()) return;
// TODO load last run and generate the message body
// TODO send emails to sysUserRecipients using EmailService
}
```
## Notification recipients
The list of active `SysUsers` that will receive the email is based on all SIDs that have `READ` permission on the execution. When SID is an active `SysGroup` then active members of that group (`SysUsers[active=true]`) are added to the list. OAuth clients and web users are ignored.
## Notification message
The title of the message is the name of the execution.
The body of the message is generated by loading the last execution run and passing it through `TemplateService` to generate the message. The default template `kpi-execution-template.mustache` is bundled with server code in `src/main/resources/notifications`.
The default template should generate a body similar to how the execution run is displayed in the UI:
> ## KPI {{execution.name}} run {{executionRun.timestamp}}
>
> | genus | COUNT |
> |-------------|-------|
> | Aa | 33 |
> | Abarema | 26 |
> | Abelmoschus | |
> ...
> | Total | {{executionRun.total}} |
>
> View it in GGCE +Link to GGCE UI for this execution2024.3Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/467Handling of partial dates for DOI registration2024-03-13T19:32:29+01:00Matija ObrezaHandling of partial dates for DOI registrationDOI registration uses `yyyy-MM-dd` format and supports partial dates `yyyy-MM` and `yyyy`.
Code in `GlisDOIRegistrationManager#convertMcpdDateToRequest` is unable to handle partial MCPD dates like `2023----`, `20230000`, `202403--` or `...DOI registration uses `yyyy-MM-dd` format and supports partial dates `yyyy-MM` and `yyyy`.
Code in `GlisDOIRegistrationManager#convertMcpdDateToRequest` is unable to handle partial MCPD dates like `2023----`, `20230000`, `202403--` or `20240300` (`00` and `--` are interchangeable in MCPD but GGCE only uses `--`) and is unable to translate them to DOI registration format.2024.2Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/466Unable to download folders in repository2024-03-07T03:52:08+01:00Antonio RiveraUnable to download folders in repositoryWe are trying to download a while folder from the repository but it crases after a while.
![image](/uploads/d3bdafbbb9912e3c92e35577d82f4682/image.png)
![image](/uploads/585947016895991ded3c68e07110a077/image.png)
![image](/uploads/c5...We are trying to download a while folder from the repository but it crases after a while.
![image](/uploads/d3bdafbbb9912e3c92e35577d82f4682/image.png)
![image](/uploads/585947016895991ded3c68e07110a077/image.png)
![image](/uploads/c54f167db3b4cc173f177914b2f04e45/image.png)
This error only happens with root, first and second level. So I think it could be due to the folder size.
![image](/uploads/3cf9673767850ee117de00a620a218c8/image.png)
![image](/uploads/f200287c830e2e1384bd7291ea2b99e5/image.png)
![image](/uploads/7370ae1553ac773585a3f81846d4b30b/image.png)2024.2Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/465Slow performance in inventory_viability_data dataview2024-03-14T20:00:02+01:00Antonio RiveraSlow performance in inventory_viability_data dataviewSince we upgrade to the 2024.1.2 versión the server performance for the _inventory_viability_data_ dataview
We send request that has a length of only 13, 000 records. The request lasted 2 hours before ending
![image.png](/uploads/efb8...Since we upgrade to the 2024.1.2 versión the server performance for the _inventory_viability_data_ dataview
We send request that has a length of only 13, 000 records. The request lasted 2 hours before ending
![image.png](/uploads/efb85ecccfffdc814e0802ff5ad015bf/image.png)
We check the server memory. It looks fine.
![image.png](/uploads/9d7059045513de0ad48da0dff9d4a266/image.png)Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/464DOI is not matching in Genesys2024-03-07T09:14:13+01:00Antonio RiveraDOI is not matching in GenesysGiven the accession BW 56873 we have data inconsistency after submit it to GLIS.
![image.png](/uploads/da1e138971a5ad0721acd5e963b8afc9/image.png)
The DOI matches with GLIS site
![image.png](/uploads/861433a2dfd43172ee293e42bcd972a6/i...Given the accession BW 56873 we have data inconsistency after submit it to GLIS.
![image.png](/uploads/da1e138971a5ad0721acd5e963b8afc9/image.png)
The DOI matches with GLIS site
![image.png](/uploads/861433a2dfd43172ee293e42bcd972a6/image.png)
But in Genesys the DOI was not updated
![image.png](/uploads/b8455eeb77d0b72447e4d7e62352baa9/image.png)
![image.png](/uploads/7f05f008722ebd068d7d3dec6672f9b4/image.png)
The problem is that after to submit the data to GLIS, in Genesys the DOI was not updated despite GGCE returns a succeeded message.Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/463Save Data Error on Curator Tool2024-03-13T19:32:29+01:00Antonio RiveraSave Data Error on Curator ToolAfter upgrade to 2024.1 version we have had several errors while trying to save the data in Curator Tool
**Order Items DataView**
![image.png](/uploads/16fe97678090e4bff9fca17b806ffbe7/image.png)
In relation to the order of the above...After upgrade to 2024.1 version we have had several errors while trying to save the data in Curator Tool
**Order Items DataView**
![image.png](/uploads/16fe97678090e4bff9fca17b806ffbe7/image.png)
In relation to the order of the above error, the user reports that in Order of type Phytosanitary testing the order items are not being saved. Is this related to the Session error?
**Order Wizard**
![image.png](/uploads/2c13f50166febc3ec4dfb88fac494490/image.png)
Session error in the crop trait, inventory and accesion dataviews.
![image.png](/uploads/f9f2204bc48c13c1a3f5a71902f26756/image.png)
![image.png](/uploads/88e070523c571a8cacf16a40d6437557/image.png)
In addition, the following window is shown suddenly without any interaction with Curator Tool or Dataview
![image.png](/uploads/6f07de71c5ad39fc2d8c58b7a09285af/image.png)2024.2Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/462Seed moisture content2024-03-14T07:45:54+01:00Matija ObrezaSeed moisture contentAdd to `SeedInventoryExtra` the fields to record the moisture content (MC) of seed and the date when it was measured.
```java
@Min(0) @Max(100)
private Float moistureContent;
private Instant moistureContentDate;
@CodeValue(DATE_FORMAT...Add to `SeedInventoryExtra` the fields to record the moisture content (MC) of seed and the date when it was measured.
```java
@Min(0) @Max(100)
private Float moistureContent;
private Instant moistureContentDate;
@CodeValue(DATE_FORMAT)
private String moistureContentDateCode;
```
These properties should be copied over to any split inventory, similar to how we copy `intialSeedViability`.
In the `InventoryController` we need an extra endpoint `.../moisture-content` to update only the MC fields.
/cc @jarias @jalarcon2024.2Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/460Extend search for similar Cooperators2024-02-19T13:36:57+01:00Matija ObrezaExtend search for similar CooperatorsDocumented in grin-global/grin-global-ui#651, the similarity search for Cooperators needs extending to include more fields in the search.Documented in grin-global/grin-global-ui#651, the similarity search for Cooperators needs extending to include more fields in the search.2024.1Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/459Switch to OpenSearch2024-02-19T10:26:42+01:00Matija ObrezaSwitch to OpenSearchWe are using ES6 which is the last version before ES changed it's licensing model. The open source version was forked into OpenSearch.
In this ticket we replace ES with OS.
I think it makes sense to first upgrade ES libs in our project...We are using ES6 which is the last version before ES changed it's licensing model. The open source version was forked into OpenSearch.
In this ticket we replace ES with OS.
I think it makes sense to first upgrade ES libs in our project to the version mentioned in OS migration guide at https://opensearch.org/docs/latest/upgrade-to/upgrade-to/ and then switch over to OS.
The reason for first upgrading ES and then switching to OpenSearch in stages is that we can also slowly migrate our ES cluster.
We now have some custom code for serializing entities for indexing. That code will eventually be removed and replaced with DTO-style mapping to a distinct type before sending it over to ES/OS.Artem HrybeniukArtem Hrybeniukhttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/458SOAP: CT assigns Cooperator ID to created/owned by fields2024-02-19T15:17:32+01:00Matija ObrezaSOAP: CT assigns Cooperator ID to created/owned by fieldsCT assigns current user's Cooperator ID to `ownedBy` field when a new record is added. But with the upgraded GGCE that checks that references are valid, this now causes a problem.
Also, no error message is returned, the table in CT is s...CT assigns current user's Cooperator ID to `ownedBy` field when a new record is added. But with the upgraded GGCE that checks that references are valid, this now causes a problem.
Also, no error message is returned, the table in CT is simply cleared.
![Foo](/uploads/9aa57ba47075c9e963c47ca8ee282eb7/Foo.m4v)2024.1Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/461Replace input control for the Availability Status Note field2024-02-22T15:27:28+01:00Antonio RiveraReplace input control for the Availability Status Note fieldWe need to replace the input control for the field **Availability Status Code**.
![image](/uploads/c0a7a4c3e9cefed8e626ac41afebaf2c/image.png)
We would like to use a Dropdown control or a typeahead control instead. The data source for ...We need to replace the input control for the field **Availability Status Code**.
![image](/uploads/c0a7a4c3e9cefed8e626ac41afebaf2c/image.png)
We would like to use a Dropdown control or a typeahead control instead. The data source for the Dropdown we need is the Code Values with the group_name = INVENTORY_STATUS_NOTE
![image](/uploads/c801fe4059ab40c417c7d6eb9c637d63/image.png)
![image](/uploads/9515870a53098ef8a571f8bc7701f0cd/image.png)2024.2Matija ObrezaMatija Obrezahttps://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/457Add Inventories By Id2024-01-31T09:04:25+01:00Antonio RiveraAdd Inventories By IdIn order to solve the issue [The server supports a maximum of 21000 parameters](https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/450) we need a tool to add several inventories given their id as suggested in the Propos...In order to solve the issue [The server supports a maximum of 21000 parameters](https://gitlab.croptrust.org/grin-global/grin-global-server/-/issues/450) we need a tool to add several inventories given their id as suggested in the Proposal 0:
![image](/uploads/9a4ff3c889400090ab3093903fbfaed4/image.png)
![image](/uploads/0aa66a4f5f2114191352f2bde6ef19f7/image.png)