Skip to content

Commit

Permalink
VCST-509: optional modules (#728)
Browse files Browse the repository at this point in the history
  • Loading branch information
ksavosteev committed May 10, 2024
1 parent f55012d commit 8895d2e
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 129 deletions.
3 changes: 3 additions & 0 deletions module.keep
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
VirtoCommerce.BulkActionsModule.Core.dll
VirtoCommerce.ExportModule.Core.dll
VirtoCommerce.ExportModule.Data.dll
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="VirtoCommerce.CoreModule.Core" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.ExportModule.Core" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.824.0" />
<PackageReference Include="VirtoCommerce.SearchModule.Core" Version="3.800.0" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql" Version="8.0.1" />
<PackageReference Include="Npgsql" Version="8.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0">
<PrivateAssets>all</PrivateAssets>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="VirtoCommerce.AssetsModule.Core" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.ExportModule.Data" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Data" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Hangfire" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.800.0" />
<PackageReference Include="VirtoCommerce.Platform.Data" Version="3.824.0" />
<PackageReference Include="VirtoCommerce.Platform.Hangfire" Version="3.824.0" />
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.824.0" />
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.800.0" />
</ItemGroup>
<ItemGroup>
Expand Down
103 changes: 58 additions & 45 deletions src/VirtoCommerce.CatalogModule.Web/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,11 @@
using VirtoCommerce.ExportModule.Core.Services;
using VirtoCommerce.ExportModule.Data.Extensions;
using VirtoCommerce.ExportModule.Data.Services;
using VirtoCommerce.Platform.Core.Bus;
using VirtoCommerce.Platform.Core.Common;
using VirtoCommerce.Platform.Core.DynamicProperties;
using VirtoCommerce.Platform.Core.Events;
using VirtoCommerce.Platform.Core.ExportImport;
using VirtoCommerce.Platform.Core.Extensions;
using VirtoCommerce.Platform.Core.Modularity;
using VirtoCommerce.Platform.Core.Security;
using VirtoCommerce.Platform.Core.Settings;
Expand All @@ -57,13 +58,18 @@

namespace VirtoCommerce.CatalogModule.Web
{
public class Module : IModule, IHasConfiguration, IExportSupport, IImportSupport
public class Module : IModule, IHasConfiguration, IExportSupport, IImportSupport, IHasModuleCatalog
{
private IApplicationBuilder _appBuilder;

public ManifestModuleInfo ModuleInfo { get; set; }

public IConfiguration Configuration { get; set; }
public IModuleCatalog ModuleCatalog { get; set; }

// optional modules
private const string BulkActionsModuleId = "VirtoCommerce.BulkActionsModule";
private const string GenericExportModuleId = "VirtoCommerce.Export";

public void Initialize(IServiceCollection serviceCollection)
{
Expand Down Expand Up @@ -238,13 +244,17 @@ public void Initialize(IServiceCollection serviceCollection)

#endregion Add Authorization Policy for GenericExport

#region BulkActions

serviceCollection.AddTransient<ListEntryMover<Category>, CategoryMover>();
serviceCollection.AddTransient<ListEntryMover<CatalogProduct>, ProductMover>();
serviceCollection.AddTransient<IBulkPropertyUpdateManager, BulkPropertyUpdateManager>();
serviceCollection.AddTransient<IDataSourceFactory, DataSourceFactory>();
serviceCollection.AddTransient<IBulkActionFactory, CatalogBulkActionFactory>();

#region BulkActions

if (ModuleCatalog.IsModuleInstalled(BulkActionsModuleId))
{
serviceCollection.AddTransient<IBulkPropertyUpdateManager, BulkPropertyUpdateManager>();
serviceCollection.AddTransient<IDataSourceFactory, DataSourceFactory>();
serviceCollection.AddTransient<IBulkActionFactory, CatalogBulkActionFactory>();
}

#endregion BulkActions

Expand All @@ -271,13 +281,12 @@ public void PostInitialize(IApplicationBuilder appBuilder)
ModuleConstants.Security.Permissions.Delete,
}, new SelectedCatalogScope());

var inProcessBus = appBuilder.ApplicationServices.GetService<IHandlerRegistrar>();
inProcessBus.RegisterHandler<ProductChangedEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<LogChangesChangedEventHandler>().Handle(message));
inProcessBus.RegisterHandler<CategoryChangedEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<LogChangesChangedEventHandler>().Handle(message));
inProcessBus.RegisterHandler<CategoryChangedEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<IndexCategoryChangedEventHandler>().Handle(message));
inProcessBus.RegisterHandler<ProductChangedEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<IndexProductChangedEventHandler>().Handle(message));
inProcessBus.RegisterHandler<ProductChangingEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<VideoOwnerChangingEventHandler>().Handle(message));
inProcessBus.RegisterHandler<CategoryChangedEvent>(async (message, _) => await appBuilder.ApplicationServices.GetService<TrackSpecialChangesEventHandler>().Handle(message));
appBuilder.RegisterEventHandler<ProductChangedEvent, LogChangesChangedEventHandler>();
appBuilder.RegisterEventHandler<CategoryChangedEvent, LogChangesChangedEventHandler>();
appBuilder.RegisterEventHandler<CategoryChangedEvent, IndexCategoryChangedEventHandler>();
appBuilder.RegisterEventHandler<ProductChangedEvent, IndexProductChangedEventHandler>();
appBuilder.RegisterEventHandler<ProductChangingEvent, VideoOwnerChangingEventHandler>();
appBuilder.RegisterEventHandler<CategoryChangedEvent, TrackSpecialChangesEventHandler>();

