From 51d432fd2ea1611605f2e8ecfbb249928076cc7d Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Wed, 18 Feb 2015 02:35:32 -0800 Subject: [PATCH 01/12] webdav portal filter + detail view added --- WebsitePanel/Database/update_db.sql | 87 + .../EnterpriseStorageProxy.cs | 124 + .../Data/DataProvider.cs | 39 + .../EnterpriseStorageController.cs | 31 + .../esEnterpriseStorage.asmx.cs | 12 + .../LocalizedDescriptionAttribute.cs | 29 + .../Config/Entities/ElementsRendering.cs | 2 - .../Config/Entities/FileIconsDictionary.cs | 4 +- .../Entities/FilesToIgnoreCollection.cs | 38 + .../Config/IWebDavAppConfig.cs | 1 + .../ElementsRenderingElement.cs | 8 - .../FileIconsElementCollection.cs | 8 + .../WebConfigSections/FilesToIgnoreElement.cs | 24 + .../FilesToIgnoreElementCollection.cs | 19 + ...DavExplorerConfigurationSettingsSection.cs | 8 + .../Config/WebDavAppConfigManager.cs | 2 + .../Entities/Account/Enums/FolderViewTypes.cs | 8 + .../Entities/Account/UserPortalSettings.cs | 9 + .../Extensions/EnumExtensions.cs | 23 + .../Helper/SerializeHelper.cs | 41 + .../WebsitePanel.WebDav.Core/IFolder.cs | 62 + .../WebsitePanel.WebDav.Core/IResource.cs | 9 + .../Managers/Users/IUserSettingsManager.cs | 13 + .../WebsitePanel.WebDav.Core/ItemType.cs | 5 + .../Managers/Users/UserSettingsManager.cs | 40 + .../Managers/WebDavManager.cs | 29 +- .../Resources/WebDavResources.Designer.cs | 18 + .../Resources/WebDavResources.resx | 6 + .../WebsitePanel.WebDav.Core/WebDavSession.cs | 13 + .../WebsitePanel.WebDav.Core.csproj | 10 + .../WebsitePanel.WebDav.Core/WspContext.cs | 2 + .../App_Start/BundleConfig.cs | 32 +- .../App_Start/RouteConfig.cs | 67 +- .../Routes/AccountRouteNames.cs | 0 .../Routes/FileSystemRouteNames.cs | 2 + .../{UI => App_Start}/Routes/OwaRouteNames.cs | 0 .../css/dataTables.autoFill.css | 24 + .../css/dataTables.autoFill.min.css | 1 + .../css/dataTables.bootstrap.css | 204 + .../css/dataTables.colReorder.css | 14 + .../css/dataTables.colReorder.min.css | 1 + .../css/dataTables.colVis.css | 185 + .../css/dataTables.colVis.min.css | 1 + .../css/dataTables.colvis.jqueryui.css | 23 + .../css/dataTables.fixedColumns.css | 24 + .../css/dataTables.fixedColumns.min.css | 1 + .../css/dataTables.fixedHeader.css | 7 + .../css/dataTables.fixedHeader.min.css | 1 + .../css/dataTables.foundation.css | 213 + .../css/dataTables.jqueryui.css | 316 + .../css/dataTables.jqueryui.scss | 408 + .../css/dataTables.keyTable.css | 7 + .../css/dataTables.keyTable.min.css | 1 + .../css/dataTables.responsive.css | 93 + .../css/dataTables.responsive.scss | 132 + .../css/dataTables.scroller.css | 44 + .../css/dataTables.scroller.min.css | 1 + .../css/dataTables.tableTools.css | 361 + .../css/dataTables.tableTools.min.css | 1 + .../css/jquery.dataTables.css | 476 + .../css/jquery.dataTables.min.css | 1 + .../css/jquery.dataTables_themeroller.css | 330 + .../images/back_disabled.png | Bin 0 -> 1361 bytes .../DataTables-1.10.4/images/back_enabled.png | Bin 0 -> 1379 bytes .../images/back_enabled_hover.png | Bin 0 -> 1375 bytes .../DataTables-1.10.4/images/background.png | Bin 0 -> 944 bytes .../DataTables-1.10.4/images/collection.png | Bin 0 -> 1166 bytes .../images/collection_hover.png | Bin 0 -> 1194 bytes .../Content/DataTables-1.10.4/images/copy.png | Bin 0 -> 2184 bytes .../DataTables-1.10.4/images/copy_hover.png | Bin 0 -> 2797 bytes .../Content/DataTables-1.10.4/images/csv.png | Bin 0 -> 1607 bytes .../DataTables-1.10.4/images/csv_hover.png | Bin 0 -> 1854 bytes .../images/details_close.png | Bin 0 -> 841 bytes .../DataTables-1.10.4/images/details_open.png | Bin 0 -> 881 bytes .../DataTables-1.10.4/images/filler.png | Bin 0 -> 1040 bytes .../images/forward_disabled.png | Bin 0 -> 1363 bytes .../images/forward_enabled.png | Bin 0 -> 1380 bytes .../images/forward_enabled_hover.png | Bin 0 -> 1379 bytes .../DataTables-1.10.4/images/insert.png | Bin 0 -> 1885 bytes .../images/loading-background.png | Bin 0 -> 1013 bytes .../Content/DataTables-1.10.4/images/pdf.png | Bin 0 -> 4325 bytes .../DataTables-1.10.4/images/pdf_hover.png | Bin 0 -> 2786 bytes .../DataTables-1.10.4/images/print.png | Bin 0 -> 2123 bytes .../DataTables-1.10.4/images/print_hover.png | Bin 0 -> 2230 bytes .../DataTables-1.10.4/images/sort_asc.png | Bin 0 -> 1118 bytes .../images/sort_asc_disabled.png | Bin 0 -> 2916 bytes .../DataTables-1.10.4/images/sort_both.png | Bin 0 -> 1136 bytes .../DataTables-1.10.4/images/sort_desc.png | Bin 0 -> 1127 bytes .../images/sort_desc_disabled.png | Bin 0 -> 1045 bytes .../Content/DataTables-1.10.4/images/xls.png | Bin 0 -> 1641 bytes .../DataTables-1.10.4/images/xls_hover.png | Bin 0 -> 2061 bytes .../DataTables-1.10.4/swf/copy_csv_xls.swf | Bin 0 -> 2232 bytes .../swf/copy_csv_xls_pdf.swf | Bin 0 -> 58845 bytes .../Content/Images/indicator_medium.gif | Bin 0 -> 6613 bytes .../Content/Site.css | 43 +- .../Controllers/Api/OwaController.cs | 4 +- .../Controllers/FileSystemController.cs | 145 +- .../DependencyInjection/PortalDependencies.cs | 3 + .../Providers/WebDavManagerProvider.cs | 38 - .../FileOperations/FileOpenerManager.cs | 44 + .../WebsitePanel.WebDavPortal/Global.asax.cs | 6 + .../Helpers/DataTableHelper.cs | 44 + .../Logs/log-debug.log | 0 .../Mapping/AutoMapperPortalConfiguration.cs | 17 + .../Webdav/ResourceTableItemProfile.cs | 50 + .../DataTables/JqueryDataTableModelBinder.cs | 78 + .../DataTable/JqueryDataTableBaseEntity.cs | 13 + .../Common/DataTable/JqueryDataTableColumn.cs | 13 + .../Common/DataTable/JqueryDataTableOrder.cs | 8 + .../DataTable/JqueryDataTableRequest.cs | 16 + .../Common/DataTable/JqueryDataTableSearch.cs | 9 + .../DataTable/JqueryDataTablesResponse.cs | 20 + .../FileSystem/ResourceTableItemModel.cs | 34 + .../Models/ModelForWebDav.cs | 2 + .../UI.Designer.cs} | 71 +- .../{UI/Resources.resx => Resources/UI.resx} | 21 + .../DataTables-1.10.4/dataTables.autoFill.js | 855 + .../dataTables.autoFill.min.js | 22 + .../DataTables-1.10.4/dataTables.bootstrap.js | 152 + .../dataTables.colReorder.js | 1371 ++ .../dataTables.colReorder.min.js | 26 + .../DataTables-1.10.4/dataTables.colVis.js | 1107 ++ .../dataTables.colVis.min.js | 23 + .../dataTables.fixedColumns.js | 1399 ++ .../dataTables.fixedColumns.min.js | 30 + .../dataTables.fixedHeader.js | 1028 ++ .../dataTables.fixedHeader.min.js | 30 + .../dataTables.foundation.js | 186 + .../DataTables-1.10.4/dataTables.jqueryui.js | 102 + .../DataTables-1.10.4/dataTables.keyTable.js | 1175 ++ .../dataTables.keyTable.min.js | 18 + .../dataTables.responsive.js | 801 + .../dataTables.responsive.min.js | 17 + .../DataTables-1.10.4/dataTables.scroller.js | 1262 ++ .../dataTables.scroller.min.js | 25 + .../dataTables.tableTools.js | 3215 ++++ .../dataTables.tableTools.min.js | 69 + .../DataTables-1.10.4/jquery.dataTables.js | 14840 ++++++++++++++++ .../jquery.dataTables.min.js | 157 + .../Scripts/appScripts/dialogs.js | 40 +- .../Scripts/appScripts/fileBrowsing.js | 53 +- .../Scripts/appScripts/uploadingData2.js | 2 +- .../Scripts/appScripts/wsp.js | 15 +- .../Views/FileSystem/ShowContent.cshtml | 56 +- .../Views/FileSystem/_ResoursePartial.cshtml | 5 +- .../FileSystem/_ShowContentBigIcons.cshtml | 24 + .../Views/FileSystem/_ShowContentTable.cshtml | 53 + .../FileSystem/_ShowContentTopMenu.cshtml | 51 + .../Views/Shared/_ConfirmDialog.cshtml | 9 +- .../Views/Shared/_Layout.cshtml | 7 +- .../Views/Shared/_ProcessDialog.cshtml | 14 +- .../WebsitePanel.WebDavPortal/Web.config | 10 +- .../WebsitePanel.WebDavPortal.csproj | 118 +- .../WebsitePanel.WebDavPortal/packages.config | 2 + .../WebsitePanel.WebPortal.csproj | 9 + .../Sources/packages/repositories.config | 2 + 156 files changed, 32494 insertions(+), 260 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Attributes/Resources/LocalizedDescriptionAttribute.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FilesToIgnoreCollection.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElement.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElementCollection.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/Enums/FolderViewTypes.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/UserPortalSettings.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Extensions/EnumExtensions.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Helper/SerializeHelper.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/Users/IUserSettingsManager.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/Users/UserSettingsManager.cs rename WebsitePanel/Sources/WebsitePanel.WebDavPortal/{UI => App_Start}/Routes/AccountRouteNames.cs (100%) rename WebsitePanel/Sources/WebsitePanel.WebDavPortal/{UI => App_Start}/Routes/FileSystemRouteNames.cs (80%) rename WebsitePanel/Sources/WebsitePanel.WebDavPortal/{UI => App_Start}/Routes/OwaRouteNames.cs (100%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.bootstrap.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colvis.jqueryui.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.foundation.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.scss create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.scss create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.min.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables_themeroller.css create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_disabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_enabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_enabled_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/background.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/collection.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/collection_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/copy.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/copy_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/details_close.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/details_open.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/filler.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_disabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/insert.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/loading-background.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/print.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/print_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc_disabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_both.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc_disabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/xls.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/xls_hover.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls.swf create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls_pdf.swf create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Images/indicator_medium.gif delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Helpers/DataTableHelper.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Logs/log-debug.log create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/AutoMapperPortalConfiguration.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/ModelBinders/DataTables/JqueryDataTableModelBinder.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableBaseEntity.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableColumn.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableOrder.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableRequest.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableSearch.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTablesResponse.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs rename WebsitePanel/Sources/WebsitePanel.WebDavPortal/{UI/Resources.Designer.cs => Resources/UI.Designer.cs} (75%) rename WebsitePanel/Sources/WebsitePanel.WebDavPortal/{UI/Resources.resx => Resources/UI.resx} (90%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.autoFill.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.autoFill.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.bootstrap.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colReorder.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colReorder.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colVis.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colVis.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.fixedColumns.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.fixedColumns.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.fixedHeader.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.fixedHeader.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.foundation.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.jqueryui.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.keyTable.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.keyTable.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.responsive.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.responsive.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.scroller.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.scroller.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.tableTools.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.tableTools.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/jquery.dataTables.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/jquery.dataTables.min.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentBigIcons.cshtml create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentTable.cshtml create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentTopMenu.cshtml diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 30e79afd..1f3b5c1c 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -8603,4 +8603,91 @@ LEFT OUTER JOIN ExchangeMailboxPlans AS AP ON E.ArchivingMailboxPlanId = AP.Mail WHERE E.UserPrincipalName = @UserPrincipalName RETURN +GO + + + +--Webdav portal users settings + +IF NOT EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'WebDavPortalUsersSettings') +CREATE TABLE WebDavPortalUsersSettings +( + ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + AccountId INT NOT NULL, + Settings NVARCHAR(max) +) +GO + +IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME ='FK_WebDavPortalUsersSettings_UserId') +ALTER TABLE [dbo].[WebDavPortalUsersSettings] +DROP CONSTRAINT [FK_WebDavPortalUsersSettings_UserId] +GO + +ALTER TABLE [dbo].[WebDavPortalUsersSettings] WITH CHECK ADD CONSTRAINT [FK_WebDavPortalUsersSettings_UserId] FOREIGN KEY([AccountID]) +REFERENCES [dbo].[ExchangeAccounts] ([AccountID]) +ON DELETE CASCADE +GO + + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetWebDavPortalUsersSettingsByAccountId') +DROP PROCEDURE GetWebDavPortalUsersSettingsByAccountId +GO +CREATE PROCEDURE [dbo].[GetWebDavPortalUsersSettingsByAccountId] +( + @AccountId INT +) +AS +SELECT TOP 1 + US.Id, + US.AccountId, + US.Settings + FROM WebDavPortalUsersSettings AS US + WHERE AccountId = @AccountId +GO + + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddWebDavPortalUsersSettings') +DROP PROCEDURE AddWebDavPortalUsersSettings +GO +CREATE PROCEDURE [dbo].[AddWebDavPortalUsersSettings] +( + @WebDavPortalUsersSettingsId INT OUTPUT, + @AccountId INT, + @Settings NVARCHAR(max) +) +AS + +INSERT INTO WebDavPortalUsersSettings +( + AccountId, + Settings +) +VALUES +( + @AccountId, + @Settings +) + +SET @WebDavPortalUsersSettingsId = SCOPE_IDENTITY() + +RETURN +GO + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'UpdateWebDavPortalUsersSettings') +DROP PROCEDURE UpdateWebDavPortalUsersSettings +GO +CREATE PROCEDURE [dbo].[UpdateWebDavPortalUsersSettings] +( + @AccountId INT, + @Settings NVARCHAR(max) +) +AS + +UPDATE WebDavPortalUsersSettings +SET + Settings = @Settings +WHERE AccountId = @AccountId GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index 7300cf58..e54c99e8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -69,6 +69,10 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback CheckUsersDomainExistsOperationCompleted; + private System.Threading.SendOrPostCallback GetWebDavPortalUserSettingsByAccountIdOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateWebDavPortalUserSettingsOperationCompleted; + private System.Threading.SendOrPostCallback GetDirectoryBrowseEnabledOperationCompleted; private System.Threading.SendOrPostCallback SetDirectoryBrowseEnabledOperationCompleted; @@ -145,6 +149,12 @@ namespace WebsitePanel.EnterpriseServer { /// public event CheckUsersDomainExistsCompletedEventHandler CheckUsersDomainExistsCompleted; + /// + public event GetWebDavPortalUserSettingsByAccountIdCompletedEventHandler GetWebDavPortalUserSettingsByAccountIdCompleted; + + /// + public event UpdateWebDavPortalUserSettingsCompletedEventHandler UpdateWebDavPortalUserSettingsCompleted; + /// public event GetDirectoryBrowseEnabledCompletedEventHandler GetDirectoryBrowseEnabledCompleted; @@ -928,6 +938,90 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetWebDavPortalUserSettingsByAccount" + + "Id", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetWebDavPortalUserSettingsByAccountId(int accountId) { + object[] results = this.Invoke("GetWebDavPortalUserSettingsByAccountId", new object[] { + accountId}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetWebDavPortalUserSettingsByAccountId(int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetWebDavPortalUserSettingsByAccountId", new object[] { + accountId}, callback, asyncState); + } + + /// + public string EndGetWebDavPortalUserSettingsByAccountId(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetWebDavPortalUserSettingsByAccountIdAsync(int accountId) { + this.GetWebDavPortalUserSettingsByAccountIdAsync(accountId, null); + } + + /// + public void GetWebDavPortalUserSettingsByAccountIdAsync(int accountId, object userState) { + if ((this.GetWebDavPortalUserSettingsByAccountIdOperationCompleted == null)) { + this.GetWebDavPortalUserSettingsByAccountIdOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetWebDavPortalUserSettingsByAccountIdOperationCompleted); + } + this.InvokeAsync("GetWebDavPortalUserSettingsByAccountId", new object[] { + accountId}, this.GetWebDavPortalUserSettingsByAccountIdOperationCompleted, userState); + } + + private void OnGetWebDavPortalUserSettingsByAccountIdOperationCompleted(object arg) { + if ((this.GetWebDavPortalUserSettingsByAccountIdCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetWebDavPortalUserSettingsByAccountIdCompleted(this, new GetWebDavPortalUserSettingsByAccountIdCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateWebDavPortalUserSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void UpdateWebDavPortalUserSettings(int accountId, string settings) { + this.Invoke("UpdateWebDavPortalUserSettings", new object[] { + accountId, + settings}); + } + + /// + public System.IAsyncResult BeginUpdateWebDavPortalUserSettings(int accountId, string settings, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("UpdateWebDavPortalUserSettings", new object[] { + accountId, + settings}, callback, asyncState); + } + + /// + public void EndUpdateWebDavPortalUserSettings(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void UpdateWebDavPortalUserSettingsAsync(int accountId, string settings) { + this.UpdateWebDavPortalUserSettingsAsync(accountId, settings, null); + } + + /// + public void UpdateWebDavPortalUserSettingsAsync(int accountId, string settings, object userState) { + if ((this.UpdateWebDavPortalUserSettingsOperationCompleted == null)) { + this.UpdateWebDavPortalUserSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateWebDavPortalUserSettingsOperationCompleted); + } + this.InvokeAsync("UpdateWebDavPortalUserSettings", new object[] { + accountId, + settings}, this.UpdateWebDavPortalUserSettingsOperationCompleted, userState); + } + + private void OnUpdateWebDavPortalUserSettingsOperationCompleted(object arg) { + if ((this.UpdateWebDavPortalUserSettingsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateWebDavPortalUserSettingsCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDirectoryBrowseEnabled", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public bool GetDirectoryBrowseEnabled(int itemId, string site) { @@ -1811,6 +1905,36 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetWebDavPortalUserSettingsByAccountIdCompletedEventHandler(object sender, GetWebDavPortalUserSettingsByAccountIdCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetWebDavPortalUserSettingsByAccountIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetWebDavPortalUserSettingsByAccountIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void UpdateWebDavPortalUserSettingsCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetDirectoryBrowseEnabledCompletedEventHandler(object sender, GetDirectoryBrowseEnabledCompletedEventArgs e); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 1ef34bd0..c100263a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -4486,6 +4486,45 @@ namespace WebsitePanel.EnterpriseServer ); } + public static IDataReader GetWebDavPortalUserSettingsByAccountId(int accountId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetWebDavPortalUsersSettingsByAccountId", + new SqlParameter("@AccountId", accountId) + ); + } + + public static int AddWebDavPortalUsersSettings(int accountId, string settings) + { + SqlParameter settingsId = new SqlParameter("@WebDavPortalUsersSettingsId", SqlDbType.Int); + settingsId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddWebDavPortalUsersSettings", + settingsId, + new SqlParameter("@AccountId", accountId), + new SqlParameter("@Settings", settings) + ); + + // read identity + return Convert.ToInt32(settingsId.Value); + } + + public static void UpdateWebDavPortalUsersSettings(int accountId, string settings) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateWebDavPortalUsersSettings", + new SqlParameter("@AccountId", accountId), + new SqlParameter("@Settings", settings) + ); + } + #endregion #region Support Service Levels diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 21cd276d..79ed21b8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -1210,6 +1210,37 @@ namespace WebsitePanel.EnterpriseServer return null; } + #region WebDav portal + + public static string GetWebDavPortalUserSettingsByAccountId(int accountId) + { + var dataReader = DataProvider.GetWebDavPortalUserSettingsByAccountId(accountId); + + while (dataReader.Read()) + { + return (string)dataReader["Settings"]; + } + + return null; + } + + public static void UpdateUserSettings(int accountId, string settings) + { + var oldSettings = GetWebDavPortalUserSettingsByAccountId(accountId); + + if (string.IsNullOrEmpty(oldSettings)) + { + DataProvider.AddWebDavPortalUsersSettings(accountId, settings); + } + else + { + DataProvider.UpdateWebDavPortalUsersSettings(accountId, settings); + } + } + + #endregion + + #region Statistics public static OrganizationStatistics GetStatistics(int itemId) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index deb4f45a..066ad302 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -158,6 +158,18 @@ namespace WebsitePanel.EnterpriseServer return EnterpriseStorageController.CheckUsersDomainExists(itemId); } + [WebMethod] + public string GetWebDavPortalUserSettingsByAccountId(int accountId) + { + return EnterpriseStorageController.GetWebDavPortalUserSettingsByAccountId(accountId); + } + + [WebMethod] + public void UpdateWebDavPortalUserSettings(int accountId, string settings) + { + EnterpriseStorageController.UpdateUserSettings(accountId,settings); + } + #region Directory Browsing [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Attributes/Resources/LocalizedDescriptionAttribute.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Attributes/Resources/LocalizedDescriptionAttribute.cs new file mode 100644 index 00000000..83cb4428 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Attributes/Resources/LocalizedDescriptionAttribute.cs @@ -0,0 +1,29 @@ +using System; +using System.ComponentModel; +using System.Resources; + +namespace WebsitePanel.WebDav.Core.Attributes.Resources +{ + public class LocalizedDescriptionAttribute : DescriptionAttribute + { + private readonly string _resourceKey; + private readonly ResourceManager _resource; + public LocalizedDescriptionAttribute(Type resourceType, string resourceKey) + { + _resource = new ResourceManager(resourceType); + _resourceKey = resourceKey; + } + + public override string Description + { + get + { + string displayName = _resource.GetString(_resourceKey); + + return string.IsNullOrEmpty(displayName) + ? string.Format("[[{0}]]", _resourceKey) + : displayName; + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs index f6f33649..59d4de63 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs @@ -7,13 +7,11 @@ namespace WebsitePanel.WebDav.Core.Config.Entities { public int DefaultCount { get; private set; } public int AddElementsCount { get; private set; } - public List ElementsToIgnore { get; private set; } public ElementsRendering() { DefaultCount = ConfigSection.ElementsRendering.DefaultCount; AddElementsCount = ConfigSection.ElementsRendering.AddElementsCount; - ElementsToIgnore = ConfigSection.ElementsRendering.ElementsToIgnore.Split(',').ToList(); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs index 6bd7b26c..8ad79350 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs @@ -12,10 +12,12 @@ namespace WebsitePanel.WebDav.Core.Config.Entities public FileIconsDictionary() { DefaultPath = ConfigSection.FileIcons.DefaultPath; + FolderPath = ConfigSection.FileIcons.FolderPath; _fileIcons = ConfigSection.FileIcons.Cast().ToDictionary(x => x.Extension, y => y.Path); } public string DefaultPath { get; private set; } + public string FolderPath { get; private set; } public IEnumerator> GetEnumerator() { @@ -57,4 +59,4 @@ namespace WebsitePanel.WebDav.Core.Config.Entities get { return _fileIcons.Values; } } } -} \ No newline at end of file +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FilesToIgnoreCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FilesToIgnoreCollection.cs new file mode 100644 index 00000000..25a9a52d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FilesToIgnoreCollection.cs @@ -0,0 +1,38 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using WebsitePanel.WebDav.Core.Config.WebConfigSections; +using WebsitePanel.WebDavPortal.WebConfigSections; + +namespace WebsitePanel.WebDav.Core.Config.Entities +{ + public class FilesToIgnoreCollection : AbstractConfigCollection, IReadOnlyCollection + { + private readonly IList _filesToIgnore; + + public FilesToIgnoreCollection() + { + _filesToIgnore = ConfigSection.FilesToIgnore.Cast().ToList(); + } + + public IEnumerator GetEnumerator() + { + return _filesToIgnore.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public int Count + { + get { return _filesToIgnore.Count; } + } + + public bool Contains(string name) + { + return _filesToIgnore.Any(x => x.Name == name); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs index d46df2bd..e4c882c8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs @@ -13,5 +13,6 @@ namespace WebsitePanel.WebDav.Core.Config HttpErrorsCollection HttpErrors { get; } OfficeOnlineCollection OfficeOnline { get; } OwaSupportedBrowsersCollection OwaSupportedBrowsers { get; } + FilesToIgnoreCollection FilesToIgnore { get; } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs index f25b2034..b5c5166e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs @@ -6,7 +6,6 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { private const string DefaultCountKey = "defaultCount"; private const string AddElementsCountKey = "addElementsCount"; - private const string ElementsToIgnoreKey = "elementsToIgnoreKey"; [ConfigurationProperty(DefaultCountKey, IsKey = true, IsRequired = true, DefaultValue = 30)] public int DefaultCount @@ -21,12 +20,5 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections get { return (int)this[AddElementsCountKey]; } set { this[AddElementsCountKey] = value; } } - - [ConfigurationProperty(ElementsToIgnoreKey, IsKey = true, IsRequired = true, DefaultValue = "")] - public string ElementsToIgnore - { - get { return (string)this[ElementsToIgnoreKey]; } - set { this[ElementsToIgnoreKey] = value; } - } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs index fb3d5340..1309c639 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs @@ -6,6 +6,7 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections public class FileIconsElementCollection : ConfigurationElementCollection { private const string DefaultPathKey = "defaultPath"; + private const string FolderPathKey = "folderPath"; [ConfigurationProperty(DefaultPathKey, IsRequired = false, DefaultValue = "/")] public string DefaultPath @@ -14,6 +15,13 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections set { this[DefaultPathKey] = value; } } + [ConfigurationProperty(FolderPathKey, IsRequired = false)] + public string FolderPath + { + get { return (string)this[FolderPathKey]; } + set { this[FolderPathKey] = value; } + } + protected override ConfigurationElement CreateNewElement() { return new FileIconsElement(); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElement.cs new file mode 100644 index 00000000..e2fc0b9c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElement.cs @@ -0,0 +1,24 @@ +using System.Configuration; + +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections +{ + public class FilesToIgnoreElement : ConfigurationElement + { + private const string NameKey = "name"; + private const string RegexKey = "regex"; + + [ConfigurationProperty(NameKey, IsKey = true, IsRequired = true)] + public string Name + { + get { return this[NameKey].ToString(); } + set { this[NameKey] = value; } + } + + [ConfigurationProperty(RegexKey, IsKey = true, IsRequired = true)] + public string Regex + { + get { return this[RegexKey].ToString(); } + set { this[RegexKey] = value; } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElementCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElementCollection.cs new file mode 100644 index 00000000..9c4a8c30 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FilesToIgnoreElementCollection.cs @@ -0,0 +1,19 @@ +using System; +using System.Configuration; + +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections +{ + [ConfigurationCollection(typeof(FilesToIgnoreElement))] + public class FilesToIgnoreElementCollection : ConfigurationElementCollection + { + protected override ConfigurationElement CreateNewElement() + { + return new FilesToIgnoreElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((FilesToIgnoreElement)element).Name; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs index a51b9460..029e3565 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs @@ -17,6 +17,7 @@ namespace WebsitePanel.WebDavPortal.WebConfigSections private const string FileIconsKey = "fileIcons"; private const string OwaSupportedBrowsersKey = "owaSupportedBrowsers"; private const string OfficeOnlineKey = "officeOnline"; + private const string FilesToIgnoreKey = "filesToIgnore"; public const string SectionName = "webDavExplorerConfigurationSettings"; @@ -89,5 +90,12 @@ namespace WebsitePanel.WebDavPortal.WebConfigSections get { return (OfficeOnlineElementCollection)this[OfficeOnlineKey]; } set { this[OfficeOnlineKey] = value; } } + + [ConfigurationProperty(FilesToIgnoreKey, IsDefaultCollection = false)] + public FilesToIgnoreElementCollection FilesToIgnore + { + get { return (FilesToIgnoreElementCollection)this[FilesToIgnoreKey]; } + set { this[FilesToIgnoreKey] = value; } + } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs index f6925e5b..1e5852a4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs @@ -19,6 +19,7 @@ namespace WebsitePanel.WebDav.Core.Config HttpErrors = new HttpErrorsCollection(); OfficeOnline = new OfficeOnlineCollection(); OwaSupportedBrowsers = new OwaSupportedBrowsersCollection(); + FilesToIgnore = new FilesToIgnoreCollection(); } public static WebDavAppConfigManager Instance @@ -53,5 +54,6 @@ namespace WebsitePanel.WebDav.Core.Config public HttpErrorsCollection HttpErrors { get; private set; } public OfficeOnlineCollection OfficeOnline { get; private set; } public OwaSupportedBrowsersCollection OwaSupportedBrowsers { get; private set; } + public FilesToIgnoreCollection FilesToIgnore { get; private set; } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/Enums/FolderViewTypes.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/Enums/FolderViewTypes.cs new file mode 100644 index 00000000..51d2e381 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/Enums/FolderViewTypes.cs @@ -0,0 +1,8 @@ +namespace WebsitePanel.WebDav.Core.Entities.Account.Enums +{ + public enum FolderViewTypes + { + BigIcons, + Table + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/UserPortalSettings.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/UserPortalSettings.cs new file mode 100644 index 00000000..69e30be4 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Entities/Account/UserPortalSettings.cs @@ -0,0 +1,9 @@ +using WebsitePanel.WebDav.Core.Entities.Account.Enums; + +namespace WebsitePanel.WebDav.Core.Entities.Account +{ + public class UserPortalSettings + { + public FolderViewTypes WebDavViewType { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Extensions/EnumExtensions.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Extensions/EnumExtensions.cs new file mode 100644 index 00000000..6d5b1092 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Extensions/EnumExtensions.cs @@ -0,0 +1,23 @@ +using System; +using System.ComponentModel; +using System.Linq; +using System.Reflection; +using System.Resources; +using WebsitePanel.WebDav.Core.Attributes.Resources; + +namespace WebsitePanel.WebDav.Core.Extensions +{ + public static class EnumExtensions + { + public static string GetDescription(this Enum value) + { + FieldInfo field = value.GetType().GetField(value.ToString()); + + DescriptionAttribute attribute + = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) + as DescriptionAttribute; + + return attribute == null ? value.ToString() : attribute.Description; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Helper/SerializeHelper.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Helper/SerializeHelper.cs new file mode 100644 index 00000000..83a40d52 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Helper/SerializeHelper.cs @@ -0,0 +1,41 @@ +using System.IO; +using System.Xml; +using System.Xml.Serialization; + +namespace WebsitePanel.WebDav.Core.Helper +{ + public class SerializeHelper + { + public static TResult Deserialize(string inputString) + { + TResult result; + + var serializer = new XmlSerializer(typeof(TResult)); + + using (TextReader reader = new StringReader(inputString)) + { + result = (TResult)serializer.Deserialize(reader); + } + + return result; + } + + public static string Serialize(TEntity entity) + { + string result = string.Empty; + + var xmlSerializer = new XmlSerializer(typeof(TEntity)); + + using (var stringWriter = new StringWriter()) + { + using (XmlWriter writer = XmlWriter.Create(stringWriter)) + { + xmlSerializer.Serialize(writer, entity); + result = stringWriter.ToString(); + } + } + + return result; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs index 6d587fc9..c9f69adb 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs @@ -218,6 +218,68 @@ namespace WebsitePanel.WebDav.Core Open(); } + public void OpenPaged(string path) + { + _path = new Uri(path); + OpenPaged(); + } + + public void OpenPaged() + { + var request = (HttpWebRequest)WebRequest.Create(_path); + //request.PreAuthenticate = true; + request.Method = "SEARCH"; + + //TODO Disable SSL + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); + + var credentials = (NetworkCredential)_credentials; + if (credentials != null && credentials.UserName != null) + { + request.Credentials = _credentials; + + string auth = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(credentials.UserName + ":" + credentials.Password)); + request.Headers.Add("Authorization", auth); + } + + var strQuery = "" + + "SELECT \"DAV:displayname\" FROM \"" + _path + "\"" + + "WHERE \"DAV:ishidden\" = false" + + ""; + + try + { + var bytes = Encoding.UTF8.GetBytes(strQuery); + + request.ContentLength = bytes.Length; + + using (var requestStream = request.GetRequestStream()) + { + // Write the SQL query to the request stream. + requestStream.Write(bytes, 0, bytes.Length); + } + + request.ContentType = "text/xml"; + + using (var response = (HttpWebResponse)request.GetResponse()) + { + using (var responseStream = new StreamReader(response.GetResponseStream())) + { + string responseString = responseStream.ReadToEnd(); + ProcessResponse(responseString); + } + } + } + catch (WebException e) + { + if (e.Status == WebExceptionStatus.ProtocolError) + { + throw new UnauthorizedException(); + } + throw e; + } + } + /// /// Processes the response from the server. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs index a4c2fc08..2140b7e1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs @@ -44,6 +44,15 @@ namespace WebsitePanel.WebDav.Core AllowWriteStreamBuffering = false; } + public WebDavResource(ICredentials credentials, IHierarchyItem item) + { + SendChunked = false; + AllowWriteStreamBuffering = false; + + SetCredentials(credentials); + SetHierarchyItem(item); + } + public Uri BaseUri { get { return _baseUri; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/Users/IUserSettingsManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/Users/IUserSettingsManager.cs new file mode 100644 index 00000000..43d8a123 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/Users/IUserSettingsManager.cs @@ -0,0 +1,13 @@ +using WebsitePanel.EnterpriseServer; +using WebsitePanel.WebDav.Core.Entities.Account; +using WebsitePanel.WebDav.Core.Entities.Account.Enums; + +namespace WebsitePanel.WebDav.Core.Interfaces.Managers.Users +{ + public interface IUserSettingsManager + { + UserPortalSettings GetUserSettings(int accountId); + void UpdateSettings(int accountId, UserPortalSettings settings); + void ChangeWebDavViewType(int accountId, FolderViewTypes type); + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/ItemType.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/ItemType.cs index c706ddd2..9302b36b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/ItemType.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/ItemType.cs @@ -1,10 +1,15 @@ +using WebsitePanel.WebDav.Core.Attributes.Resources; +using WebsitePanel.WebDav.Core.Resources; + namespace WebsitePanel.WebDav.Core { namespace Client { public enum ItemType { + [LocalizedDescription(typeof(WebDavResources), "ItemTypeResource")] Resource, + [LocalizedDescription(typeof(WebDavResources), "ItemTypeFolder")] Folder, Version, VersionHistory diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/Users/UserSettingsManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/Users/UserSettingsManager.cs new file mode 100644 index 00000000..e8fdb29f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/Users/UserSettingsManager.cs @@ -0,0 +1,40 @@ +using WebsitePanel.EnterpriseServer; +using WebsitePanel.WebDav.Core.Entities.Account; +using WebsitePanel.WebDav.Core.Entities.Account.Enums; +using WebsitePanel.WebDav.Core.Helper; +using WebsitePanel.WebDav.Core.Interfaces.Managers.Users; +using WebsitePanel.WebDav.Core.Wsp.Framework; + +namespace WebsitePanel.WebDav.Core.Managers.Users +{ + public class UserSettingsManager : IUserSettingsManager + { + public UserPortalSettings GetUserSettings(int accountId) + { + string xml = WSP.Services.EnterpriseStorage.GetWebDavPortalUserSettingsByAccountId(accountId); + + if (string.IsNullOrEmpty(xml)) + { + return new UserPortalSettings(); + } + + return SerializeHelper.Deserialize(xml); + } + + public void UpdateSettings(int accountId, UserPortalSettings settings) + { + var xml = SerializeHelper.Serialize(settings); + + WSP.Services.EnterpriseStorage.UpdateWebDavPortalUserSettings(accountId, xml); + } + + public void ChangeWebDavViewType(int accountId, FolderViewTypes type) + { + var settings = GetUserSettings(accountId); + + settings.WebDavViewType = type; + + UpdateSettings(accountId, settings); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs index 93d17679..b5bd354c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net; using System.Text; +using System.Text.RegularExpressions; using System.Web; using System.Xml.Serialization; using log4net; @@ -74,7 +75,7 @@ namespace WebsitePanel.WebDav.Core.Managers _currentFolder = _webDavSession.OpenFolder(string.Format("{0}{1}/{2}", WebDavAppConfigManager.Instance.WebdavRoot, WspContext.User.OrganizationId, pathPart.TrimStart('/'))); } - children = _currentFolder.GetChildren().Where(x => !WebDavAppConfigManager.Instance.ElementsRendering.ElementsToIgnore.Contains(x.DisplayName.Trim('/'))).ToArray(); + children = FilterResult(_currentFolder.GetChildren()).ToArray(); } List sortedChildren = children.Where(x => x.ItemType == ItemType.Folder).OrderBy(x => x.DisplayName).ToList(); @@ -352,7 +353,31 @@ namespace WebsitePanel.WebDav.Core.Managers } return path.Split('/').Last(); ; - } + } + + private IEnumerable FilterResult(IEnumerable items) + { + var result = items.ToList(); + + foreach (var item in items) + { + foreach (var itemToIgnore in WebDavAppConfigManager.Instance.FilesToIgnore) + { + var regex = new Regex(itemToIgnore.Regex); + + Match match = regex.Match(item.DisplayName.Trim('/')); + + if (match.Success && result.Contains(item)) + { + result.Remove(item); + + break; + } + } + } + + return result; + } #endregion } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.Designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.Designer.cs index 2cb3ad80..996a2806 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.Designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.Designer.cs @@ -68,5 +68,23 @@ namespace WebsitePanel.WebDav.Core.Resources { return ResourceManager.GetString("FolderIsNotEmptyFormat", resourceCulture); } } + + /// + /// Looks up a localized string similar to Folder. + /// + internal static string ItemTypeFolder { + get { + return ResourceManager.GetString("ItemTypeFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Document. + /// + internal static string ItemTypeResource { + get { + return ResourceManager.GetString("ItemTypeResource", resourceCulture); + } + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.resx b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.resx index fb231645..bf52d5f6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/WebDavResources.resx @@ -120,4 +120,10 @@ Folder {0} is not empty. + + Folder + + + Document + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebDavSession.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebDavSession.cs index bc69a061..de80e53b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebDavSession.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebDavSession.cs @@ -39,6 +39,19 @@ namespace WebsitePanel.WebDav.Core return folder; } + /// + /// Returns IFolder corresponding to path. + /// + /// Path to the folder. + /// Folder corresponding to requested path. + public IFolder OpenFolderPaged(string path) + { + var folder = new WebDavFolder(); + folder.SetCredentials(Credentials); + folder.OpenPaged(path); + return folder; + } + /// /// Returns IResource corresponding to path. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj index 9cbc1f07..b2b5e806 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj @@ -99,10 +99,12 @@ + + @@ -113,6 +115,8 @@ + + @@ -124,6 +128,8 @@ + + @@ -131,14 +137,18 @@ + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WspContext.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WspContext.cs index 73468739..5d33a341 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WspContext.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WspContext.cs @@ -5,11 +5,13 @@ using System.Text; using System.Threading.Tasks; using System.Web; using WebsitePanel.WebDav.Core.Security.Authentication.Principals; +using WebsitePanel.WebDav.Core.Wsp.Framework; namespace WebsitePanel.WebDav.Core { public class WspContext { public static WspPrincipal User { get { return HttpContext.Current.User as WspPrincipal; } } + public static WSP Services { get { return WSP.Services; } } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs index 411062bb..087e1310 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs @@ -7,9 +7,14 @@ namespace WebsitePanel.WebDavPortal // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862 public static void RegisterBundles(BundleCollection bundles) { - bundles.Add(new ScriptBundle("~/bundles/jquery").Include( + var jQueryBundle = new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js", - "~/Scripts/jquery.cookie.js")); + "~/Scripts/jquery.cookie.js"); + + jQueryBundle.IncludeDirectory("~/Scripts", "jquery.dataTables.min.js", true); + jQueryBundle.IncludeDirectory("~/Scripts", "dataTables.bootstrap.js", true); + + bundles.Add(jQueryBundle); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate*")); @@ -24,21 +29,34 @@ namespace WebsitePanel.WebDavPortal "~/Scripts/respond.js")); bundles.Add(new ScriptBundle("~/bundles/appScripts").Include( - "~/Scripts/appScripts/recalculateResourseHeight.js", - "~/Scripts/appScripts/uploadingData2.js", "~/Scripts/appScripts/authentication.js", "~/Scripts/appScripts/messages.js", - "~/Scripts/appScripts/fileBrowsing.js", + "~/Scripts/appScripts/fileBrowsing.js", "~/Scripts/appScripts/dialogs.js", "~/Scripts/appScripts/wsp.js" )); + bundles.Add(new ScriptBundle("~/bundles/appScripts/storage/bigIcons").Include( + "~/Scripts/appScripts/recalculateResourseHeight.js", + "~/Scripts/appScripts/uploadingData2.js" + )); + + //bundles.Add(new ScriptBundle("~/bundles/appScripts/storage/table-view").Include( + // )); + bundles.Add(new ScriptBundle("~/bundles/authScripts").Include( "~/Scripts/appScripts/authentication.js")); - bundles.Add(new StyleBundle("~/Content/css").Include( + var styleBundle = new StyleBundle("~/Content/css"); + + styleBundle.Include( "~/Content/bootstrap.css", - "~/Content/site.css")); + "~/Content/site.css"); + + styleBundle.IncludeDirectory("~/Content", "jquery.datatables.css", true); + styleBundle.IncludeDirectory("~/Content", "dataTables.bootstrap.css", true); + + bundles.Add(styleBundle); // Set EnableOptimizations to false for debugging. For more information, // visit http://go.microsoft.com/fwlink/?LinkId=301862 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/RouteConfig.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/RouteConfig.cs index 8e4c1bf8..61986ff2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/RouteConfig.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/RouteConfig.cs @@ -26,53 +26,68 @@ namespace WebsitePanel.WebDavPortal #endregion - routes.MapRoute( - name: FileSystemRouteNames.DeleteFiles, - url: "files-group-action/delete", - defaults: new { controller = "FileSystem", action = "DeleteFiles" } - ); - - routes.MapRoute( - name: FileSystemRouteNames.UploadFile, - url: "upload-file/{org}/{*pathPart}", - defaults: new { controller = "FileSystem", action = "UploadFile" } - ); - - routes.MapRoute( - name: FileSystemRouteNames.DownloadFile, - url: "download-file/{org}/{*pathPart}", - defaults: new { controller = "FileSystem", action = "DownloadFile" } - ); + #region Owa routes.MapRoute( name: FileSystemRouteNames.ViewOfficeOnline, url: "office365/view/{org}/{*pathPart}", - defaults: new { controller = "FileSystem", action = "ViewOfficeDocument", pathPart = UrlParameter.Optional } + defaults: + new {controller = "FileSystem", action = "ViewOfficeDocument", pathPart = UrlParameter.Optional} ); routes.MapRoute( name: FileSystemRouteNames.EditOfficeOnline, url: "office365/edit/{org}/{*pathPart}", - defaults: new { controller = "FileSystem", action = "EditOfficeDocument", pathPart = UrlParameter.Optional } + defaults: + new {controller = "FileSystem", action = "EditOfficeDocument", pathPart = UrlParameter.Optional} ); - //routes.MapRoute( - // name: FileSystemRouteNames.ShowOfficeOnlinePath, - // url: "office365/{org}/{*pathPart}", - // defaults: new { controller = "FileSystem", action = "ShowOfficeDocument", pathPart = UrlParameter.Optional } - // ); + #endregion + + #region Enterprise storage + + routes.MapRoute( + name: FileSystemRouteNames.ChangeWebDavViewType, + url: "storage/change-view-type/{viewType}", + defaults: new { controller = "FileSystem", action = "ChangeViewType" } + ); + + routes.MapRoute( + name: FileSystemRouteNames.DeleteFiles, + url: "storage/files-group-action/delete", + defaults: new { controller = "FileSystem", action = "DeleteFiles" } + ); + + routes.MapRoute( + name: FileSystemRouteNames.UploadFile, + url: "storage/upload-file/{org}/{*pathPart}", + defaults: new { controller = "FileSystem", action = "UploadFile" } + ); + + routes.MapRoute( + name: FileSystemRouteNames.DownloadFile, + url: "storage/download-file/{org}/{*pathPart}", + defaults: new { controller = "FileSystem", action = "DownloadFile" } + ); routes.MapRoute( name: FileSystemRouteNames.ShowAdditionalContent, - url: "show-additional-content/{*path}", + url: "storage/show-additional-content/{*path}", defaults: new { controller = "FileSystem", action = "ShowAdditionalContent", path = UrlParameter.Optional } ); + routes.MapRoute( + name: FileSystemRouteNames.ShowContentDetails, + url: "storage/details/{org}/{*pathPart}", + defaults: new { controller = "FileSystem", action = "GetContentDetails", pathPart = UrlParameter.Optional } + ); + routes.MapRoute( name: FileSystemRouteNames.ShowContentPath, url: "{org}/{*pathPart}", defaults: new { controller = "FileSystem", action = "ShowContent", pathPart = UrlParameter.Optional } - ); + ); + #endregion routes.MapRoute( name: "Default", diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/AccountRouteNames.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/AccountRouteNames.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/AccountRouteNames.cs rename to WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/AccountRouteNames.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/FileSystemRouteNames.cs similarity index 80% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs rename to WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/FileSystemRouteNames.cs index 78426d31..23ac46e2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/FileSystemRouteNames.cs @@ -7,7 +7,9 @@ namespace WebsitePanel.WebDavPortal.UI.Routes { public class FileSystemRouteNames { + public const string ChangeWebDavViewType = "ChangeWebDavViewTypeRoute"; public const string ShowContentPath = "ShowContentRoute"; + public const string ShowContentDetails = "ShowContentDetailsRoute"; public const string ShowOfficeOnlinePath_ = "ShowOfficeOnlineRoute"; public const string ViewOfficeOnline = "ViewOfficeOnlineRoute"; public const string EditOfficeOnline = "EditOfficeOnlineRoute"; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/OwaRouteNames.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/OwaRouteNames.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/OwaRouteNames.cs rename to WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/Routes/OwaRouteNames.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.css new file mode 100644 index 00000000..cab59b3a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.css @@ -0,0 +1,24 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * AutoFill styles + */ + +div.AutoFill_filler { + display: none; + position: absolute; + height: 14px; + width: 14px; + background: url(../images/filler.png) no-repeat center center; + z-index: 1002; +} + +div.AutoFill_border { + display: none; + position: absolute; + background-color: #0063dc; + z-index: 1001; + + box-shadow: 0px 0px 5px #76b4ff; + -moz-box-shadow: 0px 0px 5px #76b4ff; + -webkit-box-shadow: 0px 0px 5px #76b4ff; +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.min.css new file mode 100644 index 00000000..b485f216 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.autoFill.min.css @@ -0,0 +1 @@ +div.AutoFill_filler{display:none;position:absolute;height:14px;width:14px;background:url(../images/filler.png) no-repeat center center;z-index:1002}div.AutoFill_border{display:none;position:absolute;background-color:#0063dc;z-index:1001;box-shadow:0px 0px 5px #76b4ff;-moz-box-shadow:0px 0px 5px #76b4ff;-webkit-box-shadow:0px 0px 5px #76b4ff} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.bootstrap.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.bootstrap.css new file mode 100644 index 00000000..416f17e3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.bootstrap.css @@ -0,0 +1,204 @@ + +div.dataTables_length label { + font-weight: normal; + float: left; + text-align: left; +} + +div.dataTables_length select { + width: 75px; +} + +div.dataTables_filter label { + font-weight: normal; + float: right; +} + +div.dataTables_filter input { + width: 16em; +} + +div.dataTables_info { + padding-top: 8px; +} + +div.dataTables_paginate { + float: right; + margin: 0; +} + +div.dataTables_paginate ul.pagination { + margin: 2px; +} + +table.table { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; +} + +table.table thead .sorting, +table.table thead .sorting_asc, +table.table thead .sorting_desc, +table.table thead .sorting_asc_disabled, +table.table thead .sorting_desc_disabled { + cursor: pointer; +} + +table.table thead .sorting { background: url('../images/sort_both.png') no-repeat center right; } +table.table thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; } +table.table thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; } + +table.table thead .sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; } +table.table thead .sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; } + +table.dataTable th:active { + outline: none; +} + +/* Scrolling */ +div.dataTables_scrollHead table { + margin-bottom: 0 !important; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.dataTables_scrollHead table thead tr:last-child th:first-child, +div.dataTables_scrollHead table thead tr:last-child td:first-child { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody tbody tr:first-child th, +div.dataTables_scrollBody tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + border-top: none; +} + + + + +/* + * TableTools styles + */ +.table tbody tr.active td, +.table tbody tr.active th { + background-color: #08C; + color: white; +} + +.table tbody tr.active:hover td, +.table tbody tr.active:hover th { + background-color: #0075b0 !important; +} + +.table-striped tbody tr.active:nth-child(odd) td, +.table-striped tbody tr.active:nth-child(odd) th { + background-color: #017ebc; +} + +table.DTTT_selectable tbody tr { + cursor: pointer; +} + +div.DTTT .btn { + color: #333 !important; + font-size: 12px; +} + +div.DTTT .btn:hover { + text-decoration: none !important; +} + +ul.DTTT_dropdown.dropdown-menu { + z-index: 2003; +} + +ul.DTTT_dropdown.dropdown-menu a { + color: #333 !important; /* needed only when demo_page.css is included */ +} + +ul.DTTT_dropdown.dropdown-menu li { + position: relative; +} + +ul.DTTT_dropdown.dropdown-menu li:hover a { + background-color: #0088cc; + color: white !important; +} + +/* TableTools information display */ +div.DTTT_print_info.modal { + height: 150px; + margin-top: -75px; + text-align: center; +} + +div.DTTT_print_info h6 { + font-weight: normal; + font-size: 28px; + line-height: 28px; + margin: 1em; +} + +div.DTTT_print_info p { + font-size: 14px; + line-height: 20px; +} + + + +/* + * FixedColumns styles + */ +div.DTFC_LeftHeadWrapper table, +div.DTFC_LeftFootWrapper table, +div.DTFC_RightHeadWrapper table, +div.DTFC_RightFootWrapper table, +table.DTFC_Cloned tr.even { + background-color: white; +} + +div.DTFC_RightHeadWrapper table , +div.DTFC_LeftHeadWrapper table { + margin-bottom: 0 !important; + border-top-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, +div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, +div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, +div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.DTFC_RightBodyWrapper table, +div.DTFC_LeftBodyWrapper table { + border-top: none; + margin-bottom: 0 !important; +} + +div.DTFC_RightBodyWrapper tbody tr:first-child th, +div.DTFC_RightBodyWrapper tbody tr:first-child td, +div.DTFC_LeftBodyWrapper tbody tr:first-child th, +div.DTFC_LeftBodyWrapper tbody tr:first-child td { + border-top: none; +} + +div.DTFC_RightFootWrapper table, +div.DTFC_LeftFootWrapper table { + border-top: none; +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.css new file mode 100644 index 00000000..bdd6aa0b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.css @@ -0,0 +1,14 @@ +/* + * Namespace DTCR - "DataTables ColReorder" plug-in + */ + +table.DTCR_clonedTable { + background-color: rgba(255, 255, 255, 0.7); + z-index: 202; +} + +div.DTCR_pointer { + width: 1px; + background-color: #0259C4; + z-index: 201; +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.min.css new file mode 100644 index 00000000..77b230e0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colReorder.min.css @@ -0,0 +1 @@ +table.DTCR_clonedTable{background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.css new file mode 100644 index 00000000..51f546de --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.css @@ -0,0 +1,185 @@ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * ColVis styles + */ +div.ColVis { + float: right; + margin-bottom: 1em; +} + +button.ColVis_Button, +ul.ColVis_collection li { + position: relative; + float: left; + margin-right: 3px; + padding: 5px 8px; + border: 1px solid #999; + cursor: pointer; + *cursor: hand; + font-size: 0.88em; + color: black !important; + white-space: nowrap; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 1px 1px 3px #ccc; + -moz-box-shadow: 1px 1px 3px #ccc; + -ms-box-shadow: 1px 1px 3px #ccc; + -o-box-shadow: 1px 1px 3px #ccc; + box-shadow: 1px 1px 3px #ccc; + + /* Generated by http://www.colorzilla.com/gradient-editor/ */ + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ +} + +.ColVis_Button:hover, +ul.ColVis_collection li:hover { + border: 1px solid #666; + text-decoration: none !important; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; + + background: #f3f3f3; /* Old browsers */ + background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */ + background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */ +} + +button.ColVis_Button { + height: 30px; + padding: 3px 8px; +} + +button.ColVis_Button::-moz-focus-inner { + border: none !important; + padding: 0; +} + +button.ColVis_Button:active { + outline: none; +} + + +div.ColVis_collectionBackground { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: black; + z-index: 1100; +} + +ul.ColVis_collection { + list-style: none; + width: 150px; + padding: 8px 8px 4px 8px; + margin: 0; + border: 1px solid #ccc; + border: 1px solid rgba( 0, 0, 0, 0.4 ); + background-color: #f3f3f3; + background-color: rgba( 255, 255, 255, 0.3 ); + overflow: hidden; + z-index: 2002; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); +} + +ul.ColVis_collection li { + position: relative; + height: auto; + left: 0; + right: 0; + padding: 0.5em; + + display: block; + float: none; + margin-bottom: 4px; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; +} + +ul.ColVis_collection li { + text-align: left; +} + +ul.ColVis_collection li.ColVis_Button:hover { + border: 1px solid #999; + background-color: #f0f0f0; +} + +ul.ColVis_collection li span { + display: inline-block; + padding-left: 0.5em; + cursor: pointer; +} + + +ul.ColVis_collection li.ColVis_Special { + border-color: #555; + background: rgb(237,237,237); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, rgba(237,237,237,1) 0%, rgba(214,214,214,1) 77%, rgba(232,232,232,1) 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* IE10+ */ + background: -o-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Opera 11.10+ */ + background: linear-gradient(to bottom, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 ); /* IE6-9 */ +} + +ul.ColVis_collection li.ColVis_Special:hover { + background: #e2e2e2; /* Old browsers */ + background: -webkit-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* IE10+ */ + background: -o-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 ); /* IE6-9 */ +} + + +span.ColVis_radio { + display: inline-block; + width: 20px; +} + +div.ColVis_catcher { + position: absolute; + z-index: 1101; +} + +.disabled { + color: #999; +} + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.min.css new file mode 100644 index 00000000..00ab37d7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colVis.min.css @@ -0,0 +1 @@ +div.ColVis{float:right;margin-bottom:1em}button.ColVis_Button,ul.ColVis_collection li{position:relative;float:left;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;white-space:nowrap;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}.ColVis_Button:hover,ul.ColVis_collection li:hover{border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.ColVis_Button{height:30px;padding:3px 8px}button.ColVis_Button::-moz-focus-inner{border:none !important;padding:0}button.ColVis_Button:active{outline:none}div.ColVis_collectionBackground{position:fixed;top:0;left:0;height:100%;width:100%;background-color:black;z-index:1100}ul.ColVis_collection{list-style:none;width:150px;padding:8px 8px 4px 8px;margin:0;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}ul.ColVis_collection li{position:relative;height:auto;left:0;right:0;padding:0.5em;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}ul.ColVis_collection li{text-align:left}ul.ColVis_collection li.ColVis_Button:hover{border:1px solid #999;background-color:#f0f0f0}ul.ColVis_collection li span{display:inline-block;padding-left:0.5em;cursor:pointer}ul.ColVis_collection li.ColVis_Special{border-color:#555;background:#ededed;background:-webkit-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-moz-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-ms-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-o-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:linear-gradient(to bottom, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 )}ul.ColVis_collection li.ColVis_Special:hover{background:#e2e2e2;background:-webkit-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-moz-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-ms-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-o-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 )}span.ColVis_radio{display:inline-block;width:20px}div.ColVis_catcher{position:absolute;z-index:1101}.disabled{color:#999} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colvis.jqueryui.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colvis.jqueryui.css new file mode 100644 index 00000000..2d768732 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.colvis.jqueryui.css @@ -0,0 +1,23 @@ + +button.ColVis_Button, +ul.ColVis_collection li { + padding: 0.5em; +} + +ul.ColVis_collection { + margin: 0; + padding: 0; +} + +ul.ColVis_collection li { + clear: both; + display: block; + text-align: left; + margin: -1px 0 0 0; +} + +ul.ColVis_collection li span { + display: inline-block; + padding-left: 0.5em; + cursor: pointer; +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.css new file mode 100644 index 00000000..0377aef2 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.css @@ -0,0 +1,24 @@ + + +/* Block out what is behind the fixed column's header and footer */ +table.DTFC_Cloned thead, +table.DTFC_Cloned tfoot { + background-color: white; +} + +/* Block out the gap above the scrollbar on the right, when there is a fixed + * right column + */ +div.DTFC_Blocker { + background-color: white; +} + +div.DTFC_LeftWrapper table.dataTable, +div.DTFC_RightWrapper table.dataTable { + margin-bottom: 0; +} + +div.DTFC_LeftWrapper table.dataTable.no-footer, +div.DTFC_RightWrapper table.dataTable.no-footer { + border-bottom: none; +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.min.css new file mode 100644 index 00000000..f0e5ff4c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedColumns.min.css @@ -0,0 +1 @@ +table.DTFC_Cloned thead,table.DTFC_Cloned tfoot{background-color:white}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{margin-bottom:0}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.css new file mode 100644 index 00000000..724317a6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.css @@ -0,0 +1,7 @@ + + +div.FixedHeader_Cloned th, +div.FixedHeader_Cloned td { + background-color: white !important; +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.min.css new file mode 100644 index 00000000..e276a91a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.fixedHeader.min.css @@ -0,0 +1 @@ +div.FixedHeader_Cloned th,div.FixedHeader_Cloned td{background-color:white !important} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.foundation.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.foundation.css new file mode 100644 index 00000000..d1268a18 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.foundation.css @@ -0,0 +1,213 @@ +div.dataTables_wrapper { + margin-bottom: 1.25em; +} + +div.dataTables_length label, +div.dataTables_filter label, +div.dataTables_info { + color: #999; + font-weight: normal; +} + +div.dataTables_length { + padding-top: 6px; +} +div.dataTables_length label { + float: left; + text-align: left; +} + +div.dataTables_length select { + width: 75px; +} + +div.dataTables_filter label { + float: right; +} +div.dataTables_filter input { + display: inline-block !important; + width: auto !important; +} + +div.dataTables_info { + padding-top: 2px; + font-size: 0.875em; +} + +div.dataTables_paginate { + float: right; + margin: 0; +} + +table.dataTable { + clear: both; + margin-bottom: 0.5em !important; + max-width: none !important; + width: 100%; +} + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + *cursor: hand; +} + +table.dataTable thead .sorting { background: url('images/sort_both.png') no-repeat center right; } +table.dataTable thead .sorting_asc { background: url('images/sort_asc.png') no-repeat center right; } +table.dataTable thead .sorting_desc { background: url('images/sort_desc.png') no-repeat center right; } + +table.dataTable thead .sorting_asc_disabled { background: url('images/sort_asc_disabled.png') no-repeat center right; } +table.dataTable thead .sorting_desc_disabled { background: url('images/sort_desc_disabled.png') no-repeat center right; } + +table.dataTable th:active { + outline: none; +} + +/* Scrolling */ +div.dataTables_scrollHead table { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody tbody tr:first-child th, +div.dataTables_scrollBody tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + border-top: none; +} + + + + +/* + * TableTools styles + */ +.table tbody tr.active td, +.table tbody tr.active th { + background-color: #08C; + color: white; +} + +.table tbody tr.active:hover td, +.table tbody tr.active:hover th { + background-color: #0075b0 !important; +} + +.table-striped tbody tr.active:nth-child(odd) td, +.table-striped tbody tr.active:nth-child(odd) th { + background-color: #017ebc; +} + +table.DTTT_selectable tbody tr { + cursor: pointer; + *cursor: hand; +} + +div.DTTT { + float: left; + margin-bottom: 0; +} + +div.DTTT .button:hover { + text-decoration: none !important; +} + +ul.DTTT_dropdown.dropdown-menu li { + position: relative; +} + +ul.DTTT_dropdown.dropdown-menu li:hover a { + background-color: #0088cc; + color: white !important; +} + +/* TableTools information display */ +.DTTT_print_info { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + height: 150px; + margin-left: -200px; + margin-top: -75px; + text-align: center; + color: #333; + padding: 10px 30px; + + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ + + opacity: 0.95; + + border: 1px solid black; + border: 1px solid rgba(0, 0, 0, 0.5); + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + -ms-border-radius: 6px; + -o-border-radius: 6px; + border-radius: 6px; + + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -o-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); +} + +div.DTTT_print_info h6 { + font-weight: normal; + font-size: 28px; + line-height: 28px; + margin: 1em; +} + +div.DTTT_print_info p { + font-size: 14px; + line-height: 20px; +} + + + +/* + * FixedColumns styles + */ +div.DTFC_LeftHeadWrapper table, +div.DTFC_LeftFootWrapper table, +table.DTFC_Cloned tr.even { + background-color: white; +} + +div.DTFC_LeftHeadWrapper table { + margin-bottom: 0 !important; +} + +div.DTFC_LeftBodyWrapper table { + border-top: none; + margin-bottom: 0 !important; +} + +div.DTFC_LeftBodyWrapper tbody tr:first-child th, +div.DTFC_LeftBodyWrapper tbody tr:first-child td { + border-top: none; +} + +div.DTFC_LeftFootWrapper table { + border-top: none; +} + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.css new file mode 100644 index 00000000..f4a28a9e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.css @@ -0,0 +1,316 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 4px 10px; +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; +} +table.dataTable thead th.ui-state-default { + border-right-width: 0; +} +table.dataTable thead th.ui-state-default:last-child { + border-right-width: 1px; +} +table.dataTable tbody tr { + background-color: white; +} +table.dataTable tbody tr.selected { + background-color: #b0bed9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable th.center, +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.right, +table.dataTable td.right { + text-align: right; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #dddddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #dddddd; + border-right: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.scss b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.scss new file mode 100644 index 00000000..910dc6a8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.jqueryui.scss @@ -0,0 +1,408 @@ + + + // + // Colour customisation + // + +// Border between the header (and footer) and the table body +$table-header-border: 1px solid #111; + +// Border of rows / cells +$table-body-border: 1px solid #ddd; + +// Row background colour (hover, striping etc are all based on this colour and +// calculated automatically) +$table-row-background: #ffffff; + +// Row colour, when selected (tr.selected) +$table-row-selected: #B0BED9; + +// Text colour of the interaction control elements (info, filter, paging etc) +$table-control-color: #333; + +// Highlight colour of the paging button for the current page +$table-paging-button-active: #dcdcdc; + +// Hover colour of paging buttons on mouse over +$table-paging-button-hover: #111; + + + +// +// Functions / mixins +// +@function tint( $color, $percent ) { + @return mix(white, $color, $percent); +} + +@function shade( $color, $percent ) { + @return mix(black, $color, $percent); +} + +@mixin gradient( $from, $to ) { + background-color: $from; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,$from), color-stop(100%,$to)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, $from 0%, $to 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, $from 0%, $to 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, $from 0%, $to 100%); /* IE10+ */ + background: -o-linear-gradient(top, $from 0%, $to 100%); /* Opera 11.10+ */ + background: linear-gradient(to bottom, $from 0%, $to 100%); /* W3C */ +} + + +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + + /* + * Header and footer styles + */ + thead, + tfoot { + th, + td { + padding: 4px 10px; + } + + th { + font-weight: bold; + } + } + + thead th, + thead td { + &:active { + outline: none; + } + } + + // Sorting + thead { + .sorting_asc, + .sorting_desc, + .sorting { + cursor: pointer; + *cursor: hand; + } + + th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; + + span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; + } + } + + th.ui-state-default { + border-right-width: 0; + + &:last-child { + border-right-width: 1px; + } + } + } + + + /* + * Body styles + */ + tbody { + tr { + background-color: $table-row-background; + + &.selected { + background-color: $table-row-selected; + } + } + + th, + td { + padding: 8px 10px; + } + } + + th.center, + td.center, + td.dataTables_empty { + text-align: center; + } + + th.right, + td.right { + text-align: right; + } + + + // Stripe classes - add "row-border" class to the table to activate + &.row-border tbody, + &.display tbody { + th, td { + border-top: $table-body-border; + } + + tr:first-child th, + tr:first-child td { + border-top: none; + } + } + + + // Stripe classes - add "cell-border" class to the table to activate + &.cell-border tbody { + th, td { + border-top: $table-body-border; + border-right: $table-body-border; + } + + tr th:first-child, + tr td:first-child { + border-left: $table-body-border; + } + + tr:first-child th, + tr:first-child td { + border-top: none; + } + } + + + // Stripe classes - add "stripe" class to the table to activate + &.stripe tbody, + &.display tbody { + tr.odd { + background-color: shade($table-row-background, 2.35%); // shade by f9 + + &.selected { + background-color: shade($table-row-selected, 2.35%); + } + } + } + + + // Hover classes - add "hover" class to the table to activate + &.hover tbody, + &.display tbody { + tr:hover, + tr.odd:hover, + tr.even:hover { + background-color: shade($table-row-background, 3.6%); // shade by f5 + + &.selected { + background-color: shade($table-row-selected, 3.6%); + } + } + } + + + // Sort column highlighting - add "hover" class to the table to activate + &.order-column, + &.display { + tbody { + tr>.sorting_1, + tr>.sorting_2, + tr>.sorting_3 { + background-color: shade($table-row-background, 2%); // shade by fa + } + + tr.selected>.sorting_1, + tr.selected>.sorting_2, + tr.selected>.sorting_3 { + background-color: shade($table-row-selected, 2%); + } + } + } + + &.display tbody, + &.order-column.stripe tbody { + tr.odd { + >.sorting_1 { background-color: shade($table-row-background, 5.4%); } // shade by f1 + >.sorting_2 { background-color: shade($table-row-background, 4.7%); } // shade by f3 + >.sorting_3 { background-color: shade($table-row-background, 3.9%); } // shade by f5 + + &.selected { + >.sorting_1 { background-color: shade($table-row-selected, 5.4%); } + >.sorting_2 { background-color: shade($table-row-selected, 4.7%); } + >.sorting_3 { background-color: shade($table-row-selected, 3.9%); } + } + } + + tr.even { + >.sorting_1 { background-color: shade($table-row-background, 2%); } // shade by fa + >.sorting_2 { background-color: shade($table-row-background, 1.2%); } // shade by fc + >.sorting_3 { background-color: shade($table-row-background, 0.4%); } // shade by fe + + &.selected { + >.sorting_1 { background-color: shade($table-row-selected, 2%); } + >.sorting_2 { background-color: shade($table-row-selected, 1.2%); } + >.sorting_3 { background-color: shade($table-row-selected, 0.4%); } + } + } + } + + &.display tbody, + &.order-column.hover tbody { + tr:hover, + tr.odd:hover, + tr.even:hover { + >.sorting_1 { background-color: shade($table-row-background, 8.2%); } // shade by ea + >.sorting_2 { background-color: shade($table-row-background, 7.5%); } // shade by ec + >.sorting_3 { background-color: shade($table-row-background, 6.3%); } // shade by ef + + &.selected { + >.sorting_1 { background-color: shade($table-row-selected, 8.2%); } + >.sorting_2 { background-color: shade($table-row-selected, 7.5%); } + >.sorting_3 { background-color: shade($table-row-selected, 6.3%); } + } + } + } +} + +// Its not uncommon to use * {border-box} now, but it messes up the column width +// calculations, so use content-box for the table and cells +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + + + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + + // Page length options + .dataTables_length { + float: left; + } + + // Filtering input + .dataTables_filter { + float: right; + text-align: right; + + input { + margin-left: 0.5em; + } + } + + // Table info + .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; + } + + // Paging + .dataTables_paginate { + float: right; + text-align: right; + + .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + + color: $table-control-color !important; + border: 1px solid transparent; + + &:active { + outline: none; + } + } + + .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + + .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + } + + // Processing + .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + + text-align: center; + font-size: 1.2em; + + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba($table-row-background, 0)), color-stop(25%,rgba($table-row-background, 0.9)), color-stop(75%,rgba($table-row-background, 0.9)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba($table-row-background, 0) 0%, rgba($table-row-background, 0.9) 25%, rgba($table-row-background, 0.9) 75%, rgba($table-row-background, 0) 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba($table-row-background, 0) 0%, rgba($table-row-background, 0.9) 25%, rgba($table-row-background, 0.9) 75%, rgba($table-row-background, 0) 100%); /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba($table-row-background, 0) 0%, rgba($table-row-background, 0.9) 25%, rgba($table-row-background, 0.9) 75%, rgba($table-row-background, 0) 100%); /* IE10+ */ + background: -o-linear-gradient(left, rgba($table-row-background, 0) 0%, rgba($table-row-background, 0.9) 25%, rgba($table-row-background, 0.9) 75%, rgba($table-row-background, 0) 100%); /* Opera 11.10+ */ + background: linear-gradient(to right, rgba($table-row-background, 0) 0%, rgba($table-row-background, 0.9) 25%, rgba($table-row-background, 0.9) 75%, rgba($table-row-background, 0) 100%); /* W3C */ + } + + .dataTables_length, + .dataTables_filter, + .dataTables_info, + .dataTables_processing, + .dataTables_paginate { + color: $table-control-color; + } + + // Scrolling + .dataTables_scroll { + clear: both; + } + + .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; + } + + + .ui-widget-header { + font-weight: normal; + } + + .ui-toolbar { + padding: 8px; + } + + // Self clear the wrapper + &:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; + } + zoom: 1; // Poor old IE +} + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.css new file mode 100644 index 00000000..2759df1b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.css @@ -0,0 +1,7 @@ + + +table.KeyTable th.focus, +table.KeyTable td.focus { + outline: 3px solid #3366FF; + outline-offset: -3px; +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.min.css new file mode 100644 index 00000000..db040201 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.keyTable.min.css @@ -0,0 +1 @@ +table.KeyTable th.focus,table.KeyTable td.focus{outline:3px solid #3366FF;outline-offset:-3px} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.css new file mode 100644 index 00000000..fd57fd6a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.css @@ -0,0 +1,93 @@ +table.dataTable.dtr-inline.collapsed tbody td:first-child, +table.dataTable.dtr-inline.collapsed tbody th:first-child { + position: relative; + padding-left: 30px; + cursor: pointer; +} +table.dataTable.dtr-inline.collapsed tbody td:first-child:before, +table.dataTable.dtr-inline.collapsed tbody th:first-child:before { + top: 8px; + left: 4px; + height: 16px; + width: 16px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #31b131; +} +table.dataTable.dtr-inline.collapsed tbody td:first-child.dataTables_empty:before, +table.dataTable.dtr-inline.collapsed tbody th:first-child.dataTables_empty:before { + display: none; +} +table.dataTable.dtr-inline.collapsed tbody tr.parent td:first-child:before, +table.dataTable.dtr-inline.collapsed tbody tr.parent th:first-child:before { + content: '-'; + background-color: #d33333; +} +table.dataTable.dtr-inline.collapsed tbody tr.child td:before { + display: none; +} +table.dataTable.dtr-column tbody td.control, +table.dataTable.dtr-column tbody th.control { + position: relative; + cursor: pointer; +} +table.dataTable.dtr-column tbody td.control:before, +table.dataTable.dtr-column tbody th.control:before { + top: 50%; + left: 50%; + height: 16px; + width: 16px; + margin-top: -10px; + margin-left: -10px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #31b131; +} +table.dataTable.dtr-column tbody tr.parent td.control:before, +table.dataTable.dtr-column tbody tr.parent th.control:before { + content: '-'; + background-color: #d33333; +} +table.dataTable tr.child { + padding: 0.5em 1em; +} +table.dataTable tr.child:hover { + background: transparent !important; +} +table.dataTable tr.child ul { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; +} +table.dataTable tr.child ul li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; +} +table.dataTable tr.child ul li:first-child { + padding-top: 0; +} +table.dataTable tr.child ul li:last-child { + border-bottom: none; +} +table.dataTable tr.child span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.scss b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.scss new file mode 100644 index 00000000..16cc054f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.responsive.scss @@ -0,0 +1,132 @@ + +// +// Mixins +// +@mixin control() { + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; +} + +@mixin control-open() { + content: '+'; + background-color: #31b131; +} + +@mixin control-close() { + content: '-'; + background-color: #d33333; +} + + +// +// Table styles +// +table.dataTable { + // Styling for the `inline` type + &.dtr-inline.collapsed tbody { + td:first-child, + th:first-child { + position: relative; + padding-left: 30px; + cursor: pointer; + + &:before { + top: 8px; + left: 4px; + height: 16px; + width: 16px; + @include control; + @include control-open; + } + + &.dataTables_empty:before { + display: none; + } + } + + tr.parent { + td:first-child:before, + th:first-child:before { + @include control-close; + } + } + + tr.child td:before { + display: none; + } + } + + + // Styling for the `column` type + &.dtr-column tbody { + td.control, + th.control { + position: relative; + cursor: pointer; + + &:before { + top: 50%; + left: 50%; + height: 16px; + width: 16px; + margin-top: -10px; + margin-left: -10px; + @include control; + @include control-open; + } + } + + tr.parent { + td.control:before, + th.control:before { + @include control-close; + } + } + } + + + // Child row styling + tr.child { + padding: 0.5em 1em; + + &:hover { + background: transparent !important; + } + + ul { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; + + li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; + + &:first-child { + padding-top: 0; + } + + &:last-child { + border-bottom: none; + } + } + } + + span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; + } + + span.dtr-data {} + } +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.css new file mode 100644 index 00000000..4bbaa575 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.css @@ -0,0 +1,44 @@ + +/* + * Namespace: DTS (DataTables Scroller) + */ + +div.DTS tbody th, +div.DTS tbody td { + white-space: nowrap; +} + +div.DTS tbody tr.even { + background-color: white; +} + +div.DTS div.DTS_Loading { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + height: 20px; + margin-top: -20px; + margin-left: -100px; + z-index: 1; + + border: 1px solid #999; + padding: 20px 0; + text-align: center; + background-color: white; + background-color: rgba(255, 255, 255, 0.5); +} + +div.DTS div.dataTables_scrollHead, +div.DTS div.dataTables_scrollFoot { + background-color: white; +} + +div.DTS div.dataTables_scrollBody { + z-index: 2; +} + +div.DTS div.dataTables_scroll { + background: url('../images/loading-background.png') repeat 0 0; +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.min.css new file mode 100644 index 00000000..499b85d6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.scroller.min.css @@ -0,0 +1 @@ +div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS tbody tr.even{background-color:white}div.DTS div.DTS_Loading{position:absolute;top:50%;left:50%;width:200px;height:20px;margin-top:-20px;margin-left:-100px;z-index:1;border:1px solid #999;padding:20px 0;text-align:center;background-color:white;background-color:rgba(255,255,255,0.5)}div.DTS div.dataTables_scrollHead,div.DTS div.dataTables_scrollFoot{background-color:white}div.DTS div.dataTables_scrollBody{z-index:2}div.DTS div.dataTables_scroll{background:url("../images/loading-background.png") repeat 0 0} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.css new file mode 100644 index 00000000..844ca421 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.css @@ -0,0 +1,361 @@ +/* + * File: TableTools.css + * Description: Styles for TableTools 2 + * Author: Allan Jardine (www.sprymedia.co.uk) + * Language: Javascript + * License: GPL v2 / 3 point BSD + * Project: DataTables + * + * Copyright 2009-2012 Allan Jardine, all rights reserved. + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * CSS name space: + * DTTT DataTables TableTools + * + * Style sheet provides: + * CONTAINER TableTools container element and styles applying to all components + * BUTTON_STYLES Action specific button styles + * SELECTING Row selection styles + * COLLECTIONS Drop down list (collection) styles + * PRINTING Print display styles + */ + + +/* + * CONTAINER + * TableTools container element and styles applying to all components + */ +div.DTTT_container { + position: relative; + float: right; + margin-bottom: 1em; +} + +@media screen and (max-width: 640px) { + div.DTTT_container { + float: none !important; + text-align: center; + } + + div.DTTT_container:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; + } +} + + +button.DTTT_button, +div.DTTT_button, +a.DTTT_button { + position: relative; + display: inline-block; + margin-right: 3px; + padding: 5px 8px; + border: 1px solid #999; + cursor: pointer; + *cursor: hand; + font-size: 0.88em; + color: black !important; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 1px 1px 3px #ccc; + -moz-box-shadow: 1px 1px 3px #ccc; + -ms-box-shadow: 1px 1px 3px #ccc; + -o-box-shadow: 1px 1px 3px #ccc; + box-shadow: 1px 1px 3px #ccc; + + /* Generated by http://www.colorzilla.com/gradient-editor/ */ + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ +} + + +/* Buttons are cunning border-box sizing - we can't just use that for A and DIV due to IE6/7 */ +button.DTTT_button { + height: 30px; + padding: 3px 8px; +} + +.DTTT_button embed { + outline: none; +} + +button.DTTT_button:hover, +div.DTTT_button:hover, +a.DTTT_button:hover { + border: 1px solid #666; + text-decoration: none !important; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; + + background: #f3f3f3; /* Old browsers */ + background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */ + background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */ +} + +button.DTTT_button:focus, +div.DTTT_button:focus, +a.DTTT_button:focus { + border: 1px solid #426c9e; + text-shadow: 0 1px 0 #c4def1; + outline: none; + + background-color: #a3d0ef 100%; + background-image: -webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef'); +} + +button.DTTT_button:active, +div.DTTT_button:active, +a.DTTT_button:active { + -webkit-box-shadow: inset 1px 1px 3px #999999; + -moz-box-shadow: inset 1px 1px 3px #999999; + box-shadow: inset 1px 1px 3px #999999; +} + +button.DTTT_disabled, +div.DTTT_disabled, +a.DTTT_disabled { + color: #999; + border: 1px solid #d0d0d0; + + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 ); /* IE6-9 */ +} + + + +/* + * BUTTON_STYLES + * Action specific button styles + * If you want images - comment this back in + +a.DTTT_button_csv, +a.DTTT_button_xls, +a.DTTT_button_copy, +a.DTTT_button_pdf, +a.DTTT_button_print { + padding-right: 0px; +} + +a.DTTT_button_csv span, +a.DTTT_button_xls span, +a.DTTT_button_copy span, +a.DTTT_button_pdf span, +a.DTTT_button_print span { + display: inline-block; + height: 24px; + line-height: 24px; + padding-right: 30px; +} + + +a.DTTT_button_csv span { background: url(../images/csv.png) no-repeat bottom right; } +a.DTTT_button_csv:hover span { background: url(../images/csv_hover.png) no-repeat center right; } + +a.DTTT_button_xls span { background: url(../images/xls.png) no-repeat center right; } +a.DTTT_button_xls:hover span { background: #f0f0f0 url(../images/xls_hover.png) no-repeat center right; } + +a.DTTT_button_copy span { background: url(../images/copy.png) no-repeat center right; } +a.DTTT_button_copy:hover span { background: #f0f0f0 url(../images/copy_hover.png) no-repeat center right; } + +a.DTTT_button_pdf span { background: url(../images/pdf.png) no-repeat center right; } +a.DTTT_button_pdf:hover span { background: #f0f0f0 url(../images/pdf_hover.png) no-repeat center right; } + +a.DTTT_button_print span { background: url(../images/print.png) no-repeat center right; } +a.DTTT_button_print:hover span { background: #f0f0f0 url(../images/print_hover.png) no-repeat center right; } + + */ + +button.DTTT_button_collection span { + padding-right: 17px; + background: url(../images/collection.png) no-repeat center right; +} + +button.DTTT_button_collection:hover span { + padding-right: 17px; + background: #f0f0f0 url(../images/collection_hover.png) no-repeat center right; +} + + +/* + * SELECTING + * Row selection styles + */ +table.DTTT_selectable tbody tr { + cursor: pointer; + *cursor: hand; +} + +table.dataTable tr.DTTT_selected.odd { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_1 { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_2 { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_3 { + background-color: #9FAFD1; +} + + +table.dataTable tr.DTTT_selected.even { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_1 { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_2 { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_3 { + background-color: #B0BED9; +} + + +/* + * COLLECTIONS + * Drop down list (collection) styles + */ + +div.DTTT_collection { + width: 150px; + padding: 8px 8px 4px 8px; + border: 1px solid #ccc; + border: 1px solid rgba( 0, 0, 0, 0.4 ); + background-color: #f3f3f3; + background-color: rgba( 255, 255, 255, 0.3 ); + overflow: hidden; + z-index: 2002; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); +} + +div.DTTT_collection_background { + background: transparent url(../images/background.png) repeat top left; + z-index: 2001; +} + +div.DTTT_collection button.DTTT_button, +div.DTTT_collection div.DTTT_button, +div.DTTT_collection a.DTTT_button { + position: relative; + left: 0; + right: 0; + + display: block; + float: none; + margin-bottom: 4px; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; +} + + +/* + * PRINTING + * Print display styles + */ + +.DTTT_print_info { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + height: 150px; + margin-left: -200px; + margin-top: -75px; + text-align: center; + color: #333; + padding: 10px 30px; + + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ + + opacity: 0.95; + + border: 1px solid black; + border: 1px solid rgba(0, 0, 0, 0.5); + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + -ms-border-radius: 6px; + -o-border-radius: 6px; + border-radius: 6px; + + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -o-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); +} + +.DTTT_print_info h6 { + font-weight: normal; + font-size: 28px; + line-height: 28px; + margin: 1em; +} + +.DTTT_print_info p { + font-size: 14px; + line-height: 20px; +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.min.css new file mode 100644 index 00000000..a6ffb818 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/dataTables.tableTools.min.css @@ -0,0 +1 @@ +div.DTTT_container{position:relative;float:right;margin-bottom:1em}@media screen and (max-width: 640px){div.DTTT_container{float:none !important;text-align:center}div.DTTT_container:after{visibility:hidden;display:block;content:"";clear:both;height:0}}button.DTTT_button,div.DTTT_button,a.DTTT_button{position:relative;display:inline-block;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}button.DTTT_button{height:30px;padding:3px 8px}.DTTT_button embed{outline:none}button.DTTT_button:hover,div.DTTT_button:hover,a.DTTT_button:hover{border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef')}button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active{-webkit-box-shadow:inset 1px 1px 3px #999999;-moz-box-shadow:inset 1px 1px 3px #999999;box-shadow:inset 1px 1px 3px #999999}button.DTTT_disabled,div.DTTT_disabled,a.DTTT_disabled{color:#999;border:1px solid #d0d0d0;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-moz-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-ms-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-o-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 )}button.DTTT_button_collection span{padding-right:17px;background:url(../images/collection.png) no-repeat center right}button.DTTT_button_collection:hover span{padding-right:17px;background:#f0f0f0 url(../images/collection_hover.png) no-repeat center right}table.DTTT_selectable tbody tr{cursor:pointer;*cursor:hand}table.dataTable tr.DTTT_selected.odd{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_1{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_2{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_3{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.even{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_1{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_2{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_3{background-color:#B0BED9}div.DTTT_collection{width:150px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}div.DTTT_collection_background{background:transparent url(../images/background.png) repeat top left;z-index:2001}div.DTTT_collection button.DTTT_button,div.DTTT_collection div.DTTT_button,div.DTTT_collection a.DTTT_button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}.DTTT_print_info{position:fixed;top:50%;left:50%;width:400px;height:150px;margin-left:-200px;margin-top:-75px;text-align:center;color:#333;padding:10px 30px;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 );opacity:0.95;border:1px solid black;border:1px solid rgba(0,0,0,0.5);-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.5);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.5);-ms-box-shadow:0 3px 7px rgba(0,0,0,0.5);-o-box-shadow:0 3px 7px rgba(0,0,0,0.5);box-shadow:0 3px 7px rgba(0,0,0,0.5)}.DTTT_print_info h6{font-weight:normal;font-size:28px;line-height:28px;margin:1em}.DTTT_print_info p{font-size:14px;line-height:20px} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.css new file mode 100644 index 00000000..4e6fbe38 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.css @@ -0,0 +1,476 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid #111111; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid #111111; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead .sorting { + background: url("../images/sort_both.png") no-repeat center right; +} +table.dataTable thead .sorting_asc { + background: url("../images/sort_asc.png") no-repeat center right; +} +table.dataTable thead .sorting_desc { + background: url("../images/sort_desc.png") no-repeat center right; +} +table.dataTable thead .sorting_asc_disabled { + background: url("../images/sort_asc_disabled.png") no-repeat center right; +} +table.dataTable thead .sorting_desc_disabled { + background: url("../images/sort_desc_disabled.png") no-repeat center right; +} +table.dataTable tbody tr { + background-color: white; +} +table.dataTable tbody tr.selected { + background-color: #b0bed9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #dddddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #dddddd; + border-right: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 5px 9px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 5px 9px 3px 9px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px 5px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333333 !important; + border: 1px solid #cacaca; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, gainsboro)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, gainsboro 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, gainsboro 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, gainsboro 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, gainsboro 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, gainsboro 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.min.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.min.css new file mode 100644 index 00000000..a2c5489c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables_themeroller.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables_themeroller.css new file mode 100644 index 00000000..5a56d979 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/css/jquery.dataTables_themeroller.css @@ -0,0 +1,330 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 4px 10px; +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; +} +table.dataTable thead th.ui-state-default { + border-right-width: 0; +} +table.dataTable thead th.ui-state-default:last-child { + border-right-width: 1px; +} +table.dataTable tbody tr { + background-color: white; +} +table.dataTable tbody tr.selected { + background-color: #b0bed9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable th.center, +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.right, +table.dataTable td.right { + text-align: right; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #dddddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #dddddd; + border-right: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_disabled.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..881de7976ff98955e2a5487dca66e618a0655f3d GIT binary patch literal 1361 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVin+1c5}%-r12$=KP@(AChw*vQht)WY1&)XmVs z#Kj1v*Cju>G&eP`1g19yq1OVZUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnv1?G!Lpb z1-DzwaO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i-f{BMZ3YI$qn<8~Ar-gQ zOt$tu93XPMc=CmoA1oW4o1+WYIB!k3r72K4*@xA>;l+b1ClB@qaOE!8@r8RwiN1wc zl+_Cb3(lEQAv#$bmh>Mfe(I7Woy4{G!}EFf?)^FUc%F02^;EH~5owLt3k}+qS-P)U z616t%^wT0PX2liq$807FHoQ4d$0`5rkQ{U2Kkgclu0)Awnd5T>ob((vrABTq*u(RS z>E?oy`!@uw+@i*D$dKV&#I(EL&;9;u$GTQAMM5faVZejQCzo(NvvlZ75dZt%IYnd( z*RL;GX3W}R-P)5>-Zsu`&nUT&Ho^GzHq{#}Ya$hT91>M0@O`!9^}b&yQ@87fac$Vj zkb72h`!2pMTYunpu!r@;1)uFRXDvHO zu{mw?PmW#JOy1f}J}ILj)G2cQ^TrhhTtyr5@7eCYm=Uoy?6qTPsOnt5?2i>S(pg>~ z>M~M93=YlxcD}*xKl_@hz5j0IZGT@9Yu_^8_RN8=&YkAdFR(fGAAWd4CvkG#0^hlN z8>(g;?I=2=cEEAHaL+WiOvRp~fl`n5dTf5V)bNv|ZcjyzLHRnz@2)SdPWo#3tF@Nf ZfT6u;&2Oo-XD5RSIZszVmvv4FO#nm}^+Nyv literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_enabled.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/back_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c608682b04a6d9b8002602450c8ef7e80ebba099 GIT binary patch literal 1379 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 A0{{R3 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/copy.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..5b01ab165a9d1adeee1142b4ea5a0c47278c0689 GIT binary patch literal 2184 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 KfL+QIrTrJRQ-Rt5 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..43df1559f7cf9546065ef4864e605a834df47b51 GIT binary patch literal 1607 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI1#=yXM&$lK5$YDu$^mSxlxOU@;e}oZ`FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpC$O5Fu(I+G%F`dC)!8b7_RUto5 zArZ(*R^)Z9NX{uO&MZq+NXsu$2+mC`&dAJ52g;=9c{FoijrsN?cNllZ!G7 zN;32FfI+yXM}5RnejUS+Wl7>dU|T^vIyZYBNs|KFb3 zD1k}v^Ru(R|9^db{eJ;ta&mIp{`&t)Au+ql-rl&jHoCv@1_R@fjvThn>*M!N+gJCu zN;hCbqi0Nv&8?FsJ0ITOp3kG>ecgrAxJ1HVNM7J!W^?A=z4@(A z^5i{##6PVszG~a@VcC=>L$>EKUYY_<6Qa-k-1*b}hv@-Jd(){w{MowG1d@6bTIQ^X zdi{|nnPQT$IzbLn-bEqiyquXz7aut6tld!hu(BJs{?T!E5h z3zC?WEqSYVB&pm`l5Ar0mOC(ad%+*SLt&G&EfnwW{%$#KcJZ^7g);mz-r9WFnk&8a z+Pvq>%DrCR+xGtV!YPYNV#b4&KN$t7MH4jesUanDhyefFE zGUEDGp2G_762EWK>3v?wwx%lK9dpqg#ecCpEm~^6!7Bw^Cnh|yE{&R&s^&R~Ij7>E zB!9yEUF)hh=l+&^w=Z?N0Z*%=(4o!me;+HH!~IRJ@%WL#nx+Nre?7D(TIS4|v%MwK zQJ^Dqg&_0oZKA!?QVl~xCH3z2*@hinbxP`ERx+<>23-~Uc8 zOPSDjIQ@>f!Xww@{VXrG^n^-vG->P#P1<=>sN+V<1UC;sMb~Tmf;u@z?_D}CVDHL( zP;G+9&n6K?0Vl21xm!QXJGk3s@|upuv$x-zt1eD|c5d#UjPlJ3u4dhRURl>{R*@W~ zeZfNJ>PMF=)mMKh>^`5bZtDO2qU|d!(Q?%(@=@ov&Qp7#q%L;jWQvgX&Q+_lZs%_mR_e_p;m{9rn<7PmN^r`oXxdYf;B1rE>;FX0u(7@Cbiqk(TjFEc$wC z^PGLFZ{90;bG1=3-IJrZ)vyUCI0#j&)qp z^9c;B;Bd0qu_K&!QC#yu1rc^#gAITG_Fh&h^(eXg(nLvBi0}3H-#064__p0_wElfP z@#2#fW{W+SUtZbVyT#z=#nAt%8$2wHj~|OztSl~iWLC)5Khgaw9IIwXKELwUQYk?3 whM0}@N5#Gw-!;Gfzopr0IJ)>1ONa4 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv_hover.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/csv_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..10b34d3b90b3f7712f6de998fbc98a051b38a661 GIT binary patch literal 1854 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 ThIkt{00000NkvXXu0mjfW_^Rc literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/details_open.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/details_open.png new file mode 100644 index 0000000000000000000000000000000000000000..6f034d0f2d5c7902dce190355b12defdc07d6c9a GIT binary patch literal 881 zcmV-%1CIQOP)P5xVIgh(4gM3Zjdy!n~2N zjD^FnHQ1(tR(9cJl^-l~RyvtO-;dMt9M4;+6T9$?ALpFs)Rcr6nirw3t>UzAPx#r5M&8N9I=W>B2)xRbt)puL>xs_c64-H@%#Or zXf!&j>$*muHOWXvHo`VD#lg6MPE~+#^!N8aRTO1|?J`J5He@S&wvbBVO8K%ZpNm8y zAIT}HC7Cxi$gY3tW-XzMtU1`kx+go?tM3CWp(Z#n*^&?X9upjrBoaWeDh>vNcO4E# z)3UM*kH0>GH%mi2IAp}6%}CKyd$~2W6jvjYwyv(OhW7UM zP7O5aPWUzq$A-}#e>#Hw16_xihIJroxfm&IbSiP6!~SxS;g5FTo6ZM`H( zlIh)&4}38nXc|&$DyX^!-nt?1)(-JKW(QQ%jr|ydxA>>z)7I8@S=`cW5N4N`m!G77 zdZMpERgp|rK~d3JRsUp;HJ6lA@hNmr@UjvF zT!Ag6;H&rZ+37vY=g+HO_-wIQtVRQvx7QEFj83+*vi=TLQ+cY^m5t3Z!D|~jv(ZlR zc>I^mX3LW^WSCo>=P5lkaGKBKE#utS*o(YFK~4deqwi1AMVd+US~dit;|^yb25sIpdZA`Wys(O1dAvo2(I ziyc~u+*C?>Z*T8&(cem%afeVS6nDGb_L8EKvNL%#5MBx6)#tXj`d$yLwBMhA-vSH(T>k(8(cOU?00000NkvXX Hu0mjf8E%-PSCwvdq#I>|w&vYiQvJ*5b8_Ub{?#`r0{k+Lq*2zHAYueQ6G zuVR9|Dt172AqG@UH|-#9;#F13*&fks9p&USOBFcNG^F?pgo&gOn--L~AjnEm7NL?z zMw6*X9Lg!7&6TmfW+9ujxyCU!-jy4yg5}W6GIGszWGF7SK(l1Y?CvGfRj(P&hdK>+K$ z<(~eLG5Kqz6arhHFQ57{oj=S>GJC1~l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVin+1c5}%-qS)$=KP@(AChw*vQht)WY1&)XmVs z#Kj1v*Cju>G&eP`1g19yq1PFwUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZns$CG!Lpb z1-Dxqaq86vIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@ies{+CJ_7^eaZeY=kcwMt zrucd@1&XviUp=W&hC_Vigxz9qe=+JQiRZ>#-OmxVbJNmo0?O0%xE7^$7hDVzS=7nq zBvt-aWrpIMi;ByGX0JatRXb+C`iBGE*Nwm1%=tcVr*ri@cU^6Xtj>)g66P@%1db+s zWSF+QYf((v=9^+`Y}d3l_I1DM*_La4%-~FX zOD#3=6_)Nj)~$1T^@J$qollO4A6gI{9eUN=bCTSutFMe5M0p+_TYIkc<*t8mtFJEc zTKXwVqK$2(et`HF?-Em4wsukSTsY4VW0ic bdL|wQU%!)=<|i%z6_yO1u6{1-oD!M<;V$ow literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e6b5384b8454ee7f44a8f7c75b0321b7eeb9b1 GIT binary patch literal 1380 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVip+||I$+{MJu$=KP@(AChw*vQht)WY1&)XmVs z#Kj1v*Cju>G&eP`1g19yq1P0rUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnqfWG!Lpb z1-Dy_aq86vIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@iW_)h2mVtrshNp{TNX4zB zKmY&RGjC-OW)@`(g)dh`10)R-NpU#bM1=1eo8Z2AYd)<-?^`_sqOFY@6XS7KM&8JXTA5$g^A9S z{TX;`xlCJF@2;-kt^WS)-(qj^YjbRh3Qo21zn9<7##PJs=)J=q?vtT6c$tqWSn$;S z{q^hJt*2*?^Szy4@bTi|;PVYm@{K=qh5oS|v0uoRWd7#=|NZ;-*VL7!+I+Ui=RzOdW2D@cF)|8@0kar@euUy>OYxL3%Wh|X{LVLRn7b4UH-Q)xXL zlsIOXI?k$WjNtJ4&-&^N(`qv`*KNBfVYRHPjKr+8GT t=fC*;><^O18kWptJjt-AJE?(znPJ1m)BPofdH;jTJx^CZmvv4FO#l_Q2A%)_ literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled_hover.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/forward_enabled_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..fc46c5ebf0524b72a509fe2d7c1bc74995cb8a9d GIT binary patch literal 1379 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVi#&A{2f&C=1($=KD<(AChw*vQht)WY1&)XmVs z#Kj1v*Cju>G&eP`1g19yq1OqgUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZns$AG!Lpb z1-Dx)aq86vIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@imN7BvVqjpr?&;zfQgJKk z&;S4S%v%{AKQQkRwI?VL9s)YsRaG&b6_ zgRo<91_J$Y%O?`e|&#$ZtS+eXp_f= zjUUrLb7!pi%4at>{rxttxB!poqO-MU1}Hz4_scgh+`O`|pzGU*Ppd<;SGk>1td!-8 z=;-~nzrMci*RP)sFMiM0pIiAYgm$R?>m2vx|wYgZ#kAH7}W-quPuJDiV$o>g2t#=I)c$y9~%y7A9 zTfgc1jk&Lj_4ZX)f0PV(p)9c9_0ar=AL>^e-n9Mw|Nr~<^YZ!qF*`48{dsWi)b|VZ zD%w*xPFz?Y(EM+~bAgn@|LT8!dGP4_dwn}*-YUka%$2Ws1@^aZs%Q9^A9It(GQY{> zGt)+aDgU^S%wM?fC!gsP`E`4^jM#4)q-B&8J6^t!zrwrDf%l)k#^S|Oq%QdIe*R^@ tLh*lxrsW37V+~Wv{w==9!pqEIz%cpgo%)U5J^Y|z&(qb2Z8_q literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/insert.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/insert.png new file mode 100644 index 0000000000000000000000000000000000000000..15d5522da64f4f036c5a717dbb320799884fa12b GIT binary patch literal 1885 zcmaJ?Yfuwc6ke)>fRTqUjALP&*xC`v?j}Y`Bs^n)nFNqTMNwhdEF?m*%Vv>?mPoZ# zs@74ainfY%Y-t(Plw!alqNXAbBPu#pi$zL{3SvNQVEafum8T(P?s-2qUyS)Q#a8v?Rj@fQTpqiDJ1p4QAmv8l9M9YiQzt z8kLx{LMVsjWE`&6BotA&q9{p;73E^#Do#`+7-0}G0$Q9#L4!6=rxzK-oR_*HX6@dF zIN(bNoh#=2Z7NNk0>%*(4hng2CU&fu`OnL+{@Qv%LK0nAJ;L{PBCL0mV5CH=C)i*l*A|vcd}CQ%gxXLOs9De@MJ3-+U->UezzfZ4b zJDpe>ABVV|6;VdEdGHKsX=!PJ>v9@Kn~W|t@WyrzRlm8j!&R9aK9bS8z6zK&X|cdk z*(77liTIq=RO}i#|HFm0nxSBe(bFG(ia4%38}6-pu1!C&>BfqCSbhBfpBoJzRUTSQ zm7Qg(Nfq@x`UWc=xE=VBUxg8Ic-%RIosS7P;!Uh9cDzt5GOklknin#ycXYRrU4CE| zd$TWUO6kcl3|5c!4{xbs?flrRU`H?4s1pw-wweTIpA2y=pZP_xi=8j5CVdaeo;kCx z(tk-bKt*14vAi{ASD-a&`MJw2@Sf6A?*)_G)f?Y;4X0-gR}b0!GK#VKi3=ZE_Ghqe zC3i1&{&9O_i06@;3l>z%ShA*B2V6BZ$R?+2OUa%she~$r`LN_r*{;%n2WMT;A?0bC z`G z$-ze_iKgC|tjs8iGDTVw(z83-tuF}mA!xKU7Y;POO_fxlS=Wuy<;@5X<$ zW1h_i22Tfo(RY9K>y%8tG;C|wxZ=bgbB+n;_JiJU%?zB{DVbgO&K;l0($f4)EPvm- zlN+v;S_1+DEnC0R!389oRr~E*Q?J+FnOR@k)fi;I|7kZj<@(pq>4t}An{4){BaxAZ zH%?gQRj|6J@`?R=a0O2#7_@L5=9|4}Mg4|&WxZ+J_C6!DEOJHrsga0gds4A--}I0z z0(Ir4@~w0iFvTagY;*62was1uOG}S><-aM}(OOpiY_D=(P^td<#@N~37i`nIC&zj2 z-9OcH-N+i&oP*rA;o^%IAVsoIPshsTvIhr)6zGqqehOLDU-LWl=f%4@inL4pE0-{K*64}5NYR>RpukMimF|MslT0q9QPlIW+biD--V00;u>>pd3$=G z{Kl$ZDq^cRN%8jvq^Ez>n1dg9+UCz6?K>R94Vrd)F*dL}C`am-a4hC=-mPt|!i%1t zRh%7suNYZ#gZ)K~K71uGOct$wqWyvtM1FoR?S1=~=?;@Hx$tqLv>m;F{CSiA v3v1c-1AQT_MP7}WOBDevGdhR%UqvP!KOI{pd-r?y4=-^^lH^2e<_CWP6QK!R literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/loading-background.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/loading-background.png new file mode 100644 index 0000000000000000000000000000000000000000..2d815070cb6ba554d18bcc36f1eebb5a2010a095 GIT binary patch literal 1013 zcmaJ=&ubGw7+ol6TPa>VSP>bwAfje}rO9TOtR=}NZNLp7iI}6?-AS{yyR+S$B-@Hm zN)ZH$=v7ehq*d!5pj1H+y;KBGp0pRO7wt`N&ZbG~A$4JP<{RF7-mji`v>&j#uZnHFKL-4FZ@0zM=MUX)r1Tlt-7+jnK zah~C$NoEy#Ruh^z580r7WZCNDB`YM93~e;|CuQnHyd-uQnI{TWEi=(SoRyV$c O4>6xDsO#y=%YOkv`$i1_ literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..1b038d0884524f887d32a4d293b868802903992a GIT binary patch literal 4325 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 TzzMz{00000NkvXXu0mjfWhV~A literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf_hover.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/pdf_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..eb06855f4fc6bb57036cf61324149e3f8e27c902 GIT binary patch literal 2786 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 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/print_hover.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/print_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..9808a9cc9c59c3968494faea0399864448fdb3f4 GIT binary patch literal 2230 zcmb7_c|6p67sr3r1~ZnfWk?xIiiEL+$`}SCOJWGwh8bgQ6DC_@D_e+>r9_Ik;r5_h zYf9sy!DSlRsf!{dvZjfVdB$J&-{(26*Li)nNZ3TTM{wuWE4IsAd+~MOeBT#MgXuzqyN8NjL&DVc}k-L+`nE9U|s*Cp;J$c zUje`&BU=;_6Fcp{$K@gf^!)gxVpfy(xZBH@pMhPlaS#C|_QiB1M4~QErcg6QNXNIG z{9RO1U}_NH>&XlicISTFW+7F&a##-$To#kbT;JTjp80)j;BKC&iHSTQC^_GqA@LW# zg~bgnm&+Mg|GuOzY!oeSO@*qyph{a(Q0wzKg(!JzYinWZj-sL>SlG=mM=RY_0qht( zu4iRs1@@&U1o#Euv1nUc{LmN%&JTiFlh-;QY=3#HnjX-b3#a_rUE;PreaO}EYFq!> zah(l?nw!2#;?6WvwxVELy zUsQfeZmyv@0N3_zmtO6mCvhW9O-&Oy>@}sydY(#m<^A(5h?AEz4g!AkQwpjvvWnQr zk6T!|{79Wjg33$(?hX|+QR*;+!`}j$aRSc0U43s@os9ne_2qfHbRH*ZUQpo+mO0qj zHP{9GxzWqg0Z%;b*gGOC!%mo(=>RJs00{YqsGp>ajCQTo;5W|Z_Nhsa!NEa4aHJ4g zwU6dY=LR}qsDW44L4LUWqGErL*d~d42-C@8u{!yhihhH}t*nI3WePr~JwznwQTF%b zq2yWlm0IR)bLAdfF!4IZ!X9Jk<5PTGL%IC(JckXox3>qwX7@RqyD37@nbSwTNy+IA zq<8JEaxg&YQ|mNJGHrtteTGxLs;++JhCvn#nmS&J*6f;Q$O?XY%z|b5ZCgtzRmy#{ z^66w~X6_35fMiA=ooRu$33VIUX-D&_p;~x($vr3J*)!epi-TqQ^tDoMms#-1q6>IM zT;o&+#f)@&y}dp=xY;!1{vxM4<5cc^j=;2Z;IKx1&s*7Sp`M66#}R|#flvGW#Lbaj ziDoA2MCkC7w*H~x@7wPGZmwPMCn=9)ig^-?jk37$GhgDAZy!5J-)-?NFssQp+ zuIm$RIeqAu?|h5m-bxqy9q8szW~JnXI=AleA1yU>FYTLGFom`jpKd9oK@#3MJf{DAuEj1r*+DItbKWWMrD~$T;qJqHv>SvUkSrf^Ga-mOvujy$8DDiiYh_7QKW_fK1|FX?j(kfw+=TFz-fm8$-?4aB;ksc=82 zx||azjKp@^ss9?h9<_R&{XWXZXLhxzVc03}m(Zq`p{wcwzE%sARe8kez8PvNrQ=3t zor3wIK$Gn%wqlK|i8%aQ`e(yXvOBR_--bpD*znVx%mvCnhJU5!v;+}OsBHDS*(DM^ zXn$Q5eLdVOq*JOTGUu}G7%AhSQBsV)R0u8`I|Tb&Wxj?0XMOajqn>pn42d_VBrit1 zFpw{69I?}Ns2b3^Bwm7ZR)9Dx{82HJGA%7wUAl5p(ZL7^>OXbRmZjv*Ra6 zY(Po(+4g|=VI6_O{>3lI3Bj?NW2OmY2}-w>j_-DA{OpgT8IT2h-aDqVncHKxafW|` zp~%yudm`%UeWrImCQw9nRJ+H;GE)7ZnCxES)7HI5mB##_Nc3V#^6fOVnlt*u<H}ZllwAh0Ka*zPT7YdQLphI{Gzo#AU?boT6~eD$@wCGGnbK!#yhz zNg&x3Mu?|;y{KFJfJ^1f>dR|u6qf>T3j@W7!{WP7AtLcp8qccR+U~WtzZeM%`!?~h o;Us;q!HUvr$byH37?TLU_*S9#_)UUT%E868wQ@w&Tln4hFFz3kD*ylh literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..a88d7975fe9017e4e5f2289a94bd1ed66a5f59dc GIT binary patch literal 1118 zcmbVLO=#0l98awuV{uMt6P_}u4rcI3idKFP2SpU%ZJIE?RL`X zK?Oyo=*5GG2SxDYK=7akJqV&hrl{aWJa`y*5xh+1%i2y4V}gO?edPc9{r;a9vjc}) zn|Cxb4AYwFmvVG%_ui)U^y_4!ujsO!qzYuv8YUIR!Aw%KiWp=JrG#@>(I!s4#N7H->?w+cxsH2#GA};A>g8lyFDGPKh!5)vuP_{)}*83+N zJUBU!S0_i+E{*Lu1iGsNB``2iK-CyCU7?y_mv{xb_pUh>ESZqe1Y2{eAZLMSIT%EO zFrdOH1W^=3p>Qk~I{J+k#s5zQ@j{%aIA!l^GQjJ zqA1Uc2%!{8qBKfMNh#9DCnKS_*uZ8?mnf!+8@f8xtz#prVg=E`3bCBLWsNmDAX~PG z<(4fQh=UOzE2?gKXRkc9XeI3Er?HlHECVd%SI}3`hy1_du3@$R$r(qT;k@Sft63UX zv;)2Ea_iH>^6+4jPK-lGM{Zw37Tz>~~zlHzO61x51(V4jcaKrcIVDG$-d>)z}S|7f!xxYhfUE}Kj zug_h&HZN}go22$5Ym1}P8~vYNx7-~$TWFJ;_nh!wFYSAQJF{CCo=xpK8^7?iY1^!H haOA^1D_`VC7fU=jcT literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc_disabled.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_asc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd7b7b8cab2304b374e6e4b9dc8c05faa2e1130 GIT binary patch literal 2916 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 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..def071ed5afd264a036f6d9e75856366fd6ad153 GIT binary patch literal 1127 zcmbVMOK8+U7*1U&zKRu5sR)h{1;yRWWV^4}ShvZpU2*HWU2!iy(qy)cZ89;Lb+`3m zMbruv!GjkO!3qksP*5)lD)k}=Dp*ht-n@8G5m8XoN!zU+ih_Y;=AZe$?|)|~*Ri8v z(dtDU$2DZy)jV65`|pB!_H}d7Cv0h=sUqzpC0fy3%q0!dg+a#Bx^W(BM*oq=xP{{a zC9_bZ#q2IgCss)FbwX9kVQ7wPX{|b%-is;d!ri7V^Y8E8=YeU+{JuyQW*r6hnC$~D z?i}bS=mWia!r)uCftISo2rNuBP__DOPpZoN6tBeg{;|M=DHYl)^V3chvpJv;7lTL$ z26Y&PAc{gL+#HL=wg3?#C_qs_Vi3iouqZ(YW*(kdbB&UeSJN}Lm?ZN(lsb|iR4SEF zB^)Adw}29fgwG+0L8cM(`faLJgSNN6#-L(PcTI+l@K3y+Xf(g*^61+0|J+O6zN2mb?UNGh6GU@A{1+eF%d@N2(^XdVmhis(y25|iAr;gV=io5OsYy0 zB}Gv|2&GUGrBPB%s*yG^841Ug8a88lRI_zlvuiTDGuXsmv6A9qjS{y&NMEf3ay^6+ zuZK85>5PD^rkl1e`{kLAR>iJ)6dP%mSYRr@k~xQcDE=$%X{_--ITM&Og5Ml}G)wJ> zb)dhUZG9%p4iC23#JFrUCcmwHz{cugMoku~ue-kg{Mj0~%`FeCcz9jAdg}QET-kSG za`+2B_+lRTaeAVz>E`F1pN7h>B=BbGqcz13d%ywZR&4OjkNNrF_U}#EcXDGa@V52B z>JnIW7#s%CHi literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc_disabled.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/sort_desc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7824973cc60fc1841b16f2cb39323cefcdc3f942 GIT binary patch literal 1045 zcmaJ=&rj1(9IuWjVlWt@h#q(rlc~7%$2P_q>KN??ODrK{#&I!}_Kh{rzS=%m2N%F- zAW={L0VZBJnRrkSCK{q1NKA||(ZmA>6Hgw9o;Z-;>)3_|u*vIt-(X0AeGY5Bm`Mgoq{>2>Xkbiu%Ds= zw2?31f^tL9kQr8eOxQDR!ltPHq-U$zG{j&MP8pU+Z@qp?149?-TQP-IYzdZ(;duv+ z&5z`@`Drbo)5+_g-xG*{39$-1bH;K7Po%550y+EF3=OIfJT20DK^2ryARz~WSeOlI zY%dFXxiA-r#^dp8fM+?DVR?q*LtI>l@B+(%+D8*_j$RaUa;D~sSR!4**cKS3TrP*p zkuY+m7%q`W_!>MPB8ZS%v9RieEVsL^AVXJk3>zEB0=}X;iDt1#lSubcFztq{<<`nX z3dVS<&2VAXPpJ-6l>b9bvw?PT4(`W$ps<^-*pSIV7tJ~vX67YQ8ELa7v~ZoP?{i~^a{W;-ZQ@ymjxh)IjDt*2O<6Dwh=q$vY$VY; zc&J{Ds~-?cjVm3>Wk@iL-`IZ|UB4pJ;~yJiON_?gLyJtiL&kbxZhV_OiPfx}%6s1@ zcXoG^ffrPJ;LQ4(`t<(ickJ1j|E0&fC8lSh8sUh5lwUg=l~QoqsK t`nTanN|e2@a&yVMdhy*Tr#-4H5`LnI;B zmXcUmvE)c3Md*H+qC*m8Xa4HnbDr1hd3~Sf`~5uc*XQ;9`zng}=m$V`xusnP~UCz6N&FfuyqK{b)~8Y~AYi^2?M#Y53FfEdIKpn=Ze5S>P* zK|zU8BATUCWU(qDx_Np+bif8AK|wT-8397lDo`8ckPsLa8^egBfx*mZkP;5XgfJrL z(lKf!;{Lgr^N(DGa^|GW`y(#0A?z?{;wAct7G4#lRH*%zrC!&?*2zZ`n49F z(qH`OY)|w|cpmUmBC(M(IV`I@_pX0g@=ffMjdZ%#l`2`8dDi;gCc9r&x@m$Kii^XSXk@g6-y6x-KkUF zbLSB7;04aKx$6gPD&s^rMghVurr7Th$sz&8W)1WGRRKBmw#0N87Nz1OT*2n5ZD>fo zKI1RhHK{VOjK3u0ss2qE_N(A`YT+*FeIz2H8a-V!bvbF|2M0sLFD_tSTRvjHw^a)4 zz?rN#^jP1=TpP)YvF^D!SZ7$0Vk&Z`hJIB}Bbi)J$8aiYn1CG@TcECk$#^GRUuaNd z{H5KjPz`CTN|Q?xLay4oaK$y#rzNSjac$w1xInk=`&{)>tsWVx#aqWaOCKH`ODyXr z?3F9UIpMT9zy#Z+oWCN(!Jyq*PCan>jeqE)Y~BB7JwX6|iRpO(%I@ zkF-km@8*tO|4b>VmX8Gx$m}d=vFv>!8uaq|m3yPk&>-QB5qZe$O`;aQ&yMEn5+3&L zl<4Tm*NcMhHe4-idY-twO1z5;VVlnwzpUEooS`;N$nr>C7`YY7Zd1$j7ds7&an|si znfQVsH7qje%!P?!_DuXr@+2Xw_l0kHjTHwz zR?o4<+V%Qfedn*ZcA5`_^8JQl#N2G+($cR^D-oiF0(Imq$2%8{f0!PN%gRmbyI5v1 zNZFcQiEWQ)8zaG5s0K*jSHRn3>o(abPNv>;-BWS0Vo|xzRU6ho->Ie<)dke-xckbW4_P(#*&2PUn=OE667#nV zY!G0)S;B%Z2!_{(Q&u-?^{XR2w$)DMb+J9Ls@;=EZ{xpcf-nL66T0|S5v3@$q#8bc zgm2KX45yF!jC_Y{%=Q{Cd>k=8+jr@$!NA;MORWuE-R*-RY7c`=6)&@W-aZ-B7V}1; z{@4S}og<@`0ivkXU2k@KN{FW{l+PB?R17uEL(DdM%gXTFws}|0`}CxN1)F@{?xRWO zgvIEJ&6X9*vW{N!C0y8Ir(qa79T2!|*I8&nHFnTc-(Yt*<6piT&6xlI literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/xls_hover.png b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/images/xls_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1930afd86e7ef439026ee89e75520c086471f5 GIT binary patch literal 2061 zcmb7_dpHvcAIFzDGtT5v)~3lUrG?ta>SWj$DJBfDl-bNoW0{#vB)8o1qI#?0xK-YC zKaNWzm-M2@r94F{&E!&N?+A^#?47^Pzwi5dp5ODkf1dAuzie->Bf2`qIsgDb_ozF` zR~?Nv91H>gHhm^12C5597LiN@0NxD`9S^io*KodTAfLhw=f{Wgm;hoJm(D~UjS6Kk zeVL(QqL`OVyn5--#uCxf&o7h(a6*zp!pfU z1Us6gp0Pp`*wIWg&w@fdH3PfBaN(X6@z|^gKA;-;x9K8nFqq$vbP@76N6q0O{nTQ@ zxbd-P*gxx7#p+`hwqGEh#EfO|*k}1{ZnU}u0LX8){=ZrdIboA@B@8SrE&t=&@>EgKRCFayrwil0e$CWJqi^?abQ*Jk03(ocH9G} z-QDG&0DwN>Qg`@c*txQxZ}L~BM$@ZlDd;{~!~&~Wc#%8Sf_;p^VzDJQo$#TtwViT8te0B1+9Jb!J|Fq^wJ;9f! z@p9Pt)undKn!9z!&6WMImgJSq^(M#*u)$|Q;HANTH>}U|Y;9MUmh(e-b$dFVDoo)M z6B96TDPH*`?Yhi94JM2-xb*4;-%mN>oH9({g2%9rIpgH|ALF=P`y{P@2Zkh1YB`WZ9?#;XSZLD;`7zeHM zI((Revkmpq0i`XFKmJ+SrA1EwPjk=&R28G#-ZZnz09P<28kPx2D1%?I?{pgFG*|4d zMtGAq_m)NDgNL2eXDz!bZlX<{H}@}8-f;Cve;K9>%b&nA=^9&H8XT|Ri^&nNXxaa~ zbBFE0bQoIyxqaw_Tei~enm$i+^4bY&F?wl7aN&$$yu$EPaV@Yp*LD`X<#46FU$%+BHgE%rP0%o7sbuXs#96$LL;&$VRPm19mTT6Vp7QSdeg1;$H z{{H=I=T-Z*_rqfcitVo6V-_x<|cPN6Mw=sJBxECJf& za>b7@n-TK&IOV~Un&`!ukio)a3+t6EA4cHljj{p8=y%lmjmqxvsrzj^1%RF;n?93! z<^Gk#?hXtjqNsj!YQC;ZI``)gsb3frumEhGiEW&$uI9u>2L|TEJfjhe${O_Gp9}QHtn)HN8wODZZQdRWnTydB|GGYF~xTqhZ_G0w}$z2b?CL>1nN{iSl2 zDy(-{W4{z>uM!u`Q)zDW+km){p|7&gydO(55GHq@q1{a$(v{B-z^+N0Fru0oRBW2{_7|YRA zd#MbS;H9Tm^}Rg`znr+OmHa#3ojTK6gtKz8D`^5AQIu$`1mx9-sfmMQDKtl%aWg2H+sFotDXNROl$ ax&mAY+hYDES`WPO$d0;tksdnJQvVCjG_(i+ literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls.swf b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls.swf new file mode 100644 index 0000000000000000000000000000000000000000..32fdf052847db219b63787b42683a6c691382098 GIT binary patch literal 2232 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 GtH}^&J8p&m literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls_pdf.swf b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/DataTables-1.10.4/swf/copy_csv_xls_pdf.swf new file mode 100644 index 0000000000000000000000000000000000000000..ebab741ee8c87658cbebbe36dc7b4fd88012ad74 GIT binary patch literal 58845 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 b`(J+V7eD`1@|X30|8Rh&!GZq={-mI7T5T}N literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Images/indicator_medium.gif b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Images/indicator_medium.gif new file mode 100644 index 0000000000000000000000000000000000000000..73019697f11f73737884ba8742993ae527fea264 GIT binary patch literal 6613 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 Put(int accessTokenId) + public HttpResponseMessage Put(int accessTokenId) { var token = _tokenManager.GetToken(accessTokenId); - var bytes = await Request.Content.ReadAsByteArrayAsync(); + var bytes = Request.Content.ReadAsByteArrayAsync().Result; _webDavManager.UploadFile(token.FilePath, bytes); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs index 4b4cf1c2..ac4c87a8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs @@ -8,20 +8,28 @@ using System.Security.Policy; using System.Web; using System.Web.Mvc; using System.Web.Routing; +using AutoMapper; using log4net; using WebsitePanel.WebDav.Core; using WebsitePanel.WebDav.Core.Client; using WebsitePanel.WebDav.Core.Config; +using WebsitePanel.WebDav.Core.Entities.Account.Enums; using WebsitePanel.WebDav.Core.Exceptions; using WebsitePanel.WebDav.Core.Interfaces.Managers; +using WebsitePanel.WebDav.Core.Interfaces.Managers.Users; using WebsitePanel.WebDav.Core.Interfaces.Security; using WebsitePanel.WebDav.Core.Security.Authorization.Enums; using WebsitePanel.WebDav.Core.Security.Cryptography; +using WebsitePanel.WebDav.Core.Wsp.Framework; using WebsitePanel.WebDavPortal.CustomAttributes; using WebsitePanel.WebDavPortal.Extensions; +using WebsitePanel.WebDavPortal.FileOperations; +using WebsitePanel.WebDavPortal.Helpers; +using WebsitePanel.WebDavPortal.ModelBinders.DataTables; using WebsitePanel.WebDavPortal.Models; using System.Net; using WebsitePanel.WebDavPortal.Models.Common; +using WebsitePanel.WebDavPortal.Models.Common.DataTable; using WebsitePanel.WebDavPortal.Models.Common.Enums; using WebsitePanel.WebDavPortal.Models.FileSystem; using WebsitePanel.WebDavPortal.UI; @@ -39,19 +47,29 @@ namespace WebsitePanel.WebDavPortal.Controllers private readonly IAuthenticationService _authenticationService; private readonly IAccessTokenManager _tokenManager; private readonly IWebDavAuthorizationService _webDavAuthorizationService; + private readonly IUserSettingsManager _userSettingsManager; private readonly ILog Log; - public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, IWebDavAuthorizationService webDavAuthorizationService) + public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, IWebDavAuthorizationService webDavAuthorizationService, FileOpenerManager openerManager, IUserSettingsManager userSettingsManager) { _cryptography = cryptography; _webdavManager = webdavManager; _authenticationService = authenticationService; _tokenManager = tokenManager; _webDavAuthorizationService = webDavAuthorizationService; + _userSettingsManager = userSettingsManager; Log = LogManager.GetLogger(this.GetType()); } + [HttpGet] + public ActionResult ChangeViewType(FolderViewTypes viewType, string org, string pathPart = "") + { + _userSettingsManager.ChangeWebDavViewType(WspContext.User.AccountId, viewType); + + return RedirectToRoute(FileSystemRouteNames.ShowContentPath, new { org, pathPart }); + } + [HttpGet] public ActionResult ShowContent(string org, string pathPart = "") { @@ -70,11 +88,12 @@ namespace WebsitePanel.WebDavPortal.Controllers try { - IEnumerable children = _webdavManager.OpenFolder(pathPart); - - var permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart); - - var model = new ModelForWebDav { Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount), UrlSuffix = pathPart, Permissions = permissions}; + var model = new ModelForWebDav + { + UrlSuffix = pathPart, + Permissions =_webDavAuthorizationService.GetPermissions(WspContext.User, pathPart), + UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId) + }; return View(model); } @@ -84,42 +103,46 @@ namespace WebsitePanel.WebDavPortal.Controllers } } - public ActionResult ShowOfficeDocument(string org, string pathPart, string owaOpenerUri) + [ChildActionOnly] + public ActionResult ContentList(string org, FolderViewTypes viewType, string pathPart = "") { - string fileUrl = WebDavAppConfigManager.Instance.WebdavRoot+ org + "/" + pathPart.TrimStart('/'); - var accessToken = _tokenManager.CreateToken(WspContext.User, pathPart); - - var urlPart = Url.HttpRouteUrl(OwaRouteNames.CheckFileInfo, new {accessTokenId = accessToken.Id}); - var url = new Uri(Request.Url, urlPart).ToString(); - - string wopiSrc = Server.UrlDecode(url); - - var uri = string.Format("{0}/{1}WOPISrc={2}&access_token={3}", WebDavAppConfigManager.Instance.OfficeOnline.Url, owaOpenerUri, Server.UrlEncode(wopiSrc), Server.UrlEncode(accessToken.AccessToken.ToString("N"))); - - string fileName = fileUrl.Split('/').Last(); - - return View("ShowOfficeDocument", new OfficeOnlineModel(uri, fileName)); - } - - public ActionResult ViewOfficeDocument(string org, string pathPart) - { - var owaOpener = WebDavAppConfigManager.Instance.OfficeOnline.Single(x => x.Extension == Path.GetExtension(pathPart)); - - return ShowOfficeDocument(org, pathPart, owaOpener.OwaView); - } - - public ActionResult EditOfficeDocument(string org, string pathPart) - { - var permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart); - - if (permissions.HasFlag(WebDavPermissions.Write) == false) + try { - return new RedirectToRouteResult(FileSystemRouteNames.ViewOfficeOnline, null); + IEnumerable children = _webdavManager.OpenFolder(pathPart); + + var model = new ModelForWebDav + { + UrlSuffix = pathPart, + Permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart), + UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId) + }; + + if (Request.Browser.IsMobileDevice == false && model.UserSettings.WebDavViewType == FolderViewTypes.Table) + { + return View("_ShowContentTable", model); + } + + model.Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount); + + return View("_ShowContentBigIcons", model); } + catch (UnauthorizedException e) + { + throw new HttpException(404, "Not Found"); + } + } - var owaOpener = WebDavAppConfigManager.Instance.OfficeOnline.Single(x => x.Extension == Path.GetExtension(pathPart)); - return ShowOfficeDocument(org, pathPart, owaOpener.OwaEditor); + [HttpGet] + public ActionResult GetContentDetails(string org, string pathPart, [ModelBinder(typeof (JqueryDataTableModelBinder))] JqueryDataTableRequest dtRequest) + { + var folderItems = _webdavManager.OpenFolder(pathPart); + + var tableItems = Mapper.Map, IEnumerable>(folderItems).ToList(); + + var dataTableResponse = DataTableHelper.ProcessRequest(tableItems, dtRequest); + + return Json(dataTableResponse, JsonRequestBehavior.AllowGet); } [HttpPost] @@ -146,7 +169,7 @@ namespace WebsitePanel.WebDavPortal.Controllers if (_webdavManager.IsFile(pathPart) == false) { - throw new Exception(Resources.NotAFile); + throw new Exception(Resources.UI.NotAFile); } var fileBytes = _webdavManager.GetFileBytes(pathPart); @@ -179,7 +202,7 @@ namespace WebsitePanel.WebDavPortal.Controllers if (filePathes == null) { - model.AddMessage(MessageType.Error, Resources.NoFilesAreSelected); + model.AddMessage(MessageType.Error, Resources.UI.NoFilesAreSelected); return Json(model); } @@ -200,10 +223,52 @@ namespace WebsitePanel.WebDavPortal.Controllers if (model.DeletedFiles.Any()) { - model.AddMessage(MessageType.Success, string.Format(Resources.ItemsWasRemovedFormat, model.DeletedFiles.Count)); + model.AddMessage(MessageType.Success, string.Format(Resources.UI.ItemsWasRemovedFormat, model.DeletedFiles.Count)); } return Json(model); } + + #region Owa Actions + + public ActionResult ShowOfficeDocument(string org, string pathPart, string owaOpenerUri) + { + string fileUrl = WebDavAppConfigManager.Instance.WebdavRoot + org + "/" + pathPart.TrimStart('/'); + var accessToken = _tokenManager.CreateToken(WspContext.User, pathPart); + + var urlPart = Url.HttpRouteUrl(OwaRouteNames.CheckFileInfo, new { accessTokenId = accessToken.Id }); + var url = new Uri(Request.Url, urlPart).ToString(); + + string wopiSrc = Server.UrlDecode(url); + + var uri = string.Format("{0}/{1}WOPISrc={2}&access_token={3}", WebDavAppConfigManager.Instance.OfficeOnline.Url, owaOpenerUri, Server.UrlEncode(wopiSrc), Server.UrlEncode(accessToken.AccessToken.ToString("N"))); + + string fileName = fileUrl.Split('/').Last(); + + return View("ShowOfficeDocument", new OfficeOnlineModel(uri, fileName)); + } + + public ActionResult ViewOfficeDocument(string org, string pathPart) + { + var owaOpener = WebDavAppConfigManager.Instance.OfficeOnline.Single(x => x.Extension == Path.GetExtension(pathPart)); + + return ShowOfficeDocument(org, pathPart, owaOpener.OwaView); + } + + public ActionResult EditOfficeDocument(string org, string pathPart) + { + var permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart); + + if (permissions.HasFlag(WebDavPermissions.Write) == false) + { + return new RedirectToRouteResult(FileSystemRouteNames.ViewOfficeOnline, null); + } + + var owaOpener = WebDavAppConfigManager.Instance.OfficeOnline.Single(x => x.Extension == Path.GetExtension(pathPart)); + + return ShowOfficeDocument(org, pathPart, owaOpener.OwaEditor); + } + #endregion + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs index 1e3c37e4..c7661530 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs @@ -1,10 +1,12 @@ using Ninject; using System.Web.SessionState; using WebsitePanel.WebDav.Core.Interfaces.Managers; +using WebsitePanel.WebDav.Core.Interfaces.Managers.Users; using WebsitePanel.WebDav.Core.Interfaces.Owa; using WebsitePanel.WebDav.Core.Interfaces.Security; using WebsitePanel.WebDav.Core.Interfaces.Storages; using WebsitePanel.WebDav.Core.Managers; +using WebsitePanel.WebDav.Core.Managers.Users; using WebsitePanel.WebDav.Core.Owa; using WebsitePanel.WebDav.Core.Security.Authentication; using WebsitePanel.WebDav.Core.Security.Authorization; @@ -28,6 +30,7 @@ namespace WebsitePanel.WebDavPortal.DependencyInjection kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); + kernel.Bind().To(); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs deleted file mode 100644 index e731d5fc..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Net; -using System.Web.SessionState; -using Ninject; -using Ninject.Activation; -using WebsitePanel.WebDav.Core; -using WebsitePanel.WebDav.Core.Config; -using WebsitePanel.WebDav.Core.Managers; -using WebsitePanel.WebDav.Core.Security.Cryptography; -using WebsitePanel.WebDavPortal.Models; - -namespace WebsitePanel.WebDavPortal.DependencyInjection.Providers -{ - public class WebDavManagerProvider : Provider - { - protected override WebDavManager CreateInstance(IContext context) - { - var session = context.Kernel.Get(); - - WebDavManager webDavManager = null; - - if (session != null) - { - webDavManager = session[WebDavAppConfigManager.Instance.SessionKeys.WebDavManager] as WebDavManager; - - if (webDavManager == null) - { - var cryptography = context.Kernel.Get(); - - webDavManager = new WebDavManager(cryptography); - - session[WebDavAppConfigManager.Instance.SessionKeys.WebDavManager] = webDavManager; - } - } - - return webDavManager; - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs index f948d193..cf5d2467 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs @@ -1,15 +1,21 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using System.Net; using System.Web; +using System.Web.Mvc; +using WebsitePanel.WebDav.Core; +using WebsitePanel.WebDav.Core.Client; using WebsitePanel.WebDav.Core.Config; using WebsitePanel.WebDavPortal.Extensions; +using WebsitePanel.WebDavPortal.UI.Routes; namespace WebsitePanel.WebDavPortal.FileOperations { public class FileOpenerManager { private readonly IDictionary _operationTypes = new Dictionary(); + private UrlHelper _urlHelper; public FileOpenerManager() { @@ -17,6 +23,44 @@ namespace WebsitePanel.WebDavPortal.FileOperations _operationTypes.AddRange(WebDavAppConfigManager.Instance.OfficeOnline.ToDictionary(x => x.Extension, y => FileOpenerType.OfficeOnline)); } + public string GetUrl(IHierarchyItem item) + { + _urlHelper =_urlHelper ?? new UrlHelper(HttpContext.Current.Request.RequestContext); + + var opener = this[Path.GetExtension(item.DisplayName)]; + string href = "/"; + + switch (opener) + { + case FileOpenerType.OfficeOnline: + { + var pathPart = item.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "").TrimStart('/'); + href = string.Concat(_urlHelper.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart); + break; + } + default: + { + href = item.Href.LocalPath; + break; + } + } + + return href; + } + + public bool GetIsTargetBlank(IHierarchyItem item) + { + var opener = this[Path.GetExtension(item.DisplayName)]; + + switch (opener) + { + case FileOpenerType.OfficeOnline: + return true; + default: + return false; + } + } + public FileOpenerType this[string fileExtension] { get diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs index 8a658982..fd14b881 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs @@ -8,6 +8,7 @@ using System.Web.Routing; using System.Web.Script.Serialization; using System.Web.Security; using System.Web.SessionState; +using AutoMapper; using WebsitePanel.WebDav.Core.Config; using WebsitePanel.WebDav.Core.Interfaces.Security; using WebsitePanel.WebDav.Core.Security.Authentication.Principals; @@ -16,6 +17,7 @@ using WebsitePanel.WebDavPortal.App_Start; using WebsitePanel.WebDavPortal.Controllers; using WebsitePanel.WebDavPortal.DependencyInjection; using WebsitePanel.WebDavPortal.HttpHandlers; +using WebsitePanel.WebDavPortal.Mapping; namespace WebsitePanel.WebDavPortal { @@ -32,6 +34,10 @@ namespace WebsitePanel.WebDavPortal DependencyResolver.SetResolver(new NinjectDependecyResolver()); + AutoMapperPortalConfiguration.Configure(); + + Mapper.AssertConfigurationIsValid(); + log4net.Config.XmlConfigurator.Configure(); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Helpers/DataTableHelper.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Helpers/DataTableHelper.cs new file mode 100644 index 00000000..3a229887 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Helpers/DataTableHelper.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using WebsitePanel.WebDavPortal.Models.Common.DataTable; + +namespace WebsitePanel.WebDavPortal.Helpers +{ + public class DataTableHelper + { + public static JqueryDataTablesResponse ProcessRequest(IEnumerable entities, JqueryDataTableRequest request) where TEntity : JqueryDataTableBaseEntity + { + IOrderedEnumerable orderedEntities = null; + + foreach (var order in request.Orders) + { + var closure = order; + + if (orderedEntities == null) + { + orderedEntities = order.Ascending ? entities.OrderBy(x => x[closure.Column]) : entities.OrderByDescending(x => x[closure.Column]); + } + else + { + orderedEntities = order.Ascending ? orderedEntities.ThenBy(x => x[closure.Column]) : orderedEntities.ThenByDescending(x => x[closure.Column]); + } + } + + if (orderedEntities == null) + { + orderedEntities = entities.OrderBy(x=>x[0]); + } + + var itemsPaged = orderedEntities.Skip(request.Start).Take(request.Count).ToList(); + var totalCount = orderedEntities.Count(); + + + return new JqueryDataTablesResponse( + request.Draw, + itemsPaged, + totalCount, + totalCount); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Logs/log-debug.log b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Logs/log-debug.log new file mode 100644 index 00000000..e69de29b diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/AutoMapperPortalConfiguration.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/AutoMapperPortalConfiguration.cs new file mode 100644 index 00000000..060bb3af --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/AutoMapperPortalConfiguration.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav; + +namespace WebsitePanel.WebDavPortal.Mapping +{ + public class AutoMapperPortalConfiguration + { + public static void Configure() + { + Mapper.Initialize( + config => + { + config.AddProfile(); + }); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs new file mode 100644 index 00000000..13f718ef --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; +using AutoMapper; +using WebsitePanel.WebDav.Core.Client; +using WebsitePanel.WebDav.Core.Config; +using WebsitePanel.WebDav.Core.Extensions; +using WebsitePanel.WebDavPortal.FileOperations; +using WebsitePanel.WebDavPortal.Models.FileSystem; + +namespace WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav +{ + public class ResourceTableItemProfile : Profile + { + ///

+ /// Gets the name of the profile. + /// + /// + /// The name of the profile. + /// + public override string ProfileName + { + get + { + return this.GetType().Name; + } + } + + /// + /// Override this method in a derived class and call the CreateMap method to associate that map with this profile. + /// Avoid calling the class from this method. + /// + protected override void Configure() + { + var openerManager = new FileOpenerManager(); + + Mapper.CreateMap() + .ForMember(ti => ti.DisplayName, x => x.MapFrom(hi => hi.DisplayName.Trim('/'))) + .ForMember(ti => ti.Url, x => x.MapFrom(hi => openerManager.GetUrl(hi))) + .ForMember(ti => ti.IsTargetBlank, x => x.MapFrom(hi => openerManager.GetIsTargetBlank(hi))) + .ForMember(ti => ti.Type, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType.GetDescription().ToLowerInvariant())) + .ForMember(ti => ti.IconHref, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~'))) + .ForMember(ti => ti.LastModified, + x => x.MapFrom(hi => (new WebDavResource(null, hi)).LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString("dd/MM/yyyy hh:mm tt"))) + .ForMember(ti => ti.Size, x => x.MapFrom(hi => (new WebDavResource(null,hi)).ContentLength)); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/ModelBinders/DataTables/JqueryDataTableModelBinder.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/ModelBinders/DataTables/JqueryDataTableModelBinder.cs new file mode 100644 index 00000000..aa0f749e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/ModelBinders/DataTables/JqueryDataTableModelBinder.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.Mvc; +using Microsoft.Ajax.Utilities; +using WebsitePanel.WebDavPortal.Models.Common.DataTable; + + +namespace WebsitePanel.WebDavPortal.ModelBinders.DataTables +{ + public class JqueryDataTableModelBinder : DefaultModelBinder + { + public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) + { + base.BindModel(controllerContext, bindingContext); + HttpRequestBase request = controllerContext.HttpContext.Request; + + // Retrieve request data + int draw = Convert.ToInt32(request["draw"]); + int start = Convert.ToInt32(request["start"]); + int count = Convert.ToInt32(request["length"]); + + // Search + var search = new JqueryDataTableSearch + { + Value = request["search[value]"], + IsRegex = Convert.ToBoolean(request["search[regex]"]) + }; + + var orderIndex = 0; + + var orders = new List(); + + while (request["order[" + orderIndex + "][column]"] != null) + { + orders.Add(new JqueryDataTableOrder() + { + Column = Convert.ToInt32(request["order[" + orderIndex + "][column]"]), + Ascending = (request["order[" + orderIndex + "][dir]"] == "asc") + }); + + orderIndex++; + } + + // Columns + var columnsIndex = 0; + var columns = new List(); + + while (request["columns[" + columnsIndex + "][name]"] != null) + { + columns.Add(new JqueryDataTableColumn + { + Data = request["columns[" + columnsIndex + "][data]"], + Name = request["columns[" + columnsIndex + "][name]"], + Orderable = Convert.ToBoolean(request["columns[" + columnsIndex + "][orderable]"]), + Search = new JqueryDataTableSearch + { + Value = request["columns[" + columnsIndex + "][search][value]"], + IsRegex = Convert.ToBoolean(request["columns[" + columnsIndex + "][search][regex]"]) + } + }); + + columnsIndex++; + } + + return new JqueryDataTableRequest + { + Draw = draw, + Start = start, + Count = count, + Search = search, + Orders = orders, + Columns = columns + }; + } + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableBaseEntity.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableBaseEntity.cs new file mode 100644 index 00000000..12504577 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableBaseEntity.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; + +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public abstract class JqueryDataTableBaseEntity + { + public abstract dynamic this[int index] + { + get; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableColumn.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableColumn.cs new file mode 100644 index 00000000..1d458b84 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableColumn.cs @@ -0,0 +1,13 @@ +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public class JqueryDataTableColumn + { + public string Data { get; set; } + + public string Name { get; set; } + + public bool Orderable { get; set; } + + public JqueryDataTableSearch Search { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableOrder.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableOrder.cs new file mode 100644 index 00000000..8ba46f24 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableOrder.cs @@ -0,0 +1,8 @@ +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public class JqueryDataTableOrder + { + public int Column { get; set; } + public bool Ascending { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableRequest.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableRequest.cs new file mode 100644 index 00000000..c0ff7f8c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableRequest.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public class JqueryDataTableRequest + { + public int Draw { get; set; } + public int Start { get; set; } + public int Count { get; set; } + + + public JqueryDataTableSearch Search { get; set; } + public IEnumerable Orders { get; set; } + public IEnumerable Columns { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableSearch.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableSearch.cs new file mode 100644 index 00000000..2da548d1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTableSearch.cs @@ -0,0 +1,9 @@ +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public class JqueryDataTableSearch + { + public string Value { get; set; } + + public bool IsRegex { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTablesResponse.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTablesResponse.cs new file mode 100644 index 00000000..48b06874 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Common/DataTable/JqueryDataTablesResponse.cs @@ -0,0 +1,20 @@ +using System.Collections; + +namespace WebsitePanel.WebDavPortal.Models.Common.DataTable +{ + public class JqueryDataTablesResponse + { + public int draw { get; private set; } + public IEnumerable data { get; private set; } + public int recordsTotal { get; private set; } + public int recordsFiltered { get; private set; } + + public JqueryDataTablesResponse(int draw, IEnumerable data, int recordsFilteredCount, int recordsTotalCount) + { + this.draw = draw; + this.data = data; + this.recordsFiltered = recordsFilteredCount; + this.recordsTotal = recordsTotalCount; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs new file mode 100644 index 00000000..7bfbb70d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs @@ -0,0 +1,34 @@ +using WebsitePanel.WebDav.Core.Client; +using WebsitePanel.WebDavPortal.Models.Common.DataTable; + +namespace WebsitePanel.WebDavPortal.Models.FileSystem +{ + public class ResourceTableItemModel : JqueryDataTableBaseEntity + { + public string DisplayName { get; set; } + public string Url { get; set; } + public bool IsTargetBlank { get; set; } + public long Size { get; set; } + public string Type { get; set; } + public string LastModified { get; set; } + public string IconHref { get; set; } + + public override dynamic this[int index] + { + get + { + switch (index) + { + case 1 : + { + return Size; + } + default: + { + return DisplayName; + } + } + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs index bb6f722b..b84fb560 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using WebsitePanel.WebDav.Core.Client; +using WebsitePanel.WebDav.Core.Entities.Account; using WebsitePanel.WebDav.Core.Security.Authorization.Enums; using WebsitePanel.WebDavPortal.Models.Common; @@ -11,5 +12,6 @@ namespace WebsitePanel.WebDavPortal.Models public string UrlSuffix { get; set; } public string Error { get; set; } public WebDavPermissions Permissions { get; set; } + public UserPortalSettings UserSettings { get; set; } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.Designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs similarity index 75% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.Designer.cs rename to WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs index 0722b254..037da6d4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.Designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace WebsitePanel.WebDavPortal.UI { +namespace WebsitePanel.WebDavPortal.Resources { using System; @@ -22,14 +22,14 @@ namespace WebsitePanel.WebDavPortal.UI { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { + public class UI { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { + internal UI() { } /// @@ -39,7 +39,7 @@ namespace WebsitePanel.WebDavPortal.UI { public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.WebDavPortal.UI.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.WebDavPortal.Resources.UI", typeof(UI).Assembly); resourceMan = temp; } return resourceMan; @@ -114,6 +114,15 @@ namespace WebsitePanel.WebDavPortal.UI { } } + /// + /// Looks up a localized string similar to Details. + /// + public static string Details { + get { + return ResourceManager.GetString("Details", resourceCulture); + } + } + /// /// Looks up a localized string similar to Are you sure you want to delete {0} item(s)?. /// @@ -150,6 +159,24 @@ namespace WebsitePanel.WebDavPortal.UI { } } + /// + /// Looks up a localized string similar to Modified. + /// + public static string Modified { + get { + return ResourceManager.GetString("Modified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + /// /// Looks up a localized string similar to No files are selected.. /// @@ -168,6 +195,15 @@ namespace WebsitePanel.WebDavPortal.UI { } } + /// + /// Looks up a localized string similar to Please wait.... + /// + public static string PleaseWaitWithDots { + get { + return ResourceManager.GetString("PleaseWaitWithDots", resourceCulture); + } + } + /// /// Looks up a localized string similar to Processing. /// @@ -186,6 +222,33 @@ namespace WebsitePanel.WebDavPortal.UI { } } + /// + /// Looks up a localized string similar to Size. + /// + public static string Size { + get { + return ResourceManager.GetString("Size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table. + /// + public static string Table { + get { + return ResourceManager.GetString("Table", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + public static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + /// /// Looks up a localized string similar to Upload. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.resx b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx similarity index 90% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.resx rename to WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx index edd8c739..c11d2af5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx @@ -135,6 +135,9 @@ Delete File? + + Details + Are you sure you want to delete {0} item(s)? @@ -147,18 +150,36 @@ {0} items was removed. + + Modified + + + Name + No files are selected. Not a file. + + Please wait... + Processing Processing... + + Size + + + Table + + + Type + Upload diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.autoFill.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.autoFill.js new file mode 100644 index 00000000..6bbfa35b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.autoFill.js @@ -0,0 +1,855 @@ +/*! AutoFill 1.2.1 + * ©2008-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary AutoFill + * @description Add Excel like click and drag auto-fill options to DataTables + * @version 1.2.1 + * @file dataTables.autoFill.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function( window, document, undefined ) { + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * AutoFill provides Excel like auto-fill features for a DataTable + * + * @class AutoFill + * @constructor + * @param {object} oTD DataTables settings object + * @param {object} oConfig Configuration object for AutoFill + */ +var AutoFill = function( oDT, oConfig ) +{ + /* Sanity check that we are a new instance */ + if ( ! (this instanceof AutoFill) ) { + throw( "Warning: AutoFill must be initialised with the keyword 'new'" ); + } + + if ( ! $.fn.dataTableExt.fnVersionCheck('1.7.0') ) { + throw( "Warning: AutoFill requires DataTables 1.7 or greater"); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + this.c = {}; + + /** + * @namespace Settings object which contains customisable information for AutoFill instance + */ + this.s = { + /** + * @namespace Cached information about the little dragging icon (the filler) + */ + "filler": { + "height": 0, + "width": 0 + }, + + /** + * @namespace Cached information about the border display + */ + "border": { + "width": 2 + }, + + /** + * @namespace Store for live information for the current drag + */ + "drag": { + "startX": -1, + "startY": -1, + "startTd": null, + "endTd": null, + "dragging": false + }, + + /** + * @namespace Data cache for information that we need for scrolling the screen when we near + * the edges + */ + "screen": { + "interval": null, + "y": 0, + "height": 0, + "scrollTop": 0 + }, + + /** + * @namespace Data cache for the position of the DataTables scrolling element (when scrolling + * is enabled) + */ + "scroller": { + "top": 0, + "bottom": 0 + }, + + /** + * @namespace Information stored for each column. An array of objects + */ + "columns": [] + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + "table": null, + "filler": null, + "borderTop": null, + "borderRight": null, + "borderBottom": null, + "borderLeft": null, + "currentTarget": null + }; + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @method fnSettings + * @returns {object} AutoFill settings object + */ + this.fnSettings = function () { + return this.s; + }; + + + /* Constructor logic */ + this._fnInit( oDT, oConfig ); + return this; +}; + + + +AutoFill.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Initialisation + * @method _fnInit + * @param {object} dt DataTables settings object + * @param {object} config Configuration object for AutoFill + * @returns void + */ + "_fnInit": function ( dt, config ) + { + var + that = this, + i, iLen; + + // Use DataTables API to get the settings allowing selectors, instances + // etc to be used, or for backwards compatibility get from the old + // fnSettings method + this.s.dt = DataTable.Api ? + new DataTable.Api( dt ).settings()[0] : + dt.fnSettings(); + this.s.init = config || {}; + this.dom.table = this.s.dt.nTable; + + $.extend( true, this.c, AutoFill.defaults, config ); + + /* Add and configure the columns */ + this._initColumns(); + + /* Auto Fill click and drag icon */ + var filler = $('
', { + 'class': 'AutoFill_filler' + } ) + .appendTo( 'body' ); + this.dom.filler = filler[0]; + + // Get the height / width of the click element + this.s.filler.height = filler.height(); + this.s.filler.width = filler.width(); + filler[0].style.display = "none"; + + /* Border display - one div for each side. We can't just use a single + * one with a border, as we want the events to effectively pass through + * the transparent bit of the box + */ + var border; + var appender = document.body; + if ( that.s.dt.oScroll.sY !== "" ) { + that.s.dt.nTable.parentNode.style.position = "relative"; + appender = that.s.dt.nTable.parentNode; + } + + border = $('
', { + "class": "AutoFill_border" + } ); + this.dom.borderTop = border.clone().appendTo( appender )[0]; + this.dom.borderRight = border.clone().appendTo( appender )[0]; + this.dom.borderBottom = border.clone().appendTo( appender )[0]; + this.dom.borderLeft = border.clone().appendTo( appender )[0]; + + /* Events */ + filler.on( 'mousedown.DTAF', function (e) { + this.onselectstart = function() { return false; }; + that._fnFillerDragStart.call( that, e ); + return false; + } ); + + $('tbody', this.dom.table).on( + 'mouseover.DTAF mouseout.DTAF', + '>tr>td, >tr>th', + function (e) { + that._fnFillerDisplay.call( that, e ); + } + ); + + $(this.dom.table).on( 'destroy.dt.DTAF', function () { + filler.off( 'mousedown.DTAF' ).remove(); + $('tbody', this.dom.table).off( 'mouseover.DTAF mouseout.DTAF' ); + } ); + }, + + + _initColumns: function ( ) + { + var that = this; + var i, ien; + var dt = this.s.dt; + var config = this.s.init; + + for ( i=0, ien=dt.aoColumns.length ; i offsetEnd.left) { + x1 = offsetEnd.left - border; + x2 = offsetStart.left + $(nStart).outerWidth(); + width = offsetStart.left + $(nStart).outerWidth() - offsetEnd.left + (2*border); + } + + if ( this.s.dt.oScroll.sY !== "" ) + { + /* The border elements are inside the DT scroller - so position relative to that */ + var + offsetScroll = $(this.s.dt.nTable.parentNode).offset(), + scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(), + scrollLeft = $(this.s.dt.nTable.parentNode).scrollLeft(); + + x1 -= offsetScroll.left - scrollLeft; + x2 -= offsetScroll.left - scrollLeft; + y1 -= offsetScroll.top - scrollTop; + y2 -= offsetScroll.top - scrollTop; + } + + /* Top */ + oStyle = this.dom.borderTop.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Bottom */ + oStyle = this.dom.borderBottom.style; + oStyle.top = y2+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Left */ + oStyle = this.dom.borderLeft.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + + /* Right */ + oStyle = this.dom.borderRight.style; + oStyle.top = y1+"px"; + oStyle.left = x2+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + }, + + + /** + * Mouse down event handler for starting a drag + * @method _fnFillerDragStart + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragStart": function (e) + { + var that = this; + var startingTd = this.dom.currentTarget; + + this.s.drag.dragging = true; + + that.dom.borderTop.style.display = "block"; + that.dom.borderRight.style.display = "block"; + that.dom.borderBottom.style.display = "block"; + that.dom.borderLeft.style.display = "block"; + + var coords = this._fnTargetCoords( startingTd ); + this.s.drag.startX = coords.x; + this.s.drag.startY = coords.y; + + this.s.drag.startTd = startingTd; + this.s.drag.endTd = startingTd; + + this._fnUpdateBorder( startingTd, startingTd ); + + $(document).bind('mousemove.AutoFill', function (e) { + that._fnFillerDragMove.call( that, e ); + } ); + + $(document).bind('mouseup.AutoFill', function (e) { + that._fnFillerFinish.call( that, e ); + } ); + + /* Scrolling information cache */ + this.s.screen.y = e.pageY; + this.s.screen.height = $(window).height(); + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + + /* Scrolling handler - we set an interval (which is cancelled on mouse up) which will fire + * regularly and see if we need to do any scrolling + */ + this.s.screen.interval = setInterval( function () { + var iScrollTop = $(document).scrollTop(); + var iScrollDelta = iScrollTop - that.s.screen.scrollTop; + that.s.screen.y += iScrollDelta; + + if ( that.s.screen.height - that.s.screen.y + iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y - iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop - 50 + }, 240, 'linear' ); + } + + if ( that.s.dt.oScroll.sY !== "" ) + { + if ( that.s.screen.y > that.s.scroller.bottom - 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y < that.s.scroller.top + 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() - 50 + }, 240, 'linear' ); + } + } + }, 250 ); + }, + + + /** + * Mouse move event handler for during a move. See if we want to update the display based on the + * new cursor position + * @method _fnFillerDragMove + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragMove": function (e) + { + if ( e.target && e.target.nodeName.toUpperCase() == "TD" && + e.target != this.s.drag.endTd ) + { + var coords = this._fnTargetCoords( e.target ); + + if ( this.c.mode == "y" && coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + if ( this.c.mode == "x" && coords.y != this.s.drag.startY ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + + if ( this.c.mode == "either") + { + if(coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + else if ( coords.y != this.s.drag.startY ) { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + } + + // update coords + if ( this.c.mode !== "both" ) { + coords = this._fnTargetCoords( e.target ); + } + + var drag = this.s.drag; + drag.endTd = e.target; + + if ( coords.y >= this.s.drag.startY ) { + this._fnUpdateBorder( drag.startTd, drag.endTd ); + } + else { + this._fnUpdateBorder( drag.endTd, drag.startTd ); + } + this._fnFillerPosition( e.target ); + } + + /* Update the screen information so we can perform scrolling */ + this.s.screen.y = e.pageY; + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(); + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + }, + + + /** + * Mouse release handler - end the drag and take action to update the cells with the needed values + * @method _fnFillerFinish + * @param {Object} e Event object + * @returns void + */ + "_fnFillerFinish": function (e) + { + var that = this, i, iLen, j; + + $(document).unbind('mousemove.AutoFill mouseup.AutoFill'); + + this.dom.borderTop.style.display = "none"; + this.dom.borderRight.style.display = "none"; + this.dom.borderBottom.style.display = "none"; + this.dom.borderLeft.style.display = "none"; + + this.s.drag.dragging = false; + + clearInterval( this.s.screen.interval ); + + var cells = []; + var table = this.dom.table; + var coordsStart = this._fnTargetCoords( this.s.drag.startTd ); + var coordsEnd = this._fnTargetCoords( this.s.drag.endTd ); + var columnIndex = function ( visIdx ) { + return that.s.dt.oApi._fnVisibleToColumnIndex( that.s.dt, visIdx ); + }; + + // xxx - urgh - there must be a way of reducing this... + if ( coordsStart.y <= coordsEnd.y ) { + for ( i=coordsStart.y ; i<=coordsEnd.y ; i++ ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + } + } + else { + for ( i=coordsStart.y ; i>=coordsEnd.y ; i-- ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: coordsStart.x - j, + y: coordsStart.y - i, + colIdx: columnIndex( j ) + } ); + } + } + } + } + + // An auto-fill requires 2 or more cells + if ( cells.length <= 1 ) { + return; + } + + var edited = []; + var previous; + + for ( i=0, iLen=cells.length ; i",{"class":"AutoFill_filler"}).appendTo("body");this.dom.filler=e[0];this.s.filler.height=e.height();this.s.filler.width=e.width();e[0].style.display= +"none";var g,f=j.body;""!==a.s.dt.oScroll.sY&&(a.s.dt.nTable.parentNode.style.position="relative",f=a.s.dt.nTable.parentNode);g=c("
",{"class":"AutoFill_border"});this.dom.borderTop=g.clone().appendTo(f)[0];this.dom.borderRight=g.clone().appendTo(f)[0];this.dom.borderBottom=g.clone().appendTo(f)[0];this.dom.borderLeft=g.clone().appendTo(f)[0];e.on("mousedown.DTAF",function(b){this.onselectstart=function(){return false};a._fnFillerDragStart.call(a,b);return false});c("tbody",this.dom.table).on("mouseover.DTAF mouseout.DTAF", +">tr>td, >tr>th",function(b){a._fnFillerDisplay.call(a,b)});c(this.dom.table).on("destroy.dt.DTAF",function(){e.off("mousedown.DTAF").remove();c("tbody",this.dom.table).off("mouseover.DTAF mouseout.DTAF")})},_initColumns:function(){var d=this,b,a,e=this.s.dt,g=this.s.init;b=0;for(a=e.aoColumns.length;bg.left&&(f=g.left-a,i=e.left+c(d).outerWidth(),j=e.left+c(d).outerWidth()-g.left+2*a);""!==this.s.dt.oScroll.sY&&(a=c(this.s.dt.nTable.parentNode).offset(),e=c(this.s.dt.nTable.parentNode).scrollTop(), +g=c(this.s.dt.nTable.parentNode).scrollLeft(),f-=a.left-g,i-=a.left-g,n-=a.top-e,h-=a.top-e);a=this.dom.borderTop.style;a.top=n+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderBottom.style;a.top=h+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderLeft.style;a.top=n+"px";a.left=f+"px";a.height=k+"px";a.width=this.s.border.width+"px";a=this.dom.borderRight.style;a.top=n+"px";a.left=i+"px";a.height=k+"px";a.width=this.s.border.width+ +"px"},_fnFillerDragStart:function(d){var b=this,a=this.dom.currentTarget;this.s.drag.dragging=!0;b.dom.borderTop.style.display="block";b.dom.borderRight.style.display="block";b.dom.borderBottom.style.display="block";b.dom.borderLeft.style.display="block";var e=this._fnTargetCoords(a);this.s.drag.startX=e.x;this.s.drag.startY=e.y;this.s.drag.startTd=a;this.s.drag.endTd=a;this._fnUpdateBorder(a,a);c(j).bind("mousemove.AutoFill",function(a){b._fnFillerDragMove.call(b,a)});c(j).bind("mouseup.AutoFill", +function(a){b._fnFillerFinish.call(b,a)});this.s.screen.y=d.pageY;this.s.screen.height=c(o).height();this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=this.s.scroller.top+c(this.s.dt.nTable.parentNode).height());this.s.screen.interval=setInterval(function(){var a=c(j).scrollTop();b.s.screen.y=b.s.screen.y+(a-b.s.screen.scrollTop);b.s.screen.height-b.s.screen.y+a<50?c("html, body").animate({scrollTop:a+ +50},240,"linear"):b.s.screen.y-a<50&&c("html, body").animate({scrollTop:a-50},240,"linear");b.s.dt.oScroll.sY!==""&&(b.s.screen.y>b.s.scroller.bottom-50?c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()+50},240,"linear"):b.s.screen.ytr:eq("+b.y+")>td:eq("+this.s.drag.startX+")",this.dom.table)[0]);"x"==this.c.mode&&b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]);"either"==this.c.mode&&(b.x!=this.s.drag.startX?d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]:b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+ +")",this.dom.table)[0]));"both"!==this.c.mode&&(b=this._fnTargetCoords(d.target));var a=this.s.drag;a.endTd=d.target;b.y>=this.s.drag.startY?this._fnUpdateBorder(a.startTd,a.endTd):this._fnUpdateBorder(a.endTd,a.startTd);this._fnFillerPosition(d.target)}this.s.screen.y=d.pageY;this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.scrollTop=c(this.s.dt.nTable.parentNode).scrollTop(),this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom= +this.s.scroller.top+c(this.s.dt.nTable.parentNode).height())},_fnFillerFinish:function(){var d=this,b,a;c(j).unbind("mousemove.AutoFill mouseup.AutoFill");this.dom.borderTop.style.display="none";this.dom.borderRight.style.display="none";this.dom.borderBottom.style.display="none";this.dom.borderLeft.style.display="none";this.s.drag.dragging=!1;clearInterval(this.s.screen.interval);var e=[],g=this.dom.table,f=this._fnTargetCoords(this.s.drag.startTd),i=this._fnTargetCoords(this.s.drag.endTd),h=function(a){return d.s.dt.oApi._fnVisibleToColumnIndex(d.s.dt, +a)};if(f.y<=i.y)for(b=f.y;b<=i.y;b++)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(b=f.y;b>=i.y;b--)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:f.x-a,y:f.y- +b,colIdx:h(a)});if(!(1>=e.length)){var g=[],m;b=0;for(a=e.length;bg||0>f?-1:1)):a===m?b:a}}};return h};"function"===typeof define&&define.amd? +define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.AutoFill&&l(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.bootstrap.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.bootstrap.js new file mode 100644 index 00000000..5037d7d5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.bootstrap.js @@ -0,0 +1,152 @@ +/* Set the defaults for DataTables initialisation */ +$.extend( true, $.fn.dataTable.defaults, { + "sDom": "<'row'<'col-xs-6'l><'col-xs-6'f>r>t<'row'<'col-xs-6'i><'col-xs-6'p>>", + "sPaginationType": "bootstrap", + "oLanguage": { + "sLengthMenu": "_MENU_ records per page" + } +} ); + + + + +/* Default class modification */ +$.extend( $.fn.dataTableExt.oStdClasses, { + "sWrapper": "dataTables_wrapper form-inline", + "sFilterInput": "form-control input-sm", + "sLengthSelect": "form-control input-sm" +} ); + + +/* API method to get paging information */ +$.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings ) +{ + return { + "iStart": oSettings._iDisplayStart, + "iEnd": oSettings.fnDisplayEnd(), + "iLength": oSettings._iDisplayLength, + "iTotal": oSettings.fnRecordsTotal(), + "iFilteredTotal": oSettings.fnRecordsDisplay(), + "iPage": oSettings._iDisplayLength === -1 ? + 0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ), + "iTotalPages": oSettings._iDisplayLength === -1 ? + 0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength ) + }; +}; + + +/* Bootstrap style pagination control */ +$.extend( $.fn.dataTableExt.oPagination, { + "bootstrap": { + "fnInit": function( oSettings, nPaging, fnDraw ) { + var oLang = oSettings.oLanguage.oPaginate; + var fnClickHandler = function ( e ) { + e.preventDefault(); + if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) { + fnDraw( oSettings ); + } + }; + + $(nPaging).append( + '' + ); + var els = $('a', nPaging); + $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler ); + $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler ); + }, + + "fnUpdate": function ( oSettings, fnDraw ) { + var iListLength = 5; + var oPaging = oSettings.oInstance.fnPagingInfo(); + var an = oSettings.aanFeatures.p; + var i, ien, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2); + + if ( oPaging.iTotalPages < iListLength) { + iStart = 1; + iEnd = oPaging.iTotalPages; + } + else if ( oPaging.iPage <= iHalf ) { + iStart = 1; + iEnd = iListLength; + } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) { + iStart = oPaging.iTotalPages - iListLength + 1; + iEnd = oPaging.iTotalPages; + } else { + iStart = oPaging.iPage - iHalf + 1; + iEnd = iStart + iListLength - 1; + } + + for ( i=0, ien=an.length ; i'+j+'') + .insertBefore( $('li:last', an[i])[0] ) + .bind('click', function (e) { + e.preventDefault(); + oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength; + fnDraw( oSettings ); + } ); + } + + // Add / remove disabled classes from the static elements + if ( oPaging.iPage === 0 ) { + $('li:first', an[i]).addClass('disabled'); + } else { + $('li:first', an[i]).removeClass('disabled'); + } + + if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) { + $('li:last', an[i]).addClass('disabled'); + } else { + $('li:last', an[i]).removeClass('disabled'); + } + } + } + } +} ); + + +/* + * TableTools Bootstrap compatibility + * Required TableTools 2.1+ + */ +if ( $.fn.DataTable.TableTools ) { + // Set the classes that TableTools uses to something suitable for Bootstrap + $.extend( true, $.fn.DataTable.TableTools.classes, { + "container": "DTTT btn-group", + "buttons": { + "normal": "btn btn-default", + "disabled": "disabled" + }, + "collection": { + "container": "DTTT_dropdown dropdown-menu", + "buttons": { + "normal": "", + "disabled": "disabled" + } + }, + "print": { + "info": "DTTT_print_info modal" + }, + "select": { + "row": "active" + } + } ); + + // Have the collection use a bootstrap compatible dropdown + $.extend( true, $.fn.DataTable.TableTools.DEFAULTS.oTags, { + "collection": { + "container": "ul", + "button": "li", + "liner": "a" + } + } ); +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colReorder.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colReorder.js new file mode 100644 index 00000000..bc5aeee7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.colReorder.js @@ -0,0 +1,1371 @@ +/*! ColReorder 1.1.2 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary ColReorder + * @description Provide the ability to reorder columns in a DataTable + * @version 1.1.2 + * @file dataTables.colReorder.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined) { + + +/** + * Switch the key value pairing of an index array to be value key (i.e. the old value is now the + * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ]. + * @method fnInvertKeyValues + * @param array aIn Array to switch around + * @returns array + */ +function fnInvertKeyValues( aIn ) +{ + var aRet=[]; + for ( var i=0, iLen=aIn.length ; i= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom ); + return; + } + + if ( iTo < 0 || iTo >= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo ); + return; + } + + /* + * Calculate the new column array index, so we have a mapping between the old and new + */ + var aiMapping = []; + for ( i=0, iLen=iCols ; i this.s.fixed-1 && i < iLen - this.s.fixedRight ) + { + this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh ); + } + + /* Mark the original column order for later reference */ + this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i; + } + + /* State saving */ + this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { + that._fnStateSave.call( that, oData ); + }, "ColReorder_State" ); + + /* An initial column order has been specified */ + var aiOrder = null; + if ( this.s.init.aiOrder ) + { + aiOrder = this.s.init.aiOrder.slice(); + } + + /* State loading, overrides the column order given */ + if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' && + this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length ) + { + aiOrder = this.s.dt.oLoadedState.ColReorder; + } + + /* If we have an order to apply - do so */ + if ( aiOrder ) + { + /* We might be called during or after the DataTables initialisation. If before, then we need + * to wait until the draw is done, if after, then do what we need to do right away + */ + if ( !that.s.dt._bInitComplete ) + { + var bDone = false; + this.s.dt.aoDrawCallback.push( { + "fn": function () { + if ( !that.s.dt._bInitComplete && !bDone ) + { + bDone = true; + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + }, + "sName": "ColReorder_Pre" + } ); + } + else + { + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + } + else { + this._fnSetColumnIndexes(); + } + }, + + + /** + * Set the column order from an array + * @method _fnOrderColumns + * @param array a An array of integers which dictate the column order that should be applied + * @returns void + * @private + */ + "_fnOrderColumns": function ( a ) + { + if ( a.length != this.s.dt.aoColumns.length ) + { + this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+ + "match known number of columns. Skipping." ); + return; + } + + for ( var i=0, iLen=a.length ; i
') + .addClass( 'DTCR_pointer' ) + .css( { + position: 'absolute', + top: scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top : + $(this.s.dt.nTable).offset().top, + height : scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() : + $(this.s.dt.nTable).height() + } ) + .appendTo( 'body' ); + }, + + /** + * Clean up ColReorder memory references and event handlers + * @method _fnDestroy + * @returns void + * @private + */ + "_fnDestroy": function () + { + var i, iLen; + + for ( i=0, iLen=this.s.dt.aoDrawCallback.length ; if||f>=m)this.oApi._fnLog(b,1,"ColReorder 'from' index is out of bounds: "+f);else if(0>a||a>=m)this.oApi._fnLog(b,1,"ColReorder 'to' index is out of bounds: "+a);else{j=[];c=0;for(d=m;cthis.s.fixed-1&&cMath.pow(Math.pow(a.pageX-this.s.mouse.startX,2)+Math.pow(a.pageY-this.s.mouse.startY,2),0.5))return;this._fnCreateDragNode()}this.dom.drag.css({left:a.pageX-this.s.mouse.offsetX,top:a.pageY-this.s.mouse.offsetY});for(var b=!1,c=this.s.mouse.toIndex,d=1,f=this.s.aoTargets.length;d
").addClass("DTCR_pointer").css({position:"absolute",top:a?b("div.dataTables_scroll",this.s.dt.nTableWrapper).offset().top:b(this.s.dt.nTable).offset().top,height:a?b("div.dataTables_scroll",this.s.dt.nTableWrapper).height():b(this.s.dt.nTable).height()}).appendTo("body")}, +_fnDestroy:function(){var a,e;a=0;for(e=this.s.dt.aoDrawCallback.length;a
')[0], +g=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0b.clientWidth&&(c.x=!0);a.offsetHeight>b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>=this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b=this.s.iLeftColumns)){var b,c=[];for(b=0;bthead",a.header);j.empty();e=0; +for(h=m.length;ethead",a.header)[0]);e=0;for(h=m.length;etbody>tr",f.dom.body).css("height","auto");null!==a.body&&(a.body.parentNode.removeChild(a.body),a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=this.s.dt.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*this.s.dt.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot",a.body).remove();var o=d("tbody",a.body)[0];d(o).empty();if(0thead>tr",a.body)[0];for(k=0;ktbody>tr",f.dom.body).each(function(a){var b=this.cloneNode(false);b.removeAttribute("id");a=f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+a]:a;for(k=0;k0){l=d(e[n]).clone(true,true)[0];b.appendChild(l)}}o.appendChild(b)})}else d(">tbody>tr",f.dom.body).each(function(){l=this.cloneNode(true);l.className=l.className+" DTFC_NoData";d("td",l).html("");o.appendChild(l)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";g&&"undefined"!=typeof this.s.dt.oScroller&&b.liner.appendChild(this.s.dt.oScroller.dom.force.cloneNode(!0));b.liner.appendChild(a.body);this._fnEqualiseHeights("tbody", +f.dom.body,a.body);if(null!==this.s.dt.nTFoot){if(g){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);m=this._fnCopyLayout(this.s.dt.aoFooter,c);b=d(">tfoot",a.footer);b.empty();e=0;for(h=m.length;etfoot",a.footer)[0]);e=0;for(h=m.length;ethead",a.header)[0]);d(b).each(function(a){n=c[a];this.style.width=f.s.aiInnerWidths[n]+"px"});null!==f.s.dt.nTFoot&&(b=this.s.dt.oApi._fnGetUniqueThs(this.s.dt,d(">tfoot",a.footer)[0]),d(b).each(function(a){n=c[a];this.style.width=f.s.aiInnerWidths[n]+"px"}))},_fnGetTrNodes:function(a){for(var b= +[],c=0,d=a.childNodes.length;c"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var e=this._fnGetTrNodes(e),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;cg?f:g,"semiauto"==this.s.sHeightMatch&& +(e[c]._DTTC_iHeight=g),h.push(g);c=0;for(a=b.length;ctfoot', s.nTable).length > 0) ? true : false; + + /* Add the 'sides' that are fixed */ + if ( s.oSides.top ) + { + s.aoCache.push( that._fnCloneTable( "fixedHeader", "FixedHeader_Header", that._fnCloneThead ) ); + } + if ( s.oSides.bottom ) + { + s.aoCache.push( that._fnCloneTable( "fixedFooter", "FixedHeader_Footer", that._fnCloneTfoot ) ); + } + if ( s.oSides.left ) + { + s.aoCache.push( that._fnCloneTable( "fixedLeft", "FixedHeader_Left", that._fnCloneTLeft, s.oSides.left ) ); + } + if ( s.oSides.right ) + { + s.aoCache.push( that._fnCloneTable( "fixedRight", "FixedHeader_Right", that._fnCloneTRight, s.oSides.right ) ); + } + + /* Event listeners for window movement */ + FixedHeader.afnScroll.push( function () { + that._fnUpdatePositions.call(that); + } ); + + $(window).resize( function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones.call(that); + that._fnUpdatePositions.call(that); + } ); + + $(s.nTable) + .on('column-reorder.dt', function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones( true ); + that._fnUpdatePositions(); + } ) + .on('column-visibility.dt', function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones( true ); + that._fnUpdatePositions(); + } ); + + /* Get things right to start with */ + FixedHeader.fnMeasure(); + that._fnUpdateClones(); + that._fnUpdatePositions(); + + s.bInitComplete = true; + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Support functions + */ + + /* + * Function: fnInitSettings + * Purpose: Take the user's settings and copy them to our local store + * Returns: - + * Inputs: object:s - the local settings object + * object:oInit - the user's settings object + */ + fnInitSettings: function ( s, oInit ) + { + if ( oInit !== undefined ) + { + if ( oInit.top !== undefined ) { + s.oSides.top = oInit.top; + } + if ( oInit.bottom !== undefined ) { + s.oSides.bottom = oInit.bottom; + } + if ( typeof oInit.left == 'boolean' ) { + s.oSides.left = oInit.left ? 1 : 0; + } + else if ( oInit.left !== undefined ) { + s.oSides.left = oInit.left; + } + if ( typeof oInit.right == 'boolean' ) { + s.oSides.right = oInit.right ? 1 : 0; + } + else if ( oInit.right !== undefined ) { + s.oSides.right = oInit.right; + } + + if ( oInit.zTop !== undefined ) { + s.oZIndexes.top = oInit.zTop; + } + if ( oInit.zBottom !== undefined ) { + s.oZIndexes.bottom = oInit.zBottom; + } + if ( oInit.zLeft !== undefined ) { + s.oZIndexes.left = oInit.zLeft; + } + if ( oInit.zRight !== undefined ) { + s.oZIndexes.right = oInit.zRight; + } + + if ( oInit.offsetTop !== undefined ) { + s.oOffset.top = oInit.offsetTop; + } + if ( oInit.alwaysCloneTop !== undefined ) { + s.oCloneOnDraw.top = oInit.alwaysCloneTop; + } + if ( oInit.alwaysCloneBottom !== undefined ) { + s.oCloneOnDraw.bottom = oInit.alwaysCloneBottom; + } + if ( oInit.alwaysCloneLeft !== undefined ) { + s.oCloneOnDraw.left = oInit.alwaysCloneLeft; + } + if ( oInit.alwaysCloneRight !== undefined ) { + s.oCloneOnDraw.right = oInit.alwaysCloneRight; + } + } + }, + + /* + * Function: _fnCloneTable + * Purpose: Clone the table node and do basic initialisation + * Returns: - + * Inputs: - + */ + _fnCloneTable: function ( sType, sClass, fnClone, iCells ) + { + var s = this.fnGetSettings(); + var nCTable; + + /* We know that the table _MUST_ has a DIV wrapped around it, because this is simply how + * DataTables works. Therefore, we can set this to be relatively position (if it is not + * alreadu absolute, and use this as the base point for the cloned header + */ + if ( $(s.nTable.parentNode).css('position') != "absolute" ) + { + s.nTable.parentNode.style.position = "relative"; + } + + /* Just a shallow clone will do - we only want the table node */ + nCTable = s.nTable.cloneNode( false ); + nCTable.removeAttribute( 'id' ); + + var nDiv = document.createElement( 'div' ); + nDiv.style.position = "absolute"; + nDiv.style.top = "0px"; + nDiv.style.left = "0px"; + nDiv.className += " FixedHeader_Cloned "+sType+" "+sClass; + + /* Set the zIndexes */ + if ( sType == "fixedHeader" ) + { + nDiv.style.zIndex = s.oZIndexes.top; + } + if ( sType == "fixedFooter" ) + { + nDiv.style.zIndex = s.oZIndexes.bottom; + } + if ( sType == "fixedLeft" ) + { + nDiv.style.zIndex = s.oZIndexes.left; + } + else if ( sType == "fixedRight" ) + { + nDiv.style.zIndex = s.oZIndexes.right; + } + + /* remove margins since we are going to position it absolutely */ + nCTable.style.margin = "0"; + + /* Insert the newly cloned table into the DOM, on top of the "real" header */ + nDiv.appendChild( nCTable ); + document.body.appendChild( nDiv ); + + return { + "nNode": nCTable, + "nWrapper": nDiv, + "sType": sType, + "sPosition": "", + "sTop": "", + "sLeft": "", + "fnClone": fnClone, + "iCells": iCells + }; + }, + + /* + * Function: _fnMeasure + * Purpose: Get the current positioning of the table in the DOM + * Returns: - + * Inputs: - + */ + _fnMeasure: function () + { + var + s = this.fnGetSettings(), + m = s.oMes, + jqTable = $(s.nTable), + oOffset = jqTable.offset(), + iParentScrollTop = this._fnSumScroll( s.nTable.parentNode, 'scrollTop' ), + iParentScrollLeft = this._fnSumScroll( s.nTable.parentNode, 'scrollLeft' ); + + m.iTableWidth = jqTable.outerWidth(); + m.iTableHeight = jqTable.outerHeight(); + m.iTableLeft = oOffset.left + s.nTable.parentNode.scrollLeft; + m.iTableTop = oOffset.top + iParentScrollTop; + m.iTableRight = m.iTableLeft + m.iTableWidth; + m.iTableRight = FixedHeader.oDoc.iWidth - m.iTableLeft - m.iTableWidth; + m.iTableBottom = FixedHeader.oDoc.iHeight - m.iTableTop - m.iTableHeight; + }, + + /* + * Function: _fnSumScroll + * Purpose: Sum node parameters all the way to the top + * Returns: int: sum + * Inputs: node:n - node to consider + * string:side - scrollTop or scrollLeft + */ + _fnSumScroll: function ( n, side ) + { + var i = n[side]; + while ( n = n.parentNode ) + { + if ( n.nodeName == 'HTML' || n.nodeName == 'BODY' ) + { + break; + } + i = n[side]; + } + return i; + }, + + /* + * Function: _fnUpdatePositions + * Purpose: Loop over the fixed elements for this table and update their positions + * Returns: - + * Inputs: - + */ + _fnUpdatePositions: function () + { + var s = this.fnGetSettings(); + this._fnMeasure(); + + for ( var i=0, iLen=s.aoCache.length ; i oWin.iScrollTop + s.oOffset.top ) + { + /* Above the table */ + this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else if ( oWin.iScrollTop + s.oOffset.top > oMes.iTableTop+iTbodyHeight ) + { + /* At the bottom of the table */ + this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+iTbodyHeight)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else + { + /* In the middle of the table */ + this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', s.oOffset.top+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft-oWin.iScrollLeft)+"px", 'left', nTable.style ); + } + }, + + /* + * Function: _fnUpdateCache + * Purpose: Check the cache and update cache and value if needed + * Returns: - + * Inputs: object:oCache - local cache object + * string:sCache - cache property + * string:sSet - value to set + * string:sProperty - object property to set + * object:oObj - object to update + */ + _fnUpdateCache: function ( oCache, sCache, sSet, sProperty, oObj ) + { + if ( oCache[sCache] != sSet ) + { + oObj[sProperty] = sSet; + oCache[sCache] = sSet; + } + }, + + + + /** + * Copy the classes of all child nodes from one element to another. This implies + * that the two have identical structure - no error checking is performed to that + * fact. + * @param {element} source Node to copy classes from + * @param {element} dest Node to copy classes too + */ + _fnClassUpdate: function ( source, dest ) + { + var that = this; + + if ( source.nodeName.toUpperCase() === "TR" || source.nodeName.toUpperCase() === "TH" || + source.nodeName.toUpperCase() === "TD" || source.nodeName.toUpperCase() === "SPAN" ) + { + dest.className = source.className; + } + + $(source).children().each( function (i) { + that._fnClassUpdate( $(source).children()[i], $(dest).children()[i] ); + } ); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Cloning functions + */ + + /* + * Function: _fnCloneThead + * Purpose: Clone the thead element + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneThead: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + + if ( s.bInitComplete && !s.oCloneOnDraw.top ) + { + this._fnClassUpdate( $('thead', s.nTable)[0], $('thead', nTable)[0] ); + return; + } + + /* Set the wrapper width to match that of the cloned table */ + var iDtWidth = $(s.nTable).outerWidth(); + oCache.nWrapper.style.width = iDtWidth+"px"; + nTable.style.width = iDtWidth+"px"; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + $('thead th', nTable).unbind( 'click' ); + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Clone the DataTables header */ + var nThead = $('thead', s.nTable).clone(true)[0]; + nTable.appendChild( nThead ); + + /* Copy the widths across - apparently a clone isn't good enough for this */ + var a = []; + var b = []; + + $("thead>tr th", s.nTable).each( function (i) { + a.push( $(this).width() ); + } ); + + $("thead>tr td", s.nTable).each( function (i) { + b.push( $(this).width() ); + } ); + + $("thead>tr th", s.nTable).each( function (i) { + $("thead>tr th:eq("+i+")", nTable).width( a[i] ); + $(this).width( a[i] ); + } ); + + $("thead>tr td", s.nTable).each( function (i) { + $("thead>tr td:eq("+i+")", nTable).width( b[i] ); + $(this).width( b[i] ); + } ); + + // Stop DataTables 1.9 from putting a focus ring on the headers when + // clicked to sort + $('th.sorting, th.sorting_desc, th.sorting_asc', nTable).bind( 'click', function () { + this.blur(); + } ); + }, + + /* + * Function: _fnCloneTfoot + * Purpose: Clone the tfoot element + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTfoot: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + + /* Set the wrapper width to match that of the cloned table */ + oCache.nWrapper.style.width = $(s.nTable).outerWidth()+"px"; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Clone the DataTables footer */ + var nTfoot = $('tfoot', s.nTable).clone(true)[0]; + nTable.appendChild( nTfoot ); + + /* Copy the widths across - apparently a clone isn't good enough for this */ + $("tfoot:eq(0)>tr th", s.nTable).each( function (i) { + $("tfoot:eq(0)>tr th:eq("+i+")", nTable).width( $(this).width() ); + } ); + + $("tfoot:eq(0)>tr td", s.nTable).each( function (i) { + $("tfoot:eq(0)>tr td:eq("+i+")", nTable).width( $(this).width() ); + } ); + }, + + /* + * Function: _fnCloneTLeft + * Purpose: Clone the left column(s) + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTLeft: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + var nBody = $('tbody', s.nTable)[0]; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Is this the most efficient way to do this - it looks horrible... */ + nTable.appendChild( $("thead", s.nTable).clone(true)[0] ); + nTable.appendChild( $("tbody", s.nTable).clone(true)[0] ); + if ( s.bFooter ) + { + nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] ); + } + + /* Remove unneeded cells */ + var sSelector = 'gt(' + (oCache.iCells - 1) + ')'; + $('thead tr', nTable).each( function (k) { + $('th:' + sSelector, this).remove(); + } ); + + $('tfoot tr', nTable).each( function (k) { + $('th:' + sSelector, this).remove(); + } ); + + $('tbody tr', nTable).each( function (k) { + $('td:' + sSelector, this).remove(); + } ); + + this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable ); + + var iWidth = 0; + for (var i = 0; i < oCache.iCells; i++) { + iWidth += $('thead tr th:eq(' + i + ')', s.nTable).outerWidth(); + } + nTable.style.width = iWidth+"px"; + oCache.nWrapper.style.width = iWidth+"px"; + }, + + /* + * Function: _fnCloneTRight + * Purpose: Clone the right most column(s) + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTRight: function ( oCache ) + { + var s = this.fnGetSettings(); + var nBody = $('tbody', s.nTable)[0]; + var nTable = oCache.nNode; + var iCols = $('tbody tr:eq(0) td', s.nTable).length; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Is this the most efficient way to do this - it looks horrible... */ + nTable.appendChild( $("thead", s.nTable).clone(true)[0] ); + nTable.appendChild( $("tbody", s.nTable).clone(true)[0] ); + if ( s.bFooter ) + { + nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] ); + } + $('thead tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove(); + $('tfoot tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove(); + + /* Remove unneeded cells */ + $('tbody tr', nTable).each( function (k) { + $('td:lt('+(iCols-oCache.iCells)+')', this).remove(); + } ); + + this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable ); + + var iWidth = 0; + for (var i = 0; i < oCache.iCells; i++) { + iWidth += $('thead tr th:eq('+(iCols-1-i)+')', s.nTable).outerWidth(); + } + nTable.style.width = iWidth+"px"; + oCache.nWrapper.style.width = iWidth+"px"; + }, + + + /** + * Equalise the heights of the rows in a given table node in a cross browser way. Note that this + * is more or less lifted as is from FixedColumns + * @method fnEqualiseHeights + * @returns void + * @param {string} parent Node type - thead, tbody or tfoot + * @param {element} original Original node to take the heights from + * @param {element} clone Copy the heights to + * @private + */ + "fnEqualiseHeights": function ( parent, original, clone ) + { + var that = this; + var originals = $(parent +' tr', original); + var height; + + $(parent+' tr', clone).each( function (k) { + height = originals.eq( k ).css('height'); + + // This is nasty :-(. IE has a sub-pixel error even when setting + // the height below (the Firefox fix) which causes the fixed column + // to go out of alignment. Need to add a pixel before the assignment + // Can this be feature detected? Not sure how... + if ( navigator.appName == 'Microsoft Internet Explorer' ) { + height = parseInt( height, 10 ) + 1; + } + + $(this).css( 'height', height ); + + // For Firefox to work, we need to also set the height of the + // original row, to the value that we read from it! Otherwise there + // is a sub-pixel rounding error + originals.eq( k ).css( 'height', height ); + } ); + } +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static properties and methods + * We use these for speed! This information is common to all instances of FixedHeader, so no + * point if having them calculated and stored for each different instance. + */ + +/* + * Variable: oWin + * Purpose: Store information about the window positioning + * Scope: FixedHeader + */ +FixedHeader.oWin = { + "iScrollTop": 0, + "iScrollRight": 0, + "iScrollBottom": 0, + "iScrollLeft": 0, + "iHeight": 0, + "iWidth": 0 +}; + +/* + * Variable: oDoc + * Purpose: Store information about the document size + * Scope: FixedHeader + */ +FixedHeader.oDoc = { + "iHeight": 0, + "iWidth": 0 +}; + +/* + * Variable: afnScroll + * Purpose: Array of functions that are to be used for the scrolling components + * Scope: FixedHeader + */ +FixedHeader.afnScroll = []; + +/* + * Function: fnMeasure + * Purpose: Update the measurements for the window and document + * Returns: - + * Inputs: - + */ +FixedHeader.fnMeasure = function () +{ + var + jqWin = $(window), + jqDoc = $(document), + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc; + + oDoc.iHeight = jqDoc.height(); + oDoc.iWidth = jqDoc.width(); + + oWin.iHeight = jqWin.height(); + oWin.iWidth = jqWin.width(); + oWin.iScrollTop = jqWin.scrollTop(); + oWin.iScrollLeft = jqWin.scrollLeft(); + oWin.iScrollRight = oDoc.iWidth - oWin.iScrollLeft - oWin.iWidth; + oWin.iScrollBottom = oDoc.iHeight - oWin.iScrollTop - oWin.iHeight; +}; + + +FixedHeader.version = "2.1.2"; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Global processing + */ + +/* + * Just one 'scroll' event handler in FixedHeader, which calls the required components. This is + * done as an optimisation, to reduce calculation and proagation time + */ +$(window).scroll( function () { + FixedHeader.fnMeasure(); + + for ( var i=0, iLen=FixedHeader.afnScroll.length ; itfoot",c.nTable).length?!0:!1,c.oSides.top&&c.aoCache.push(d._fnCloneTable("fixedHeader","FixedHeader_Header",d._fnCloneThead)),c.oSides.bottom&&c.aoCache.push(d._fnCloneTable("fixedFooter","FixedHeader_Footer",d._fnCloneTfoot)),c.oSides.left&&c.aoCache.push(d._fnCloneTable("fixedLeft","FixedHeader_Left",d._fnCloneTLeft,c.oSides.left)), +c.oSides.right&&c.aoCache.push(d._fnCloneTable("fixedRight","FixedHeader_Right",d._fnCloneTRight,c.oSides.right)),FixedHeader.afnScroll.push(function(){d._fnUpdatePositions.call(d)}),e(j).resize(function(){FixedHeader.fnMeasure();d._fnUpdateClones.call(d);d._fnUpdatePositions.call(d)}),e(c.nTable).on("column-reorder.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}).on("column-visibility.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}), +FixedHeader.fnMeasure(),d._fnUpdateClones(),d._fnUpdatePositions(),c.bInitComplete=!0)},fnInitSettings:function(a,b){if(b!==h&&(b.top!==h&&(a.oSides.top=b.top),b.bottom!==h&&(a.oSides.bottom=b.bottom),"boolean"==typeof b.left?a.oSides.left=b.left?1:0:b.left!==h&&(a.oSides.left=b.left),"boolean"==typeof b.right?a.oSides.right=b.right?1:0:b.right!==h&&(a.oSides.right=b.right),b.zTop!==h&&(a.oZIndexes.top=b.zTop),b.zBottom!==h&&(a.oZIndexes.bottom=b.zBottom),b.zLeft!==h&&(a.oZIndexes.left=b.zLeft),b.zRight!== +h&&(a.oZIndexes.right=b.zRight),b.offsetTop!==h&&(a.oOffset.top=b.offsetTop),b.alwaysCloneTop!==h&&(a.oCloneOnDraw.top=b.alwaysCloneTop),b.alwaysCloneBottom!==h&&(a.oCloneOnDraw.bottom=b.alwaysCloneBottom),b.alwaysCloneLeft!==h&&(a.oCloneOnDraw.left=b.alwaysCloneLeft),b.alwaysCloneRight!==h))a.oCloneOnDraw.right=b.alwaysCloneRight},_fnCloneTable:function(a,b,c,d){var f=this.fnGetSettings(),g;"absolute"!=e(f.nTable.parentNode).css("position")&&(f.nTable.parentNode.style.position="relative");g=f.nTable.cloneNode(!1); +g.removeAttribute("id");var i=k.createElement("div");i.style.position="absolute";i.style.top="0px";i.style.left="0px";i.className+=" FixedHeader_Cloned "+a+" "+b;"fixedHeader"==a&&(i.style.zIndex=f.oZIndexes.top);"fixedFooter"==a&&(i.style.zIndex=f.oZIndexes.bottom);"fixedLeft"==a?i.style.zIndex=f.oZIndexes.left:"fixedRight"==a&&(i.style.zIndex=f.oZIndexes.right);g.style.margin="0";i.appendChild(g);k.body.appendChild(i);return{nNode:g,nWrapper:i,sType:a,sPosition:"",sTop:"",sLeft:"",fnClone:c,iCells:d}}, +_fnMeasure:function(){var a=this.fnGetSettings(),b=a.oMes,c=e(a.nTable),d=c.offset(),f=this._fnSumScroll(a.nTable.parentNode,"scrollTop");this._fnSumScroll(a.nTable.parentNode,"scrollLeft");b.iTableWidth=c.outerWidth();b.iTableHeight=c.outerHeight();b.iTableLeft=d.left+a.nTable.parentNode.scrollLeft;b.iTableTop=d.top+f;b.iTableRight=b.iTableLeft+b.iTableWidth;b.iTableRight=FixedHeader.oDoc.iWidth-b.iTableLeft-b.iTableWidth;b.iTableBottom=FixedHeader.oDoc.iHeight-b.iTableTop-b.iTableHeight},_fnSumScroll:function(a, +b){for(var c=a[b];(a=a.parentNode)&&!("HTML"==a.nodeName||"BODY"==a.nodeName);)c=a[b];return c},_fnUpdatePositions:function(){var a=this.fnGetSettings();this._fnMeasure();for(var b=0,c=a.aoCache.length;bd.iScrollTop+b.oOffset.top?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):d.iScrollTop+b.oOffset.top>c.iTableTop+ +g?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+g+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):(this._fnUpdateCache(a,"sPosition","fixed","position",e.style),this._fnUpdateCache(a,"sTop",b.oOffset.top+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft-d.iScrollLeft+"px","left",e.style))},_fnUpdateCache:function(a,b,c,d,e){a[b]!=c&&(e[d]=c,a[b]=c)},_fnClassUpdate:function(a,b){var c=this; +if("TR"===a.nodeName.toUpperCase()||"TH"===a.nodeName.toUpperCase()||"TD"===a.nodeName.toUpperCase()||"SPAN"===a.nodeName.toUpperCase())b.className=a.className;e(a).children().each(function(d){c._fnClassUpdate(e(a).children()[d],e(b).children()[d])})},_fnCloneThead:function(a){var b=this.fnGetSettings(),c=a.nNode;if(b.bInitComplete&&!b.oCloneOnDraw.top)this._fnClassUpdate(e("thead",b.nTable)[0],e("thead",c)[0]);else{var d=e(b.nTable).outerWidth();a.nWrapper.style.width=d+"px";for(c.style.width=d+ +"px";0tr th",b.nTable).each(function(){f.push(e(this).width())});e("thead>tr td",b.nTable).each(function(){g.push(e(this).width())});e("thead>tr th",b.nTable).each(function(a){e("thead>tr th:eq("+a+")",c).width(f[a]);e(this).width(f[a])});e("thead>tr td",b.nTable).each(function(a){e("thead>tr td:eq("+a+")",c).width(g[a]);e(this).width(g[a])}); +e("th.sorting, th.sorting_desc, th.sorting_asc",c).bind("click",function(){this.blur()})}},_fnCloneTfoot:function(a){var b=this.fnGetSettings(),c=a.nNode;for(a.nWrapper.style.width=e(b.nTable).outerWidth()+"px";0tr th",b.nTable).each(function(a){e("tfoot:eq(0)>tr th:eq("+a+")",c).width(e(this).width())});e("tfoot:eq(0)>tr td",b.nTable).each(function(a){e("tfoot:eq(0)>tr td:eq("+ +a+")",c).width(e(this).width())})},_fnCloneTLeft:function(a){for(var b=this.fnGetSettings(),c=a.nNode,d=e("tbody",b.nTable)[0];0<'large-6 columns'f>r>"+ + "t"+ + "<'row'<'large-6 columns'i><'large-6 columns'p>>", + "sPaginationType": "bootstrap", + "oLanguage": { + "sLengthMenu": "_MENU_ records per page" + } +} ); + + +/* API method to get paging information */ +$.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings ) +{ + return { + "iStart": oSettings._iDisplayStart, + "iEnd": oSettings.fnDisplayEnd(), + "iLength": oSettings._iDisplayLength, + "iTotal": oSettings.fnRecordsTotal(), + "iFilteredTotal": oSettings.fnRecordsDisplay(), + "iPage": oSettings._iDisplayLength === -1 ? + 0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ), + "iTotalPages": oSettings._iDisplayLength === -1 ? + 0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength ) + }; +}; + + +/* Bootstrap style pagination control */ +$.extend( $.fn.dataTableExt.oPagination, { + "bootstrap": { + "fnInit": function( oSettings, nPaging, fnDraw ) { + var oLang = oSettings.oLanguage.oPaginate; + var fnClickHandler = function ( e ) { + e.preventDefault(); + if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) { + fnDraw( oSettings ); + } + }; + + $(nPaging).append( + '
    '+ + ''+ + ''+ + '
' + ); + var els = $('a', nPaging); + $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler ); + $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler ); + }, + + "fnUpdate": function ( oSettings, fnDraw ) { + var iListLength = 5; + var oPaging = oSettings.oInstance.fnPagingInfo(); + var an = oSettings.aanFeatures.p; + var pages = []; + var i, ien, klass, host; + + // This could use some improving - however, see + // https://github.com/DataTables/DataTables/issues/163 - this will + // be changing in the near future, so not much point in doing too + // much just now + if ( oPaging.iTotalPages <= 6 ) { + for ( i=0 ; i= oPaging.iTotalPages ? + oPaging.iTotalPages : + oPaging.iPage + 2; + for ( i=oPaging.iPage+1 ; i 0 ? + oPaging.iPage - 2 : + 0; + for ( i=oPaging.iPage-1 ; i>pagesBefore ; i-- ) { + pages.unshift( i ); + } + + // Before gap + if ( pagesBefore > 1 ) { + pages.unshift( null ); + } + + // Start + if ( $.inArray( 1, pages ) === -1 && oPaging.iTotalPages > 1 ) { + pages.unshift( 1 ); + } + if ( $.inArray( 0, pages ) === -1 ) { + pages.unshift( 0 ); + } + } + + for ( i=0, ien=an.length ; i'+(page===null? '…' : page+1)+'') + .insertBefore( $('li:last', host) ) + .bind('click', function (e) { + e.preventDefault(); + oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength; + fnDraw( oSettings ); + } ); + } ); + + // Add / remove disabled classes from the static elements + if ( oPaging.iPage === 0 ) { + $('li:first', host).addClass('unavailable'); + } else { + $('li:first', host).removeClass('unavailable'); + } + + if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) { + $('li:last', host).addClass('unavailable'); + } else { + $('li:last', host).removeClass('unavailable'); + } + } + } + } +} ); + + +/* + * TableTools Foundation compatibility + * Required TableTools 2.1+ + */ +if ( $.fn.DataTable.TableTools ) { + // Set the classes that TableTools uses to something suitable for Foundation + $.extend( true, $.fn.DataTable.TableTools.classes, { + "container": "DTTT button-group", + "buttons": { + "normal": "button", + "disabled": "disabled" + }, + "collection": { + "container": "DTTT_dropdown dropdown-menu", + "buttons": { + "normal": "", + "disabled": "disabled" + } + }, + "select": { + "row": "active" + } + } ); + + // Have the collection use a bootstrap compatible dropdown + $.extend( true, $.fn.DataTable.TableTools.DEFAULTS.oTags, { + "collection": { + "container": "ul", + "button": "li", + "liner": "a" + } + } ); +} + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.jqueryui.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.jqueryui.js new file mode 100644 index 00000000..3575e822 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.jqueryui.js @@ -0,0 +1,102 @@ + +(function(){ + +var DataTable = $.fn.dataTable; +var sort_prefix = 'css_right ui-icon ui-icon-'; +var toolbar_prefix = 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-'; + +/* Set the defaults for DataTables initialisation */ +$.extend( true, DataTable.defaults, { + dom: + '<"'+toolbar_prefix+'tl ui-corner-tr"lfr>'+ + 't'+ + '<"'+toolbar_prefix+'bl ui-corner-br"ip>', + renderer: 'jqueryui' +} ); + + +$.extend( DataTable.ext.classes, { + /* Full numbers paging buttons */ + "sPageButton": "fg-button ui-button ui-state-default", + "sPageButtonActive": "ui-state-disabled", + "sPageButtonDisabled": "ui-state-disabled", + + /* Features */ + "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ + "ui-buttonset-multi paging_", /* Note that the type is postfixed */ + + /* Sorting */ + "sSortAsc": "ui-state-default sorting_asc", + "sSortDesc": "ui-state-default sorting_desc", + "sSortable": "ui-state-default sorting", + "sSortableAsc": "ui-state-default sorting_asc_disabled", + "sSortableDesc": "ui-state-default sorting_desc_disabled", + "sSortableNone": "ui-state-default sorting_disabled", + "sSortIcon": "DataTables_sort_icon", + + /* Scrolling */ + "sScrollHead": "dataTables_scrollHead "+"ui-state-default", + "sScrollFoot": "dataTables_scrollFoot "+"ui-state-default", + + /* Misc */ + "sHeaderTH": "ui-state-default", + "sFooterTH": "ui-state-default", +} ); + + +DataTable.ext.renderer.header.jqueryui = function ( settings, cell, column, idx, classes ) { + $('
') + .addClass( 'DataTables_sort_wrapper' ) + .append( cell.contents() ) + .append( $('') + .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) + ) + .appendTo( cell ); + + // Attach a sort listener to update on sort + $(settings.nTable).on( 'order.dt', function ( e, settings, sorting, columns ) { + cell + .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) + .addClass( columns[ idx ] == 'asc' ? + classes.sSortAsc : columns[ idx ] == 'desc' ? + classes.sSortDesc : + column.sSortingClass + ); + + cell + .find( 'span' ) + .removeClass( + sort_prefix+'triangle-1-n' +" "+ + sort_prefix+'triangle-1-s' +" "+ + sort_prefix+'carat-2-n-s' +" "+ + sort_prefix+'carat-1-n' +" "+ + sort_prefix+'carat-1-s' + ) + .addClass( columns[ idx ] == 'asc' ? + sort_prefix+'triangle-1-n' : columns[ idx ] == 'desc' ? + sort_prefix+'triangle-1-s' : + column.sSortingClassJUI + ); + } ); +} + + +/* + * TableTools jQuery UI compatibility + * Required TableTools 2.1+ + */ +if ( DataTable.TableTools ) { + $.extend( true, DataTable.TableTools.classes, { + "container": "DTTT_container ui-buttonset ui-buttonset-multi", + "buttons": { + "normal": "DTTT_button ui-button ui-state-default" + }, + "collection": { + "container": "DTTT_collection ui-buttonset ui-buttonset-multi" + } + } ); +} + + +}()); + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.keyTable.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.keyTable.js new file mode 100644 index 00000000..f303f766 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/DataTables-1.10.4/dataTables.keyTable.js @@ -0,0 +1,1175 @@ +/*! KeyTable 1.2.1 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary KeyTable + * @description Spreadsheet like keyboard navigation for DataTables + * @version 1.2.1 + * @file dataTables.keyTable.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2009-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +// Global scope for KeyTable for backwards compatibility. Will be removed in 1.3 +var KeyTable; + + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +KeyTable = function ( oInit ) +{ + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * API parameters + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Variable: block + * Purpose: Flag whether or not KeyTable events should be processed + * Scope: KeyTable - public + */ + this.block = false; + + /* + * Variable: event + * Purpose: Container for all event application methods + * Scope: KeyTable - public + * Notes: This object contains all the public methods for adding and removing events - these + * are dynamically added later on + */ + this.event = { + "remove": {} + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * API methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Function: fnGetCurrentPosition + * Purpose: Get the currently focused cell's position + * Returns: array int: [ x, y ] + * Inputs: void + */ + this.fnGetCurrentPosition = function () + { + return [ _iOldX, _iOldY ]; + }; + + + /* + * Function: fnGetCurrentData + * Purpose: Get the currently focused cell's data (innerHTML) + * Returns: string: - data requested + * Inputs: void + */ + this.fnGetCurrentData = function () + { + return _nOldFocus.innerHTML; + }; + + + /* + * Function: fnGetCurrentTD + * Purpose: Get the currently focused cell + * Returns: node: - focused element + * Inputs: void + */ + this.fnGetCurrentTD = function () + { + return _nOldFocus; + }; + + + /* + * Function: fnSetPosition + * Purpose: Set the position of the focused cell + * Returns: - + * Inputs: int:x - x coordinate + * int:y - y coordinate + * Notes: Thanks to Rohan Daxini for the basis of this function + */ + this.fnSetPosition = function( x, y ) + { + if ( typeof x == 'object' && x.nodeName ) + { + _fnSetFocus( x ); + } + else + { + _fnSetFocus( _fnCellFromCoords(x, y) ); + } + }; + + + /* + * Function: fnBlur + * Purpose: Blur the current focus + * Returns: - + * Inputs: - + */ + this.fnBlur = function() + { + _fnBlur(); + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private parameters + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Variable: _nBody + * Purpose: Body node of the table - cached for renference + * Scope: KeyTable - private + */ + var _nBody = null; + + /* + * Variable: + * Purpose: + * Scope: KeyTable - private + */ + var _nOldFocus = null; + + /* + * Variable: _iOldX and _iOldY + * Purpose: X and Y coords of the old elemet that was focused on + * Scope: KeyTable - private + */ + var _iOldX = null; + var _iOldY = null; + + /* + * Variable: _that + * Purpose: Scope saving for 'this' after a jQuery event + * Scope: KeyTable - private + */ + var _that = null; + + /* + * Variable: sFocusClass + * Purpose: Class that should be used for focusing on a cell + * Scope: KeyTable - private + */ + var _sFocusClass = "focus"; + + /* + * Variable: _bKeyCapture + * Purpose: Flag for should KeyTable capture key events or not + * Scope: KeyTable - private + */ + var _bKeyCapture = false; + + /* + * Variable: _oaoEvents + * Purpose: Event cache object, one array for each supported event for speed of searching + * Scope: KeyTable - private + */ + var _oaoEvents = { + "action": [], + "esc": [], + "focus": [], + "blur": [] + }; + + /* + * Variable: _oDatatable + * Purpose: DataTables settings object for if we are actually using a + * DataTables table + * Scope: KeyTable - private + */ + var _oDatatable = null; + + var _bForm; + var _nInput; + var _bInputFocused = false; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Key table events + */ + + /* + * Function: _fnEventAddTemplate + * Purpose: Create a function (with closure for sKey) event addition API + * Returns: function: - template function + * Inputs: string:sKey - type of event to detect + */ + function _fnEventAddTemplate( sKey ) + { + /* + * Function: - + * Purpose: API function for adding event to cache + * Returns: - + * Inputs: 1. node:x - target node to add event for + * 2. function:y - callback function to apply + * or + * 1. int:x - x coord. of target cell (can be null for live events) + * 2. int:y - y coord. of target cell (can be null for live events) + * 3. function:z - callback function to apply + * Notes: This function is (interally) overloaded (in as much as javascript allows for + * that) - the target cell can be given by either node or coords. + */ + return function ( x, y, z ) { + if ( (x===null || typeof x == "number") && + (y===null || typeof y == "number") && + typeof z == "function" ) + { + _fnEventAdd( sKey, x, y, z ); + } + else if ( typeof x == "object" && typeof y == "function" ) + { + var aCoords = _fnCoordsFromCell( x ); + _fnEventAdd( sKey, aCoords[0], aCoords[1], y ); + } + else + { + alert( "Unhandable event type was added: x" +x+ " y:" +y+ " z:" +z ); + } + }; + } + + + /* + * Function: _fnEventRemoveTemplate + * Purpose: Create a function (with closure for sKey) event removal API + * Returns: function: - template function + * Inputs: string:sKey - type of event to detect + */ + function _fnEventRemoveTemplate( sKey ) + { + /* + * Function: - + * Purpose: API function for removing event from cache + * Returns: int: - number of events removed + * Inputs: 1. node:x - target node to remove event from + * 2. function:y - callback function to apply + * or + * 1. int:x - x coord. of target cell (can be null for live events) + * 2. int:y - y coord. of target cell (can be null for live events) + * 3. function:z - callback function to remove - optional + * Notes: This function is (interally) overloaded (in as much as javascript allows for + * that) - the target cell can be given by either node or coords and the function + * to remove is optional + */ + return function ( x, y, z ) { + if ( (x===null || typeof arguments[0] == "number") && + (y===null || typeof arguments[1] == "number" ) ) + { + if ( typeof arguments[2] == "function" ) + { + _fnEventRemove( sKey, x, y, z ); + } + else + { + _fnEventRemove( sKey, x, y ); + } + } + else if ( typeof arguments[0] == "object" ) + { + var aCoords = _fnCoordsFromCell( x ); + if ( typeof arguments[1] == "function" ) + { + _fnEventRemove( sKey, aCoords[0], aCoords[1], y ); + } + else + { + _fnEventRemove( sKey, aCoords[0], aCoords[1] ); + } + } + else + { + alert( "Unhandable event type was removed: x" +x+ " y:" +y+ " z:" +z ); + } + }; + } + + /* Use the template functions to add the event API functions */ + for ( var sKey in _oaoEvents ) + { + if ( sKey ) + { + this.event[sKey] = _fnEventAddTemplate( sKey ); + this.event.remove[sKey] = _fnEventRemoveTemplate( sKey ); + } + } + + + /* + * Function: _fnEventAdd + * Purpose: Add an event to the internal cache + * Returns: - + * Inputs: string:sType - type of event to add, given by the available elements in _oaoEvents + * int:x - x-coords to add event to - can be null for "blanket" event + * int:y - y-coords to add event to - can be null for "blanket" event + * function:fn - callback function for when triggered + */ + function _fnEventAdd( sType, x, y, fn ) + { + _oaoEvents[sType].push( { + "x": x, + "y": y, + "fn": fn + } ); + } + + + /* + * Function: _fnEventRemove + * Purpose: Remove an event from the event cache + * Returns: int: - number of matching events removed + * Inputs: string:sType - type of event to look for + * node:nTarget - target table cell + * function:fn - optional - remove this function. If not given all handlers of this + * type will be removed + */ + function _fnEventRemove( sType, x, y, fn ) + { + var iCorrector = 0; + + for ( var i=0, iLen=_oaoEvents[sType].length ; i= oSettings.fnDisplayEnd() ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + /* Make sure we are not over running the display array */ + if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart += oSettings._iDisplayLength; + } + } + else + { + oSettings._iDisplayStart = 0; + } + _oDatatable.oApi._fnCalculateEnd( oSettings ); + } + + /* Page backwards */ + while ( iRow < oSettings._iDisplayStart ) + { + oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? + oSettings._iDisplayStart - oSettings._iDisplayLength : + 0; + + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + _oDatatable.oApi._fnCalculateEnd( oSettings ); + } + + /* Re-draw the table */ + _oDatatable.oApi._fnDraw( oSettings ); + + /* Restore the key capture */ + _bKeyCapture = bKeyCaptureCache; + } + + /* Cache the information that we are interested in */ + var aNewPos = _fnCoordsFromCell( nTarget ); + _nOldFocus = nTarget; + _iOldX = aNewPos[0]; + _iOldY = aNewPos[1]; + + var iViewportHeight, iViewportWidth, iScrollTop, iScrollLeft, iHeight, iWidth, aiPos; + if ( bAutoScroll ) + { + /* Scroll the viewport such that the new cell is fully visible in the rendered window */ + iViewportHeight = $(window).height(); + iViewportWidth = $(window).width(); + iScrollTop = $(document).scrollTop(); + iScrollLeft = $(document).scrollLeft(); + iHeight = nTarget.offsetHeight; + iWidth = nTarget.offsetWidth; + aiPos = _fnGetPos( nTarget ); + + /* Take account of scrolling in DataTables 1.7 - remove scrolling since that would add to + * the positioning calculation + */ + if ( _oDatatable && typeof oSettings.oScroll != 'undefined' && + (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) + { + aiPos[1] -= $(oSettings.nTable.parentNode).scrollTop(); + aiPos[0] -= $(oSettings.nTable.parentNode).scrollLeft(); + } + + /* Correct viewport positioning for vertical scrolling */ + if ( aiPos[1]+iHeight > iScrollTop+iViewportHeight ) + { + /* Displayed element if off the bottom of the viewport */ + _fnSetScrollTop( aiPos[1]+iHeight - iViewportHeight ); + } + else if ( aiPos[1] < iScrollTop ) + { + /* Displayed element if off the top of the viewport */ + _fnSetScrollTop( aiPos[1] ); + } + + /* Correct viewport positioning for horizontal scrolling */ + if ( aiPos[0]+iWidth > iScrollLeft+iViewportWidth ) + { + /* Displayed element is off the bottom of the viewport */ + _fnSetScrollLeft( aiPos[0]+iWidth - iViewportWidth ); + } + else if ( aiPos[0] < iScrollLeft ) + { + /* Displayed element if off the Left of the viewport */ + _fnSetScrollLeft( aiPos[0] ); + } + } + + /* Take account of scrolling in DataTables 1.7 */ + if ( _oDatatable && typeof oSettings.oScroll != 'undefined' && + (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) + { + var dtScrollBody = oSettings.nTable.parentNode; + iViewportHeight = dtScrollBody.clientHeight; + iViewportWidth = dtScrollBody.clientWidth; + iScrollTop = dtScrollBody.scrollTop; + iScrollLeft = dtScrollBody.scrollLeft; + iHeight = nTarget.offsetHeight; + iWidth = nTarget.offsetWidth; + + /* Correct for vertical scrolling */ + if ( nTarget.offsetTop + iHeight > iViewportHeight+iScrollTop ) + { + dtScrollBody.scrollTop = (nTarget.offsetTop + iHeight) - iViewportHeight; + } + else if ( nTarget.offsetTop < iScrollTop ) + { + dtScrollBody.scrollTop = nTarget.offsetTop; + } + + /* Correct for horizontal scrolling */ + if ( nTarget.offsetLeft + iWidth > iViewportWidth+iScrollLeft ) + { + dtScrollBody.scrollLeft = (nTarget.offsetLeft + iWidth) - iViewportWidth; + } + else if ( nTarget.offsetLeft < iScrollLeft ) + { + dtScrollBody.scrollLeft = nTarget.offsetLeft; + } + } + + /* Focused - so we want to capture the keys */ + _fnCaptureKeys(); + + /* Fire of the focus event if there is one */ + _fnEventFire( "focus", _iOldX, _iOldY ); + } + + + /* + * Function: _fnBlur + * Purpose: Blur focus from the whole table + * Returns: - + * Inputs: - + */ + function _fnBlur() + { + _fnRemoveFocus( _nOldFocus ); + _iOldX = null; + _iOldY = null; + _nOldFocus = null; + _fnReleaseKeys(); + } + + + /* + * Function: _fnRemoveFocus + * Purpose: Remove focus from a cell and fire any blur events which are attached + * Returns: - + * Inputs: node:nTarget - cell of interest + */ + function _fnRemoveFocus( nTarget ) + { + $(nTarget).removeClass( _sFocusClass ); + $(nTarget).parent().removeClass( _sFocusClass ); + _fnEventFire( "blur", _iOldX, _iOldY ); + } + + + /* + * Function: _fnClick + * Purpose: Focus on the element that has been clicked on by the user + * Returns: - + * Inputs: event:e - click event + */ + function _fnClick ( e ) + { + var nTarget = this; + while ( nTarget.nodeName != "TD" ) + { + nTarget = nTarget.parentNode; + } + + _fnSetFocus( nTarget ); + _fnCaptureKeys(); + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Key events + */ + + /* + * Function: _fnKey + * Purpose: Deal with a key events, be it moving the focus or return etc. + * Returns: bool: - allow browser default action + * Inputs: event:e - key event + */ + function _fnKey ( e ) + { + /* If user or system has blocked KeyTable from doing anything, just ignore this event */ + if ( _that.block || !_bKeyCapture ) + { + return true; + } + + /* If a modifier key is pressed (exapct shift), ignore the event */ + if ( e.metaKey || e.altKey || e.ctrlKey ) + { + return true; + } + var + x, y, + iTableWidth = _nBody.getElementsByTagName('tr')[0].getElementsByTagName('td').length, + iTableHeight; + + /* Get table height and width - done here so as to be dynamic (if table is updated) */ + if ( _oDatatable ) + { + /* + * Locate the current node in the DataTable overriding the old positions - the reason for + * is is that there might have been some DataTables interaction between the last focus and + * now + */ + iTableHeight = _oDatatable.aiDisplay.length; + + var aDtPos = _fnFindDtCell( _nOldFocus ); + if ( aDtPos === null ) + { + /* If the table has been updated such that the focused cell can't be seen - do nothing */ + return; + } + _iOldX = aDtPos[ 0 ]; + _iOldY = aDtPos[ 1 ]; + } + else + { + iTableHeight = _nBody.getElementsByTagName('tr').length; + } + + /* Capture shift+tab to match the left arrow key */ + var iKey = (e.keyCode == 9 && e.shiftKey) ? -1 : e.keyCode; + + switch( iKey ) + { + case 13: /* return */ + e.preventDefault(); + e.stopPropagation(); + _fnEventFire( "action", _iOldX, _iOldY ); + return true; + + case 27: /* esc */ + if ( !_fnEventFire( "esc", _iOldX, _iOldY ) ) + { + /* Only lose focus if there isn't an escape handler on the cell */ + _fnBlur(); + return; + } + x = _iOldX; + y = _iOldY; + break; + + case -1: + case 37: /* left arrow */ + if ( _iOldX > 0 ) { + x = _iOldX - 1; + y = _iOldY; + } else if ( _iOldY > 0 ) { + x = iTableWidth-1; + y = _iOldY - 1; + } else { + /* at start of table */ + if ( iKey == -1 && _bForm ) + { + /* If we are in a form, return focus to the 'input' element such that tabbing will + * follow correctly in the browser + */ + _bInputFocused = true; + _nInput.focus(); + + /* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for + * focus + */ + setTimeout( function(){ _bInputFocused = false; }, 0 ); + _bKeyCapture = false; + _fnBlur(); + return true; + } + else + { + return false; + } + } + break; + + case 38: /* up arrow */ + if ( _iOldY > 0 ) { + x = _iOldX; + y = _iOldY - 1; + } else { + return false; + } + break; + + case 36: /* home */ + x = _iOldX; + y = 0; + break; + + case 33: /* page up */ + x = _iOldX; + y = _iOldY - 10; + if (y < 0) { + y = 0; + } + break; + + case 9: /* tab */ + case 39: /* right arrow */ + if ( _iOldX < iTableWidth-1 ) { + x = _iOldX + 1; + y = _iOldY; + } else if ( _iOldY < iTableHeight-1 ) { + x = 0; + y = _iOldY + 1; + } else { + /* at end of table */ + if ( iKey == 9 && _bForm ) + { + /* If we are in a form, return focus to the 'input' element such that tabbing will + * follow correctly in the browser + */ + _bInputFocused = true; + _nInput.focus(); + + /* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for + * focus + */ + setTimeout( function(){ _bInputFocused = false; }, 0 ); + _bKeyCapture = false; + _fnBlur(); + return true; + } + else + { + return false; + } + } + break; + + case 40: /* down arrow */ + if ( _iOldY < iTableHeight-1 ) { + x = _iOldX; + y = _iOldY + 1; + } else { + return false; + } + break; + + case 35: /* end */ + x = _iOldX; + y = iTableHeight-1; + break; + + case 34: /* page down */ + x = _iOldX; + y = _iOldY+10; + if (y > iTableHeight-1) { + y = iTableHeight-1; + } + break; + + default: /* Nothing we are interested in */ + return true; + } + + _fnSetFocus( _fnCellFromCoords(x, y) ); + return false; + } + + + /* + * Function: _fnCaptureKeys + * Purpose: Start capturing key events for this table + * Returns: - + * Inputs: - + */ + function _fnCaptureKeys( ) + { + if ( !_bKeyCapture ) + { + _bKeyCapture = true; + } + } + + + /* + * Function: _fnReleaseKeys + * Purpose: Stop capturing key events for this table + * Returns: - + * Inputs: - + */ + function _fnReleaseKeys( ) + { + _bKeyCapture = false; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Support functions + */ + + /* + * Function: _fnCellFromCoords + * Purpose: Calulate the target TD cell from x and y coordinates + * Returns: node: - TD target + * Inputs: int:x - x coordinate + * int:y - y coordinate + */ + function _fnCellFromCoords( x, y ) + { + if ( _oDatatable ) + { + if ( typeof _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ] != 'undefined' ) + { + return _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ].nTr.getElementsByTagName('td')[x]; + } + else + { + return null; + } + } + else + { + return $('tr:eq('+y+')>td:eq('+x+')', _nBody )[0]; + } + } + + + /* + * Function: _fnCoordsFromCell + * Purpose: Calculate the x and y position in a table from a TD cell + * Returns: array[2] int: [x, y] + * Inputs: node:n - TD cell of interest + * Notes: Not actually interested in this for DataTables since it might go out of date + */ + function _fnCoordsFromCell( n ) + { + if ( _oDatatable ) + { + return [ + $('td', n.parentNode).index(n), + $('tr', n.parentNode.parentNode).index(n.parentNode) + _oDatatable._iDisplayStart + ]; + } + else + { + return [ + $('td', n.parentNode).index(n), + $('tr', n.parentNode.parentNode).index(n.parentNode) + ]; + } + } + + + /* + * Function: _fnSetScrollTop + * Purpose: Set the vertical scrolling position + * Returns: - + * Inputs: int:iPos - scrolltop + * Notes: This is so nasty, but without browser detection you can't tell which you should set + * So on browsers that support both, the scroll top will be set twice. I can live with + * that :-) + */ + function _fnSetScrollTop( iPos ) + { + document.documentElement.scrollTop = iPos; + document.body.scrollTop = iPos; + } + + + /* + * Function: _fnSetScrollLeft + * Purpose: Set the horizontal scrolling position + * Returns: - + * Inputs: int:iPos - scrollleft + */ + function _fnSetScrollLeft( iPos ) + { + document.documentElement.scrollLeft = iPos; + document.body.scrollLeft = iPos; + } + + + /* + * Function: _fnGetPos + * Purpose: Get the position of an object on the rendered page + * Returns: array[2] int: [left, right] + * Inputs: node:obj - element of interest + */ + function _fnGetPos ( obj ) + { + var iLeft = 0; + var iTop = 0; + + if (obj.offsetParent) + { + iLeft = obj.offsetLeft; + iTop = obj.offsetTop; + obj = obj.offsetParent; + while (obj) + { + iLeft += obj.offsetLeft; + iTop += obj.offsetTop; + obj = obj.offsetParent; + } + } + return [iLeft,iTop]; + } + + + /* + * Function: _fnFindDtCell + * Purpose: Get the coords. of a cell from the DataTables internal information + * Returns: array[2] int: [x, y] coords. or null if not found + * Inputs: node:nTarget - the node of interest + */ + function _fnFindDtCell( nTarget ) + { + for ( var i=0, iLen=_oDatatable.aiDisplay.length ; i