├── .editorconfig
├── .gitattributes
├── .github
└── ISSUE_TEMPLATE
│ ├── bug-report.md
│ └── enhancement-request.md
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── Oqtane.Client
├── AssemblyInfo.cs
├── Extensions
│ ├── OqtaneLocalizationExtensions.cs
│ └── OqtaneServiceCollectionExtensions.cs
├── IconResources.cs
├── Installer
│ ├── Controls
│ │ ├── AzureSqlConfig.razor
│ │ ├── LocalDBConfig.razor
│ │ ├── MySQLConfig.razor
│ │ ├── PostgreSQLConfig.razor
│ │ ├── SqlServerConfig.razor
│ │ └── SqliteConfig.razor
│ └── Installer.razor
├── Modules
│ ├── Admin
│ │ ├── Dashboard
│ │ │ └── Index.razor
│ │ ├── Error
│ │ │ └── Index.razor
│ │ ├── Files
│ │ │ ├── Add.razor
│ │ │ ├── Details.razor
│ │ │ ├── Edit.razor
│ │ │ ├── Index.razor
│ │ │ └── ModuleInfo.cs
│ │ ├── Jobs
│ │ │ ├── Edit.razor
│ │ │ ├── Index.razor
│ │ │ └── Log.razor
│ │ ├── Languages
│ │ │ ├── Add.razor
│ │ │ ├── Edit.razor
│ │ │ └── Index.razor
│ │ ├── Login
│ │ │ └── Index.razor
│ │ ├── Logs
│ │ │ ├── Detail.razor
│ │ │ └── Index.razor
│ │ ├── ModuleDefinitions
│ │ │ ├── Add.razor
│ │ │ ├── Create.razor
│ │ │ ├── Edit.razor
│ │ │ └── Index.razor
│ │ ├── Modules
│ │ │ ├── Export.razor
│ │ │ ├── Import.razor
│ │ │ └── Settings.razor
│ │ ├── Pages
│ │ │ ├── Add.razor
│ │ │ ├── Edit.razor
│ │ │ └── Index.razor
│ │ ├── Profiles
│ │ │ ├── Edit.razor
│ │ │ ├── Index.razor
│ │ │ └── ModuleInfo.cs
│ │ ├── RecycleBin
│ │ │ └── Index.razor
│ │ ├── Register
│ │ │ └── Index.razor
│ │ ├── Reset
│ │ │ └── Index.razor
│ │ ├── Roles
│ │ │ ├── Add.razor
│ │ │ ├── Edit.razor
│ │ │ ├── Index.razor
│ │ │ ├── ModuleInfo.cs
│ │ │ └── Users.razor
│ │ ├── Search
│ │ │ └── Index.razor
│ │ ├── SearchResults
│ │ │ ├── Index.razor
│ │ │ ├── ModuleInfo.cs
│ │ │ └── Settings.razor
│ │ ├── Site
│ │ │ └── Index.razor
│ │ ├── Sites
│ │ │ ├── Add.razor
│ │ │ └── Index.razor
│ │ ├── Sql
│ │ │ └── Index.razor
│ │ ├── SystemInfo
│ │ │ └── Index.razor
│ │ ├── Themes
│ │ │ ├── Add.razor
│ │ │ ├── Create.razor
│ │ │ ├── Edit.razor
│ │ │ └── Index.razor
│ │ ├── Upgrade
│ │ │ └── Index.razor
│ │ ├── UrlMappings
│ │ │ ├── Add.razor
│ │ │ ├── Edit.razor
│ │ │ └── Index.razor
│ │ ├── UserProfile
│ │ │ ├── Add.razor
│ │ │ ├── Index.razor
│ │ │ └── View.razor
│ │ ├── Users
│ │ │ ├── Add.razor
│ │ │ ├── Edit.razor
│ │ │ ├── Index.razor
│ │ │ ├── ModuleInfo.cs
│ │ │ ├── Roles.razor
│ │ │ └── Users.razor
│ │ └── Visitors
│ │ │ ├── Detail.razor
│ │ │ └── Index.razor
│ ├── Controls
│ │ ├── ActionDialog.razor
│ │ ├── ActionLink.razor
│ │ ├── AuditInfo.razor
│ │ ├── AutoComplete.razor
│ │ ├── FileManager.razor
│ │ ├── InputList.razor
│ │ ├── Label.razor
│ │ ├── LocalizableComponent.cs
│ │ ├── ModuleMessage.razor
│ │ ├── Pager.razor
│ │ ├── PermissionGrid.razor
│ │ ├── QuillEditorInterop.cs
│ │ ├── QuillJSTextEditor.razor
│ │ ├── RichTextEditor.razor
│ │ ├── Section.razor
│ │ ├── TabPanel.razor
│ │ ├── TabStrip.razor
│ │ ├── TextAreaTextEditor.razor
│ │ └── TriStateCheckBox.razor
│ ├── HtmlText
│ │ ├── Edit.razor
│ │ ├── Index.razor
│ │ ├── ModuleInfo.cs
│ │ ├── Services
│ │ │ ├── HtmlTextService.cs
│ │ │ └── IHtmlTextService.cs
│ │ └── Settings.razor
│ ├── IModule.cs
│ ├── MessageType.cs
│ ├── ModuleBase.cs
│ └── ModuleControlBase.cs
├── Oqtane.Client.csproj
├── Oqtane.Client.csproj.DotSettings
├── Program.cs
├── Properties
│ └── launchSettings.json
├── Providers
│ └── IdentityAuthenticationStateProvider.cs
├── Resources
│ ├── IconResources.resx
│ ├── Installer
│ │ ├── Controls
│ │ │ ├── LocalDBConfig.resx
│ │ │ ├── MySQLConfig.resx
│ │ │ ├── PostgreSQLConfig.resx
│ │ │ ├── SqlServerConfig.resx
│ │ │ └── SqliteConfig.resx
│ │ └── Installer.resx
│ ├── Modules
│ │ ├── Admin
│ │ │ ├── Api
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Dashboard
│ │ │ │ └── Index.resx
│ │ │ ├── Error
│ │ │ │ └── Index.resx
│ │ │ ├── Files
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Details.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Jobs
│ │ │ │ ├── Edit.resx
│ │ │ │ ├── Index.resx
│ │ │ │ └── Log.resx
│ │ │ ├── Languages
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Login
│ │ │ │ └── Index.resx
│ │ │ ├── Logs
│ │ │ │ ├── Detail.resx
│ │ │ │ └── Index.resx
│ │ │ ├── ModuleDefinitions
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Create.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Modules
│ │ │ │ ├── Export.resx
│ │ │ │ ├── Import.resx
│ │ │ │ └── Settings.resx
│ │ │ ├── Pages
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Profiles
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── RecycleBin
│ │ │ │ └── Index.resx
│ │ │ ├── Register
│ │ │ │ └── Index.resx
│ │ │ ├── Reset
│ │ │ │ └── Index.resx
│ │ │ ├── Roles
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ ├── Index.resx
│ │ │ │ └── Users.resx
│ │ │ ├── Search
│ │ │ │ └── Index.resx
│ │ │ ├── SearchResults
│ │ │ │ ├── Index.resx
│ │ │ │ └── Settings.resx
│ │ │ ├── Site
│ │ │ │ └── Index.resx
│ │ │ ├── Sites
│ │ │ │ ├── Add.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Sql
│ │ │ │ └── Index.resx
│ │ │ ├── SystemInfo
│ │ │ │ └── Index.resx
│ │ │ ├── Themes
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Create.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── Upgrade
│ │ │ │ └── Index.resx
│ │ │ ├── UrlMappings
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ └── Index.resx
│ │ │ ├── UserProfile
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Index.resx
│ │ │ │ └── View.resx
│ │ │ ├── Users
│ │ │ │ ├── Add.resx
│ │ │ │ ├── Edit.resx
│ │ │ │ ├── Index.resx
│ │ │ │ ├── Roles.resx
│ │ │ │ └── Users.resx
│ │ │ └── Visitors
│ │ │ │ ├── Detail.resx
│ │ │ │ └── Index.resx
│ │ ├── Controls
│ │ │ ├── AuditInfo.resx
│ │ │ ├── FileManager.resx
│ │ │ ├── Pager.resx
│ │ │ ├── PermissionGrid.resx
│ │ │ ├── QuillJSTextEditor.resx
│ │ │ ├── StaticPager.resx
│ │ │ └── TriStateCheckBox.resx
│ │ ├── HtmlText
│ │ │ ├── Edit.resx
│ │ │ ├── Index.resx
│ │ │ └── Settings.resx
│ │ └── Installer
│ │ │ ├── Controls
│ │ │ ├── LocalDBConfig.resx
│ │ │ ├── MySQLConfig.resx
│ │ │ ├── PostgreSQLConfig.resx
│ │ │ ├── SqlServerConfig.resx
│ │ │ └── SqliteConfig.resx
│ │ │ └── Installer.resx
│ ├── SharedResources.resx
│ ├── Themes
│ │ ├── Controls
│ │ │ ├── ControlPanelInteractive.resx
│ │ │ ├── CookieConsent.resx
│ │ │ ├── Login.resx
│ │ │ ├── ModuleActionsBase.resx
│ │ │ ├── Search.resx
│ │ │ └── UserProfile.resx
│ │ └── OqtaneTheme
│ │ │ ├── ContainerSettings.resx
│ │ │ └── ThemeSettings.resx
│ └── UI
│ │ └── ModuleInstance.resx
├── Services
│ ├── AliasService.cs
│ ├── CookieConsentService.cs
│ ├── DatabaseService.cs
│ ├── FileService.cs
│ ├── FolderService.cs
│ ├── InstallationService.cs
│ ├── Interfaces
│ │ ├── IAliasService.cs
│ │ ├── ICookieConsentService.cs
│ │ ├── IDatabaseService.cs
│ │ ├── IFileService.cs
│ │ ├── IFolderService.cs
│ │ ├── IInstallationService.cs
│ │ ├── IJobLogService.cs
│ │ ├── IJobService.cs
│ │ ├── ILanguageService.cs
│ │ ├── ILocalizationCookieService.cs
│ │ ├── ILocalizationService.cs
│ │ ├── ILogService.cs
│ │ ├── IModuleDefinitionService.cs
│ │ ├── IModuleService.cs
│ │ ├── INotificationService.cs
│ │ ├── IOutputCacheService.cs
│ │ ├── IPackageService.cs
│ │ ├── IPageModuleService.cs
│ │ ├── IPageService.cs
│ │ ├── IProfileService.cs
│ │ ├── IRoleService.cs
│ │ ├── ISearchResultsService.cs
│ │ ├── ISettingService.cs
│ │ ├── ISiteService.cs
│ │ ├── ISiteTemplateService.cs
│ │ ├── ISqlService.cs
│ │ ├── ISyncService.cs
│ │ ├── ISystemService.cs
│ │ ├── ITenantService.cs
│ │ ├── IThemeService.cs
│ │ ├── ITimeZoneService.cs
│ │ ├── IUrlMappingService.cs
│ │ ├── IUserRoleService.cs
│ │ ├── IUserService.cs
│ │ └── IVisitorService.cs
│ ├── JobLogService.cs
│ ├── JobService.cs
│ ├── LanguageService.cs
│ ├── LocalizationCookieService.cs
│ ├── LocalizationService.cs
│ ├── LogService.cs
│ ├── ModuleDefinitionService.cs
│ ├── ModuleService.cs
│ ├── NotificationService.cs
│ ├── OutputCacheService.cs
│ ├── PackageService.cs
│ ├── PageModuleService.cs
│ ├── PageService.cs
│ ├── ProfileService.cs
│ ├── RemoteServiceBase.cs
│ ├── RoleService.cs
│ ├── SearchResultsService.cs
│ ├── ServiceBase.cs
│ ├── SettingService.cs
│ ├── SiteService.cs
│ ├── SiteTemplateService.cs
│ ├── SqlService.cs
│ ├── SyncService.cs
│ ├── SystemService.cs
│ ├── TenantService.cs
│ ├── ThemeService.cs
│ ├── TimeZoneService.cs
│ ├── UrlMappingService.cs
│ ├── UserRoleService.cs
│ ├── UserService.cs
│ └── VisitorService.cs
├── SharedResources.cs
├── Themes
│ ├── AdminContainer.razor
│ ├── BlazorTheme
│ │ ├── Containers
│ │ │ └── Container.razor
│ │ ├── ThemeInfo.cs
│ │ └── Themes
│ │ │ └── Default.razor
│ ├── ContainerBase.cs
│ ├── Controls
│ │ ├── Container
│ │ │ ├── ModuleActions.razor
│ │ │ ├── ModuleActionsBase.cs
│ │ │ ├── ModuleActionsInteractive.razor
│ │ │ └── ModuleTitle.razor
│ │ └── Theme
│ │ │ ├── Breadcrumbs.razor
│ │ │ ├── ControlPanel.razor
│ │ │ ├── ControlPanelInteractive.razor
│ │ │ ├── CookieConsent.razor
│ │ │ ├── LanguageSwitcher.razor
│ │ │ ├── Login.razor
│ │ │ ├── LoginBase.cs
│ │ │ ├── Logo.razor
│ │ │ ├── Menu.razor
│ │ │ ├── MenuBase.cs
│ │ │ ├── MenuHorizontal.razor
│ │ │ ├── MenuItemsBase.cs
│ │ │ ├── MenuItemsHorizontal.razor
│ │ │ ├── MenuItemsVertical.razor
│ │ │ ├── MenuVertical.razor
│ │ │ ├── Search.razor
│ │ │ └── UserProfile.razor
│ ├── DefaultContainer.razor
│ ├── IContainerControl.cs
│ ├── ILayoutControl.cs
│ ├── ITheme.cs
│ ├── LayoutBase.cs
│ ├── OqtaneTheme
│ │ ├── Containers
│ │ │ ├── Container.razor
│ │ │ └── ContainerSettings.razor
│ │ ├── ThemeInfo.cs
│ │ └── Themes
│ │ │ ├── Default.razor
│ │ │ └── ThemeSettings.razor
│ ├── ThemeBase.cs
│ └── ThemeControlBase.cs
├── UI
│ ├── ContainerBuilder.razor
│ ├── Head.razor
│ ├── InteractiveRenderMode.cs
│ ├── Interop.cs
│ ├── ModuleInstance.placeholder.cs
│ ├── ModuleInstance.razor
│ ├── PageState.cs
│ ├── Pane.razor
│ ├── RenderModeBoundary.placeholder.cs
│ ├── RenderModeBoundary.razor
│ ├── Routes.razor
│ ├── SiteRouter.razor
│ └── ThemeBuilder.razor
└── _Imports.razor
├── Oqtane.Database.MySQL
├── MySQLDatabase.cs
└── Oqtane.Database.MySQL.csproj
├── Oqtane.Database.PostgreSQL
├── Oqtane.Database.PostgreSQL.csproj
├── OqtaneHistoryRepository.cs
└── PostgreSQLDatabase.cs
├── Oqtane.Database.SqlServer
├── Oqtane.Database.SqlServer.csproj
├── OqtaneHistoryRepository.cs
└── SqlServerDatabase.cs
├── Oqtane.Database.Sqlite
├── Oqtane.Database.Sqlite.csproj
├── OqtaneHistoryRepository.cs
└── SqliteDatabase.cs
├── Oqtane.Maui.sln
├── Oqtane.Maui
├── App.xaml
├── App.xaml.cs
├── Head.razor
├── Main.razor
├── MainPage.xaml
├── MainPage.xaml.cs
├── MauiConstants.cs
├── MauiProgram.cs
├── Oqtane.Maui.csproj
├── Platforms
│ ├── Android
│ │ ├── AndroidManifest.xml
│ │ ├── MainActivity.cs
│ │ ├── MainApplication.cs
│ │ └── Resources
│ │ │ ├── values
│ │ │ └── colors.xml
│ │ │ └── xml
│ │ │ └── network_security_config.xml
│ ├── MacCatalyst
│ │ ├── AppDelegate.cs
│ │ ├── Info.plist
│ │ └── Program.cs
│ ├── Tizen
│ │ ├── Main.cs
│ │ └── tizen-manifest.xml
│ ├── Windows
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Package.appxmanifest
│ │ └── app.manifest
│ └── iOS
│ │ ├── AppDelegate.cs
│ │ ├── Info.plist
│ │ └── Program.cs
├── Properties
│ └── launchSettings.json
├── Resources
│ ├── AppIcon
│ │ ├── appicon.svg
│ │ └── appiconfg.svg
│ ├── Fonts
│ │ └── OpenSans-Regular.ttf
│ ├── Images
│ │ └── dotnet_bot.svg
│ ├── Raw
│ │ └── AboutAssets.txt
│ └── Splash
│ │ └── splash.svg
├── _Imports.razor
└── wwwroot
│ ├── css
│ ├── app.css
│ ├── empty.css
│ └── open-iconic
│ │ ├── FONT-LICENSE
│ │ ├── ICON-LICENSE
│ │ ├── README.md
│ │ └── font
│ │ ├── css
│ │ └── open-iconic-bootstrap.min.css
│ │ └── fonts
│ │ ├── open-iconic.eot
│ │ ├── open-iconic.otf
│ │ ├── open-iconic.svg
│ │ ├── open-iconic.ttf
│ │ └── open-iconic.woff
│ ├── favicon.ico
│ ├── images
│ ├── checked.png
│ ├── error.png
│ ├── help.png
│ ├── logo-black.png
│ ├── logo-white.png
│ ├── null.png
│ └── unchecked.png
│ ├── index.html
│ ├── js
│ ├── app.js
│ ├── interop.js
│ └── loadjs.min.js
│ ├── loading.gif
│ └── oqtane-glow.png
├── Oqtane.Package
├── Oqtane.Client.nuspec
├── Oqtane.Framework.nuspec
├── Oqtane.Server.nuspec
├── Oqtane.Shared.nuspec
├── Oqtane.Updater.nuspec
├── icon.png
├── install.ps1
├── nuget.exe
├── readme.md
├── release.cmd
└── upgrade.ps1
├── Oqtane.Server
├── AssemblyInfo.cs
├── Components
│ ├── App.razor
│ ├── _Imports.razor
│ └── _Placeholder.cs
├── Controllers
│ ├── AliasController.cs
│ ├── CookieConsentController.cs
│ ├── DatabaseController.cs
│ ├── EndpointController.cs
│ ├── FileController.cs
│ ├── FolderController.cs
│ ├── InstallationController.cs
│ ├── JobController.cs
│ ├── JobLogController.cs
│ ├── LanguageController.cs
│ ├── LocalizationController.cs
│ ├── LogController.cs
│ ├── ModuleController.cs
│ ├── ModuleControllerBase.cs
│ ├── ModuleDefinitionController.cs
│ ├── NotificationController.cs
│ ├── OutputCacheController.cs
│ ├── PackageController.cs
│ ├── PageController.cs
│ ├── PageModuleController.cs
│ ├── ProfileController.cs
│ ├── RoleController.cs
│ ├── SearchResultsController.cs
│ ├── SettingController.cs
│ ├── SiteController.cs
│ ├── SiteTemplateController.cs
│ ├── SqlController.cs
│ ├── SyncController.cs
│ ├── SystemController.cs
│ ├── TenantController.cs
│ ├── ThemeController.cs
│ ├── TimeZoneController.cs
│ ├── UrlMappingController.cs
│ ├── UserController.cs
│ ├── UserRoleController.cs
│ └── VisitorController.cs
├── Data
│ └── db.txt
├── Databases
│ ├── DatabaseBase.cs
│ └── Interfaces
│ │ ├── IDatabase.cs
│ │ └── IMultiDatabase.cs
├── Extensions
│ ├── ApplicationBuilderExtensions.cs
│ ├── CacheExtensions.cs
│ ├── ClaimsPrincipalExtensions.cs
│ ├── ComponentEndpointRouteBuilderExtensions.cs
│ ├── DbContextOptionsBuilderExtensions.cs
│ ├── DictionaryExtensions.cs
│ ├── HttpContextExtensions.cs
│ ├── MimeUtilities.cs
│ ├── OqtaneMvcBuilderExtensions.cs
│ ├── OqtaneServiceCollectionExtensions.cs
│ ├── OqtaneSiteAuthenticationBuilderExtensions.cs
│ ├── OqtaneSiteIdentityBuilderExtensions.cs
│ ├── OqtaneSiteOptionsBuilder.cs
│ ├── PermissionExtension.cs
│ ├── QueryableExtensions.cs
│ ├── StringExtensions.cs
│ └── WebHostBuilderExtensions.cs
├── Infrastructure
│ ├── AliasAccessor.cs
│ ├── ConfigManager.cs
│ ├── DatabaseManager.cs
│ ├── EventSubscribers
│ │ └── CacheInvalidationEventSubscriber.cs
│ ├── HostedServices
│ │ └── EventDistributorHostedService .cs
│ ├── InstallationManager.cs
│ ├── Interfaces
│ │ ├── IAliasAccessor.cs
│ │ ├── IConfigManager.cs
│ │ ├── IDatabaseManager.cs
│ │ ├── IEventSubscriber.cs
│ │ ├── IHostResources.cs
│ │ ├── IInstallable.cs
│ │ ├── IInstallationManager.cs
│ │ ├── ILocalizationManager.cs
│ │ ├── ILogManager.cs
│ │ ├── IServerStartup.cs
│ │ ├── IServerStateManager.cs
│ │ ├── ISiteMigration.cs
│ │ ├── ISiteTemplate.cs
│ │ ├── ISyncManager.cs
│ │ ├── ITenantManager.cs
│ │ ├── ITokenReplace.cs
│ │ ├── IUpgradeManager.cs
│ │ └── SiteMigrationAttribute.cs
│ ├── Jobs
│ │ ├── HostedServiceBase.cs
│ │ ├── NotificationJob.cs
│ │ ├── PurgeJob.cs
│ │ └── SearchIndexJob.cs
│ ├── Localization
│ │ ├── LocalizationOptions.cs
│ │ ├── RightToLeftCulture.cs
│ │ └── RightToLeftCultureCalendar.cs
│ ├── LocalizationManager.cs
│ ├── LogManager.cs
│ ├── Logging
│ │ ├── FileLogger.cs
│ │ └── FileLoggerProvider.cs
│ ├── Middleware
│ │ ├── ExceptionMiddleware.cs
│ │ ├── JwtMiddleware.cs
│ │ └── TenantMiddleware.cs
│ ├── Options
│ │ ├── ISiteNamedOptions.cs
│ │ ├── ISiteOptions.cs
│ │ ├── SiteNamedOptions.cs
│ │ ├── SiteOptions.cs
│ │ ├── SiteOptionsCache.cs
│ │ ├── SiteOptionsFactory.cs
│ │ └── SiteOptionsManager.cs
│ ├── ServerState.cs
│ ├── ServerStateManager.cs
│ ├── SiteMigration
│ │ └── ExampleSiteMigration.cs
│ ├── SiteTemplates
│ │ ├── AdminSiteTemplate.cs
│ │ ├── DefaultSiteTemplate.cs
│ │ └── EmptySiteTemplate.cs
│ ├── SyncManager.cs
│ ├── TenantManager.cs
│ ├── TokenReplace.cs
│ └── UpgradeManager.cs
├── Managers
│ ├── Interfaces
│ │ └── IUserManager.cs
│ └── UserManager.cs
├── Migrations
│ ├── EntityBuilders
│ │ ├── AliasEntityBuilder.cs
│ │ ├── AppVersionsEntityBuilder.cs
│ │ ├── AspNetUserClaimsEntityBuilder.cs
│ │ ├── AspNetUserLoginsEntityBuilder.cs
│ │ ├── AspNetUsersEntityBuilder.cs
│ │ ├── AuditableBaseEntityBuilder.cs
│ │ ├── BaseEntityBuilder.cs
│ │ ├── DeletableAuditableBaseEntityBuilder.cs
│ │ ├── DeletableBaseEntityBuilder.cs
│ │ ├── FileEntityBuilder.cs
│ │ ├── FolderEntityBuilder.cs
│ │ ├── JobEntityBuilder.cs
│ │ ├── JobLogEntityBuilder.cs
│ │ ├── LanguageEntityBuilder.cs
│ │ ├── LogEntityBuilder.cs
│ │ ├── ModuleDefinitionsEntityBuilder.cs
│ │ ├── ModuleEntityBuilder.cs
│ │ ├── NotificationEntityBuilder.cs
│ │ ├── PageEntityBuilder.cs
│ │ ├── PageModuleEntityBuilder.cs
│ │ ├── PermissionEntityBuilder.cs
│ │ ├── ProfileEntityBuilder.cs
│ │ ├── RoleEntityBuilder.cs
│ │ ├── SearchContentEntityBuilder.cs
│ │ ├── SearchContentPropertyEntityBuilder.cs
│ │ ├── SearchContentWordEntityBuilder.cs
│ │ ├── SearchWordEntityBuilder.cs
│ │ ├── SettingEntityBuilder.cs
│ │ ├── SiteEntityBuilder.cs
│ │ ├── TenantEntityBuilder.cs
│ │ ├── ThemeEntityBuilder.cs
│ │ ├── UrlMappingEntityBuilder.cs
│ │ ├── UserEntityBuilder.cs
│ │ ├── UserRoleEntityBuilder.cs
│ │ └── VisitorEntityBuilder.cs
│ ├── Framework
│ │ ├── ForeignKey.cs
│ │ ├── MigrationUtils.cs
│ │ ├── MultiDatabaseMigration.cs
│ │ ├── MultiDatabaseMigrationsAssembly.cs
│ │ └── PrimaryKey.cs
│ ├── Master
│ │ ├── 01000000_InitializeMaster.cs
│ │ ├── 01000100_AddAdditionalIndexesInMaster.cs
│ │ ├── 02010000_AddIndexesForForeignKeyInMaster.cs
│ │ ├── 02010001_AddDatabaseTypeColumnToTenant.cs
│ │ ├── 03000201_AddAliasIsDefault.cs
│ │ ├── 04000001_AddThemeTable.cs
│ │ ├── 04000002_AddThemeName.cs
│ │ ├── 05020101_AddIndexes.cs
│ │ └── 06010001_AddThemeVersion.cs
│ └── Tenant
│ │ ├── 01000000_InitializeTenant.cs
│ │ ├── 01000100_AddAdditionalIndexesInTenant.cs
│ │ ├── 01000101_AddAdditionColumnToNotifications.cs
│ │ ├── 01000201_DropColumnFromPage.cs
│ │ ├── 02000001_AddColumnToProfileAndUpdatePage.cs
│ │ ├── 02000101_UpdateIconColumnInPage.cs
│ │ ├── 02000102_AddLanguageTable.cs
│ │ ├── 02000103_UpdatePageAndAddColumnToSite.cs
│ │ ├── 02000201_AddSiteGuidToSite.cs
│ │ ├── 02000202_UpdateDefaultContainerTypeInSitePage.cs
│ │ ├── 02000203_DropDefaultLayoutInSite.cs
│ │ ├── 02010000_AddAppVersionsTableInTenant.cs
│ │ ├── 02010001_ChangeFolderNameAndPathColumnsSize.cs
│ │ ├── 02010002_DropAppVersionsTableInTenant.cs
│ │ ├── 02010003_AddFolderType.cs
│ │ ├── 02020001_AddPageIsClickable.cs
│ │ ├── 02030001_AddFolderCapacity.cs
│ │ ├── 02030002_AddSettingIsPublic.cs
│ │ ├── 03000001_AddSiteRuntime.cs
│ │ ├── 03000101_ChangeFileNameColumnsSize.cs
│ │ ├── 03000102_AddVisitorTable.cs
│ │ ├── 03000103_AddUrlMappingTable.cs
│ │ ├── 03000104_AddSiteVisitorTracking.cs
│ │ ├── 03000105_AddVisitorReferrer.cs
│ │ ├── 03000201_UpdateSettingIsPublic.cs
│ │ ├── 03000202_UpdateSettingIsPrivate.cs
│ │ ├── 03000301_AddMetaToPage.cs
│ │ ├── 03010001_ExpandVisitorAndUrlMappingUrls.cs
│ │ ├── 03010002_AddUserTwoFactor.cs
│ │ ├── 03010003_AddAspNetUserLogins.cs
│ │ ├── 03010004_AddSiteVersion.cs
│ │ ├── 03020001_AddSiteHomePage.cs
│ │ ├── 03020201_RemoveFolderFileDeletableColumns.cs
│ │ ├── 03030201_AddFolderFileIsDeletedColumns.cs
│ │ ├── 04000001_AddHeadContent.cs
│ │ ├── 04000002_AddBodyContent.cs
│ │ ├── 04000003_AddProfileValidation.cs
│ │ ├── 04000101_AddNotificationIsRead.cs
│ │ ├── 04000601_AddProfileRows.cs
│ │ ├── 05000100_AddSiteHybridEnabled.cs
│ │ ├── 05010001_AddPageEffectiveExpiryDate.cs
│ │ ├── 05010002_AddPageModuleEffectiveExpiryDate.cs
│ │ ├── 05010003_AddProfileAutocomplete.cs
│ │ ├── 05010004_AddSitePrerender.cs
│ │ ├── 05020001_AddSearchTables.cs
│ │ ├── 05020101_AddIndexes.cs
│ │ ├── 05020401_RemoveLanguageName.cs
│ │ ├── 06000101_AddLanguageName.cs
│ │ ├── 06010001_AddFolderCacheControl.cs
│ │ ├── 06010301_AddTimeZone.cs
│ │ └── 06010302_AddModuleHeaderFooter.cs
├── Modules
│ ├── Admin
│ │ └── Files
│ │ │ └── Manager
│ │ │ └── FileManager.cs
│ ├── HtmlText
│ │ ├── Controllers
│ │ │ └── HtmlTextController.cs
│ │ ├── Manager
│ │ │ └── HtmlTextManager.cs
│ │ ├── Migrations
│ │ │ ├── 01000000_InitializeModule.cs
│ │ │ └── EntityBuilders
│ │ │ │ └── HtmlTextEntityBuilder.cs
│ │ ├── Repository
│ │ │ ├── HtmlTextContext.cs
│ │ │ ├── HtmlTextRepository.cs
│ │ │ └── IHtmlTextRepository.cs
│ │ ├── Services
│ │ │ └── HtmlTextService.cs
│ │ └── Startup
│ │ │ └── ServerStartup.cs
│ ├── IPortable.cs
│ ├── ISitemap.cs
│ └── MigratableModuleBase.cs
├── Oqtane.Server.csproj
├── Pages
│ ├── External.cshtml
│ ├── External.cshtml.cs
│ ├── Files.cshtml
│ ├── Files.cshtml.cs
│ ├── Impersonate.cshtml
│ ├── Impersonate.cshtml.cs
│ ├── Login.cshtml
│ ├── Login.cshtml.cs
│ ├── Logout.cshtml
│ ├── Logout.cshtml.cs
│ ├── Sitemap.cshtml
│ └── Sitemap.cshtml.cs
├── Program.cs
├── Properties
│ └── launchSettings.json
├── Providers
│ ├── DatabaseSearchProvider.cs
│ └── IdentityRevalidatingAuthenticationStateProvider.cs
├── Repository
│ ├── AliasRepository.cs
│ ├── Context
│ │ ├── DBContextBase.cs
│ │ ├── DBContextDependencies.cs
│ │ ├── DbContextUtils.cs
│ │ ├── InstallationContext.cs
│ │ ├── MasterDBContext.cs
│ │ └── TenantDBContext.cs
│ ├── FileRepository.cs
│ ├── FolderRepository.cs
│ ├── Interfaces
│ │ ├── IAliasRepository.cs
│ │ ├── IDBContextDependencies.cs
│ │ ├── IFileRepository.cs
│ │ ├── IFolderRepository.cs
│ │ ├── IJobLogRepository.cs
│ │ ├── IJobRepository.cs
│ │ ├── ILanguageRepository.cs
│ │ ├── ILogRepository.cs
│ │ ├── IModuleDefinitionRepository.cs
│ │ ├── IModuleRepository.cs
│ │ ├── INotificationRepository.cs
│ │ ├── IPageModuleRepository.cs
│ │ ├── IPageRepository.cs
│ │ ├── IPermissionRepository.cs
│ │ ├── IProfileRepository.cs
│ │ ├── IRoleRepository.cs
│ │ ├── ISearchContentRepository.cs
│ │ ├── ISettingRepository.cs
│ │ ├── ISiteRepository.cs
│ │ ├── ISiteTemplateRepository.cs
│ │ ├── ISqlRepository.cs
│ │ ├── ITenantRepository.cs
│ │ ├── ITenantResolver.cs
│ │ ├── IThemeRepository.cs
│ │ ├── IUrlMappingRepository.cs
│ │ ├── IUserRepository.cs
│ │ ├── IUserRoleRepository.cs
│ │ └── IVisitorRepository.cs
│ ├── JobLogRepository.cs
│ ├── JobRepository.cs
│ ├── LanguageRepository.cs
│ ├── LogRepository.cs
│ ├── ModuleDefinitionRepository.cs
│ ├── ModuleRepository.cs
│ ├── NotificationRepository.cs
│ ├── PageModuleRepository.cs
│ ├── PageRepository.cs
│ ├── PermissionRepository.cs
│ ├── ProfileRepository.cs
│ ├── RoleRepository.cs
│ ├── SearchContentRepository.cs
│ ├── SettingRepository.cs
│ ├── SiteRepository.cs
│ ├── SiteTemplateRepository.cs
│ ├── SqlRepository.cs
│ ├── TenantRepository.cs
│ ├── TenantResolver.cs
│ ├── ThemeRepository.cs
│ ├── UrlMappingRepository.cs
│ ├── UserRepository.cs
│ ├── UserRoleRepository.cs
│ └── VisitorRepository.cs
├── Resources
│ ├── .gitkeep
│ ├── Infrastructure
│ │ └── SiteTemplates
│ │ │ └── AdminSiteTemplate.resx
│ └── Managers
│ │ └── UserManager.resx
├── Scripts
│ ├── MigrateMaster.sql
│ └── MigrateTenant.sql
├── Security
│ ├── AuthorizationPolicyProvider.cs
│ ├── AutoValidateAntiforgeryTokenAttribute.cs
│ ├── AutoValidateAntiforgeryTokenFilter.cs
│ ├── ClaimsPrincipalFactory.cs
│ ├── JwtManager.cs
│ ├── PermissionHandler.cs
│ ├── PermissionRequirement.cs
│ ├── PrincipalValidator.cs
│ └── UserPermissions.cs
├── Services
│ ├── CookieConsentService.cs
│ ├── ImageService.cs
│ ├── LocalizationCookieService.cs
│ ├── OutputCacheService.cs
│ ├── SearchService.cs
│ └── SiteService.cs
├── Startup.cs
├── appsettings.json
├── appsettings.release.json
└── wwwroot
│ ├── Modules
│ ├── Oqtane.Modules.Admin.Login
│ │ └── Module.css
│ ├── Oqtane.Modules.HtmlText
│ │ └── Module.css
│ └── Templates
│ │ └── External
│ │ ├── Client
│ │ ├── AssemblyInfo.cs
│ │ ├── Interop.cs
│ │ ├── Modules
│ │ │ └── [Owner].Module.[Module]
│ │ │ │ ├── Edit.razor
│ │ │ │ ├── Index.razor
│ │ │ │ ├── ModuleInfo.cs
│ │ │ │ └── Settings.razor
│ │ ├── Resources
│ │ │ └── [Owner].Module.[Module]
│ │ │ │ ├── Edit.resx
│ │ │ │ ├── Index.resx
│ │ │ │ └── Settings.resx
│ │ ├── Services
│ │ │ └── [Module]Service.cs
│ │ ├── Startup
│ │ │ └── ClientStartup.cs
│ │ ├── [Owner].Module.[Module].Client.csproj
│ │ └── _Imports.razor
│ │ ├── Package
│ │ ├── [Owner].Module.[Module].Package.csproj
│ │ ├── [Owner].Module.[Module].nuspec
│ │ ├── debug.cmd
│ │ ├── debug.sh
│ │ ├── icon.png
│ │ ├── release.cmd
│ │ └── release.sh
│ │ ├── Server
│ │ ├── AssemblyInfo.cs
│ │ ├── Controllers
│ │ │ └── [Module]Controller.cs
│ │ ├── Manager
│ │ │ └── [Module]Manager.cs
│ │ ├── Migrations
│ │ │ ├── 01000000_InitializeModule.cs
│ │ │ └── EntityBuilders
│ │ │ │ └── [Module]EntityBuilder.cs
│ │ ├── Repository
│ │ │ ├── I[Module]Repository.cs
│ │ │ ├── [Module]Context.cs
│ │ │ └── [Module]Repository.cs
│ │ ├── Services
│ │ │ └── [Module]Service.cs
│ │ ├── Startup
│ │ │ └── ServerStartup.cs
│ │ ├── [Owner].Module.[Module].Server.csproj
│ │ └── wwwroot
│ │ │ ├── Modules
│ │ │ └── [Owner].Module.[Module]
│ │ │ │ ├── Module.css
│ │ │ │ └── Module.js
│ │ │ └── _content
│ │ │ └── Placeholder.txt
│ │ ├── Shared
│ │ ├── Interfaces
│ │ │ └── I[Module]Service.cs
│ │ ├── Models
│ │ │ └── [Module].cs
│ │ └── [Owner].Module.[Module].Shared.csproj
│ │ ├── [Owner].Module.[Module].sln
│ │ └── template.json
│ ├── Oqtane.Server.lib.module.js
│ ├── Themes
│ ├── Oqtane.Themes.BlazorTheme
│ │ └── Theme.css
│ ├── Oqtane.Themes.OqtaneTheme
│ │ └── Theme.css
│ └── Templates
│ │ └── External
│ │ ├── Client
│ │ ├── AssemblyInfo.cs
│ │ ├── Containers
│ │ │ ├── Container1.razor
│ │ │ └── ContainerSettings.razor
│ │ ├── Resources
│ │ │ └── [Owner].Theme.[Theme]
│ │ │ │ ├── Container.resx
│ │ │ │ ├── ContainerSettings.resx
│ │ │ │ ├── Theme.resx
│ │ │ │ └── ThemeSettings.resx
│ │ ├── ThemeInfo.cs
│ │ ├── Themes
│ │ │ ├── Theme1.razor
│ │ │ └── ThemeSettings.razor
│ │ ├── [Owner].Theme.[Theme].Client.csproj
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ └── Themes
│ │ │ └── [Owner].Theme.[Theme]
│ │ │ └── Theme.css
│ │ ├── Package
│ │ ├── [Owner].Theme.[Theme].Package.csproj
│ │ ├── [Owner].Theme.[Theme].nuspec
│ │ ├── debug.cmd
│ │ ├── debug.sh
│ │ ├── icon.png
│ │ ├── release.cmd
│ │ └── release.sh
│ │ ├── [Owner].Theme.[Theme].sln
│ │ └── template.json
│ ├── _content
│ └── Placeholder.txt
│ ├── app_offline.bak
│ ├── css
│ ├── app.css
│ ├── open-iconic
│ │ ├── FONT-LICENSE
│ │ ├── ICON-LICENSE
│ │ ├── README.md
│ │ └── font
│ │ │ ├── css
│ │ │ └── open-iconic-bootstrap.min.css
│ │ │ └── fonts
│ │ │ ├── open-iconic.eot
│ │ │ ├── open-iconic.otf
│ │ │ ├── open-iconic.svg
│ │ │ ├── open-iconic.ttf
│ │ │ └── open-iconic.woff
│ └── quill
│ │ ├── quill.bubble.css
│ │ ├── quill.snow.css
│ │ ├── quill1.3.7.bubble.css
│ │ └── quill1.3.7.snow.css
│ ├── favicon.ico
│ ├── icon.png
│ ├── images
│ ├── checked.png
│ ├── error.png
│ ├── help.png
│ ├── logo-black.png
│ ├── logo-white.png
│ ├── null.png
│ └── unchecked.png
│ ├── js
│ ├── app.js
│ ├── interop.js
│ ├── loadjs.min.js
│ ├── quill-blot-formatter.min.js
│ ├── quill-interop.js
│ ├── quill.min.js
│ ├── quill.min.js.map
│ ├── quill1.3.7.min.js
│ └── reload.js
│ ├── loading.gif
│ ├── oqtane-black.png
│ ├── oqtane-glow.png
│ ├── oqtane-white.png
│ ├── oqtane.ico
│ ├── oqtane.png
│ ├── package.png
│ ├── resources.txt
│ ├── service-worker.js
│ └── users.txt
├── Oqtane.Shared
├── Documentation
│ ├── InternalApi.cs
│ ├── PrivateApi.cs
│ ├── PublicApi.cs
│ ├── WorkInProgressApi.cs
│ └── readme.md
├── Enums
│ ├── LogFunction.cs
│ ├── LogLevel.cs
│ ├── MigrationType.cs
│ ├── ResourceDeclaration.cs
│ ├── ResourceLevel.cs
│ ├── ResourceLoadBehavior.cs
│ ├── ResourceLocation.cs
│ ├── ResourceType.cs
│ ├── Runtime.cs
│ ├── SearchSortField.cs
│ ├── SearchSortOrder.cs
│ └── SecurityAccessLevel.cs
├── Extensions
│ ├── AssemblyExtensions.cs
│ └── EnumerableExtensions.cs
├── Interfaces
│ ├── IAuditable.cs
│ ├── IClientService.cs
│ ├── IClientStartup.cs
│ ├── IDatabaseConfigControl.cs
│ ├── IDeletable.cs
│ ├── IImageService.cs
│ ├── IModuleControl.cs
│ ├── ISearchProvider.cs
│ ├── ISearchService.cs
│ ├── ISearchable.cs
│ ├── IService.cs
│ ├── ISettingsControl.cs
│ ├── ITextEditor.cs
│ ├── IThemeControl.cs
│ ├── ITokenSource.cs
│ └── ITransientService.cs
├── Models
│ ├── Alias.cs
│ ├── Culture.cs
│ ├── Database.cs
│ ├── ExternalLoginProvider.cs
│ ├── File.cs
│ ├── Folder.cs
│ ├── Installation.cs
│ ├── Job.cs
│ ├── JobLog.cs
│ ├── Language.cs
│ ├── Log.cs
│ ├── MigrationHistoryTable.cs
│ ├── ModelBase.cs
│ ├── Module.cs
│ ├── ModuleContent.cs
│ ├── ModuleDefinition.cs
│ ├── Notification.cs
│ ├── Package.cs
│ ├── Page.cs
│ ├── PageModule.cs
│ ├── Permission.cs
│ ├── Profile.cs
│ ├── RequestCulture.cs
│ ├── Resource.cs
│ ├── Result.cs
│ ├── Role.cs
│ ├── Route.cs
│ ├── Script.cs
│ ├── SearchContent.cs
│ ├── SearchContentProperty.cs
│ ├── SearchContentWord.cs
│ ├── SearchQuery.cs
│ ├── SearchResult.cs
│ ├── SearchResults.cs
│ ├── SearchWord.cs
│ ├── Setting.cs
│ ├── Site.cs
│ ├── SiteTemplate.cs
│ ├── Sitemap.cs
│ ├── SqlQuery.cs
│ ├── Stylesheet.cs
│ ├── Sync.cs
│ ├── Template.cs
│ ├── Tenant.cs
│ ├── Theme.cs
│ ├── ThemeControl.cs
│ ├── TimeZone.cs
│ ├── UrlMapping.cs
│ ├── User.cs
│ ├── UserRole.cs
│ ├── UserValidateResult.cs
│ └── Visitor.cs
├── Modules
│ └── HtmlText
│ │ └── Models
│ │ └── HtmlText.cs
├── Oqtane.Shared.csproj
├── Security
│ └── UserSecurity.cs
└── Shared
│ ├── AuthenticationProviderTypes.cs
│ ├── Constants.cs
│ ├── ControllerRoutes.cs
│ ├── CookieRequestCultureProvider.cs
│ ├── EntityNames.cs
│ ├── ExternalLoginProviders.cs
│ ├── ExternalLoginStatus.cs
│ ├── FolderTypes.cs
│ ├── Icons.cs
│ ├── InstallConfig.cs
│ ├── OqtaneIgnoreAttribute.cs
│ ├── PaneNames.cs
│ ├── PermissionNames.cs
│ ├── PolicyNames.cs
│ ├── PropertyDictionary.cs
│ ├── RenderModes.cs
│ ├── RoleNames.cs
│ ├── Runtimes.cs
│ ├── SearchUtils.cs
│ ├── ServiceActivator.cs
│ ├── SettingKeys.cs
│ ├── SiteState.cs
│ ├── SyncEventActions.cs
│ ├── TenantNames.cs
│ ├── UserNames.cs
│ └── Utilities.cs
├── Oqtane.Updater.sln
├── Oqtane.Updater
├── Oqtane.Updater.csproj
└── Program.cs
├── Oqtane.sln
├── README.md
├── SECURITY.md
├── azuredeploy.json
├── installer.png
├── oqtane.png
└── screenshots
├── Architecture.png
├── Installer.png
├── databases.png
├── screenshot0.png
├── screenshot1.png
├── screenshot2.png
├── screenshot3.png
├── screenshot4.png
├── screenshot5.png
├── screenshot6.png
└── screenshot7.png
/.gitattributes:
--------------------------------------------------------------------------------
1 | Oqtane.Server/wwwroot/Modules/Templates/External/Package/*.sh eol=lf
2 | Oqtane.Server/wwwroot/Themes/Templates/External/Package/*.sh eol=lf
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug Report
3 | about: Create a bug report to help us improve the product
4 | title: "[BUG] "
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | ### Oqtane Info
11 |
12 | Version - #.#.#
13 | Render Mode - Static
14 | Interactivity - Server
15 | Database - SQL Server
16 |
17 | ### Describe the bug
18 |
19 |
20 | ### Expected Behavior
21 |
22 |
23 | ### Steps To Reproduce
24 |
25 |
26 | ### Anything else?
27 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/enhancement-request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Enhancement Request
3 | about: 'Suggest a product enhancement '
4 | title: "[ENH] "
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | ### Oqtane Info
11 |
12 | Version - #.#.#
13 | Render Mode - Static
14 | Interactivity - Server
15 | Database - SQL Server
16 |
17 | ### Describe the enhancement
18 |
19 |
20 | ### Anything else?
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vs/
2 | bin/
3 | obj/
4 | *.user
5 | artifacts/
6 | msbuild.binlog
7 | .vscode/
8 | *.binlog
9 | *.nupkg
10 | *.zip
11 |
12 | *.idea
13 | _ReSharper.Caches
14 | .DS_Store
15 |
16 | Oqtane.Server/appsettings.json
17 | Oqtane.Server/Data
18 |
19 | Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml
20 | Oqtane.Server/Content
21 | Oqtane.Server/Packages
22 | Oqtane.Server/wwwroot/Content
23 | Oqtane.Server/wwwroot/Packages/*.log
24 |
25 | Oqtane.Server/wwwroot/_content/*
26 | !Oqtane.Server/wwwroot/_content/Placeholder.txt
27 |
28 | Oqtane.Server/wwwroot/Modules/*
29 | !Oqtane.Server/wwwroot/Modules/Oqtane.Modules.*
30 | !Oqtane.Server/wwwroot/Modules/Templates
31 | Oqtane.Server/wwwroot/Modules/Templates/*
32 | !Oqtane.Server/wwwroot/Modules/Templates/External
33 |
34 | Oqtane.Server/wwwroot/Themes/*
35 | !Oqtane.Server/wwwroot/Themes/Oqtane.Themes.*
36 | !Oqtane.Server/wwwroot/Themes/Templates
37 | Oqtane.Server/wwwroot/Themes/Templates/*
38 | Oqtane.Server/wwwroot/Themes/Templates/External
39 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to Oqtane
2 |
3 | ## How to Contribute
4 |
5 | We track all of our issues on Github. If you want to contribute, everything starts with an issue. If you don't have an issue yet, you can add one. Then a core contributor will tag it as either an enhancement [ENH] or a bug [BUG]. Tagged issues are open for contribution.
6 |
7 | ## Use GitHub-flow process
8 | - Make a comment on the issue that you intend to work on it and read all the comments to gain a full understanding.
9 | - Fork the repository
10 | - Create a new branch and update your comment on the issue with a llink to the branch
11 | - Make your changes and commit them
12 | - Push to the branch
13 | - Create a pull request
14 |
15 | ## Reporting Bugs
16 |
17 | - Check if the issue has already been reported.
18 | - Open a new issue if it hasn’t been reported.
19 |
20 | ## Requesting Features
21 |
22 | - Use the feature request template in the Issues tab.
23 |
24 | Thank you for contributing!
25 |
--------------------------------------------------------------------------------
/Oqtane.Client/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 | using Microsoft.Extensions.Localization;
3 |
4 | [assembly: RootNamespace("Oqtane")]
5 | [assembly: InternalsVisibleTo("Oqtane.Server")]
6 |
--------------------------------------------------------------------------------
/Oqtane.Client/IconResources.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane
2 | {
3 | ///
4 | /// Dummy class used to collect shared resource strings for this application
5 | ///
6 | ///
7 | /// This class is mostly used with IStringLocalizer and IHtmlLocalizer interfaces.
8 | /// The class must reside at the project root.
9 | ///
10 | public class IconResources
11 | {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Client/Installer/Controls/SqliteConfig.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Installer.Controls
2 | @implements Oqtane.Interfaces.IDatabaseConfigControl
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | @code {
12 | private string _server = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm") + ".db";
13 |
14 | public string GetConnectionString()
15 | {
16 | var connectionstring = String.Empty;
17 |
18 | if (!String.IsNullOrEmpty(_server))
19 | {
20 | connectionstring = $"Data Source={_server};";
21 | }
22 |
23 | return connectionstring;
24 | }
25 | }
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/Error/Index.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Modules.Admin.Error
2 | @inherits ModuleBase
3 | @inject IModuleService ModuleService
4 | @inject IStringLocalizer Localizer
5 |
6 | @code {
7 | public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;
8 |
9 | protected override async Task OnInitializedAsync()
10 | {
11 | Module module = await ModuleService.GetModuleAsync(ModuleState.ModuleId);
12 | if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
13 | {
14 | AddModuleMessage(string.Format(Localizer["Error.Module.Load"], module.ModuleDefinitionName), MessageType.Error);
15 | }
16 |
17 | await logger.LogCritical("Error Loading Module {Module}", module);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/Files/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Modules.Admin.Files
6 | {
7 | [PrivateApi("Mark this as private, since it's not very useful in the public docs")]
8 | public class ModuleInfo : IModule
9 | {
10 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
11 | {
12 | Name = "File Management",
13 | Description = "File Management",
14 | Version = Constants.Version,
15 | Categories = "Admin",
16 | ServerManagerType = "Oqtane.Modules.Admin.Files.Manager.FileManager, Oqtane.Server"
17 | };
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/Profiles/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Modules.Admin.Profiles
6 | {
7 | [PrivateApi("Mark this as private, since it's not very useful in the public docs")]
8 | public class ModuleInfo : IModule
9 | {
10 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
11 | {
12 | Name = "Profiles",
13 | Description = "Manage Profiles",
14 | Categories = "Admin",
15 | Version = Constants.Version,
16 | PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
17 | $"{EntityNames.Profile}:{PermissionNames.Write}:{RoleNames.Admin}"
18 | };
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/Roles/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Modules.Admin.Roles
6 | {
7 | [PrivateApi("Mark this as private, since it's not very useful in the public docs")]
8 | public class ModuleInfo : IModule
9 | {
10 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
11 | {
12 | Name = "Roles",
13 | Description = "Manage Roles",
14 | Categories = "Admin",
15 | Version = Constants.Version,
16 | PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
17 | $"{EntityNames.Role}:{PermissionNames.Write}:{RoleNames.Admin}," +
18 | $"{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}"
19 | };
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/SearchResults/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Modules.Admin.SearchResults
6 | {
7 | [PrivateApi("Mark this as private, since it's not very useful in the public docs")]
8 | public class ModuleInfo : IModule
9 | {
10 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
11 | {
12 | Name = "Search Results",
13 | Description = "Search Results",
14 | Categories = "Admin",
15 | Version = Constants.Version,
16 | SettingsType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client"
17 | };
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Admin/Users/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Modules.Admin.Users
6 | {
7 | [PrivateApi("Mark this as private, since it's not very useful in the public docs")]
8 | public class ModuleInfo : IModule
9 | {
10 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
11 | {
12 | Name = "Users",
13 | Description = "Manage Users",
14 | Categories = "Admin",
15 | Version = Constants.Version,
16 | PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
17 | $"{EntityNames.User}:{PermissionNames.Write}:{RoleNames.Admin}," +
18 | $"{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}"
19 | };
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/Controls/TextAreaTextEditor.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Modules.Controls
2 | @inherits ModuleControlBase
3 | @implements ITextEditor
4 |
5 |
6 |
7 |
8 |
9 | @code {
10 | public string Name => "TextArea";
11 |
12 | private ElementReference _editor;
13 | private string _content;
14 |
15 | [Parameter]
16 | public bool ReadOnly { get; set; }
17 |
18 | [Parameter]
19 | public string Placeholder { get; set; }
20 |
21 | public void Initialize(string content)
22 | {
23 | _content = content;
24 |
25 | StateHasChanged();
26 | }
27 |
28 | public async Task GetContent()
29 | {
30 | await Task.CompletedTask;
31 | return _content;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/HtmlText/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Documentation;
3 | using Oqtane.Models;
4 | using Oqtane.Shared;
5 |
6 | namespace Oqtane.Modules.HtmlText
7 | {
8 | [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
9 | public class ModuleInfo : IModule
10 | {
11 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
12 | {
13 | Name = "HtmlText",
14 | Description = "Renders HTML or Text Content",
15 | Version = "1.0.1",
16 | ServerManagerType = "Oqtane.Modules.HtmlText.Manager.HtmlTextManager, Oqtane.Server",
17 | ReleaseVersions = "1.0.0,1.0.1",
18 | SettingsType = "Oqtane.Modules.HtmlText.Settings, Oqtane.Client",
19 | Resources = new List()
20 | {
21 | new Resource { ResourceType = ResourceType.Stylesheet, Url = "~/Module.css" }
22 | }
23 | };
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Documentation;
4 |
5 | namespace Oqtane.Modules.HtmlText.Services
6 | {
7 | [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
8 | public interface IHtmlTextService
9 | {
10 | Task> GetHtmlTextsAsync(int moduleId);
11 |
12 | Task GetHtmlTextAsync(int moduleId);
13 |
14 | Task GetHtmlTextAsync(int htmlTextId, int moduleId);
15 |
16 | Task AddHtmlTextAsync(Models.HtmlText htmltext);
17 |
18 | Task DeleteHtmlTextAsync(int htmlTextId, int moduleId);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/IModule.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Modules
4 | {
5 | public interface IModule
6 | {
7 | ModuleDefinition ModuleDefinition { get; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/MessageType.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Modules
2 | {
3 | public enum MessageType
4 | {
5 | Success,
6 | Info,
7 | Warning,
8 | Error,
9 | Undefined
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Client/Modules/ModuleControlBase.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Shared;
2 |
3 | namespace Oqtane.Modules
4 | {
5 | [OqtaneIgnore]
6 | public abstract class ModuleControlBase : ModuleBase
7 | {
8 |
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Client/Oqtane.Client.csproj.DotSettings:
--------------------------------------------------------------------------------
1 |
2 | True
--------------------------------------------------------------------------------
/Oqtane.Client/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "iisSettings": {
3 | "windowsAuthentication": false,
4 | "anonymousAuthentication": true,
5 | "iisExpress": {
6 | "applicationUrl": "http://localhost:44358/",
7 | "sslPort": 0
8 | }
9 | },
10 | "profiles": {
11 | "Oqtane": {
12 | "commandName": "Project",
13 | "launchBrowser": true,
14 | "environmentVariables": {
15 | "ASPNETCORE_ENVIRONMENT": "Development"
16 | },
17 | "applicationUrl": "http://localhost:44358/"
18 | },
19 | "IIS Express": {
20 | "commandName": "IISExpress",
21 | "launchBrowser": true,
22 | "environmentVariables": {
23 | "ASPNETCORE_ENVIRONMENT": "Development"
24 | }
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/Oqtane.Client/Services/DatabaseService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Threading.Tasks;
3 | using System.Net.Http;
4 | using System.Linq;
5 | using System.Collections.Generic;
6 | using Oqtane.Documentation;
7 | using Oqtane.Shared;
8 |
9 | namespace Oqtane.Services
10 | {
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class DatabaseService : ServiceBase, IDatabaseService
13 | {
14 | public DatabaseService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string Apiurl => CreateApiUrl("Database");
17 |
18 | public async Task> GetDatabasesAsync()
19 | {
20 | List databases = await GetJsonAsync>(Apiurl);
21 | return databases.OrderBy(item => item.Name).ToList();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/IDatabaseService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to retrieve information.
9 | ///
10 | public interface IDatabaseService
11 | {
12 | ///
13 | /// Returns a list of databases
14 | ///
15 | ///
16 | Task> GetDatabasesAsync();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/IJobLogService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to read the job schedule log
9 | ///
10 | public interface IJobLogService
11 | {
12 | ///
13 | /// Return a list of entries
14 | ///
15 | ///
16 | ///
17 | Task> GetJobLogsAsync(int jobId);
18 |
19 | ///
20 | /// Return a entry for the given Id
21 | ///
22 | ///
23 | ///
24 | Task GetJobLogAsync(int jobLogId);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ILocalizationCookieService.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace Oqtane.Services
4 | {
5 | ///
6 | /// Service to set localization cookie
7 | ///
8 | public interface ILocalizationCookieService
9 | {
10 | ///
11 | /// Set the localization cookie
12 | ///
13 | ///
14 | ///
15 | Task SetLocalizationCookieAsync(string culture);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ILocalizationService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to retrieve localizations ()
9 | ///
10 | public interface ILocalizationService
11 | {
12 | ///
13 | /// Returns a collection of supported cultures
14 | ///
15 | ///
16 | Task> GetCulturesAsync(bool installed);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/IOutputCacheService.cs:
--------------------------------------------------------------------------------
1 | using System.Threading;
2 | using System.Threading.Tasks;
3 |
4 | namespace Oqtane.Services
5 | {
6 | ///
7 | /// Service to manage cache
8 | ///
9 | public interface IOutputCacheService
10 | {
11 | ///
12 | /// Evicts the output cache for a specific tag
13 | ///
14 | ///
15 | ///
16 | Task EvictByTag(string tag);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ISearchResultsService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Documentation;
4 | using Oqtane.Models;
5 |
6 | namespace Oqtane.Services
7 | {
8 | [PrivateApi("Mark SearchResults classes as private, since it's not very useful in the public docs")]
9 | public interface ISearchResultsService
10 | {
11 | Task GetSearchResultsAsync(SearchQuery searchQuery);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ISiteTemplateService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to retrieve entries
9 | ///
10 | public interface ISiteTemplateService
11 | {
12 | ///
13 | /// Returns a list of site templates
14 | ///
15 | ///
16 | Task> GetSiteTemplatesAsync();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ISqlService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Threading.Tasks;
3 |
4 | namespace Oqtane.Services
5 | {
6 | ///
7 | /// Service to execute a against the backend database
8 | ///
9 | public interface ISqlService
10 | {
11 | ///
12 | /// Executes a sql query and returns its result
13 | ///
14 | ///
15 | ///
16 | Task ExecuteQueryAsync(SqlQuery sqlquery);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ISyncService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System;
3 | using System.Threading.Tasks;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to retrieve information.
9 | ///
10 | public interface ISyncService
11 | {
12 | ///
13 | /// Get sync events
14 | ///
15 | ///
16 | ///
17 | Task GetSyncEventsAsync(DateTime lastSyncDate);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ITenantService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to manage s on the Oqtane installation.
9 | ///
10 | public interface ITenantService
11 | {
12 | ///
13 | /// Get all s
14 | ///
15 | ///
16 | Task> GetTenantsAsync();
17 |
18 | ///
19 | /// Get one specific
20 | ///
21 | /// ID-reference of the
22 | ///
23 | Task GetTenantAsync(int tenantId);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/ITimeZoneService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Services
6 | {
7 | ///
8 | /// Service to store and retrieve entries
9 | ///
10 | public interface ITimeZoneService
11 | {
12 | ///
13 | /// Get the list of time zones
14 | ///
15 | ///
16 | Task> GetTimeZonesAsync();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/Interfaces/IVisitorService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Threading.Tasks;
5 |
6 | namespace Oqtane.Services
7 | {
8 | ///
9 | /// Service to manage s on a
10 | ///
11 | public interface IVisitorService
12 | {
13 | ///
14 | /// Get all s of this .
15 | ///
16 | ///
17 | /// ID-reference of a
18 | ///
19 | Task> GetVisitorsAsync(int siteId, DateTime fromDate);
20 |
21 | ///
22 | /// Get a specific of this .
23 | ///
24 | ///
25 | /// ID-reference of a
26 | ///
27 | Task GetVisitorAsync(int visitorId);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/JobLogService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Threading.Tasks;
3 | using System.Net.Http;
4 | using System.Linq;
5 | using System.Collections.Generic;
6 | using Oqtane.Documentation;
7 | using Oqtane.Shared;
8 |
9 | namespace Oqtane.Services
10 | {
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class JobLogService : ServiceBase, IJobLogService
13 | {
14 | public JobLogService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string Apiurl => CreateApiUrl("JobLog");
17 |
18 | public async Task> GetJobLogsAsync(int jobId)
19 | {
20 | return await GetJsonAsync>($"{Apiurl}?jobid={jobId}");
21 | }
22 |
23 | public async Task GetJobLogAsync(int jobLogId)
24 | {
25 | return await GetJsonAsync($"{Apiurl}/{jobLogId}");
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/LocalizationCookieService.cs:
--------------------------------------------------------------------------------
1 | using System.Net.Http;
2 | using System.Threading.Tasks;
3 | using Oqtane.Documentation;
4 | using Oqtane.Shared;
5 |
6 | namespace Oqtane.Services
7 | {
8 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
9 | public class LocalizationCookieService : ServiceBase, ILocalizationCookieService
10 | {
11 | public LocalizationCookieService(HttpClient http, SiteState siteState) : base(http, siteState) { }
12 |
13 | public Task SetLocalizationCookieAsync(string culture)
14 | {
15 | return Task.CompletedTask; // only used in server side rendering
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/LocalizationService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Net.Http;
3 | using System.Threading.Tasks;
4 | using Oqtane.Documentation;
5 | using Oqtane.Models;
6 | using Oqtane.Shared;
7 |
8 | namespace Oqtane.Services
9 | {
10 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
11 | public class LocalizationService : ServiceBase, ILocalizationService
12 | {
13 | public LocalizationService(HttpClient http, SiteState siteState) : base(http, siteState) { }
14 |
15 | private string Apiurl => CreateApiUrl("Localization");
16 |
17 | public async Task> GetCulturesAsync(bool installed) => await GetJsonAsync>($"{Apiurl}?installed={installed}");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/OutputCacheService.cs:
--------------------------------------------------------------------------------
1 | using System.Net.Http;
2 | using System.Threading;
3 | using System.Threading.Tasks;
4 |
5 | using Oqtane.Documentation;
6 | using Oqtane.Shared;
7 |
8 | namespace Oqtane.Services
9 | {
10 | ///
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class OutputCacheService : ServiceBase, IOutputCacheService
13 | {
14 | public OutputCacheService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string ApiUrl => CreateApiUrl("OutputCache");
17 |
18 | public async Task EvictByTag(string tag)
19 | {
20 | await DeleteAsync($"{ApiUrl}/{tag}");
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/SearchResultsService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Net.Http;
3 | using System.Threading.Tasks;
4 | using Oqtane.Documentation;
5 | using Oqtane.Models;
6 | using Oqtane.Modules;
7 | using Oqtane.Shared;
8 |
9 | namespace Oqtane.Services
10 | {
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class SearchResultsService : ServiceBase, ISearchResultsService, IClientService
13 | {
14 | public SearchResultsService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string ApiUrl => CreateApiUrl("SearchResults");
17 |
18 | public async Task GetSearchResultsAsync(SearchQuery searchQuery)
19 | {
20 | return await PostJsonAsync(ApiUrl, searchQuery);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/SiteTemplateService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using Oqtane.Shared;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Net.Http;
6 | using System.Threading.Tasks;
7 | using Oqtane.Documentation;
8 |
9 | namespace Oqtane.Services
10 | {
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class SiteTemplateService : ServiceBase, ISiteTemplateService
13 | {
14 | public SiteTemplateService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string Apiurl => CreateApiUrl("SiteTemplate");
17 |
18 | public async Task> GetSiteTemplatesAsync()
19 | {
20 | List siteTemplates = await GetJsonAsync>(Apiurl);
21 | return siteTemplates.OrderBy(item => item.Name).ToList();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/SqlService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using Oqtane.Shared;
3 | using System.Net.Http;
4 | using System.Threading.Tasks;
5 | using Oqtane.Documentation;
6 |
7 | namespace Oqtane.Services
8 | {
9 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
10 | public class SqlService : ServiceBase, ISqlService
11 | {
12 | public SqlService(HttpClient http, SiteState siteState) : base(http, siteState) { }
13 |
14 | private string Apiurl => CreateApiUrl("Sql");
15 |
16 | public async Task ExecuteQueryAsync(SqlQuery sqlquery)
17 | {
18 | return await PostJsonAsync(Apiurl, sqlquery);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/SyncService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Threading.Tasks;
3 | using System.Net.Http;
4 | using System;
5 | using Oqtane.Documentation;
6 | using Oqtane.Shared;
7 | using System.Globalization;
8 |
9 | namespace Oqtane.Services
10 | {
11 | ///
12 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
13 | public class SyncService : ServiceBase, ISyncService
14 | {
15 | public SyncService(HttpClient http, SiteState siteState) : base(http, siteState) { }
16 |
17 | private string ApiUrl => CreateApiUrl("Sync");
18 |
19 | ///
20 | public async Task GetSyncEventsAsync(DateTime lastSyncDate)
21 | {
22 | return await GetJsonAsync($"{ApiUrl}/{lastSyncDate.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture)}");
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/TenantService.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Net.Http;
3 | using System.Threading.Tasks;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using Oqtane.Documentation;
7 | using Oqtane.Shared;
8 |
9 | namespace Oqtane.Services
10 | {
11 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
12 | public class TenantService : ServiceBase, ITenantService
13 | {
14 | public TenantService(HttpClient http, SiteState siteState) : base(http, siteState) { }
15 |
16 | private string Apiurl => CreateApiUrl("Tenant");
17 |
18 | public async Task> GetTenantsAsync()
19 | {
20 | List tenants = await GetJsonAsync>(Apiurl);
21 | return tenants.OrderBy(item => item.Name).ToList();
22 | }
23 |
24 | public async Task GetTenantAsync(int tenantId)
25 | {
26 | return await GetJsonAsync($"{Apiurl}/{tenantId}");
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Client/Services/TimeZoneService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Net.Http;
3 | using System.Threading.Tasks;
4 | using Oqtane.Documentation;
5 | using Oqtane.Models;
6 | using Oqtane.Shared;
7 |
8 | namespace Oqtane.Services
9 | {
10 | [PrivateApi("Don't show in the documentation, as everything should use the Interface")]
11 | public class TimeZoneService : ServiceBase, ITimeZoneService
12 | {
13 | public TimeZoneService(HttpClient http, SiteState siteState) : base(http, siteState) { }
14 |
15 | private string Apiurl => CreateApiUrl("TimeZone");
16 |
17 | public async Task> GetTimeZonesAsync()
18 | {
19 | return await GetJsonAsync>($"{Apiurl}");
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Oqtane.Client/SharedResources.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane
2 | {
3 | ///
4 | /// Dummy class used to collect shared resource strings for this application
5 | ///
6 | ///
7 | /// This class is mostly used with IStringLocalizer and IHtmlLocalizer interfaces.
8 | /// The class must reside at the project root.
9 | ///
10 | public class SharedResources
11 | {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/AdminContainer.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes
2 | @inherits ContainerBase
3 |
4 |
19 |
20 | @code {
21 | private string _url;
22 |
23 | protected override void OnParametersSet()
24 | {
25 | _url = (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl();
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/BlazorTheme/Containers/Container.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes.BlazorTheme
2 | @inherits ContainerBase
3 |
4 | @if (ModuleState.Title != "-")
5 | {
6 |
12 | }
13 | else
14 | {
15 |
16 | }
17 |
22 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Documentation;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Themes.BlazorTheme
5 | {
6 | [PrivateApi("Mark Build-In Theme-Info classes as private, since it's not very useful in the public docs")]
7 | public class ThemeInfo : ITheme
8 | {
9 | public Theme Theme => new Theme
10 | {
11 | Name = "Blazor Theme",
12 | Version = "1.0.0"
13 | };
14 |
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/ContainerBase.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Components;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Themes
5 | {
6 | public abstract class ContainerBase : ThemeBase, IContainerControl
7 | {
8 | [CascadingParameter]
9 | protected Module ModuleState { get; set; }
10 |
11 | protected override bool ShouldRender()
12 | {
13 | return PageState?.RenderId == ModuleState?.RenderId;
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/Controls/Theme/Logo.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes.Controls
2 | @inherits ThemeControlBase
3 |
4 | @if (PageState.Site.LogoFileId != null)
5 | {
6 |
7 |
8 |
9 |
10 |
11 | }
12 | else
13 | {
14 | if (UseSiteNameAsFallback)
15 | {
16 |
17 | @PageState.Site.Name
18 |
19 | }
20 | }
21 |
22 | @code {
23 | [Parameter]
24 | public bool UseSiteNameAsFallback { get; set; } = false; // indicates if the site name should be displayed in scenarios where a site does not have a logo defined
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/Controls/Theme/Menu.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes.Controls
2 |
3 | @switch (Orientation)
4 | {
5 | case "Horizontal":
6 |
7 | break;
8 | default: // Vertical
9 | {
10 |
11 | break;
12 | }
13 | }
14 |
15 | @code{
16 |
17 | [Parameter]
18 | public string Orientation { get; set; }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes.Controls
2 |
3 | @inherits MenuBase
4 |
5 | @if (MenuPages.Any())
6 | {
7 |
8 |
11 |
12 |
13 |
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/Controls/Theme/MenuItemsBase.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 |
4 | using Microsoft.AspNetCore.Components;
5 |
6 | using Oqtane.Models;
7 | using Oqtane.UI;
8 |
9 | namespace Oqtane.Themes.Controls
10 | {
11 | public abstract class MenuItemsBase : MenuBase
12 | {
13 | [Parameter()]
14 | public Page ParentPage { get; set; }
15 |
16 | [Parameter()]
17 | public IEnumerable Pages { get; set; }
18 |
19 | protected IEnumerable GetChildPages()
20 | {
21 | return Pages
22 | .Where(e => e.ParentId == ParentPage?.PageId)
23 | .OrderBy(e => e.Order)
24 | .AsEnumerable();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/Controls/Theme/MenuVertical.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes.Controls
2 | @inherits MenuBase
3 |
4 | @if (MenuPages.Any())
5 | {
6 |
11 |
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/DefaultContainer.razor:
--------------------------------------------------------------------------------
1 | @namespace Oqtane.Themes
2 | @inherits ContainerBase
3 |
8 |
9 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/IContainerControl.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Themes
2 | {
3 | public interface IContainerControl
4 | {
5 |
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/ILayoutControl.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Themes
2 | {
3 | public interface ILayoutControl
4 | {
5 |
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/ITheme.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Themes
4 | {
5 | public interface ITheme
6 | {
7 | Theme Theme { get; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/LayoutBase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Themes
4 | {
5 | [Obsolete("This class is deprecated", false)]
6 | public abstract class LayoutBase : ThemeBase, ILayoutControl
7 | {
8 |
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Client/Themes/ThemeControlBase.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Shared;
2 |
3 | namespace Oqtane.Themes
4 | {
5 | [OqtaneIgnore]
6 | public abstract class ThemeControlBase : ThemeBase
7 | {
8 |
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Client/UI/InteractiveRenderMode.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Components.Web;
2 | using Microsoft.AspNetCore.Components;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.UI
6 | {
7 | public static class InteractiveRenderMode
8 | {
9 | public static IComponentRenderMode GetInteractiveRenderMode(string runtime, bool prerender)
10 | {
11 | switch (runtime)
12 | {
13 | case Runtimes.Server:
14 | return new InteractiveServerRenderMode(prerender: prerender);
15 | case Runtimes.WebAssembly:
16 | return new InteractiveWebAssemblyRenderMode(prerender: prerender);
17 | case Runtimes.Auto:
18 | return new InteractiveAutoRenderMode(prerender: prerender);
19 | }
20 | return new InteractiveServerRenderMode(prerender: prerender);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Client/UI/ModuleInstance.placeholder.cs:
--------------------------------------------------------------------------------
1 | // This is just a placeholder file
2 | // It is necessary for the documentation to successfully build this project.
3 | // Reason is that docfx will run the .net compiler and find references
4 | // to this class in the project.
5 | // But since the real class is just a .razor file, ATM docfx will fail.
6 | //
7 | // Note added 2024-06-27 by @iJungleboy.
8 | // We hope that as .net and docfx improve, the razor-compiler will work in that scenario
9 | // as well, and this file can be removed.
10 |
11 | namespace Oqtane.UI;
12 |
13 | public partial class ModuleInstance;
14 |
--------------------------------------------------------------------------------
/Oqtane.Client/UI/RenderModeBoundary.placeholder.cs:
--------------------------------------------------------------------------------
1 | // This is just a placeholder file
2 | // It is necessary for the documentation to successfully build this project.
3 | // Reason is that docfx will run the .net compiler and find references
4 | // to this class in the project.
5 | // But since the real class is just a .razor file, ATM docfx will fail.
6 | //
7 | // Note added 2024-06-27 by @iJungleboy.
8 | // We hope that as .net and docfx improve, the razor-compiler will work in that scenario
9 | // as well, and this file can be removed.
10 |
11 | namespace Oqtane.UI;
12 |
13 | public partial class RenderModeBoundary;
14 |
--------------------------------------------------------------------------------
/Oqtane.Client/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System
2 | @using System.Linq
3 | @using System.Collections.Generic
4 | @using System.Net.Http
5 | @using System.Net.Http.Json
6 |
7 | @using Microsoft.AspNetCore.Components.Authorization
8 | @using Microsoft.AspNetCore.Components.Forms
9 | @using Microsoft.AspNetCore.Components.Routing
10 | @using Microsoft.AspNetCore.Components.Web
11 | @using Microsoft.AspNetCore.Components.Web.Virtualization
12 | @using Microsoft.Extensions.Localization
13 | @using Microsoft.JSInterop
14 | @using static Microsoft.AspNetCore.Components.Web.RenderMode
15 |
16 | @using Oqtane.Client
17 | @using Oqtane.Models
18 | @using Oqtane.Modules
19 | @using Oqtane.Modules.Controls
20 | @using Oqtane.Providers
21 | @using Oqtane.Security
22 | @using Oqtane.Services
23 | @using Oqtane.Shared
24 | @using Oqtane.Themes
25 | @using Oqtane.Themes.Controls
26 | @using Oqtane.UI
27 | @using Oqtane.Enums
28 | @using Oqtane.Installer
29 | @using Oqtane.Interfaces
30 |
--------------------------------------------------------------------------------
/Oqtane.Maui/App.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Maui;
2 |
3 | public partial class App : Application
4 | {
5 | public App()
6 | {
7 | InitializeComponent();
8 | }
9 |
10 | protected override Window CreateWindow(IActivationState activationState)
11 | {
12 | return new Window(new MainPage());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Head.razor:
--------------------------------------------------------------------------------
1 | @using Oqtane.Shared;
2 |
3 |
4 |
5 | @code {
6 | Type ComponentType = Type.GetType("Oqtane.UI.Head, Oqtane.Client");
7 | private IDictionary Parameters { get; set; }
8 |
9 | protected override void OnInitialized()
10 | {
11 | Parameters = new Dictionary();
12 | Parameters.Add(new KeyValuePair("RenderMode", RenderModes.Interactive));
13 | Parameters.Add(new KeyValuePair("Runtime", Runtimes.Hybrid));
14 | }
15 | }
16 |
17 |
--------------------------------------------------------------------------------
/Oqtane.Maui/MainPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Oqtane.Maui/MainPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Maui;
2 |
3 | public partial class MainPage : ContentPage
4 | {
5 | public MainPage()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Maui/MauiConstants.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Maui;
2 |
3 | public static class MauiConstants
4 | {
5 | // the API service url (used as fallback if not set in appsettings.json)
6 | public static string ApiUrl = "";
7 | //public static string ApiUrl = "http://localhost:44357/"; // for local development (Oqtane.Server must be already running for MAUI client to connect)
8 | //public static string apiurl = "http://localhost:44357/sitename/"; // local microsite example
9 | //public static string apiurl = "https://www.dnfprojects.com/"; // for testing remote site
10 |
11 | // specify if you wish to allow users to override the url via appsettings.json in the AppDataDirectory
12 | public static bool UseAppSettings = true;
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Android/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Android/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Content.PM;
3 | using Android.OS;
4 |
5 | namespace Oqtane.Maui;
6 |
7 | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
8 | public class MainActivity : MauiAppCompatActivity
9 | {
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Android/MainApplication.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Runtime;
3 |
4 | namespace Oqtane.Maui;
5 |
6 | [Application]
7 | public class MainApplication : MauiApplication
8 | {
9 | public MainApplication(IntPtr handle, JniHandleOwnership ownership)
10 | : base(handle, ownership)
11 | {
12 | }
13 |
14 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Android/Resources/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #512BD4
4 | #2B0B98
5 | #2B0B98
6 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Android/Resources/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 10.0.2.2
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/MacCatalyst/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using Foundation;
2 |
3 | namespace Oqtane.Maui;
4 |
5 | [Register("AppDelegate")]
6 | public class AppDelegate : MauiUIApplicationDelegate
7 | {
8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/MacCatalyst/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIDeviceFamily
6 |
7 | 1
8 | 2
9 |
10 | UIRequiredDeviceCapabilities
11 |
12 | arm64
13 |
14 | UISupportedInterfaceOrientations
15 |
16 | UIInterfaceOrientationPortrait
17 | UIInterfaceOrientationLandscapeLeft
18 | UIInterfaceOrientationLandscapeRight
19 |
20 | UISupportedInterfaceOrientations~ipad
21 |
22 | UIInterfaceOrientationPortrait
23 | UIInterfaceOrientationPortraitUpsideDown
24 | UIInterfaceOrientationLandscapeLeft
25 | UIInterfaceOrientationLandscapeRight
26 |
27 | XSAppIconAssets
28 | Assets.xcassets/appicon.appiconset
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/MacCatalyst/Program.cs:
--------------------------------------------------------------------------------
1 | using ObjCRuntime;
2 | using UIKit;
3 |
4 | namespace Oqtane.Maui;
5 |
6 | public class Program
7 | {
8 | // This is the main entry point of the application.
9 | static void Main(string[] args)
10 | {
11 | // if you want to use a different Application Delegate class from "AppDelegate"
12 | // you can specify it here.
13 | UIApplication.Main(args, null, typeof(AppDelegate));
14 | }
15 | }
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Tizen/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.Maui;
3 | using Microsoft.Maui.Hosting;
4 |
5 | namespace Oqtane.Maui;
6 |
7 | class Program : MauiApplication
8 | {
9 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
10 |
11 | static void Main(string[] args)
12 | {
13 | var app = new Program();
14 | app.Run(args);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Tizen/tizen-manifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | appicon.xhigh.png
7 |
8 |
9 |
10 |
11 | http://tizen.org/privilege/internet
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Windows/App.xaml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Windows/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.UI.Xaml;
2 |
3 | // To learn more about WinUI, the WinUI project structure,
4 | // and more about our project templates, see: http://aka.ms/winui-project-info.
5 |
6 | namespace Oqtane.Maui.WinUI;
7 |
8 | ///
9 | /// Provides application-specific behavior to supplement the default Application class.
10 | ///
11 | public partial class App : MauiWinUIApplication
12 | {
13 | ///
14 | /// Initializes the singleton application object. This is the first line of authored code
15 | /// executed, and as such is the logical equivalent of main() or WinMain().
16 | ///
17 | public App()
18 | {
19 | this.InitializeComponent();
20 | }
21 |
22 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
23 | }
24 |
25 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/Windows/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 | true/PM
12 | PerMonitorV2, PerMonitor
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using Foundation;
2 |
3 | namespace Oqtane.Maui;
4 |
5 | [Register("AppDelegate")]
6 | public class AppDelegate : MauiUIApplicationDelegate
7 | {
8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Platforms/iOS/Program.cs:
--------------------------------------------------------------------------------
1 | using ObjCRuntime;
2 | using UIKit;
3 |
4 | namespace Oqtane.Maui;
5 |
6 | public class Program
7 | {
8 | // This is the main entry point of the application.
9 | static void Main(string[] args)
10 | {
11 | // if you want to use a different Application Delegate class from "AppDelegate"
12 | // you can specify it here.
13 | UIApplication.Main(args, null, typeof(AppDelegate));
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "Windows Machine": {
4 | "commandName": "Project",
5 | "nativeDebugging": false
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/Oqtane.Maui/Resources/AppIcon/appicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
20 |
--------------------------------------------------------------------------------
/Oqtane.Maui/Resources/Fonts/OpenSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/Resources/Fonts/OpenSans-Regular.ttf
--------------------------------------------------------------------------------
/Oqtane.Maui/Resources/Raw/AboutAssets.txt:
--------------------------------------------------------------------------------
1 | Any raw assets you want to be deployed with your application can be placed in
2 | this directory (and child directories). Deployment of the asset to your application
3 | is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
4 |
5 |
6 |
7 | These files will be deployed with you package and will be accessible using Essentials:
8 |
9 | async Task LoadMauiAsset()
10 | {
11 | using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
12 | using var reader = new StreamReader(stream);
13 |
14 | var contents = reader.ReadToEnd();
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Maui/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System.Net.Http
2 | @using Microsoft.AspNetCore.Components.Forms
3 | @using Microsoft.AspNetCore.Components.Routing
4 | @using Microsoft.AspNetCore.Components.Web
5 | @using Microsoft.AspNetCore.Components.Web.Virtualization
6 | @using Microsoft.JSInterop
7 | @using Oqtane.Maui
8 |
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/css/empty.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/css/empty.css
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.eot
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.otf
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/css/open-iconic/font/fonts/open-iconic.woff
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/favicon.ico
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/checked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/checked.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/error.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/help.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/help.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/logo-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/logo-black.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/logo-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/logo-white.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/null.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/null.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/images/unchecked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/images/unchecked.png
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Oqtane Maui
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | Loading...
19 |
20 |
21 | An unhandled error has occurred.
22 |
Reload
23 |
🗙
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/js/app.js:
--------------------------------------------------------------------------------
1 | function subMenu(a) {
2 | event.preventDefault();
3 | event.stopPropagation();
4 |
5 | var li = a.parentElement, submenu = li.getElementsByTagName('ul')[0];
6 | submenu.style.display = submenu.style.display == "block" ? "none" : "block";
7 | return false;
8 | }
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/loading.gif
--------------------------------------------------------------------------------
/Oqtane.Maui/wwwroot/oqtane-glow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Maui/wwwroot/oqtane-glow.png
--------------------------------------------------------------------------------
/Oqtane.Package/Oqtane.Framework.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Oqtane.Framework
5 | 6.1.3
6 | Shaun Walker
7 | .NET Foundation
8 | Oqtane Framework
9 | A modular application framework for Blazor
10 | A modular application framework for Blazor
11 | .NET Foundation
12 | false
13 | MIT
14 | https://github.com/oqtane/oqtane.framework/releases/download/v6.1.3/Oqtane.Framework.6.1.3.Upgrade.zip
15 | https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.3
16 | readme.md
17 | icon.png
18 | oqtane framework
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Oqtane.Package/Oqtane.Updater.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Oqtane.Updater
5 | 6.1.3
6 | Shaun Walker
7 | .NET Foundation
8 | Oqtane Framework
9 | A modular application framework for Blazor
10 | A modular application framework for Blazor
11 | .NET Foundation
12 | false
13 | MIT
14 | https://github.com/oqtane/oqtane.framework
15 | https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.3
16 | readme.md
17 | icon.png
18 | oqtane
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Oqtane.Package/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Package/icon.png
--------------------------------------------------------------------------------
/Oqtane.Package/install.ps1:
--------------------------------------------------------------------------------
1 | Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.1.3.Install.zip" -Force
2 |
--------------------------------------------------------------------------------
/Oqtane.Package/nuget.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Package/nuget.exe
--------------------------------------------------------------------------------
/Oqtane.Package/readme.md:
--------------------------------------------------------------------------------
1 | # Oqtane Framework
2 |
3 | 
4 |
5 | Oqtane is an open source CMS and Application Framework that provides advanced functionality for developing web, mobile, and desktop applications on .NET. It leverages Blazor to compose a fully dynamic digital experience which can be hosted on Static Blazor, Blazor Server, Blazor WebAssembly, or Blazor Hybrid (via .NET MAUI).
6 |
7 | Oqtane was created by [Shaun Walker](https://www.linkedin.com/in/shaunbrucewalker/) and was inspired by his earlier efforts with DotNetNuke... however Oqtane is a native Blazor application written from the ground up using modern .NET Core technology and a Single Page Application (SPA) architecture. It is a modular application framework offering a fully dynamic page compositing model, multi-site support, designer friendly themes, and extensibility via third party modules.
8 |
9 | More information about Oqtane can be found at: [https://www.oqtane.org](https://www.oqtane.org)
10 |
--------------------------------------------------------------------------------
/Oqtane.Package/upgrade.ps1:
--------------------------------------------------------------------------------
1 | Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.1.3.Upgrade.zip" -Force
2 |
--------------------------------------------------------------------------------
/Oqtane.Server/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Localization;
2 |
3 | [assembly: RootNamespace("Oqtane")]
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Components/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System
2 | @using System.Linq
3 | @using System.Collections.Generic
4 | @using System.Net.Http
5 | @using System.Net.Http.Json
6 |
7 | @using Microsoft.AspNetCore.Components.Authorization
8 | @using Microsoft.AspNetCore.Components.Forms
9 | @using Microsoft.AspNetCore.Components.Routing
10 | @using Microsoft.AspNetCore.Components.Web
11 | @using Microsoft.AspNetCore.Components.Web.Virtualization
12 | @using Microsoft.Extensions.Localization
13 | @using Microsoft.JSInterop
14 | @using static Microsoft.AspNetCore.Components.Web.RenderMode
15 |
16 | @using Oqtane.Client
17 | @using Oqtane.Models
18 | @using Oqtane.Modules
19 | @using Oqtane.Modules.Controls
20 | @using Oqtane.Providers
21 | @using Oqtane.Security
22 | @using Oqtane.Services
23 | @using Oqtane.Shared
24 | @using Oqtane.Themes
25 | @using Oqtane.Themes.Controls
26 | @using Oqtane.UI
27 | @using Oqtane.Enums
28 | @using Oqtane.Installer
29 | @using Oqtane.Interfaces
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Components/_Placeholder.cs:
--------------------------------------------------------------------------------
1 | // This is just a placeholder file
2 | // It is necessary for the documentation to successfully build this project.
3 | // Reason is that docfx will run the .net compiler and find references
4 | // to this class in the project.
5 | // But since the real class is just a .razor file, ATM docfx will fail.
6 | //
7 | // Note added 2024-06-27 by @iJungleboy.
8 | // We hope that as .net and docfx improve, the razor-compiler will work in that scenario
9 | // as well, and this file can be removed.
10 |
11 | using Oqtane.Documentation;
12 |
13 | namespace Oqtane.Components;
14 |
15 | [PrivateApi]
16 | public class _Placeholder;
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Controllers/JobLogController.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Microsoft.AspNetCore.Mvc;
3 | using Microsoft.AspNetCore.Authorization;
4 | using Oqtane.Models;
5 | using Oqtane.Shared;
6 | using Oqtane.Repository;
7 |
8 | namespace Oqtane.Controllers
9 | {
10 | [Route(ControllerRoutes.ApiRoute)]
11 | public class JobLogController : Controller
12 | {
13 | private readonly IJobLogRepository _jobLogs;
14 |
15 | public JobLogController(IJobLogRepository jobLogs)
16 | {
17 | _jobLogs = jobLogs;
18 | }
19 |
20 | // GET: api/?jobid=x
21 | [HttpGet]
22 | [Authorize(Roles = RoleNames.Host)]
23 | public IEnumerable Get(string jobid)
24 | {
25 | return _jobLogs.GetJobLogs(int.Parse(jobid));
26 | }
27 |
28 | // GET api//5
29 | [HttpGet("{id}")]
30 | [Authorize(Roles = RoleNames.Host)]
31 | public JobLog Get(int id)
32 | {
33 | return _jobLogs.GetJobLog(id);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Oqtane.Server/Controllers/OutputCacheController.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | using Microsoft.AspNetCore.Authorization;
4 | using Microsoft.AspNetCore.Mvc;
5 |
6 | using Oqtane.Models;
7 | using Oqtane.Services;
8 | using Oqtane.Shared;
9 |
10 | namespace Oqtane.Controllers
11 | {
12 | [Route(ControllerRoutes.ApiRoute)]
13 | public class OutputCacheController : Controller
14 | {
15 | private readonly IOutputCacheService _cacheService;
16 |
17 | public OutputCacheController(IOutputCacheService cacheService)
18 | {
19 | _cacheService = cacheService;
20 | }
21 |
22 | // DELETE api//{tag}
23 | [HttpDelete("{tag}")]
24 | [Authorize(Roles = RoleNames.Admin)]
25 | public async Task EvictByTag(string tag)
26 | {
27 | await _cacheService.EvictByTag(tag);
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Oqtane.Server/Controllers/SiteTemplateController.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Microsoft.AspNetCore.Authorization;
3 | using Microsoft.AspNetCore.Mvc;
4 | using Oqtane.Models;
5 | using Oqtane.Repository;
6 | using Oqtane.Shared;
7 |
8 | namespace Oqtane.Controllers
9 | {
10 | [Route(ControllerRoutes.ApiRoute)]
11 | public class SiteTemplateController : Controller
12 | {
13 | private readonly ISiteTemplateRepository _siteTemplates;
14 |
15 | public SiteTemplateController(ISiteTemplateRepository siteTemplates)
16 | {
17 | _siteTemplates = siteTemplates;
18 | }
19 |
20 | // GET: api/
21 | [HttpGet]
22 | public IEnumerable Get()
23 | {
24 | return _siteTemplates.GetSiteTemplates();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Oqtane.Server/Controllers/TenantController.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using Microsoft.AspNetCore.Authorization;
3 | using Oqtane.Models;
4 | using System.Collections.Generic;
5 | using Oqtane.Shared;
6 | using Oqtane.Repository;
7 |
8 | namespace Oqtane.Controllers
9 | {
10 | [Route(ControllerRoutes.ApiRoute)]
11 | public class TenantController : Controller
12 | {
13 | private readonly ITenantRepository _tenants;
14 |
15 | public TenantController(ITenantRepository tenants)
16 | {
17 | _tenants = tenants;
18 | }
19 |
20 | // GET: api/
21 | [HttpGet]
22 | [Authorize(Roles = RoleNames.Host)]
23 | public IEnumerable Get()
24 | {
25 | return _tenants.GetTenants();
26 | }
27 |
28 | // GET api//5
29 | [HttpGet("{id}")]
30 | [Authorize(Roles = RoleNames.Host)]
31 | public Tenant Get(int id)
32 | {
33 | return _tenants.GetTenant(id);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Oqtane.Server/Controllers/TimeZoneController.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using Microsoft.AspNetCore.Authorization;
5 | using Microsoft.AspNetCore.Mvc;
6 | using Oqtane.Models;
7 | using Oqtane.Shared;
8 |
9 | namespace Oqtane.Controllers
10 | {
11 | [Route(ControllerRoutes.ApiRoute)]
12 | public class TimeZoneController : Controller
13 | {
14 | public TimeZoneController() {}
15 |
16 | // GET: api/
17 | [HttpGet]
18 | public IEnumerable Get()
19 | {
20 | return TimeZoneInfo.GetSystemTimeZones()
21 | .Select(item => new Models.TimeZone
22 | {
23 | Id = item.Id,
24 | DisplayName = item.DisplayName
25 | })
26 | .OrderBy(item => item.DisplayName);
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Data/db.txt:
--------------------------------------------------------------------------------
1 | This is the location where LocalDB files will be created by default
--------------------------------------------------------------------------------
/Oqtane.Server/Databases/Interfaces/IMultiDatabase.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Databases.Interfaces;
2 |
3 | namespace Oqtane.Repository.Databases.Interfaces
4 | {
5 | public interface IMultiDatabase
6 | {
7 | public IDatabase ActiveDatabase { get; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 | using Microsoft.EntityFrameworkCore;
3 | using Microsoft.EntityFrameworkCore.Diagnostics;
4 | using Oqtane.Databases.Interfaces;
5 | // ReSharper disable ConvertToUsingDeclaration
6 |
7 | namespace Oqtane.Extensions
8 | {
9 | public static class DbContextOptionsBuilderExtensions
10 | {
11 | public static DbContextOptionsBuilder UseOqtaneDatabase([NotNull] this DbContextOptionsBuilder optionsBuilder, IDatabase database, string connectionString)
12 | {
13 | database.UseDatabase(optionsBuilder, connectionString)
14 | .ConfigureWarnings(warnings => warnings.Log(RelationalEventId.PendingModelChangesWarning));
15 |
16 | return optionsBuilder;
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/DictionaryExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Extensions
4 | {
5 | public static class DictionaryExtensions
6 | {
7 | public static TValue GetValue(this Dictionary dictionary, TKey key, TValue defaultValue, bool nullOrEmptyValueIsValid = false)
8 | {
9 | if (dictionary != null && key != null && dictionary.ContainsKey(key))
10 | {
11 | if (nullOrEmptyValueIsValid || (dictionary[key] != null && !string.IsNullOrEmpty(dictionary[key].ToString())))
12 | {
13 | return dictionary[key];
14 | }
15 | }
16 | return defaultValue;
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/MimeUtilities.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.StaticFiles;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Extensions
5 | {
6 | public static class MimeUtilities
7 | {
8 | ///
9 | /// Return Mime content type based on file extension
10 | ///
11 | /// File name
12 | public static string GetMimeType(string fileName)
13 | {
14 | var provider = new FileExtensionContentTypeProvider();
15 |
16 | if (!provider.TryGetContentType(fileName, out var contentType))
17 | contentType = "application/octet-stream";
18 | // we can add additional mappings here
19 |
20 | return contentType;
21 | }
22 |
23 | ///
24 | /// Return Mime content type based on file extension
25 | ///
26 | public static string GetMimeType(this File file)
27 | {
28 | return GetMimeType(file?.Name);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/PermissionExtension.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using System.Text.Json;
4 | using Oqtane.Models;
5 |
6 | namespace Oqtane.Extensions
7 | {
8 | public static class PermissionExtension
9 | {
10 | public static string EncodePermissions(this IEnumerable permissions)
11 | {
12 | return JsonSerializer.Serialize(permissions);
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/StringExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 |
4 | namespace Oqtane.Extensions
5 | {
6 | public static class StringExtensions
7 | {
8 | public static bool StartWithAnyOf(this string s, IEnumerable list)
9 | {
10 | if (s == null)
11 | {
12 | return false;
13 | }
14 |
15 | return list.Any(f => s.StartsWith(f));
16 | }
17 |
18 | public static string ReplaceMultiple(this string s, string[] oldValues, string newValue)
19 | {
20 | foreach(string value in oldValues)
21 | {
22 | s = s.Replace(value, newValue);
23 | }
24 | return s;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Oqtane.Server/Extensions/WebHostBuilderExtensions.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.Options;
3 | using Oqtane.Infrastructure;
4 |
5 | namespace Microsoft.AspNetCore.Hosting
6 | {
7 | public static class WebHostBuilderExtensions
8 | {
9 | public static IWebHostBuilder ConfigureLocalizationSettings(this IWebHostBuilder builder)
10 | {
11 | return builder.ConfigureServices((context, services) =>
12 | {
13 | var config = context.Configuration;
14 |
15 | services.Configure(config.GetSection("Localization"));
16 | services.AddSingleton(ctx => ctx.GetService>().Value);
17 | services.AddTransient();
18 | });
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/AliasAccessor.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Http;
2 | using Oqtane.Extensions;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public class AliasAccessor : IAliasAccessor
8 | {
9 | private readonly IHttpContextAccessor _httpContextAccessor;
10 |
11 | public AliasAccessor(IHttpContextAccessor httpContextAccessor)
12 | {
13 | _httpContextAccessor = httpContextAccessor;
14 | }
15 |
16 | public Alias Alias => _httpContextAccessor.HttpContext.GetAlias();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IAliasAccessor.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface IAliasAccessor
6 | {
7 | Alias Alias { get; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IConfigManager.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Microsoft.Extensions.Configuration;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | public interface IConfigManager
7 | {
8 | public IConfigurationSection GetSection(string sectionKey);
9 | public T GetSetting(string settingKey, T defaultValue);
10 | public T GetSetting(string sectionKey, string settingKey, T defaultValue);
11 | public Dictionary GetSettings(string sectionKey);
12 | void AddOrUpdateSetting(string key, T value, bool reload);
13 | void AddOrUpdateSetting(string file, string key, T value, bool reload);
14 | void RemoveSetting(string key, bool reload);
15 | void RemoveSetting(string file, string key, bool reload);
16 | void Reload();
17 |
18 | public string GetConnectionString();
19 | public string GetConnectionString(string name);
20 | public bool IsInstalled();
21 | public string GetInstallationId();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IDatabaseManager.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using Oqtane.Shared;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | public interface IDatabaseManager
7 | {
8 | Installation IsInstalled();
9 | Installation Install();
10 | Installation Install(InstallConfig install);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IEventSubscriber.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface IEventSubscriber
6 | {
7 | void EntityChanged(SyncEvent syncEvent);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IHostResources.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System;
3 | using System.Collections.Generic;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public interface IHostResources
8 | {
9 | [Obsolete("IHostResources is deprecated. Use module or theme scoped Resources in conjunction with ResourceLevel.Site instead.", false)]
10 | List Resources { get; } // identifies global resources for an application
11 | }
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IInstallable.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface IInstallable
6 | {
7 | bool Install(Tenant tenant, string version);
8 |
9 | bool Uninstall(Tenant tenant);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IInstallationManager.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface IInstallationManager
6 | {
7 | void InstallPackages();
8 | bool UninstallPackage(string PackageName);
9 | int RegisterAssemblies();
10 | Task UpgradeFramework(bool backup);
11 | void RestartApplication();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ILocalizationManager.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Infrastructure
2 | {
3 | public interface ILocalizationManager
4 | {
5 | string GetDefaultCulture();
6 | string[] GetSupportedCultures();
7 | string[] GetInstalledCultures();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ILogManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Oqtane.Enums;
3 | using Oqtane.Models;
4 | using Oqtane.Shared;
5 |
6 | namespace Oqtane.Infrastructure
7 | {
8 | public interface ILogManager
9 | {
10 | void Log(LogLevel level, object @class, LogFunction function, string message, params object[] args);
11 | void Log(LogLevel level, object @class, LogFunction function, Exception exception, string message, params object[] args);
12 | void Log(int siteId, LogLevel level, object @class, LogFunction function, string message, params object[] args);
13 | void Log(int siteId, LogLevel level, object @class, LogFunction function, Exception exception, string message, params object[] args);
14 | void Log(Log log);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IServerStartup.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.AspNetCore.Hosting;
3 | using Microsoft.Extensions.DependencyInjection;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public interface IServerStartup
8 | {
9 | // This method gets called by the runtime. Use this method to add services to the container.
10 | // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
11 | void ConfigureServices(IServiceCollection services);
12 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
13 | void Configure(IApplicationBuilder app, IWebHostEnvironment env);
14 | void ConfigureMvc(IMvcBuilder mvcBuilder);
15 | }
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IServerStateManager.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Infrastructure
2 | {
3 | public interface IServerStateManager
4 | {
5 | ServerState GetServerState(string siteKey);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ISiteMigration.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface ISiteMigration
6 | {
7 | void Up(Site site, Alias alias);
8 | void Down(Site site, Alias alias); // for future use (if necessary)
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ISiteTemplate.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | public interface ISiteTemplate
7 | {
8 | string Name { get; }
9 |
10 | List CreateSite(Site site);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ISyncManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public interface ISyncManager
8 | {
9 | event EventHandler EntityChanged;
10 | List GetSyncEvents(int tenantId, DateTime lastSyncDate);
11 | void AddSyncEvent(Alias alias, string entityName, int entityId, string action);
12 | void AddSyncEvent(int tenantId, int siteId, string entityName, int entityId, string action);
13 |
14 | [Obsolete("AddSyncEvent(int tenantId, string entityName, int entityId, string action) is deprecated. Use AddSyncEvent(Alias alias, string entityName, int entityId, string action) instead.", false)]
15 | void AddSyncEvent(int tenantId, string entityName, int entityId, string action);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ITenantManager.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface ITenantManager
6 | {
7 | Alias GetAlias();
8 | Tenant GetTenant();
9 | void SetAlias(Alias alias);
10 | void SetAlias(int tenantId, int siteId);
11 | void SetTenant(int tenantId);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/ITokenReplace.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Interfaces;
4 |
5 | namespace Oqtane.Infrastructure.Interfaces
6 | {
7 | public interface ITokenReplace
8 | {
9 | void AddSource(ITokenSource source);
10 |
11 | void AddSource(Func> sourceFunc);
12 |
13 | void AddSource(IDictionary source);
14 |
15 | void AddSource(string key, object value);
16 |
17 | void AddSource(string name, ITokenSource source);
18 |
19 | void AddSource(string name, Func> sourceFunc);
20 |
21 | void AddSource(string name, IDictionary source);
22 |
23 | void AddSource(string name, string key, object value);
24 |
25 | string ReplaceTokens(string source);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/IUpgradeManager.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public interface IUpgradeManager
6 | {
7 | void Upgrade(Tenant tenant, string version);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Interfaces/SiteMigrationAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | [AttributeUsage(AttributeTargets.Class)]
6 | public class SiteMigrationAttribute : Attribute
7 | {
8 | private string aliasname;
9 | private string version;
10 |
11 | public SiteMigrationAttribute(string AliasName, string Version)
12 | {
13 | aliasname = AliasName;
14 | version = Version;
15 | }
16 |
17 | public virtual string AliasName
18 | {
19 | get { return aliasname; }
20 | }
21 |
22 | public virtual string Version
23 | {
24 | get { return version; }
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Localization/LocalizationOptions.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Infrastructure
2 | {
3 | public class LocalizationOptions
4 | {
5 | public string DefaultCulture { get; set; }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Options/ISiteNamedOptions.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | public interface ISiteNamedOptions
7 | where TOptions : class, new()
8 | {
9 | void Configure(string name, TOptions options, Alias alias, Dictionary sitesettings);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Options/ISiteOptions.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | public interface ISiteOptions
7 | where TOptions : class, new()
8 | {
9 | void Configure(TOptions options, Alias alias, Dictionary sitesettings);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Options/SiteNamedOptions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public class SiteNamedOptions : ISiteNamedOptions
8 | where TOptions : class, new()
9 | {
10 | public string Name { get; }
11 |
12 | private readonly Action> configureOptions;
13 |
14 | public SiteNamedOptions(string name, Action> configureOptions)
15 | {
16 | Name = name;
17 | this.configureOptions = configureOptions;
18 | }
19 |
20 | public void Configure(string name, TOptions options, Alias alias, Dictionary sitesettings)
21 | {
22 | if (name == Name)
23 | {
24 | configureOptions(options, alias, sitesettings);
25 | }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/Options/SiteOptions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Infrastructure
6 | {
7 | public class SiteOptions : ISiteOptions
8 | where TOptions : class, new()
9 | {
10 | private readonly Action> configureOptions;
11 |
12 | public SiteOptions(Action> configureOptions)
13 | {
14 | this.configureOptions = configureOptions;
15 | }
16 |
17 | public void Configure(TOptions options, Alias alias, Dictionary sitesettings)
18 | {
19 | configureOptions(options, alias, sitesettings);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/ServerState.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | public class ServerState
6 | {
7 | public string SiteKey { get; set; }
8 | public List Assemblies { get; set; } = new List();
9 | public bool IsInitialized { get; set; } = false;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/ServerStateManager.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 |
4 | namespace Oqtane.Infrastructure
5 | {
6 | // singleton
7 | public class ServerStateManager : IServerStateManager
8 | {
9 | private List _serverStates { get; set; }
10 |
11 | public ServerStateManager()
12 | {
13 | _serverStates = new List();
14 | }
15 |
16 | public ServerState GetServerState(string siteKey)
17 | {
18 | var serverState = _serverStates.FirstOrDefault(item => item.SiteKey == siteKey);
19 | if (serverState == null)
20 | {
21 | serverState = new ServerState();
22 | serverState.SiteKey = siteKey;
23 | serverState.Assemblies = new List();
24 | serverState.IsInitialized = false;
25 | _serverStates.Add(serverState);
26 | }
27 | return serverState;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Oqtane.Server/Infrastructure/SiteMigration/ExampleSiteMigration.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Infrastructure
4 | {
5 | [SiteMigration("localhost:44357", "01.00.00")]
6 | public class ExampleSiteMigration : ISiteMigration
7 | {
8 | void ISiteMigration.Up(Site site, Alias alias)
9 | {
10 | // execute some version-specific upgrade logic for the site here such as adding pages, modules, content, etc...
11 | }
12 |
13 | void ISiteMigration.Down(Site site, Alias alias)
14 | {
15 | // not implemented
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Framework/MultiDatabaseMigration.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Migrations;
2 | using Oqtane.Databases.Interfaces;
3 |
4 | namespace Oqtane.Migrations
5 | {
6 | public abstract class MultiDatabaseMigration : Migration
7 | {
8 | protected MultiDatabaseMigration(IDatabase database)
9 | {
10 | ActiveDatabase = database;
11 | }
12 |
13 | protected IDatabase ActiveDatabase { get; }
14 |
15 | protected string RewriteName(string name)
16 | {
17 | return ActiveDatabase.RewriteName(name, false);
18 | }
19 |
20 | protected string RewriteName(string name, bool isQuery)
21 | {
22 | return ActiveDatabase.RewriteName(name, isQuery);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Framework/PrimaryKey.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq.Expressions;
3 | using Oqtane.Migrations.EntityBuilders;
4 |
5 | namespace Oqtane.Migrations
6 | {
7 | public readonly struct PrimaryKey where TEntityBuilder : BaseEntityBuilder
8 | {
9 | public PrimaryKey(string name, Expression> columns)
10 | {
11 | Name = name;
12 | Columns = columns;
13 | }
14 |
15 | public string Name { get; }
16 |
17 | public Expression> Columns { get;}
18 |
19 |
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Master/04000001_AddThemeTable.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Master
8 | {
9 | [DbContext(typeof(MasterDBContext))]
10 | [Migration("Master.04.00.00.01")]
11 | public class AddThemeTable : MultiDatabaseMigration
12 | {
13 | public AddThemeTable(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var themeEntityBuilder = new ThemeEntityBuilder(migrationBuilder, ActiveDatabase);
20 | themeEntityBuilder.Create();
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | // not implemented
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Master/04000002_AddThemeName.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Master
8 | {
9 | [DbContext(typeof(MasterDBContext))]
10 | [Migration("Master.04.00.00.02")]
11 | public class AddThemeName : MultiDatabaseMigration
12 | {
13 | public AddThemeName(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var themeEntityBuilder = new ThemeEntityBuilder(migrationBuilder, ActiveDatabase);
20 | themeEntityBuilder.AddStringColumn("Name", 200, true);
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | // not implemented
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Master/06010001_AddThemeVersion.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Master
8 | {
9 | [DbContext(typeof(MasterDBContext))]
10 | [Migration("Master.06.01.00.01")]
11 | public class AddThemeVersion : MultiDatabaseMigration
12 | {
13 | public AddThemeVersion(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var themeEntityBuilder = new ThemeEntityBuilder(migrationBuilder, ActiveDatabase);
20 | themeEntityBuilder.AddStringColumn("Version", 50, true);
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | // not implemented
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/02000101_UpdateIconColumnInPage.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.02.00.01.01")]
11 | public class UpdateIconColumnInPage : MultiDatabaseMigration
12 | {
13 | public UpdateIconColumnInPage(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | ///Update Icon Field in Page
20 | var pageEntityBuilder = new PageEntityBuilder(migrationBuilder, ActiveDatabase);
21 | var updateSql = ActiveDatabase.ConcatenateSql("'oi oi-'", $"{ActiveDatabase.RewriteName("Icon")}");
22 | pageEntityBuilder.UpdateColumn("Icon", updateSql, $"{ActiveDatabase.RewriteName("Icon")} <> ''" );
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/02010002_DropAppVersionsTableInTenant.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.02.01.00.02")]
11 | public class DropAppVersionsTableinTenant : MultiDatabaseMigration
12 | {
13 | public DropAppVersionsTableinTenant(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | //Drop AppVersions table
20 | var appVersionsEntityBuilder = new AppVersionsEntityBuilder(migrationBuilder, ActiveDatabase);
21 | appVersionsEntityBuilder.Drop();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/03000102_AddVisitorTable.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.03.00.01.02")]
11 | public class AddVisitorTable : MultiDatabaseMigration
12 | {
13 | public AddVisitorTable(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var visitorEntityBuilder = new VisitorEntityBuilder(migrationBuilder, ActiveDatabase);
20 | visitorEntityBuilder.Create();
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | var visitorEntityBuilder = new VisitorEntityBuilder(migrationBuilder, ActiveDatabase);
26 | visitorEntityBuilder.Drop();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/04000003_AddProfileValidation.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Components.Web;
2 | using Microsoft.EntityFrameworkCore.Infrastructure;
3 | using Microsoft.EntityFrameworkCore.Migrations;
4 | using Oqtane.Databases.Interfaces;
5 | using Oqtane.Migrations.EntityBuilders;
6 | using Oqtane.Repository;
7 |
8 | namespace Oqtane.Migrations.Tenant
9 | {
10 | [DbContext(typeof(TenantDBContext))]
11 | [Migration("Tenant.04.00.00.03")]
12 | public class AddProfileValidation : MultiDatabaseMigration
13 | {
14 | public AddProfileValidation(IDatabase database) : base(database)
15 | {
16 | }
17 |
18 | protected override void Up(MigrationBuilder migrationBuilder)
19 | {
20 | var profileEntityBuilder = new ProfileEntityBuilder(migrationBuilder, ActiveDatabase);
21 | profileEntityBuilder.AddStringColumn("Validation", 200, true);
22 | }
23 |
24 | protected override void Down(MigrationBuilder migrationBuilder)
25 | {
26 | // not implemented
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/04000601_AddProfileRows.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.04.00.06.01")]
11 | public class AddProfileRows : MultiDatabaseMigration
12 | {
13 | public AddProfileRows(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var profileEntityBuilder = new ProfileEntityBuilder(migrationBuilder, ActiveDatabase);
20 | profileEntityBuilder.AddIntegerColumn("Rows", true);
21 | profileEntityBuilder.UpdateColumn("Rows", "1");
22 | }
23 |
24 | protected override void Down(MigrationBuilder migrationBuilder)
25 | {
26 | // not implemented
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/05020401_RemoveLanguageName.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.05.02.04.01")]
11 | public class RemoveLanguageName : MultiDatabaseMigration
12 | {
13 | public RemoveLanguageName(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var languageEntityBuilder = new LanguageEntityBuilder(migrationBuilder, ActiveDatabase);
20 | languageEntityBuilder.DropColumn("Name");
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | // not implemented
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Migrations/Tenant/06010001_AddFolderCacheControl.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Databases.Interfaces;
4 | using Oqtane.Migrations.EntityBuilders;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Migrations.Tenant
8 | {
9 | [DbContext(typeof(TenantDBContext))]
10 | [Migration("Tenant.06.01.00.01")]
11 | public class AddFolderCacheControl : MultiDatabaseMigration
12 | {
13 | public AddFolderCacheControl(IDatabase database) : base(database)
14 | {
15 | }
16 |
17 | protected override void Up(MigrationBuilder migrationBuilder)
18 | {
19 | var folderEntityBuilder = new FolderEntityBuilder(migrationBuilder, ActiveDatabase);
20 | folderEntityBuilder.AddStringColumn("CacheControl", 50, true);
21 | }
22 |
23 | protected override void Down(MigrationBuilder migrationBuilder)
24 | {
25 | // not implemented
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore;
2 | using Oqtane.Documentation;
3 | using Oqtane.Repository;
4 | using Oqtane.Repository.Databases.Interfaces;
5 |
6 | // ReSharper disable MemberCanBePrivate.Global
7 | // ReSharper disable UnusedAutoPropertyAccessor.Global
8 |
9 | namespace Oqtane.Modules.HtmlText.Repository
10 | {
11 | [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
12 | public class HtmlTextContext : DBContextBase, ITransientService, IMultiDatabase
13 | {
14 | public HtmlTextContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) { }
15 |
16 | public virtual DbSet HtmlText { get; set; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/HtmlText/Repository/IHtmlTextRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Documentation;
3 |
4 | namespace Oqtane.Modules.HtmlText.Repository
5 | {
6 | [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
7 | public interface IHtmlTextRepository
8 | {
9 | IEnumerable GetHtmlTexts(int moduleId);
10 | Models.HtmlText GetHtmlText(int htmlTextId);
11 | Models.HtmlText AddHtmlText(Models.HtmlText htmlText);
12 | void DeleteHtmlText(int htmlTextId);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/HtmlText/Startup/ServerStartup.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.AspNetCore.Hosting;
3 | using Microsoft.Extensions.DependencyInjection;
4 | using Oqtane.Infrastructure;
5 | using Oqtane.Modules.HtmlText.Repository;
6 | using Oqtane.Modules.HtmlText.Services;
7 |
8 | namespace Oqtane.Modules.HtmlText.Startup
9 | {
10 | public class ServerStartup : IServerStartup
11 | {
12 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
13 | {
14 | // not implemented
15 | }
16 |
17 | public void ConfigureMvc(IMvcBuilder mvcBuilder)
18 | {
19 | // not implemented
20 | }
21 |
22 | public void ConfigureServices(IServiceCollection services)
23 | {
24 | services.AddTransient();
25 | services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/IPortable.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Modules
4 | {
5 | public interface IPortable
6 | {
7 | // You Must Set The "ServerManagerType" In Your IModule Interface
8 |
9 | string ExportModule(Module module);
10 |
11 | void ImportModule(Module module, string content, string version);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/ISitemap.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Modules
5 | {
6 | public interface ISitemap
7 | {
8 | // You Must Set The "ServerManagerType" In Your IModule Interface
9 |
10 | List GetUrls(string alias, string path, Module module);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Server/Modules/MigratableModuleBase.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore.Infrastructure;
2 | using Microsoft.EntityFrameworkCore.Migrations;
3 | using Oqtane.Enums;
4 | using Oqtane.Models;
5 | using Oqtane.Repository;
6 |
7 | namespace Oqtane.Modules
8 | {
9 | public class MigratableModuleBase
10 | {
11 | public bool Migrate(DBContextBase dbContext, Tenant tenant, MigrationType migrationType)
12 | {
13 | var result = true;
14 |
15 | using (dbContext)
16 | {
17 | var migrator = dbContext.GetService();
18 | if (migrationType == MigrationType.Down)
19 | {
20 | migrator.Migrate(Migration.InitialDatabase);
21 | }
22 | else
23 | {
24 | migrator.Migrate();
25 | }
26 | }
27 |
28 | return result;
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/External.cshtml:
--------------------------------------------------------------------------------
1 | @page "/pages/external"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.ExternalModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/Files.cshtml:
--------------------------------------------------------------------------------
1 | @page "/files/{**path}"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.FilesModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/Impersonate.cshtml:
--------------------------------------------------------------------------------
1 | @page "/pages/impersonate"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.ImpersonateModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/Login.cshtml:
--------------------------------------------------------------------------------
1 | @page "/pages/login"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.LoginModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/Logout.cshtml:
--------------------------------------------------------------------------------
1 | @page "/pages/logout"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.LogoutModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Pages/Sitemap.cshtml:
--------------------------------------------------------------------------------
1 | @page "/pages/sitemap.xml"
2 | @namespace Oqtane.Pages
3 | @model Oqtane.Pages.SitemapModel
4 |
--------------------------------------------------------------------------------
/Oqtane.Server/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "iisSettings": {
3 | "windowsAuthentication": false,
4 | "anonymousAuthentication": true,
5 | "iisExpress": {
6 | "applicationUrl": "http://localhost:44357/",
7 | "sslPort": 0
8 | }
9 | },
10 | "profiles": {
11 | "IIS Express": {
12 | "commandName": "IISExpress",
13 | "launchBrowser": true,
14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
15 | "environmentVariables": {
16 | "ASPNETCORE_ENVIRONMENT": "Development"
17 | }
18 | },
19 | "Oqtane.Server": {
20 | "commandName": "Project",
21 | "launchBrowser": true,
22 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
23 | "environmentVariables": {
24 | "ASPNETCORE_ENVIRONMENT": "Development"
25 | },
26 | "applicationUrl": "http://localhost:44357/"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Context/DBContextDependencies.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Http;
2 | using Microsoft.Extensions.Configuration;
3 | using Oqtane.Infrastructure;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public class DBContextDependencies : IDBContextDependencies
8 | {
9 | public DBContextDependencies(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor, IConfigurationRoot config)
10 | {
11 | TenantManager = tenantManager;
12 | Accessor = httpContextAccessor;
13 | Config = config;
14 | }
15 |
16 | public ITenantManager TenantManager { get; }
17 | public IHttpContextAccessor Accessor { get; }
18 | public IConfigurationRoot Config { get; }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IAliasRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IAliasRepository
7 | {
8 | IEnumerable GetAliases();
9 | Alias AddAlias(Alias alias);
10 | Alias UpdateAlias(Alias alias);
11 | Alias GetAlias(int aliasId);
12 | Alias GetAlias(int aliasId, bool tracking);
13 | Alias GetAlias(string url);
14 | void DeleteAlias(int aliasId);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IDBContextDependencies.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Http;
2 | using Microsoft.Extensions.Configuration;
3 | using Oqtane.Infrastructure;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface IDBContextDependencies
8 | {
9 | ITenantManager TenantManager { get; }
10 | IHttpContextAccessor Accessor { get; }
11 | IConfigurationRoot Config { get; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IFileRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IFileRepository
7 | {
8 | IEnumerable GetFiles(int folderId);
9 | IEnumerable GetFiles(int folderId, bool tracking);
10 | File AddFile(File file);
11 | File UpdateFile(File file);
12 | File GetFile(int fileId);
13 | File GetFile(int fileId, bool tracking);
14 | File GetFile(int folderId, string fileName);
15 | File GetFile(int siteId, string folderPath, string fileName);
16 | void DeleteFile(int fileId);
17 | string GetFilePath(int fileId);
18 | string GetFilePath(File file);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IFolderRepository
7 | {
8 | IEnumerable GetFolders(int siteId);
9 | Folder AddFolder(Folder folder);
10 | Folder UpdateFolder(Folder folder);
11 | Folder GetFolder(int folderId);
12 | Folder GetFolder(int folderId, bool tracking);
13 | Folder GetFolder(int siteId, string path);
14 | void DeleteFolder(int folderId);
15 | string GetFolderPath(int folderId);
16 | string GetFolderPath(Folder folder);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IJobLogRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IJobLogRepository
7 | {
8 | IEnumerable GetJobLogs();
9 | IEnumerable GetJobLogs(int jobId);
10 | JobLog AddJobLog(JobLog jobLog);
11 | JobLog UpdateJobLog(JobLog jobLog);
12 | JobLog GetJobLog(int jobLogId);
13 | void DeleteJobLog(int jobLogId);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IJobRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IJobRepository
7 | {
8 | IEnumerable GetJobs();
9 | Job AddJob(Job job);
10 | Job UpdateJob(Job job);
11 | Job GetJob(int jobId);
12 | Job GetJob(int jobId, bool tracking);
13 | void DeleteJob(int jobId);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ILanguageRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface ILanguageRepository
7 | {
8 | IEnumerable GetLanguages(int siteId);
9 |
10 | Language AddLanguage(Language language);
11 |
12 | void UpdateLanguage(Language language);
13 |
14 | Language GetLanguage(int languageId);
15 |
16 | void DeleteLanguage(int languageId);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ILogRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface ILogRepository
7 | {
8 | IEnumerable GetLogs(int siteId, string level, string function, int rows);
9 | Log GetLog(int logId);
10 | void AddLog(Log log);
11 | int DeleteLogs(int siteId, int age);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IModuleDefinitionRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IModuleDefinitionRepository
7 | {
8 | IEnumerable GetModuleDefinitions();
9 | IEnumerable GetModuleDefinitions(int siteId);
10 | ModuleDefinition GetModuleDefinition(int moduleDefinitionId, int siteId);
11 | void UpdateModuleDefinition(ModuleDefinition moduleDefinition);
12 | void DeleteModuleDefinition(int moduleDefinitionId);
13 | ModuleDefinition FilterModuleDefinition(ModuleDefinition moduleDefinition);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IModuleRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IModuleRepository
7 | {
8 | IEnumerable GetModules(int siteId);
9 | Module AddModule(Module module);
10 | Module UpdateModule(Module module);
11 | Module GetModule(int moduleId);
12 | Module GetModule(int moduleId, bool tracking);
13 | void DeleteModule(int moduleId);
14 | string ExportModule(int moduleId);
15 | bool ImportModule(int moduleId, string content);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/INotificationRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface INotificationRepository
7 | {
8 | IEnumerable GetNotifications(int siteId, int fromUserId, int toUserId);
9 | IEnumerable GetNotifications(int siteId, int fromUserId, int toUserId, int count, bool isRead);
10 | int GetNotificationCount(int siteId, int fromUserId, int toUserId, bool isRead);
11 | Notification AddNotification(Notification notification);
12 | Notification UpdateNotification(Notification notification);
13 | Notification GetNotification(int notificationId);
14 | Notification GetNotification(int notificationId, bool tracking);
15 | void DeleteNotification(int notificationId);
16 | int DeleteNotifications(int siteId, int age);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IPageModuleRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IPageModuleRepository
7 | {
8 | IEnumerable GetPageModules(int siteId);
9 | PageModule AddPageModule(PageModule pageModule);
10 | PageModule UpdatePageModule(PageModule pageModule);
11 | PageModule GetPageModule(int pageModuleId);
12 | PageModule GetPageModule(int pageModuleId, bool tracking);
13 | PageModule GetPageModule(int pageId, int moduleId);
14 | void DeletePageModule(int pageModuleId);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IPageRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IPageRepository
7 | {
8 | IEnumerable GetPages(int siteId);
9 | Page AddPage(Page page);
10 | Page UpdatePage(Page page);
11 | Page GetPage(int pageId);
12 | Page GetPage(int pageId, bool tracking);
13 | Page GetPage(string path, int siteId);
14 | void DeletePage(int pageId);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IProfileRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IProfileRepository
7 | {
8 | IEnumerable GetProfiles(int siteId);
9 | Profile AddProfile(Profile profile);
10 | Profile UpdateProfile(Profile profile);
11 | Profile GetProfile(int profileId);
12 | Profile GetProfile(int profileId, bool tracking);
13 | void DeleteProfile(int profileId);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IRoleRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IRoleRepository
7 | {
8 | IEnumerable GetRoles(int siteId);
9 | IEnumerable GetRoles(int siteId, bool includeGlobalRoles);
10 | Role AddRole(Role role);
11 | Role UpdateRole(Role role);
12 | Role GetRole(int roleId);
13 | Role GetRole(int roleId, bool tracking);
14 | void DeleteRole(int roleId);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ISearchContentRepository.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 | using Oqtane.Models;
5 |
6 | namespace Oqtane.Repository
7 | {
8 | public interface ISearchContentRepository
9 | {
10 | Task> GetSearchContentsAsync(SearchQuery searchQuery);
11 | SearchContent AddSearchContent(SearchContent searchContent);
12 | void DeleteSearchContent(int searchContentId);
13 | void DeleteSearchContent(string entityName, string entryId);
14 | void DeleteSearchContent(string uniqueKey);
15 | void DeleteAllSearchContent(int siteId);
16 |
17 | SearchWord GetSearchWord(string word);
18 | SearchWord AddSearchWord(SearchWord searchWord);
19 |
20 | IEnumerable GetSearchContentWords(int searchContentId);
21 | SearchContentWord AddSearchContentWord(SearchContentWord searchContentWord);
22 | SearchContentWord UpdateSearchContentWord(SearchContentWord searchContentWord);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ISettingRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface ISettingRepository
8 | {
9 | IEnumerable GetSettings(string entityName);
10 | IEnumerable GetSettings(string entityName, int entityId);
11 | IEnumerable GetSettings(string entityName1, int entityId1, string entityName2, int entityId2);
12 | Setting AddSetting(Setting setting);
13 | Setting UpdateSetting(Setting setting);
14 | Setting GetSetting(string entityName, int settingId);
15 | Setting GetSetting(string entityName, int entityId, string settingName);
16 | void DeleteSetting(string entityName, int settingId);
17 | void DeleteSettings(string entityName, int entityId);
18 | string GetSettingValue(IEnumerable settings, string settingName, string defaultValue);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ISiteRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface ISiteRepository
8 | {
9 | IEnumerable GetSites();
10 | Site AddSite(Site site);
11 | Site UpdateSite(Site site);
12 | Site GetSite(int siteId);
13 | Site GetSite(int siteId, bool tracking);
14 | void DeleteSite(int siteId);
15 |
16 | void InitializeSite(Alias alias);
17 | void CreatePages(Site site, List pageTemplates, Alias alias);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ISiteTemplateRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface ISiteTemplateRepository
7 | {
8 | IEnumerable GetSiteTemplates();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ISqlRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Data;
2 | using System.Reflection;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface ISqlRepository
8 | {
9 | void ExecuteScript(Tenant tenant, string script);
10 |
11 | bool ExecuteScript(string connectionString, string databaseType, Assembly assembly, string filename);
12 |
13 | bool ExecuteScript(Tenant tenant, Assembly assembly, string filename);
14 |
15 | int ExecuteNonQuery(Tenant tenant, string query);
16 |
17 | int ExecuteNonQuery(string connectionString, string databaseType, string query);
18 |
19 | IDataReader ExecuteReader(Tenant tenant, string query);
20 |
21 | IDataReader ExecuteReader(string DBType, string DBConnectionString, string query);
22 |
23 | string GetScriptFromAssembly(Assembly assembly, string fileName);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ITenantRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface ITenantRepository
7 | {
8 | IEnumerable GetTenants();
9 | Tenant AddTenant(Tenant tenant);
10 | Tenant UpdateTenant(Tenant tenant);
11 | Tenant GetTenant(int tenantId);
12 | void DeleteTenant(int tenantId);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/ITenantResolver.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 |
3 | namespace Oqtane.Repository
4 | {
5 | // class deprecated and replaced by ITenantManager
6 | public interface ITenantResolver
7 | {
8 | Alias GetAlias();
9 | Tenant GetTenant();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IThemeRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IThemeRepository
7 | {
8 | IEnumerable GetThemes();
9 | Theme GetTheme(int themeId, int siteId);
10 | void UpdateTheme(Theme theme);
11 | void DeleteTheme(int themeId);
12 | List FilterThemes(List themes);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IUrlMappingRepository.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface IUrlMappingRepository
8 | {
9 | IEnumerable GetUrlMappings(int siteId, bool isMapped);
10 | UrlMapping AddUrlMapping(UrlMapping urlMapping);
11 | UrlMapping UpdateUrlMapping(UrlMapping urlMapping);
12 | UrlMapping GetUrlMapping(int urlMappingId);
13 | UrlMapping GetUrlMapping(int urlMappingId, bool tracking);
14 | UrlMapping GetUrlMapping(int siteId, string url);
15 | void DeleteUrlMapping(int urlMappingId);
16 | int DeleteUrlMappings(int siteId, int age);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IUserRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IUserRepository
7 | {
8 | IEnumerable GetUsers();
9 | User AddUser(User user);
10 | User UpdateUser(User user);
11 | User GetUser(int userId);
12 | User GetUser(int userId, bool tracking);
13 | User GetUser(string username);
14 | User GetUser(string username, string email);
15 | void DeleteUser(int userId);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IUserRoleRepository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | public interface IUserRoleRepository
7 | {
8 | IEnumerable GetUserRoles(int siteId);
9 | IEnumerable GetUserRoles(int userId, int siteId);
10 | IEnumerable GetUserRoles(string roleName, int siteId);
11 | UserRole AddUserRole(UserRole userRole);
12 | UserRole UpdateUserRole(UserRole userRole);
13 | UserRole GetUserRole(int userRoleId);
14 | UserRole GetUserRole(int userRoleId, bool tracking);
15 | UserRole GetUserRole(int userId, int roleId);
16 | UserRole GetUserRole(int userId, int roleId, bool tracking);
17 | void DeleteUserRole(int userRoleId);
18 | void DeleteUserRoles(int userId);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/Interfaces/IVisitorRepository.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Repository
6 | {
7 | public interface IVisitorRepository
8 | {
9 | IEnumerable GetVisitors(int siteId, DateTime fromDate);
10 | Visitor AddVisitor(Visitor visitor);
11 | Visitor UpdateVisitor(Visitor visitor);
12 | Visitor GetVisitor(int visitorId);
13 | Visitor GetVisitor(int siteId, string IPAddress);
14 | void DeleteVisitor(int visitorId);
15 | int DeleteVisitors(int siteId, int age);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Server/Repository/TenantResolver.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Infrastructure;
2 | using Oqtane.Models;
3 |
4 | namespace Oqtane.Repository
5 | {
6 | // class deprecated and replaced by ITenantManager
7 | public class TenantResolver : ITenantResolver
8 | {
9 | private readonly ITenantManager _tenantManager;
10 |
11 | public TenantResolver(ITenantManager tenantManager)
12 | {
13 | _tenantManager = tenantManager;
14 | }
15 |
16 | public Alias GetAlias()
17 | {
18 | return _tenantManager.GetAlias();
19 | }
20 |
21 | public Tenant GetTenant()
22 | {
23 | return _tenantManager.GetTenant();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Oqtane.Server/Resources/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/Resources/.gitkeep
--------------------------------------------------------------------------------
/Oqtane.Server/Security/AutoValidateAntiforgeryTokenAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.AspNetCore.Mvc.Filters;
3 | using Microsoft.Extensions.DependencyInjection;
4 |
5 | namespace Oqtane.Security
6 | {
7 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
8 | public class AutoValidateAntiforgeryTokenAttribute : Attribute, IFilterFactory, IOrderedFilter
9 | {
10 | public int Order { get; set; } = 1000;
11 |
12 | public bool IsReusable => true;
13 |
14 | public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
15 | {
16 | return serviceProvider.GetRequiredService();
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Server/Security/PermissionRequirement.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Authorization;
2 |
3 | namespace Oqtane.Security
4 | {
5 | public class PermissionRequirement : IAuthorizationRequirement
6 | {
7 | public string EntityName { get; }
8 |
9 | public string PermissionName { get; }
10 |
11 | public string Roles { get; } // semi-colon delimited
12 |
13 | public PermissionRequirement(string entityName, string permissionName, string roles)
14 | {
15 | EntityName = entityName;
16 | PermissionName = permissionName;
17 | Roles = roles;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css:
--------------------------------------------------------------------------------
1 | /* Login Module Custom Styles */
2 |
3 | .Oqtane-Modules-Admin-Login {
4 | width: 200px;
5 | }
6 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css:
--------------------------------------------------------------------------------
1 | /* HtmlText Module Custom Styles */
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Client/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using Microsoft.Extensions.Localization;
3 |
4 | [assembly: RootNamespace("[Owner].Module.[Module].Client")]
5 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Interop.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.JSInterop;
2 | using System.Threading.Tasks;
3 |
4 | namespace [Owner].Module.[Module]
5 | {
6 | public class Interop
7 | {
8 | private readonly IJSRuntime _jsRuntime;
9 |
10 | public Interop(IJSRuntime jsRuntime)
11 | {
12 | _jsRuntime = jsRuntime;
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/ModuleInfo.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using Oqtane.Modules;
3 |
4 | namespace [Owner].Module.[Module]
5 | {
6 | public class ModuleInfo : IModule
7 | {
8 | public ModuleDefinition ModuleDefinition => new ModuleDefinition
9 | {
10 | Name = "[Module]",
11 | Description = "[Description]",
12 | Version = "1.0.0",
13 | ServerManagerType = "[ServerManagerType]",
14 | ReleaseVersions = "1.0.0",
15 | Dependencies = "[Owner].Module.[Module].Shared.Oqtane",
16 | PackageName = "[Owner].Module.[Module]"
17 | };
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Oqtane.Services;
3 | using [Owner].Module.[Module].Services;
4 |
5 | namespace [Owner].Module.[Module].Startup
6 | {
7 | public class ClientStartup : IClientStartup
8 | {
9 | public void ConfigureServices(IServiceCollection services)
10 | {
11 | services.AddScoped();
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Client/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System
2 | @using System.Linq
3 | @using System.Collections.Generic
4 | @using System.Net.Http
5 | @using System.Net.Http.Json
6 |
7 | @using Microsoft.AspNetCore.Components.Authorization
8 | @using Microsoft.AspNetCore.Components.Routing
9 | @using Microsoft.AspNetCore.Components.Web
10 | @using Microsoft.Extensions.Localization
11 | @using Microsoft.JSInterop
12 |
13 | @using Oqtane.Models
14 | @using Oqtane.Modules
15 | @using Oqtane.Modules.Controls
16 | @using Oqtane.Providers
17 | @using Oqtane.Security
18 | @using Oqtane.Services
19 | @using Oqtane.Shared
20 | @using Oqtane.Themes
21 | @using Oqtane.Themes.Controls
22 | @using Oqtane.UI
23 | @using Oqtane.Enums
24 | @using Oqtane.Interfaces
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd:
--------------------------------------------------------------------------------
1 | @echo off
2 | set TargetFramework=%1
3 | set ProjectName=%2
4 |
5 | XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
6 | XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
7 | XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
8 | XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
9 | XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
10 | XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
11 | XCOPY "..\Server\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TargetFramework=$1
4 | ProjectName=$2
5 |
6 | cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
7 | cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
8 | cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
9 | cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
10 | cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
11 | cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
12 | cp -rf "../Server/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/"
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Package/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/Modules/Templates/External/Package/icon.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd:
--------------------------------------------------------------------------------
1 | @echo off
2 | set TargetFramework=%1
3 | set ProjectName=%2
4 |
5 | del "*.nupkg"
6 | "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
7 | XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" /Y
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.sh:
--------------------------------------------------------------------------------
1 | TargetFramework=$1
2 | ProjectName=$2
3 |
4 | "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
5 | cp -f "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\"
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using Microsoft.Extensions.Localization;
3 |
4 | [assembly: RootNamespace("[Owner].Module.[Module].Server")]
5 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/I[Module]Repository.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 |
4 | namespace [Owner].Module.[Module].Repository
5 | {
6 | public interface I[Module]Repository
7 | {
8 | IEnumerable Get[Module]s(int ModuleId);
9 | Models.[Module] Get[Module](int [Module]Id);
10 | Models.[Module] Get[Module](int [Module]Id, bool tracking);
11 | Models.[Module] Add[Module](Models.[Module] [Module]);
12 | Models.[Module] Update[Module](Models.[Module] [Module]);
13 | void Delete[Module](int [Module]Id);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Context.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.EntityFrameworkCore;
2 | using Microsoft.AspNetCore.Http;
3 | using Oqtane.Modules;
4 | using Oqtane.Repository;
5 | using Oqtane.Infrastructure;
6 | using Oqtane.Repository.Databases.Interfaces;
7 |
8 | namespace [Owner].Module.[Module].Repository
9 | {
10 | public class [Module]Context : DBContextBase, ITransientService, IMultiDatabase
11 | {
12 | public virtual DbSet [Module] { get; set; }
13 |
14 | public [Module]Context(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies)
15 | {
16 | // ContextBase handles multi-tenant database connections
17 | }
18 |
19 | protected override void OnModelCreating(ModelBuilder builder)
20 | {
21 | base.OnModelCreating(builder);
22 |
23 | builder.Entity().ToTable(ActiveDatabase.RewriteName("[Owner][Module]"));
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Startup/ServerStartup.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.AspNetCore.Hosting;
3 | using Microsoft.Extensions.DependencyInjection;
4 | using Oqtane.Infrastructure;
5 | using [Owner].Module.[Module].Repository;
6 | using [Owner].Module.[Module].Services;
7 |
8 | namespace [Owner].Module.[Module].Startup
9 | {
10 | public class ServerStartup : IServerStartup
11 | {
12 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
13 | {
14 | // not implemented
15 | }
16 |
17 | public void ConfigureMvc(IMvcBuilder mvcBuilder)
18 | {
19 | // not implemented
20 | }
21 |
22 | public void ConfigureServices(IServiceCollection services)
23 | {
24 | services.AddTransient();
25 | services.AddDbContextFactory<[Module]Context>(opt => { }, ServiceLifetime.Transient);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.css:
--------------------------------------------------------------------------------
1 | /* Module Custom Styles */
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js:
--------------------------------------------------------------------------------
1 | /* Module Script */
2 | var [Owner] = [Owner] || {};
3 |
4 | [Owner].[Module] = {
5 | };
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/_content/Placeholder.txt:
--------------------------------------------------------------------------------
1 | The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder.
2 |
3 | ie.
4 |
5 | /_content
6 | /Radzen.Blazor
7 | /css
8 | /fonts
9 | /syncfusion.blazor
10 | /scripts
11 | /styles
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Interfaces/I[Module]Service.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 |
4 | namespace [Owner].Module.[Module].Services
5 | {
6 | public interface I[Module]Service
7 | {
8 | Task> Get[Module]sAsync(int ModuleId);
9 |
10 | Task Get[Module]Async(int [Module]Id, int ModuleId);
11 |
12 | Task Add[Module]Async(Models.[Module] [Module]);
13 |
14 | Task Update[Module]Async(Models.[Module] [Module]);
15 |
16 | Task Delete[Module]Async(int [Module]Id, int ModuleId);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Models/[Module].cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel.DataAnnotations;
3 | using System.ComponentModel.DataAnnotations.Schema;
4 | using Oqtane.Models;
5 |
6 | namespace [Owner].Module.[Module].Models
7 | {
8 | [Table("[Owner][Module]")]
9 | public class [Module] : IAuditable
10 | {
11 | [Key]
12 | public int [Module]Id { get; set; }
13 | public int ModuleId { get; set; }
14 | public string Name { get; set; }
15 |
16 | public string CreatedBy { get; set; }
17 | public DateTime CreatedOn { get; set; }
18 | public string ModifiedBy { get; set; }
19 | public DateTime ModifiedOn { get; set; }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].Module.[Module].Shared.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net9.0
5 | 1.0.0
6 | [Owner].Module.[Module]
7 | [Owner]
8 | [Owner]
9 | [Description]
10 | [Owner]
11 | [Owner].Module.[Module].Shared.Oqtane
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | [SharedReference]
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Modules/Templates/External/template.json:
--------------------------------------------------------------------------------
1 | {
2 | "Title": "Default Module Template",
3 | "Type": "External",
4 | "Version": "5.2.0",
5 | "Namespace": "[Owner].Module.[Module]"
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Client/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using Microsoft.Extensions.Localization;
3 |
4 | [assembly: RootNamespace("[Owner].Theme.[Theme].Client")]
5 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Client/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System
2 | @using System.Linq
3 | @using System.Collections.Generic
4 | @using System.Net.Http
5 | @using System.Net.Http.Json
6 |
7 | @using Microsoft.AspNetCore.Components.Authorization
8 | @using Microsoft.AspNetCore.Components.Routing
9 | @using Microsoft.AspNetCore.Components.Web
10 | @using Microsoft.Extensions.Localization
11 | @using Microsoft.JSInterop
12 |
13 | @using Oqtane
14 | @using Oqtane.Client
15 | @using Oqtane.Models
16 | @using Oqtane.Modules
17 | @using Oqtane.Modules.Controls
18 | @using Oqtane.Providers
19 | @using Oqtane.Security
20 | @using Oqtane.Services
21 | @using Oqtane.Shared
22 | @using Oqtane.Themes
23 | @using Oqtane.Themes.Controls
24 | @using Oqtane.UI
25 | @using Oqtane.Enums
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd:
--------------------------------------------------------------------------------
1 | @echo off
2 | set TargetFramework=%1
3 | set ProjectName=%2
4 |
5 | XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
6 | XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
7 | XCOPY "..\Client\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TargetFramework=$1
4 | ProjectName=$2
5 |
6 | cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
7 | cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/"
8 | cp -rf "../Server/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/"
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Package/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/Themes/Templates/External/Package/icon.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd:
--------------------------------------------------------------------------------
1 | @echo off
2 | set TargetFramework=%1
3 | set ProjectName=%2
4 |
5 | del "*.nupkg"
6 | "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
7 | XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" /Y
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.sh:
--------------------------------------------------------------------------------
1 | TargetFramework=$1
2 | ProjectName=$2
3 |
4 | "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
5 | cp -f "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\"
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/Themes/Templates/External/template.json:
--------------------------------------------------------------------------------
1 | {
2 | "Title": "Default Theme Template",
3 | "Type": "External",
4 | "Version": "5.2.0",
5 | "Namespace": "[Owner].Theme.[Theme]"
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/_content/Placeholder.txt:
--------------------------------------------------------------------------------
1 | The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder.
2 |
3 | ie.
4 |
5 | /_content
6 | /Radzen.Blazor
7 | /css
8 | /fonts
9 | /syncfusion.blazor
10 | /scripts
11 | /styles
12 |
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.eot
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.otf
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/css/open-iconic/font/fonts/open-iconic.woff
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/favicon.ico
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/icon.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/checked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/checked.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/error.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/help.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/help.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/logo-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/logo-black.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/logo-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/logo-white.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/null.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/null.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/images/unchecked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/images/unchecked.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/js/app.js:
--------------------------------------------------------------------------------
1 | function subMenu(a) {
2 | event.preventDefault();
3 | event.stopPropagation();
4 |
5 | var li = a.parentElement, submenu = li.getElementsByTagName('ul')[0];
6 | submenu.style.display = submenu.style.display == "block" ? "none" : "block";
7 | return false;
8 | }
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/loading.gif
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/oqtane-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/oqtane-black.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/oqtane-glow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/oqtane-glow.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/oqtane-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/oqtane-white.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/oqtane.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/oqtane.ico
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/oqtane.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/oqtane.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/package.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/Oqtane.Server/wwwroot/package.png
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/resources.txt:
--------------------------------------------------------------------------------
1 | This is the location where static resources such as images or style sheets should be located
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/service-worker.js:
--------------------------------------------------------------------------------
1 | // always fetch from the network and do not enable offline support
2 | self.addEventListener('fetch', () => { });
--------------------------------------------------------------------------------
/Oqtane.Server/wwwroot/users.txt:
--------------------------------------------------------------------------------
1 | Email Username DisplayName Roles FirstName LastName Street City Region Country PostalCode Phone
2 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Documentation/WorkInProgressApi.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Documentation
4 | {
5 | ///
6 | /// This attribute marks APIs to be publicly documented with a clear warning that it's work in progress.
7 | ///
8 | [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
9 | [PublicApi]
10 | public class WorkInProgressApi: Attribute
11 | {
12 | ///
13 | /// The `[WorkInProgressApi(some-comment)]` attributes must always have a comment why they are WIP.
14 | ///
15 | /// Reason why it's WIP, required
16 | public WorkInProgressApi(string comment) { }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Documentation/readme.md:
--------------------------------------------------------------------------------
1 | # Oqtane API Decorator Attributes
2 |
3 | This folder contains special attributes for the API Code Generator.
4 |
5 | The idea is that only items marked with special attributes are valid public APIs, and only these will be documented in the public docs
6 |
7 | As of 2020, all APIs are documented, and only these marked as `[PrivateApi]` will be excluded. In future, we may reverse this to only document things marked as `[PublicApi]`.
8 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/LogFunction.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Enums
2 | {
3 | public enum LogFunction
4 | {
5 | Create,
6 | Read,
7 | Update,
8 | Delete,
9 | Security,
10 | Other
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/LogLevel.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum LogLevel
4 | {
5 | Trace,
6 | Debug,
7 | Information,
8 | Warning,
9 | Error,
10 | Critical,
11 | None
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/MigrationType.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Enums
2 | {
3 | public enum MigrationType
4 | {
5 | Up,
6 | Down
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/ResourceDeclaration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Shared
4 | {
5 | [Obsolete("ResourceDeclaration is deprecated", false)]
6 | public enum ResourceDeclaration
7 | {
8 | Local,
9 | Global
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/ResourceLevel.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum ResourceLevel
4 | {
5 | Undefined,
6 | Site,
7 | Page,
8 | Module
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/ResourceLoadBehavior.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum ResourceLoadBehavior
4 | {
5 | Once,
6 | Always,
7 | None,
8 | BlazorPageScript
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/ResourceLocation.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum ResourceLocation
4 | {
5 | Head,
6 | Body
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/ResourceType.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum ResourceType
4 | {
5 | Stylesheet,
6 | Script
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/Runtime.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum Runtime
4 | {
5 | Server,
6 | WebAssembly,
7 | Auto,
8 | Hybrid
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/SearchSortField.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum SearchSortField
4 | {
5 | Relevance,
6 | Title,
7 | LastModified
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/SearchSortOrder.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum SearchSortOrder
4 | {
5 | Ascending,
6 | Descending
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Enums/SecurityAccessLevel.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public enum SecurityAccessLevel
4 | {
5 | Anonymous,
6 | View,
7 | Edit,
8 | Admin,
9 | Host
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Extensions/EnumerableExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace System.Collections
2 | {
3 | public static class EnumerableExtensions
4 | {
5 | public static bool IsNullOrEmpty(this IEnumerable source)
6 | => source == null || source.GetEnumerator().MoveNext() == false;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IAuditable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Basic create/edit information - used in many objects.
7 | ///
8 | public interface IAuditable
9 | {
10 | ///
11 | /// Username of the creator of this Object.
12 | ///
13 | string CreatedBy { get; set; }
14 |
15 | ///
16 | /// Created Timestamp for this Object.
17 | ///
18 | DateTime CreatedOn { get; set; }
19 |
20 | ///
21 | /// Username of the last user who modified this Object.
22 | ///
23 | string ModifiedBy { get; set; }
24 |
25 | ///
26 | /// Modified Timestamp for this Object.
27 | ///
28 | DateTime ModifiedOn { get; set; }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IClientService.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Modules
2 | {
3 | ///
4 | /// Empty interface used to decorate client module services for auto registration as scoped
5 | ///
6 | public interface IClientService
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IClientStartup.cs:
--------------------------------------------------------------------------------
1 |
2 | using Microsoft.Extensions.DependencyInjection;
3 |
4 | namespace Oqtane.Services
5 | {
6 | public interface IClientStartup
7 | {
8 | // This method gets called by the runtime. Use this method to add services to the container.
9 | void ConfigureServices(IServiceCollection services);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IDatabaseConfigControl.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Interfaces
2 | {
3 | public interface IDatabaseConfigControl
4 | {
5 | string GetConnectionString();
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IDeletable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Audit information for things than can be deleted.
7 | ///
8 | public interface IDeletable
9 | {
10 | ///
11 | /// who deleted this object.
12 | ///
13 | string DeletedBy { get; set; }
14 |
15 | ///
16 | /// Timestamp when it was deleted.
17 | ///
18 | DateTime? DeletedOn { get; set; }
19 |
20 | ///
21 | /// If something is deleted, this will be true.
22 | ///
23 | bool IsDeleted { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IImageService.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Services
2 | {
3 | public interface IImageService
4 | {
5 | public string[] GetAvailableFormats();
6 |
7 | public string CreateImage(string filepath, int width, int height, string mode, string position, string background, string rotate, string format, string imagepath);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ISearchProvider.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Services
6 | {
7 | public interface ISearchProvider
8 | {
9 | string Name { get; }
10 |
11 | Task> GetSearchResultsAsync(SearchQuery searchQuery);
12 |
13 | Task SaveSearchContent(SearchContent searchContent, Dictionary siteSettings);
14 |
15 | Task DeleteSearchContent(int siteId);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ISearchService.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Threading.Tasks;
3 | using Oqtane.Models;
4 |
5 | namespace Oqtane.Services
6 | {
7 | public interface ISearchService
8 | {
9 | Task GetSearchResultsAsync(SearchQuery searchQuery);
10 |
11 | Task SaveSearchContentsAsync(List searchContents, Dictionary siteSettings);
12 |
13 | Task DeleteSearchContentsAsync(int siteId);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ISearchable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 | using Oqtane.Models;
5 |
6 | namespace Oqtane.Interfaces
7 | {
8 | public interface ISearchable
9 | {
10 | public Task> GetSearchContentsAsync(PageModule pageModule, DateTime lastIndexedOn);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IService.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Modules
2 | {
3 | ///
4 | /// Empty interface used to decorate module services for auto registration as scoped
5 | ///
6 | public interface IService
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ISettingsControl.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace Oqtane.Interfaces
4 | {
5 | public interface ISettingsControl
6 | {
7 | Task UpdateSettings();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ITextEditor.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace Oqtane.Interfaces
4 | {
5 | ///
6 | /// Text editor interface.
7 | ///
8 | public interface ITextEditor
9 | {
10 | string Name { get; }
11 |
12 | ///
13 | /// initializes the editor with the initialize content.
14 | ///
15 | /// the initialize content.
16 | void Initialize(string content);
17 |
18 | ///
19 | /// get content from the editor.
20 | ///
21 | ///
22 | Task GetContent();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/IThemeControl.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.Collections.Generic;
3 |
4 | namespace Oqtane.Themes
5 | {
6 | public interface IThemeControl
7 | {
8 | ///
9 | /// Friendly name for a theme
10 | ///
11 | string Name { get; }
12 |
13 | ///
14 | /// Screen shot of a theme - assumed to be in the ThemePath() folder
15 | ///
16 | string Thumbnail { get; }
17 |
18 | ///
19 | /// Comma delimited list of all panes in a theme
20 | ///
21 | string Panes { get; }
22 |
23 | ///
24 | /// Identifies all resources in a theme
25 | ///
26 | List Resources { get; }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ITokenSource.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace Oqtane.Interfaces
8 | {
9 | public interface ITokenSource
10 | {
11 | IDictionary GetTokens();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Interfaces/ITransientService.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Modules
2 | {
3 | ///
4 | /// Empty interface used to decorate module services for auto registration as a transient
5 | ///
6 | public interface ITransientService
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Culture.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | ///
4 | /// Culture information describing a Culture
5 | ///
6 | public class Culture
7 | {
8 | ///
9 | /// Short code like `en` or `en-US`
10 | ///
11 | public string Name { get; set; }
12 |
13 | ///
14 | /// Nice name for the user, like `English (United States)`
15 | ///
16 | public string DisplayName { get; set; }
17 |
18 | ///
19 | /// Information if this is the default culture.
20 | ///
21 | ///
22 | /// Not sure if this is actually valid, as ATM there is no setting to configure a _default_ culture
23 | ///
24 | public bool IsDefault { get; set; }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Database.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | ///
4 | /// Information about a Database used in the current Oqtane installation
5 | ///
6 | public class Database
7 | {
8 | ///
9 | /// Name of the Database
10 | ///
11 | public string Name { get; set; }
12 |
13 | ///
14 | /// Namespace & name of the UI control to configure this database, like `Oqtane.Installer.Controls.SqlServerConfig, Oqtane.Client`
15 | ///
16 | public string ControlType { get; set; }
17 |
18 | ///
19 | /// Type of DB using the full namespace, like `Oqtane.Database.SqlServer.SqlServerDatabase, Oqtane.Database.SqlServer`
20 | ///
21 | public string DBType { get; set; }
22 |
23 | ///
24 | /// whether this item is the default database provider ( ie. specified by DefaultDBType in appsettings.json )
25 | ///
26 | public bool IsDefault { get; set; }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/ExternalLoginProvider.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Models
4 | {
5 | public class ExternalLoginProvider
6 | {
7 | public string Name { get; set; }
8 |
9 | public Dictionary Settings { get; set; }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Installation.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | ///
4 | /// Internal message used internally during installation.
5 | ///
6 | /// Each part of the installation will return the status / message when installing.
7 | ///
8 | public class Installation
9 | {
10 | ///
11 | /// Status if everything worked.
12 | ///
13 | public bool Success { get; set; }
14 |
15 | ///
16 | /// Message or error in case something failed.
17 | ///
18 | public string Message { get; set; }
19 |
20 | ///
21 | /// current alias value from server
22 | ///
23 | public Alias Alias { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/MigrationHistoryTable.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | public class MigrationHistoryTable
4 | {
5 | public string TableName { get; set; }
6 | public string TableSchema { get; set; }
7 | public string MigrationIdColumnName { get; set; }
8 | public string ProductVersionColumnName { get; set; }
9 | public string AppliedVersionColumnName { get; set; }
10 | public string AppliedDateColumnName { get; set; }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/ModelBase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | public class ModelBase : IAuditable
6 | {
7 | public string CreatedBy { get; set; }
8 | public DateTime CreatedOn { get; set; }
9 | public string ModifiedBy { get; set; }
10 | public DateTime ModifiedOn { get; set; }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/ModuleContent.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | ///
4 | /// Generic Model for Module-Contents to enable Import/Export of the Module-Data
5 | ///
6 | public class ModuleContent
7 | {
8 | ///
9 | /// Reference to a for which this content is relevant.
10 | ///
11 | public string ModuleDefinitionName { get; set; }
12 |
13 | ///
14 | /// Version of the which is used here. _It's not the version of the Content_
15 | ///
16 | public string Version { get; set; }
17 |
18 | ///
19 | /// Serialized Content of the module for import/export.
20 | ///
21 | public string Content { get; set; }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Result.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | public class Result
4 | {
5 | public bool Success { get; set; }
6 |
7 | public string Message { get; set; }
8 |
9 | public Result() {}
10 |
11 | public Result(bool success)
12 | {
13 | Success = success;
14 | Message = "";
15 | }
16 |
17 | public Result(bool success, string message)
18 | {
19 | Success = success;
20 | Message = message;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Role.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Describes a Security Role in Oqtane.
7 | ///
8 | public class Role : ModelBase
9 | {
10 | ///
11 | /// Primary ID
12 | ///
13 | public int RoleId { get; set; }
14 |
15 | ///
16 | /// Reference to a if applicable.
17 | ///
18 | public int? SiteId { get; set; }
19 |
20 | ///
21 | /// Role name to show in Admin dialogs.
22 | ///
23 | public string Name { get; set; }
24 |
25 | ///
26 | /// Brief description for Admin dialogs.
27 | ///
28 | public string Description { get; set; }
29 |
30 | ///
31 | /// Determines if users automatically get assigned to this role.
32 | ///
33 | public bool IsAutoAssigned { get; set; }
34 | public bool IsSystem { get; set; }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchContentProperty.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 | using Microsoft.EntityFrameworkCore;
3 |
4 | namespace Oqtane.Models
5 | {
6 | public class SearchContentProperty
7 | {
8 | [Key]
9 | public int PropertyId { get; set; }
10 |
11 | public int SearchContentId { get; set; }
12 |
13 | public string Name { get; set; }
14 |
15 | public string Value { get; set; }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchContentWord.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel.DataAnnotations;
3 | using System.ComponentModel.DataAnnotations.Schema;
4 |
5 | namespace Oqtane.Models
6 | {
7 | public class SearchContentWord
8 | {
9 | [Key]
10 | public int SearchContentWordId { get; set; }
11 |
12 | public int SearchContentId { get; set; }
13 |
14 | public int SearchWordId { get; set; }
15 |
16 | public int Count { get; set; }
17 |
18 | public DateTime CreatedOn { get; set; }
19 |
20 | public DateTime ModifiedOn { get; set; }
21 |
22 | public SearchWord SearchWord { get; set; }
23 |
24 | public SearchContent SearchContent { get; set; }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Oqtane.Shared;
4 |
5 | namespace Oqtane.Models
6 | {
7 | public class SearchQuery
8 | {
9 | public int SiteId { get; set; }
10 |
11 | public Alias Alias { get; set; }
12 |
13 | public string Keywords { get; set; }
14 |
15 | public string IncludeEntities { get; set; } = ""; // comma delimited entities to include
16 |
17 | public string ExcludeEntities { get; set; } = ""; // comma delimited entities to exclude
18 |
19 | public DateTime FromDate { get; set; }
20 |
21 | public DateTime ToDate { get; set; }
22 |
23 | public IDictionary Properties { get; set; } = new Dictionary();
24 |
25 | public int PageIndex { get; set; }
26 |
27 | public int PageSize { get; set; }
28 |
29 | public SearchSortField SortField { get; set; }
30 |
31 | public SearchSortOrder SortOrder { get; set; }
32 |
33 | public int BodyLength { get; set;} = 255;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchResult.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | public class SearchResult : SearchContent
4 | {
5 | public float Score { get; set; }
6 |
7 | public string DisplayScore { get; set; }
8 |
9 | public string Snippet { get; set; }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchResults.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Models
4 | {
5 | public class SearchResults
6 | {
7 | public List Results { get; set; }
8 |
9 | public int TotalResults { get; set; }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SearchWord.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel.DataAnnotations;
3 |
4 | namespace Oqtane.Models
5 | {
6 | public class SearchWord
7 | {
8 | [Key]
9 | public int SearchWordId { get; set; }
10 |
11 | public string Word { get; set; }
12 |
13 | public DateTime CreatedOn { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Sitemap.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Describes a Sitemap
7 | ///
8 | public class Sitemap
9 | {
10 | ///
11 | /// Url
12 | ///
13 | public string Url { get; set; }
14 |
15 | ///
16 | /// Url
17 | ///
18 | public DateTime ModifiedOn { get; set; }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/SqlQuery.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Models
4 | {
5 | public class SqlQuery
6 | {
7 | ///
8 | /// Reference to the this belongs to
9 | ///
10 | public int TenantId { get; set; }
11 | public string DBType { get; set; }
12 | public string DBConnectionString { get; set; }
13 | public string Query { get; set; }
14 | public List> Results { get; set; }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Stylesheet.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Shared;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Stylesheet inherits from Resource and offers constructors with parameters specific to Stylesheets
7 | ///
8 | public class Stylesheet : Resource
9 | {
10 | private void SetDefaults()
11 | {
12 | this.ResourceType = ResourceType.Stylesheet;
13 | this.Location = ResourceLocation.Head;
14 | }
15 |
16 | public Stylesheet(string Href)
17 | {
18 | SetDefaults();
19 | this.Url = Href;
20 | }
21 |
22 | public Stylesheet(string Href, string Integrity, string CrossOrigin)
23 | {
24 | SetDefaults();
25 | this.Url = Href;
26 | this.Integrity = Integrity;
27 | this.CrossOrigin = CrossOrigin;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Sync.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace Oqtane.Models
5 | {
6 | public class Sync
7 | {
8 | public DateTime SyncDate { get; set; }
9 | public List SyncEvents { get; set; }
10 | }
11 |
12 | public class SyncEvent : EventArgs
13 | {
14 | public int TenantId { get; set; }
15 | public int SiteId { get; set; }
16 | public string EntityName { get; set; }
17 | public int EntityId { get; set; }
18 | public string Action { get; set; }
19 | public DateTime ModifiedOn { get; set; }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/Tenant.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Models
4 | {
5 | ///
6 | /// Describes a Tenant in Oqtane.
7 | /// Tenants can contain multiple s and have all their data in a separate Database.
8 | ///
9 | public class Tenant : ModelBase
10 | {
11 | ///
12 | /// ID of the Tenant.
13 | ///
14 | public int TenantId { get; set; }
15 |
16 | ///
17 | /// Name of the Tenant to show in Tenant lists.
18 | ///
19 | public string Name { get; set; }
20 |
21 | ///
22 | /// Connection string to access this Tenant DB.
23 | ///
24 | public string DBConnectionString { get; set; }
25 |
26 | ///
27 | /// Type of DB used in this Tenant
28 | ///
29 | ///
30 | /// New in v2.1.0
31 | ///
32 | public string DBType { get; set; }
33 | public string Version { get; set; }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/ThemeControl.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | public class ThemeControl
4 | {
5 | public string TypeName { get; set; }
6 | public string Name { get; set; }
7 | public string Thumbnail { get; set; }
8 | public string Panes { get; set; }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/TimeZone.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Models
2 | {
3 | public class TimeZone
4 | {
5 | public string Id { get; set; }
6 |
7 | public string DisplayName { get; set; }
8 |
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Models/UserValidateResult.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace Oqtane.Models
8 | {
9 | public class UserValidateResult
10 | {
11 | public bool Succeeded { get; set; }
12 |
13 | public IDictionary Errors { get; set; } = new Dictionary();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs:
--------------------------------------------------------------------------------
1 | using Oqtane.Models;
2 | using System.ComponentModel.DataAnnotations;
3 | using Oqtane.Documentation;
4 |
5 | namespace Oqtane.Modules.HtmlText.Models
6 | {
7 | [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")]
8 | public class HtmlText : ModelBase
9 | {
10 | [Key]
11 | public int HtmlTextId { get; set; }
12 | public int ModuleId { get; set; }
13 | public string Content { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/AuthenticationProviderTypes.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class AuthenticationProviderTypes {
3 | public const string OpenIDConnect = "oidc";
4 | public const string OAuth2 = "oauth2";
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/ControllerRoutes.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class ControllerRoutes {
3 | public const string Default = "{alias}/api/[controller]";
4 | public const string ApiRoute = "api/[controller]";
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/ExternalLoginStatus.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class ExternalLoginStatus {
3 | public const string Success = "Success";
4 | public const string MissingClaims = "MissingClaims";
5 | public const string DuplicateEmail = "DuplicateEmail";
6 | public const string UserNotCreated = "UserNotCreated";
7 | public const string UserDoesNotExist = "UserDoesNotExist";
8 | public const string ProviderKeyMismatch = "ProviderKeyMismatch";
9 | public const string VerificationRequired = "VerificationRequired";
10 | public const string AccessDenied = "AccessDenied";
11 | public const string RemoteFailure = "RemoteFailure";
12 | public const string ReviewClaims = "ReviewClaims";
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/FolderTypes.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class FolderTypes {
3 | public const string Private = "Private";
4 | public const string Public = "Public";
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/InstallConfig.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Oqtane.Shared
3 | {
4 | public class InstallConfig
5 | {
6 | public string ConnectionString { get; set; }
7 | public string DatabaseType { get; set; }
8 | public string Aliases { get; set; }
9 | public string TenantName { get; set; }
10 | public bool IsNewTenant { get; set; }
11 | public string SiteName { get; set; }
12 | public string HostUsername { get; set; }
13 | public string HostPassword { get; set; }
14 | public string HostEmail { get; set; }
15 | public string HostName { get; set; }
16 | public string SiteTemplate { get; set; }
17 | public string DefaultTheme { get; set; }
18 | public string DefaultContainer { get; set; }
19 | public string DefaultAdminContainer { get; set; }
20 | public string RenderMode { get; set; }
21 | public string Runtime { get; set; }
22 | public bool Register { get; set; }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/OqtaneIgnoreAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Oqtane.Shared
4 | {
5 | [AttributeUsage(AttributeTargets.Class)]
6 | public class OqtaneIgnoreAttribute : Attribute
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/PaneNames.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class PaneNames {
3 | public const string Admin = "Admin";
4 | public const string Default = "Default";
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/PermissionNames.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | public class PermissionNames
4 | {
5 | // UI permissions
6 | public const string View = "View";
7 | public const string Edit = "Edit";
8 | public const string Browse = "Browse";
9 | public const string Utilize = "Utilize";
10 |
11 | // API permissions
12 | public const string Read = "Read";
13 | public const string Write = "Write";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/PolicyNames.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared
2 | {
3 | // static PolicyNames are deprecated and replaced with dynamic policies
4 | public class PolicyNames
5 | {
6 | public const string ViewModule = "ViewModule";
7 | public const string EditModule = "EditModule";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/RenderModes.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class RenderModes {
3 | public const string Static = "Static";
4 | public const string Interactive = "Interactive";
5 | public const string Headless = "Headless";
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/RoleNames.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class RoleNames {
3 | public const string Everyone = "All Users";
4 | public const string Host = "Host Users";
5 | public const string Admin = "Administrators";
6 | public const string Registered = "Registered Users";
7 | public const string Unauthenticated = "Unauthenticated Users";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/Runtimes.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class Runtimes {
3 | public const string Server = "Server";
4 | public const string WebAssembly = "WebAssembly";
5 | public const string Auto = "Auto";
6 | public const string Hybrid = "Hybrid";
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/SearchUtils.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Oqtane.Shared
4 | {
5 | public sealed class SearchUtils
6 | {
7 | public static List GetKeywords(string keywords)
8 | {
9 | var keywordsList = new List();
10 | if(!string.IsNullOrEmpty(keywords))
11 | {
12 | foreach (var keyword in keywords.Split(' '))
13 | {
14 | if (!string.IsNullOrWhiteSpace(keyword.Trim()))
15 | {
16 | keywordsList.Add(keyword.Trim().ToLower());
17 | }
18 | }
19 | }
20 |
21 | return keywordsList;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/ServiceActivator.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.Extensions.DependencyInjection;
3 |
4 | namespace Oqtane.Shared
5 | {
6 | public static class ServiceActivator
7 | {
8 | private static IServiceProvider _serviceProvider = null;
9 |
10 | public static void Configure(IServiceProvider serviceProvider)
11 | {
12 | _serviceProvider = serviceProvider;
13 | }
14 |
15 | public static IServiceScope GetScope(IServiceProvider serviceProvider = null)
16 | {
17 | var provider = serviceProvider ?? _serviceProvider;
18 |
19 | return provider?.GetRequiredService().CreateScope();
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/SyncEventActions.cs:
--------------------------------------------------------------------------------
1 | namespace Oqtane.Shared {
2 | public class SyncEventActions {
3 | // client actions for PageState management
4 | public const string Refresh = "Refresh";
5 | public const string Reload = "Reload";
6 |
7 | // server actions for raising Events
8 | public const string Create = "Create";
9 | public const string Update = "Update";
10 | public const string Delete = "Delete";
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/TenantNames.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace Oqtane.Shared {
6 | public class TenantNames {
7 | public const string Master = "Master";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Oqtane.Shared/Shared/UserNames.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace Oqtane.Shared {
6 | public class UserNames {
7 | public const string Host = "host";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/installer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/installer.png
--------------------------------------------------------------------------------
/oqtane.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/oqtane.png
--------------------------------------------------------------------------------
/screenshots/Architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/Architecture.png
--------------------------------------------------------------------------------
/screenshots/Installer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/Installer.png
--------------------------------------------------------------------------------
/screenshots/databases.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/databases.png
--------------------------------------------------------------------------------
/screenshots/screenshot0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot0.png
--------------------------------------------------------------------------------
/screenshots/screenshot1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot1.png
--------------------------------------------------------------------------------
/screenshots/screenshot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot2.png
--------------------------------------------------------------------------------
/screenshots/screenshot3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot3.png
--------------------------------------------------------------------------------
/screenshots/screenshot4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot4.png
--------------------------------------------------------------------------------
/screenshots/screenshot5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot5.png
--------------------------------------------------------------------------------
/screenshots/screenshot6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot6.png
--------------------------------------------------------------------------------
/screenshots/screenshot7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oqtane/oqtane.framework/29fe3dfd0b785558df41c4677d21178107d4f3a7/screenshots/screenshot7.png
--------------------------------------------------------------------------------