//Force migrations
using (var serviceScope = appBuilder.ApplicationServices.CreateScope())
Expand Down Expand Up @@ -311,45 +320,49 @@ public void PostInitialize(IApplicationBuilder appBuilder)

#region Register types for generic Export

var registrar = appBuilder.ApplicationServices.GetService<IKnownExportTypesRegistrar>();

registrar.RegisterType(
ExportedTypeDefinitionBuilder.Build<ExportableProduct, ProductExportDataQuery>()
.WithDataSourceFactory(appBuilder.ApplicationServices.GetService<ICatalogExportPagedDataSourceFactory>())
.WithMetadata(typeof(ExportableProduct).GetPropertyNames(
nameof(ExportableProduct.Properties),
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.Values)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.Attributes)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.DisplayNames)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.ValidationRules)}",
nameof(ExportableProduct.Assets),
nameof(ExportableProduct.Links),
nameof(ExportableProduct.SeoInfos),
nameof(ExportableProduct.Reviews),
nameof(ExportableProduct.Associations),
nameof(ExportableProduct.ReferencedAssociations),
nameof(ExportableProduct.Outlines),
nameof(ExportableProduct.Images)))
.WithTabularMetadata(typeof(ExportableProduct).GetPropertyNames()));

registrar.RegisterType(
ExportedTypeDefinitionBuilder.Build<ExportableCatalogFull, CatalogFullExportDataQuery>()
.WithDataSourceFactory(appBuilder.ApplicationServices.GetService<ICatalogExportPagedDataSourceFactory>())
.WithMetadata(new ExportedTypeMetadata { PropertyInfos = Array.Empty<ExportedTypePropertyInfo>() })
.WithRestrictDataSelectivity());
if (ModuleCatalog.IsModuleInstalled(GenericExportModuleId))
{
var registrar = appBuilder.ApplicationServices.GetService<IKnownExportTypesRegistrar>();
registrar.RegisterType(
ExportedTypeDefinitionBuilder.Build<ExportableProduct, ProductExportDataQuery>()
.WithDataSourceFactory(appBuilder.ApplicationServices.GetService<ICatalogExportPagedDataSourceFactory>())
.WithMetadata(typeof(ExportableProduct).GetPropertyNames(
nameof(ExportableProduct.Properties),
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.Values)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.Attributes)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.DisplayNames)}",
$"{nameof(ExportableProduct.Properties)}.{nameof(Property.ValidationRules)}",
nameof(ExportableProduct.Assets),
nameof(ExportableProduct.Links),
nameof(ExportableProduct.SeoInfos),
nameof(ExportableProduct.Reviews),
nameof(ExportableProduct.Associations),
nameof(ExportableProduct.ReferencedAssociations),
nameof(ExportableProduct.Outlines),
nameof(ExportableProduct.Images)))
.WithTabularMetadata(typeof(ExportableProduct).GetPropertyNames()));

