- {isItemSelected(item) &&
+
+ {selectionUtilities.isItemSelected(item) &&
}
- {!isItemSelected(item) &&
+ {!selectionUtilities.isItemSelected(item) &&
}
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md
index d5db5b3ae03..b3085d8c942 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-cardview/readme.md
@@ -7,9 +7,9 @@
## Properties
-| Property | Attribute | Description | Type | Default |
-| --------------------------- | --------- | ----------- | -------------------------- | ----------- |
-| `currentItems` _(required)_ | -- | | `GetFolderContentResponse` | `undefined` |
+| Property | Attribute | Description | Type | Default |
+| --------------------------- | --------- | -------------------------- | -------------------------- | ----------- |
+| `currentItems` _(required)_ | -- | The list of current items. | `GetFolderContentResponse` | `undefined` |
## Dependencies
@@ -18,9 +18,22 @@
- [dnn-rm-files-pane](../dnn-rm-files-pane)
+### Depends on
+
+- dnn-collapsible
+- [dnn-rm-folder-context-menu](../context-menus/dnn-rm-folder-context-menu)
+
### Graph
```mermaid
graph TD;
+ dnn-rm-items-cardview --> dnn-collapsible
+ dnn-rm-items-cardview --> dnn-rm-folder-context-menu
+ dnn-rm-folder-context-menu --> dnn-action-create-folder
+ dnn-action-create-folder --> dnn-modal
+ dnn-action-create-folder --> dnn-rm-edit-folder
+ dnn-rm-edit-folder --> dnn-button
+ dnn-button --> dnn-modal
+ dnn-button --> dnn-button
dnn-rm-files-pane --> dnn-rm-items-cardview
style dnn-rm-items-cardview fill:#f9f,stroke:#333,stroke-width:4px
```
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.scss b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.scss
index 1f2a3595d07..d958e196a49 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.scss
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.scss
@@ -44,4 +44,13 @@ table{
}
}
}
+}
+
+dnn-collapsible{
+ position: fixed;
+ display: none;
+ border: 1px solid lightgray;
+ box-shadow: 2px 2px 4px -2px;
+ background-color: white;
+ z-index: 1;
}
\ No newline at end of file
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.tsx b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.tsx
index 4ab2059ba8f..99a5a805c59 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.tsx
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/dnn-rm-items-listview.tsx
@@ -1,7 +1,7 @@
-import { Component, Host, h, Prop } from '@stencil/core';
+import { Component, Host, h, Prop, Element } from '@stencil/core';
import { GetFolderContentResponse, Item } from '../../services/ItemsClient'
import state from '../../store/store';
-import {isItemSelected, toggleItemSelected} from "../../utilities/selection-utilities";
+import { selectionUtilities } from "../../utilities/selection-utilities";
@Component({
tag: 'dnn-rm-items-listview',
@@ -10,8 +10,25 @@ import {isItemSelected, toggleItemSelected} from "../../utilities/selection-util
})
export class DnnRmItemsListview {
+ /** The list of current items. */
@Prop() currentItems!: GetFolderContentResponse;
+ @Element() el: HTMLDnnRmItemsListviewElement;
+
+ componentWillLoad() {
+ document.addEventListener("click", this.dismissContextMenu.bind(this));
+ }
+
+ disconnectedCallback() {
+ document.removeEventListener("click", this.disconnectedCallback.bind(this));
+ }
+
+ private dismissContextMenu() {
+ const existingMenus = this.el.shadowRoot.querySelectorAll("dnn-collapsible");
+ existingMenus?.forEach(existingMenu => this.el.shadowRoot.removeChild(existingMenu));
+ }
+
+
private getLocalDateString(dateString: string) {
const date = new Date(dateString);
return
@@ -49,13 +66,33 @@ export class DnnRmItemsListview {
case " ":
case "Enter":
e.preventDefault();
- toggleItemSelected(item);
+ selectionUtilities.toggleItemSelected(item);
break;
default:
break;
}
}
+ private handleContextMenu(e: MouseEvent, item: Item): void {
+ e.preventDefault();
+ state.selectedItems = [];
+ this.dismissContextMenu();
+ if (item.isFolder){
+ const collapsible = document.createElement("dnn-collapsible");
+ const folderContextMenu = document.createElement("dnn-rm-folder-context-menu");
+ folderContextMenu.clickedFolderId = item.itemId;
+ collapsible.appendChild(folderContextMenu);
+ collapsible.style.left = `${e.pageX}px`;
+ collapsible.style.top = `${e.pageY}px`;
+ collapsible.style.display = "block";
+ this.el.shadowRoot.appendChild(collapsible);
+ setTimeout(() => {
+ collapsible.expanded = true;
+ }, 100);
+ return;
+ }
+ }
+
render() {
return (
@@ -74,16 +111,17 @@ export class DnnRmItemsListview {
{this.currentItems.items?.map(item =>
this.handleRowKeyDown(e, item)}
- onClick={() => toggleItemSelected(item)}
+ onClick={() => selectionUtilities.toggleItemSelected(item)}
+ onContextMenu={e => this.handleContextMenu(e, item)}
>
- {isItemSelected(item) &&
+ {selectionUtilities.isItemSelected(item) &&
}
- {!isItemSelected(item) &&
+ {!selectionUtilities.isItemSelected(item) &&
}
|
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md
index 78590342250..54ca9a797f7 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-items-listview/readme.md
@@ -7,9 +7,9 @@
## Properties
-| Property | Attribute | Description | Type | Default |
-| --------------------------- | --------- | ----------- | -------------------------- | ----------- |
-| `currentItems` _(required)_ | -- | | `GetFolderContentResponse` | `undefined` |
+| Property | Attribute | Description | Type | Default |
+| --------------------------- | --------- | -------------------------- | -------------------------- | ----------- |
+| `currentItems` _(required)_ | -- | The list of current items. | `GetFolderContentResponse` | `undefined` |
## Dependencies
@@ -18,9 +18,22 @@
- [dnn-rm-files-pane](../dnn-rm-files-pane)
+### Depends on
+
+- dnn-collapsible
+- [dnn-rm-folder-context-menu](../context-menus/dnn-rm-folder-context-menu)
+
### Graph
```mermaid
graph TD;
+ dnn-rm-items-listview --> dnn-collapsible
+ dnn-rm-items-listview --> dnn-rm-folder-context-menu
+ dnn-rm-folder-context-menu --> dnn-action-create-folder
+ dnn-action-create-folder --> dnn-modal
+ dnn-action-create-folder --> dnn-rm-edit-folder
+ dnn-rm-edit-folder --> dnn-button
+ dnn-button --> dnn-modal
+ dnn-button --> dnn-button
dnn-rm-files-pane --> dnn-rm-items-listview
style dnn-rm-items-listview fill:#f9f,stroke:#333,stroke-width:4px
```
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-left-pane/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-left-pane/readme.md
index 22b4c274d71..2ad5e6b62f5 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-left-pane/readme.md
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-left-pane/readme.md
@@ -22,7 +22,15 @@ graph TD;
dnn-rm-folder-list --> dnn-rm-folder-list-item
dnn-rm-folder-list-item --> dnn-treeview-item
dnn-rm-folder-list-item --> dnn-rm-folder-list-item
+ dnn-rm-folder-list-item --> dnn-collapsible
+ dnn-rm-folder-list-item --> dnn-rm-folder-context-menu
dnn-treeview-item --> dnn-collapsible
+ dnn-rm-folder-context-menu --> dnn-action-create-folder
+ dnn-action-create-folder --> dnn-modal
+ dnn-action-create-folder --> dnn-rm-edit-folder
+ dnn-rm-edit-folder --> dnn-button
+ dnn-button --> dnn-modal
+ dnn-button --> dnn-button
dnn-resource-manager --> dnn-rm-left-pane
style dnn-rm-left-pane fill:#f9f,stroke:#333,stroke-width:4px
```
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-right-pane/readme.md b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-right-pane/readme.md
index abc9648631a..fdfc430a43f 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-right-pane/readme.md
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-right-pane/readme.md
@@ -24,9 +24,20 @@ graph TD;
dnn-rm-right-pane --> dnn-rm-files-pane
dnn-rm-right-pane --> dnn-rm-status-bar
dnn-rm-actions-bar --> dnn-vertical-overflow-menu
+ dnn-rm-actions-bar --> dnn-action-create-folder
dnn-rm-actions-bar --> dnn-collapsible
+ dnn-action-create-folder --> dnn-modal
+ dnn-action-create-folder --> dnn-rm-edit-folder
+ dnn-rm-edit-folder --> dnn-button
+ dnn-button --> dnn-modal
+ dnn-button --> dnn-button
dnn-rm-files-pane --> dnn-rm-items-listview
dnn-rm-files-pane --> dnn-rm-items-cardview
+ dnn-rm-items-listview --> dnn-collapsible
+ dnn-rm-items-listview --> dnn-rm-folder-context-menu
+ dnn-rm-folder-context-menu --> dnn-action-create-folder
+ dnn-rm-items-cardview --> dnn-collapsible
+ dnn-rm-items-cardview --> dnn-rm-folder-context-menu
dnn-resource-manager --> dnn-rm-right-pane
style dnn-rm-right-pane fill:#f9f,stroke:#333,stroke-width:4px
```
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts
index aedcc54a030..719127f837a 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts
@@ -99,6 +99,48 @@ export class ItemsClient{
.catch(error => reject(error));
});
}
+
+ public getFolderMappings(){
+ return new Promise((resolve, reject) => {
+ const url = `${this.requestUrl}GetFolderMappings`;
+ fetch(url, {
+ headers: this.sf.getModuleHeaders(),
+ })
+ .then(response => {
+ if (response.status == 200){
+ response.json().then(data => resolve(data));
+ }
+ else{
+ response.json().then(error => reject(error.message));
+ }
+ })
+ .catch(error => reject(error));
+ });
+ }
+
+ public createNewFolder(request: CreateNewFolderRequest, groupId = 1){
+ return new Promise((resolve, reject) => {
+ const url = `${this.requestUrl}CreateNewFolder`;
+ const headers = this.sf.getModuleHeaders();
+ headers.append("groupId", groupId.toString());
+ headers.append("Content-Type", "application/json");
+ fetch(url, {
+ method: "POST",
+ body: JSON.stringify(request),
+ headers,
+ })
+ .then(response => {
+ if (response.status == 200){
+ response.json().then(data => resolve(data));
+ }
+ else{
+ response.json().then(error => reject(error.ExceptionMessage || error.message));
+ }
+ })
+ .catch(reason => reject(reason));
+
+ });
+ }
}
export interface GetFolderContentResponse{
@@ -145,4 +187,45 @@ export interface Item{
export interface SearchResponse{
items: Item[],
totalCount: number,
+}
+
+export interface FolderMappingInfo{
+ /** The ID of the folder mapping. */
+ FolderMappingID: number;
+ /** The provider type name such as "AzureFolderProvider" */
+ FolderProviderType: string;
+ /** True if this is the default provider type. */
+ IsDefault: boolean;
+ /** A friendly name for this mapping type. */
+ MappingName: string;
+ /** A url that allows editing this folder mapping. */
+ editUrl: string;
+}
+
+export interface CreateNewFolderRequest{
+ /** Gets or sets the new folder name. */
+ FolderName: string;
+
+ /** Gets or sets he parent folder id for the new folder. */
+ ParentFolderId: number;
+
+ /** Gets or sets the folder mapping id. */
+ FolderMappingId: number;
+
+ /** Gets or sets the optional mapped path. */
+ MappedName?: string;
+}
+
+export interface CreateNewFolderResponse{
+ /** The ID of the recently created folder. */
+ FolderID: number;
+
+ /** The created folder name. */
+ FolderName: string,
+
+ /** The url to the folder icon. */
+ IconUrl: string;
+
+ /** The ID of the folder mapping. */
+ FolderMappingID: number,
}
\ No newline at end of file
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/LocalizationClient.ts b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/LocalizationClient.ts
index c0f0d8448dd..e30b0fe894b 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/LocalizationClient.ts
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/LocalizationClient.ts
@@ -110,6 +110,7 @@ export interface LocalizedStrings {
RemoveFolderType: String;
RemoveFolderTypeDialogBody: String;
RemoveFolderTypeDialogHeader: String;
+ MappedPath: String;
MoveItem: String;
NewLocation: String;
SortField_ItemName: String;
diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/utilities/selection-utilities.ts b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/utilities/selection-utilities.ts
index 0bc5b2abc99..252ef90a694 100644
--- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/utilities/selection-utilities.ts
+++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/utilities/selection-utilities.ts
@@ -1,16 +1,24 @@
import {Item} from "../services/ItemsClient";
import state from "../store/store";
-export function isItemSelected(item: Item)
-{
- return state.selectedItems && state.selectedItems.includes(item);
-}
+/** Various utilities that help with current selection of items. */
+class SelectionUtilities{
+
+ /** Check if an item is currently selected */
+ public isItemSelected(item: Item)
+ {
+ return state.selectedItems && state.selectedItems.includes(item);
+ }
-export function toggleItemSelected(item: Item): void {
- if (isItemSelected(item)){
+ /** Toggles the selection of an item. */
+ public toggleItemSelected(item: Item): void {
+ if (this.isItemSelected(item)){
state.selectedItems = state.selectedItems.filter(i => i != item);
}
else{
state.selectedItems = [...state.selectedItems, item];
}
- }
\ No newline at end of file
+ }
+}
+
+export const selectionUtilities = new SelectionUtilities();
\ No newline at end of file