2) Fixed an issue where the User Management and Change Password dialogs were hidden when selecting a menu while a workspace other than 'Default' was active. #8418
3) Revert the change of OS from Ubuntu 22.04 to 24.04 for github action failure.
Fixed an issue in ERD where link notation end-points were not rendering occasionally.
---------
Co-authored-by: Aditya Toshniwal <aditya.toshniwal@enterprisedb.com>
This changes the query that fetches roles from using the
pg_catalog.shobj_description function to using an explicit join on
pg_catalog.pg_shdescription. In my specific case, in a production system with
over 20k roles, this reduces the query time down from 8 minutes(!) down to
~40ms. Just in case it was a locking issue, I did use pg_activity to
investigate locks, and nothing was being blocked during the 8 minutes.
This fixes a problem that exists only for certain users, and specifically in my
case where the user that runs the query is themselves a member (directly and
indirectly) of a high number of roles. Running the existing query as a user
that has a low number of roles (and specifically, the master user in an AWS RDS
database), the existing query is fairly performant.
My best explanation as to the performance difference comes from the definition
of shobj_description
2a8a00674e/src/backend/catalog/system_functions.sql (L303-L312).
Each time it's called it runs a query against pg_shdescription and pg_class,
and so in my case runs 20k times, compared to the equivalent of once when doing
the explicit join on pg_shdescription. It should also be noted that in my case
pg_class is quite big - currently about 500k rows (although it has grown to ~5
million in the past, but that was borderline a mistake).
See https://github.com/pgadmin-org/pgadmin4/pull/8457#issue-2853052114 for
EXPLAIN ANALYZE results of the existing query and the updated query.
1. Do not use the Array index in keys
2. Visible, non-interactive elements with click handlers must have at least one keyboard listener.
3. Add replacement fields or use a normal string instead of an f-string.
4. Add a parameter to the parent lambda function
Introduces a GLOBALLY_DELIVERABLE variable so that it can be passed to the email validator library
and ultimately allowing the email admin@localhost to be valid, as long as False is passed in.
Also:
* Adjusted the indentation of a command above it in the entrypoint.sh
* Added printing out the output of the validation library so that we can better find what the actual issue is
2) Fixed an issue where a single row is copied first and then clicked on "Select All", the previously copied row's highlight color changes.
3) Fixed an issue where non-shared servers are visible in the Existing Servers list on the Welcome page and New Connection dialog.
2) Fixed an issue where the SSH Tunnel password was not being saved in the External Database if its encoded length exceeded 64 characters.
3) 'Save Password' check box should be hidden for SSH Tunnel password on the Welcome page.
1) Unable to add ad-hoc server with External Database.
2) Server list not updating when password is saved on the Welcome page.
3) Icons for Query Tool and PSQL missing on the Welcome page.
4) Error when removing connection parameters.
1. On the welcome page, the Password should be cleared when the user/db is changed.
2. Added a spinner when we tried to connect to the existing remote server.
3. Details should be cleared when we select the existing server but cancel when it asks for the password.
4) Return from the chageWorkspace function if clicking on the same workspace button multiple times.
* Fixed issues reported in #7954
- Search wasn't working as we were using the wrong row-index, while
rendering it.
- Fixed the CSS issue with the alignment of the search input box.
- Pass the row object while rendering the 'DataRow' component, to
improve the performance as it repeatedly calls the filtering function for each row.
- Changed the order of the validators on a field to prioritize the
'empty' string validator over the unique-id validator in a
collection.
- Use 'row.index' instead of rowId, while rendering a grid row
* Updated the columns for the unique and primary keys while creating a table.
Use the 'editable' option for a Cell instead of 'disabled'.
* Don't need to define the hidden member as fields in GridHeaderSchema
* Updated the columns for the exclusion constraints while creating a
table.
* Signaled the relevant field, when column options have changed, for all
the children of a table.
* Use current snapshot of data for the GrigFormHeadeer
* Fixed the styling for the search input box
* Don't check for the 'colOptions.editable' flag, as it could be
indirect call as well.
* Fix an issue - when the object browser tree is being recreated due to reloading for changes in some of the preferences. Tree object returns object from the previous instance as 'selected', but - it does not have the 'treeNodeInfo' available. In this special case - we would consider that there is no node selected at that particular moment, and pass information accordingly.
* Fixed 'New Connection' dialog issue after connecting a disconnected server.
* Disable the 'Add' button in the GridHeader with form, when 'canAdd'
flag is set to false.
* Convert the access path to string array for correct comparision.
* Check the access path type before comparison.
When language is 'c', set the 'code' block read-only.
* Enabled 'Strict' control for EPAS >= 95
* Introduced a 'exclude' option in the 'Field' to exclude it from the
change completely. Use the option 'exclude' to add field
'notNullColumns', which will be excluded from the data, but - can be
used to force rerender the 'Not Null Columns' select control on
change of it.
* Fixed the linter issue
* Rerender the cell as well, when dependent changes values. (#7884)
* Listen for the depenent changes even for the non-visible controls
* Use 'useRef' on every rendering to avoid the React 'Something wrong' page
* Introduced a 'exclude' option in the 'Field' to exclude it from the
change completely. Use the option 'exclude' to add field
'notNullColumns', which will be excluded from the data, but - can be
used to force rerender the 'Not Null Columns' select control on
change of it.
* Fixed the linter issue
* Show the icon for the 'Reset' button. (Reference #7884)
* Reload the server list after connecting to a server in the 'New
connection' dialog (QueryTool). (Reference: #7884)
* Pass the grid path during the bulk update (click on a radio action)
* Don't assign the cell value to the 'rowValue' variable.
* Don't rely on the 'optionsLoaded' for setting the variable types as it
is loaded asynchronously, and variable types data may not be available
while rendering the 'value' cell. (Fixes#7884)
* Fixed a type while checking for the 'inline-group'. fixes (#7884)
* 'vnameOptions' can be a Promise function too, hence - taken care accrodingly.
* Introduced a parameter 'reloadOnDepChanges' in the BaseSchemaUI field
to force reload the control on value change for one of the
dependencies.
* Reload on the components in case of dependent value changes.
* Introduced 'useSchemaStateSubscriber', which generates a state
subscriber mananager instance. It helps multiple subscribers in a
single control as we could have multiple subscribe within a control.
(For example - value, options, errors, etc).
* Fixed all the issues reported (#7884)
* Show the icon for the 'Reset' button. (Reference #7884)
* Reload the server list after connecting to a server in the 'New
connection' dialog (QueryTool). (Reference: #7884)
* Pass the grid path during the bulk update (click on a radio action)
* Don't assign the cell value to the 'rowValue' variable.
Restructured these modules for ease of maintenance and apply the single
responsibility principle (wherever applicable).
* SchemaView
- Split the code based on the functionality and responsibility.
- Introduced a new View 'InlineView' instead of using the
'nextInline' configuration of the fields to have a better, and
manageable view.
- Using the separate class 'SchemaState' for managing the data and
states of the SchemaView (separated from the 'useSchemaState'
custom hook).
- Introduced three new custom hooks 'useFieldValue',
'useFieldOptions', 'useFieldError' for the individual control to
use for each Schema Field.
- Don't pass value as the parameter props, and let the
'useFieldValue' and other custom hooks to decide, whether to
rerender the control itself or the whole dialog/view. (single
responsibility principle)
- Introduced a new data store with a subscription facility.
- Moving the field metadata (option) evaluation to a separate place
for better management, and each option can be defined for a
particular kind of field (for example - collection, row, cell,
general, etc).
- Allow to provide custom control for all kind of Schema field.
* DataGridView
- Same as SchemaView, split the DataGridView call into smaller,
manageable chunks. (For example - grid, row, mappedCell, etc).
- Use context based approach for providing the row and table data
instead of passing them as parameters to every component
separately.
- Have a facility to extend this feature separately in future.
(for example - selectable cell, column grouping, etc.)
- Separated the features like deletable, editable, reorder,
expandable etc. cells using the above feature support.
- Added ability to provide the CustomHeader, and CustomRow through the
Schema field, which will extend the ability to customize better.
- Removed the 'DataGridViewWithHeaderForm' as it has been achieved
through providing 'CustomHeader', and also introduced
'DataGridFormHeader' (a custom header) to achieve the same feature
as 'DataGridViewWithHeaderForm'.
The new implementation will store the master password in the keyring instead of storing each and every server password separately. The master password will be used to encrypt/decrypt server password when storing in the pgAdmin config DB.