Skip to content

v1.0.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Apr 21:07
· 1486 commits to develop since this release
8fcbe38

1.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 releaseDate by 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 NbInfiniteListDirective to the marketplace template.
  • Implement loadMore logic in the component to fetch subsequent pages.
  • Introduce a reset action 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 hasNext calculation for infinite scroll in both marketplace
    and version history components for clarity and efficiency.
  • Prevent loadMore in version history from triggering prematurely
    before initial data is loaded.
  • Add missing NbListModule import.
  • 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 for manifest.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 AuthConnectionGuard checking serverConnection and userId.
  • Added the guard to /auth, /time-tracker, and the default route.
  • Provided default configuration for the guard's redirect behavior.
  • Refactored ServerConnectionService for improved reliability,
    error handling, and async/await usage.
  • Updated AuthGuard and NoAuthGuard to set connection status to 0
    if authentication checks fail due to connection issues.
  • Refined server check logic on ServerDownPage to navigate away once
    connection or session is restored.
  • Standardized initial serverConnection state 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

  • [Feat] Implement plugin registry module by @adkif in #8893

Full Changelog: v0.625.2...v1.0.0