registrar.RegisterType(
ExportedTypeDefinitionBuilder.Build<ExportableCatalogFull, CatalogFullExportDataQuery>()
.WithDataSourceFactory(appBuilder.ApplicationServices.GetService<ICatalogExportPagedDataSourceFactory>())
.WithMetadata(new ExportedTypeMetadata { PropertyInfos = Array.Empty<ExportedTypePropertyInfo>() })
.WithRestrictDataSelectivity());
}

#endregion Register types for generic Export

#region BulkActions

AbstractTypeFactory<BulkActionContext>.RegisterType<CategoryChangeBulkActionContext>();
AbstractTypeFactory<BulkActionContext>.RegisterType<PropertiesUpdateBulkActionContext>();
if (ModuleCatalog.IsModuleInstalled(BulkActionsModuleId))
{
AbstractTypeFactory<BulkActionContext>.RegisterType<CategoryChangeBulkActionContext>();
AbstractTypeFactory<BulkActionContext>.RegisterType<PropertiesUpdateBulkActionContext>();

RegisterBulkAction(nameof(CategoryChangeBulkAction), nameof(CategoryChangeBulkActionContext));
RegisterBulkAction(nameof(PropertiesUpdateBulkAction), nameof(PropertiesUpdateBulkActionContext));
RegisterBulkAction(nameof(CategoryChangeBulkAction), nameof(CategoryChangeBulkActionContext));
RegisterBulkAction(nameof(PropertiesUpdateBulkAction), nameof(PropertiesUpdateBulkActionContext));
}

#endregion BulkActions

}

public void Uninstall()
Expand Down
85 changes: 45 additions & 40 deletions src/VirtoCommerce.CatalogModule.Web/Scripts/catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ angular.module(catalogsModuleName, ['ui.grid.validate', 'ui.grid.infiniteScroll'
}])

