v1.0.0
Pre-release1.0.0 (2025-04-07)
⚠ BREAKING CHANGES
-
Deleting the last remaining version of a plugin is no
longer permitted and will result in a 403 Forbidden error. -
fix(plugin-registry): throw error for missing Gauzy plugin file key
Previously, creating a plugin with source type 'GAUZY' without
providing a file resulted in a console warning and an undefined
return value.
This change replaces the warning with a BadRequestException to
ensure the client receives an appropriate HTTP 400 error response
when the file key is missing.
-
Creating a plugin with source type 'GAUZY' without a
file now returns a 400 Bad Request instead of potentially succeeding
with a warning. -
fix(plugin): fix issues in plugin creation and upload
- Corrects the handling of
releaseDateby using ISO string format
before sending to the backend and standardizes max date selection
in UI using NbDateService. - Fixes the incorrect step order (Source/Version) in the plugin
upload stepper component. - Resolves an error where the uploaded file was not correctly
extracted from the form data structure. - Adds error handling to plugin upload and version creation requests.
- refactor(plugin-marketplace): reuse deletion timestamp when updating plugin version state
Generate the deletion timestamp once before updating the plugin version
store state.
This ensures the exact same timestamp is used for both the single
version view and the list view update, promoting consistency and
slightly improving code clarity by avoiding redundant new Date() calls.
- feat(plugin-marketplace): add infinite scrolling
Implement infinite scrolling for the plugin marketplace list.
This improves performance and user experience by loading plugins
in batches as the user scrolls down, instead of loading all
plugins at once.
- Add
NbInfiniteListDirectiveto the marketplace template. - Implement
loadMorelogic in the component to fetch subsequent pages. - Introduce a
resetaction and effect to clear the plugin list from
the store when the component is destroyed, ensuring a fresh load
on revisit.
- feat(plugin-marketplace): add infinite scroll to plugin version history
Implements infinite scrolling for the plugin version history list within
the marketplace item view. This improves performance and user
experience when viewing plugins with numerous versions.
Also refactors plugin ID management in the parent component to utilize
the state store consistently.
- fix(plugin-marketplace): remove reset action dispatch on destroy
Removes the dispatch of the PluginMarketplaceActions.reset() action
within the ngOnDestroy lifecycle hook. This prevents the plugin
marketplace state from being automatically cleared when the
component instance is destroyed.
- refactor(plugins/routing): organize plugin routes into child modules
Extract routes for installed plugins and the marketplace into separate
lazy-loaded routing modules (plugin-installed-routing.module.ts and
plugin-marketplace-routing.module.ts). This improves code organization
and separation of concerns within the plugin settings feature.
Also includes fixes for pagination logic (skip initialization corrected
to 1) and ensures state reset actions (PluginVersionActions.reset,
PluginMarketplaceActions.reset) are dispatched on component destroy
for related components.
- refactor(plugins-state): make plugin action identifiers more specific
Update the descriptive type strings for NgRx/Effects actions related to
plugins. Replace the generic [Plugin] prefix with more specific
domains:
[Plugin Installed][Plugin Installation][Plugin Marketplace][Plugin Version]
This improves clarity and aids debugging by providing better context for
actions, especially in state management developer tools.
- fix(plugin-marketplace): load plugins on component initialization
Call the load method during ngOnInit to ensure the plugin list is
fetched when the component is displayed.
Additionally, remove the 'versions' relation and its specific ordering
from the data retrieval action as it is not required for the initial
marketplace view. This simplifies the query.
- fix(plugin-marketplace): correct plugin state update after install/uninstall
Ensure the plugin's installed status is correctly reflected in both
the main plugin list and the individual plugin state within the
PluginMarketplaceStore after installation or uninstallation.
Previously, the state update logic did not handle cases where the
plugin being acted upon might only exist in the installation state
(e.g., viewed directly) and not in the main marketplace list. This
change uses the PluginInstallationQuery as a fallback to retrieve
plugin details if necessary and updates both plugins array and the
singular plugin state property consistently.
- feat(plugin-marketplace): include relations in plugin fetch
Fetch plugin versions, source, and uploader information alongside the
main plugin data when listing plugins in the marketplace. This optimizes
data loading and enables richer display of plugin details.
- fix(plugins): improve loading state and infinite scroll logic
- Reorder loading indicator display in plugin marketplace and version
history templates to potentially show content sooner if available. - Refactor
hasNextcalculation for infinite scroll in both marketplace
and version history components for clarity and efficiency. - Prevent
loadMorein version history from triggering prematurely
before initial data is loaded. - Add missing
NbListModuleimport.
- fix(plugins): fix plugin upload form state and backend error handling
Mark the plugin upload form in the desktop UI as touched and dirty
when a file is selected. This ensures the form state correctly
reflects user interaction, enabling proper validation and UI updates.
Additionally, improve backend error handling in the plugin version
controller. Throw a BadRequestException instead of logging a warning
when the file key is missing for a GAUZY source type plugin upload.
This provides clearer and more appropriate error feedback.
- refactor(plugin-system): improve structure of plugin download strategies
Break down the monolithic execute methods in both CDN and Local
download strategies into smaller, more focused private methods. This
improves code clarity, maintainability, and testability.
Key changes include:
- Introduce separate methods for validation, directory preparation,
download/file handling, unzipping, manifest processing, and cleanup. - Enhance error handling with more specific messages and dedicated
cleanup logic on failure. - Add explicit validation for URLs (CDN) and selected files (Local).
- Implement streaming download for the CDN strategy to reduce memory usage.
- Improve logic for locating the plugin directory within the unzipped
archive, including searching formanifest.json. - Introduce constants for retry logic and file extensions.
- feat(desktop): enhance server connection detection and feedback
Introduce a dedicated serverConnection state (0 for down, 200 for up)
in the store, updated consistently by the app component and the
server error interceptor upon successful pings or HTTP errors.
Redesign the 'Server Down' page with improved visuals, animations, and
a connecting status indicator. Refactor its connection checking logic
using RxJS interval and switchMap for better reliability and resource
management.
Update the Plugin Marketplace to display an explicit offline message
when the application detects a lost connection.
- feat(i18n): add server down translations
Add translations for messages displayed when the backend server
is unavailable (HTTP 503).
This includes keys for title, description, connecting status,
and a hint with the error code across all supported languages.
- refactor(plugin-marketplace): inject Store service
Inject the global Store service into the PluginMarketplaceComponent.
This makes the application's central store accessible within the
component for potential future use, such as selecting state or
dispatching actions.
- feat(auth): add connection guard to block routes when offline
Introduces the AuthConnectionGuard to prevent navigation to main
application routes when the server connection is unavailable (status 0),
unless the user already has an active session (userId exists in store).
- Created
AuthConnectionGuardcheckingserverConnectionanduserId. - Added the guard to
/auth,/time-tracker, and the default route. - Provided default configuration for the guard's redirect behavior.
- Refactored
ServerConnectionServicefor improved reliability,
error handling, and async/await usage. - Updated
AuthGuardandNoAuthGuardto set connection status to 0
if authentication checks fail due to connection issues. - Refined server check logic on
ServerDownPageto navigate away once
connection or session is restored. - Standardized initial
serverConnectionstate to 0. - Refactored common SCSS styles into
_reusable.scss.
- fix(plugins): refine error message display and IPC property access
Simplify fallback error message construction for plugin uploads.
Remove unnecessary optional chaining for Electron IPC message properties (message, data).
Includes minor import order adjustment.
- style(desktop-ui-lib): organize imports and remove unused code
Remove unused imports (HttpErrorResponse, Http2ServerResponse, throwError)
from the plugin service.
Alphabetize RxJS imports in the server-down page for consistency and
remove an unused RxJS operator import (take).
- refactor(auth): use format specifiers for console logs
Update console.warn and console.error calls in AuthConnectionGuard
to utilize format specifiers (%s) rather than string concatenation.
This improves the readability and consistency of log output,
potentially aiding debugging and integration with logging tools
that parse format strings.
- fix(plugin-installation): reset toggle state on installation error
When a plugin installation fails, the associated UI toggle element
was not being reset to its previous state. This could leave the
toggle in an active state despite the failed operation.
This commit modifies the installation error handler to explicitly
read the current toggle state via a new query getter and then
updates the store with the inverted state, effectively resetting
the toggle visually upon failure.
- fix(plugins): fix version selection in plugin marketplace item
Add a compareWith function to the version select dropdown in the
plugin marketplace item component.
This ensures that the correct version is highlighted in the dropdown,
as Angular needs guidance on how to compare the IPluginVersion objects
(by ID) rather than by object reference.
- fix(plugin-marketplace): ensure correct plugin version selection and state update
Update the plugin marketplace store immediately after a new version is
created to include the new version in the plugin details.
Prevent the marketplace item component from automatically selecting the
latest version if a version is already selected, preserving the current
selection state.
- refactor(plugin-marketplace): extract version selector component
Extract the plugin version selection logic from PluginMarketplaceItemComponent
into a new dedicated VersionSelectorComponent.
This new component utilizes the gauzy-select component instead of
nb-select and introduces infinite scrolling for loading plugin versions.
Adjusted the PluginVersionEffects to correctly update the version list
in the store when creating or updating versions. The state update now
modifies the existing version in the list if found, or prepends it
otherwise, improving consistency.
Additionally, the VersionHistoryComponent now fetches deleted versions.
- feat(plugin-marketplace): add skeleton loaders and defer loading for plugins
Implement skeleton placeholders for the plugin list and version history
using Angular's @defer block with @placeholder. This improves the
user experience by showing a structured loading state instead of a
blank area or simple text message while data is being fetched.
The isLoading condition is refined to only show the main loading
indicator before the initial data arrives. Deferred loading
(@defer on viewport) is used for the lists to potentially improve
initial render performance.
The plugin upload button is also deferred (@defer on idle) and
disabled when the application is offline.
- chore(plugin-marketplace): remove console warning for missing local installation
Remove the console warning that appears when a plugin is not found
locally during the marketplace check. This warning is redundant as it
represents an expected state (plugin not installed) rather than an
actual problem.
- style(plugin-list): update uninstall icon
Replace 'trash-2-outline' icon with 'slash-outline' for the plugin uninstall button.
- fix(plugin-registry): update enum types and version index for db compatibility
Update ORM entity definitions to use 'simple-enum' instead of 'enum'
for better cross-database compatibility and simpler management.
Add default values to several enum columns for consistency.
Adjust the unique index definition on the PluginVersion entity to
correctly handle differences between MySQL and other database systems
regarding unique constraints involving tenant/organization IDs.
- feat(plugin-registry): add plugin registry database tables
Introduce a new TypeORM migration to establish the database schema
for the plugin registry feature.
This migration creates the following tables:
- plugin: Stores core plugin metadata.
- plugin_source: Details the source location (CDN, NPM, Gauzy) and
storage details for plugin assets. - plugin_version: Manages different versions of each plugin,
including changelogs and checksums. - plugin_installation: Tracks the installation status of plugins
within tenants/organizations.
The migration includes specific implementations for PostgreSQL,
SQLite, and MySQL databases.
- perf(plugin-registry): eagerly load version source
Join the 'source' relation when querying for all plugin versions
within the PluginSubscriber.
This avoids potential N+1 query issues when accessing the source
information for each version later in the process, improving
database query performance.
- feat(plugin-marketplace): select version on detail open and fix count
Dispatch the PluginVersionActions.selectVersion action when navigating
to the plugin detail page. This ensures the correct version context is
set for subsequent operations.
Fixes an issue where the total plugin count in the marketplace state
was not incremented after a successful plugin upload.
Also refactors the plugin getter in PluginMarketplaceItemComponent
to be private.
- feat(plugins): add plugin-registry dependency
Add the @gauzy/plugin-registry package as a dependency to the desktop,
server-api, and server applications. This prepares the applications
for dynamic plugin loading and management capabilities.
Add the @gauzy/plugin-videos dependency to the server-api and server
applications to incorporate video-related features.
Update productName and description in apps/server/package.json for
consistency.
- fix(plugins): remove success toast from upload/version dialogs
The plugin upload and create version dialogs were showing a success
message immediately upon form submission, before the parent component
confirmed the success of the actual operation.
This removes the premature success toasts. The responsibility for
notifying the user of success now lies with the component that handles
the dialog result.
What's Changed
Full Changelog: v0.625.2...v1.0.0