.run(
['platformWebApp.mainMenuService', 'platformWebApp.widgetService', '$state', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogExportService', 'platformWebApp.permissionScopeResolver', 'virtoCommerce.catalogModule.catalogs', 'virtoCommerce.catalogModule.predefinedSearchFilters', 'platformWebApp.metaFormsService', 'virtoCommerce.catalogModule.itemTypesResolverService', '$http', '$compile', 'virtoCommerce.exportModule.genericViewerItemService', 'platformWebApp.toolbarService', 'platformWebApp.breadcrumbHistoryService',
function (mainMenuService, widgetService, $state, bladeNavigationService, catalogExportService, scopeResolver, catalogs, predefinedSearchFilters, metaFormsService, itemTypesResolverService, $http, $compile, genericViewerItemService, toolbarService, breadcrumbHistoryService) {
['$injector', 'platformWebApp.mainMenuService', 'platformWebApp.widgetService', '$state', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogExportService', 'platformWebApp.permissionScopeResolver', 'virtoCommerce.catalogModule.catalogs', 'virtoCommerce.catalogModule.predefinedSearchFilters', 'platformWebApp.metaFormsService', 'virtoCommerce.catalogModule.itemTypesResolverService', '$http', '$compile', 'platformWebApp.toolbarService', 'platformWebApp.breadcrumbHistoryService',
function ($injector, mainMenuService, widgetService, $state, bladeNavigationService, catalogExportService, scopeResolver, catalogs, predefinedSearchFilters, metaFormsService, itemTypesResolverService, $http, $compile, toolbarService, breadcrumbHistoryService) {

//Register module in main menu
var menuItem = {
Expand Down Expand Up @@ -574,50 +574,55 @@ angular.module(catalogsModuleName, ['ui.grid.validate', 'ui.grid.infiniteScroll'
}
]);

genericViewerItemService.registerViewer('CatalogProduct', function (item) {
var itemCopy = angular.copy(item);

return {
id: "itemmDetail",
itemId: itemCopy.id,
productType: itemCopy.productType,
title: itemCopy.name,
controller: 'virtoCommerce.catalogModule.itemDetailController',
template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'
};
});
// assume that since export module is loaded it's safe to use module services and controllers
if ($injector.modules['virtoCommerce.exportModule']) {
var genericViewerItemService = $injector.get('virtoCommerce.exportModule.genericViewerItemService');

genericViewerItemService.registerViewer('CatalogProduct', function (item) {
var itemCopy = angular.copy(item);

return {
id: "itemmDetail",
itemId: itemCopy.id,
productType: itemCopy.productType,
title: itemCopy.name,
controller: 'virtoCommerce.catalogModule.itemDetailController',
template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'
};
});

catalogExportService.register({
name: 'Generic Export',
description: 'Export products filtered by catalogs or categories to JSON or CSV',
icon: 'fa-fw fa fa-database',
controller: 'virtoCommerce.exportModule.exportSettingsController',
template: 'Modules/$(VirtoCommerce.Export)/Scripts/blades/export-settings.tpl.html',
id: 'catalogGenericExport',
title: 'catalog.blades.exporter.productTitle',
subtitle: 'catalog.blades.exporter.productSubtitle',
onInitialize: function (newBlade) {
var exportDataRequest = {
exportTypeName: 'VirtoCommerce.CatalogModule.Core.Model.Export.ExportableProduct',
dataQuery: {
exportTypeName: 'ProductExportDataQuery',
categoryIds: _.pluck(newBlade.selectedCategories, 'id'),
objectIds: _.pluck(newBlade.selectedProducts, 'id'),
catalogIds: [newBlade.catalog.id],
searchInChildren: true,
isAllSelected: true
}
};
newBlade.exportDataRequest = exportDataRequest;
newBlade.totalItemsCount = (newBlade.selectedProducts || []).length;
}
});
}

$http.get('Modules/$(VirtoCommerce.Catalog)/Scripts/directives/itemSearch.tpl.html').then(function (response) {
// compile the response, which will put stuff into the cache
$compile(response.data);
});

catalogExportService.register({
name: 'Generic Export',
description: 'Export products filtered by catalogs or categories to JSON or CSV',
icon: 'fa-fw fa fa-database',
controller: 'virtoCommerce.exportModule.exportSettingsController',
template: 'Modules/$(VirtoCommerce.Export)/Scripts/blades/export-settings.tpl.html',
id: 'catalogGenericExport',
title: 'catalog.blades.exporter.productTitle',
subtitle: 'catalog.blades.exporter.productSubtitle',
onInitialize: function (newBlade) {
var exportDataRequest = {
exportTypeName: 'VirtoCommerce.CatalogModule.Core.Model.Export.ExportableProduct',
dataQuery: {
exportTypeName: 'ProductExportDataQuery',
categoryIds: _.pluck(newBlade.selectedCategories, 'id'),
objectIds: _.pluck(newBlade.selectedProducts, 'id'),
catalogIds: [newBlade.catalog.id],
searchInChildren: true,
isAllSelected: true
}
};
newBlade.exportDataRequest = exportDataRequest;
newBlade.totalItemsCount = (newBlade.selectedProducts || []).length;
}
});

metaFormsService.registerMetaFields('measureDetails', [
{
name: 'name',
Expand Down
Loading

0 comments on commit 8895d2e

Please sign in to comment.