Skip to content

Commit

Permalink
Added default visibility command provider.
Browse files Browse the repository at this point in the history
  • Loading branch information
azaslonov committed Sep 14, 2024
1 parent c5667aa commit 30b0c9a
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 89 deletions.
17 changes: 14 additions & 3 deletions src/button/buttonHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,34 @@
import { IContextCommandSet } from "@paperbits/common/ui";
import { deleteWidgetCommand, openWidgetEditorCommand, splitter, switchToParentCommand } from "@paperbits/common/ui/commands";
import { ButtonModel } from "./buttonModel";
import { IVisibilityCommandProvider } from "../security/visibilityContextCommandProvider";
import { IVisibilityContextCommandProvider } from "../security/visibilityContextCommandProvider";


export class ButtonHandlers implements IWidgetHandler<ButtonModel> {
constructor(private readonly visibilityCommandProvider: IVisibilityCommandProvider) { }
constructor(private readonly visibilityCommandProvider: IVisibilityContextCommandProvider) { }

public async getWidgetModel(): Promise<ButtonModel> {
return new ButtonModel();
}

public getContextCommands(context: WidgetContext): IContextCommandSet {
const visibilityCommand = this.visibilityCommandProvider.create(context);

const selectCommands = [
openWidgetEditorCommand(context, "Edit button"),
splitter(),
switchToParentCommand(context),
];

if (visibilityCommand) {
selectCommands.push(visibilityCommand);
}

const contextualEditor: IContextCommandSet = {
selectCommands: [
openWidgetEditorCommand(context, "Edit button"),
splitter(),
switchToParentCommand(context),
this.visibilityCommandProvider.create(context),
// openHelpArticleCommand(context, "/widgets/button")
],
deleteCommand: deleteWidgetCommand(context)
Expand Down
23 changes: 15 additions & 8 deletions src/menu/menuHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
import { IContextCommandSet } from "@paperbits/common/ui";
import { deleteWidgetCommand, openWidgetEditorCommand, splitter, switchToParentCommand } from "@paperbits/common/ui/commands";
import { MenuModel } from "./menuModel";
import { IVisibilityCommandProvider } from "../security/visibilityContextCommandProvider";
import { IVisibilityContextCommandProvider } from "../security/visibilityContextCommandProvider";

export class MenuHandlers implements IWidgetHandler<MenuModel> {
constructor(private readonly visibilityCommandProvider: IVisibilityCommandProvider) { }
constructor(private readonly visibilityCommandProvider: IVisibilityContextCommandProvider) { }

public async getWidgetOrder(): Promise<IWidgetOrder<MenuModel>> {
const widgetOrder: IWidgetOrder<MenuModel> = {
Expand All @@ -20,14 +20,21 @@ export class MenuHandlers implements IWidgetHandler<MenuModel> {
}

public getContextCommands(context: WidgetContext): IContextCommandSet {
const visibilityCommand = this.visibilityCommandProvider.create(context);

const selectCommands = [
openWidgetEditorCommand(context, "Edit menu"),
splitter(),
switchToParentCommand(context),
];

if (visibilityCommand) {
selectCommands.push(visibilityCommand);
}

const contextualEditor: IContextCommandSet = {
color: "#2b87da",
selectCommands: [
openWidgetEditorCommand(context, "Edit menu"),
splitter(),
switchToParentCommand(context),
this.visibilityCommandProvider.create(context),
],
selectCommands: selectCommands,
deleteCommand: deleteWidgetCommand(context)
};

Expand Down
85 changes: 47 additions & 38 deletions src/section/sectionHandlers.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import * as Utils from "@paperbits/common/utils";
import { IContextCommandSet, View, ViewManager } from "@paperbits/common/ui";
import { IContextCommand, IContextCommandSet, View, ViewManager } from "@paperbits/common/ui";
import { IWidgetHandler, WidgetContext } from "@paperbits/common/editing";
import { SectionModel } from "./sectionModel";
import { RowModel } from "../row/rowModel";
import { EventManager, Events } from "@paperbits/common/events";
import { SectionModelBinder } from "./sectionModelBinder";
import { IVisibilityCommandProvider } from "../security/visibilityContextCommandProvider";
import { IVisibilityContextCommandProvider } from "../security/visibilityContextCommandProvider";
import { switchToChildCommand } from "@paperbits/common/ui/commands";


Expand All @@ -14,10 +14,53 @@ export class SectionHandlers implements IWidgetHandler<SectionModel> {
private readonly viewManager: ViewManager,
private readonly eventManager: EventManager,
private readonly sectionModelBinder: SectionModelBinder,
private readonly visibilityCommandProvider: IVisibilityCommandProvider,
private readonly visibilityCommandProvider: IVisibilityContextCommandProvider,
) { }

public getContextCommands(context: WidgetContext): IContextCommandSet {
const selectCommands: IContextCommand[] = [
{
controlType: "toolbox-button",
displayName: "Edit section",
position: "top right",
color: "#2b87da",
callback: () => this.viewManager.openWidgetEditor(context.binding)
},
{
controlType: "toolbox-splitter",
},
{
controlType: "toolbox-button",
tooltip: "Add to library",
iconClass: "paperbits-icon paperbits-simple-add",
position: "top right",
color: "#2b87da",
callback: () => {
const sectionContract = this.sectionModelBinder.modelToContract(<SectionModel>context.model);

const view: View = {
heading: "Add to library",
component: {
name: "add-block-dialog",
params: {
blockContract: sectionContract,
blockType: "layout-section"
}
},
resizing: "vertically horizontally"
};

this.viewManager.openViewAsPopup(view);
}
},
];

const visibilityCommand = this.visibilityCommandProvider.create(context);

if (visibilityCommand) {
selectCommands.push(visibilityCommand);
}

const contextualCommands: IContextCommandSet = {
color: "#2b87da",
hoverCommands: [{
Expand Down Expand Up @@ -65,41 +108,7 @@ export class SectionHandlers implements IWidgetHandler<SectionModel> {
this.viewManager.clearContextualCommands();
}
},
selectCommands: [{
controlType: "toolbox-button",
displayName: "Edit section",
position: "top right",
color: "#2b87da",
callback: () => this.viewManager.openWidgetEditor(context.binding)
},
{
controlType: "toolbox-splitter",
},
{
controlType: "toolbox-button",
tooltip: "Add to library",
iconClass: "paperbits-icon paperbits-simple-add",
position: "top right",
color: "#2b87da",
callback: () => {
const sectionContract = this.sectionModelBinder.modelToContract(<SectionModel>context.model);

const view: View = {
heading: "Add to library",
component: {
name: "add-block-dialog",
params: {
blockContract: sectionContract,
blockType: "layout-section"
}
},
resizing: "vertically horizontally"
};

this.viewManager.openViewAsPopup(view);
}
},
this.visibilityCommandProvider.create(context)]
selectCommands: selectCommands
};

if (context.model.widgets.length === 0) {
Expand Down
12 changes: 12 additions & 0 deletions src/security/defaultVisibilityCommandProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { WidgetContext } from "@paperbits/common/editing";
import { IContextCommand } from "@paperbits/common/ui";
import { IVisibilityContextCommandProvider } from "./visibilityContextCommandProvider";

/**
* Default visibility command provider. Returns null, which means that no visibility command will be displayed.
*/
export class DefaultVisibilityCommandProvider implements IVisibilityContextCommandProvider {
public create(context: WidgetContext): IContextCommand {
return null;
}
}
10 changes: 10 additions & 0 deletions src/security/roleBasedSecurity.design.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { RoleBasedSecuredBindingHandler } from "../ko/bindingHandlers/bindingHan
import { AccessContextToolButton } from "../workshops/accessContextToolbutton";
import { RoleBasedSecurityModelEditor } from "../workshops/roles/ko/roleBasedSecurityModelEditor";
import { RoleBasedSecurityModelEditorProvider } from "./roleBasedSecurityModelEditorProvider";
import { DefaultVisibilityCommandProvider } from "./defaultVisibilityCommandProvider";


export class RoleBasedSecurityDesignModule implements IInjectorModule {
Expand All @@ -15,3 +16,12 @@ export class RoleBasedSecurityDesignModule implements IInjectorModule {
injector.bindToCollection("autostart", RoleBasedSecuredBindingHandler);
}
}

export class NoOpSecurityDesignModule implements IInjectorModule {
register(injector: IInjector): void {
injector.bindSingleton("visibilityCommandProvider", DefaultVisibilityCommandProvider);
injector.bind("securityModelEditor", RoleBasedSecurityModelEditor);
injector.bindSingleton("securityModelBinder", RoleBasedSecurityModelBinder);
injector.bindToCollection("autostart", RoleBasedSecuredBindingHandler);
}
}
41 changes: 32 additions & 9 deletions src/security/roleBasedSecurityModelEditorProvider.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,42 @@
import { ViewManager, IContextCommand } from "@paperbits/common/ui";
import { ViewManager, IContextCommand, IComponent } from "@paperbits/common/ui";
import { WidgetContext } from "@paperbits/common/editing";
import {
createSecurityModelEditorComponent,
createStandardVisibilityCommand,
IVisibilityCommandProvider
} from "./visibilityContextCommandProvider";
import { IVisibilityContextCommandProvider } from "./visibilityContextCommandProvider";
import { SecurityModelEditor } from "./securityModelEditor";

export class RoleBasedSecurityModelEditorProvider implements IVisibilityCommandProvider {
export class RoleBasedSecurityModelEditorProvider implements IVisibilityContextCommandProvider {
constructor(private readonly viewManager: ViewManager) { }

private createStandardVisibilityCommand(callback: IContextCommand["callback"], overrides?: Partial<Exclude<IContextCommand, "callback">>): IContextCommand {
return {
controlType: "toolbox-button",
tooltip: "Change access",
iconClass: "paperbits-icon paperbits-a-security",
position: "top right",
color: "#607d8b",
...overrides,
callback,
};
}

private createSecurityModelEditorComponent(context: WidgetContext, componentSelector: string): IComponent {
const securityModelEditorParams: SecurityModelEditor = {
securityModel: context.binding.model.security,
onChange: (securityModel): void => {
context.binding.model.security = securityModel;
context.binding.applyChanges(context.model);
},
};
return {
name: componentSelector,
params: securityModelEditorParams,
};
}

public create(context: WidgetContext): IContextCommand {
return createStandardVisibilityCommand(() =>
return this.createStandardVisibilityCommand(() =>
this.viewManager.openViewAsPopup({
heading: `Access control`,
component: createSecurityModelEditorComponent(context, "role-based-security-model-editor"),
component: this.createSecurityModelEditorComponent(context, "role-based-security-model-editor"),
resizing: "vertically horizontally",
}));
}
Expand Down
42 changes: 11 additions & 31 deletions src/security/visibilityContextCommandProvider.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,14 @@
import { WidgetContext } from "@paperbits/common/editing";
import { IContextCommand } from "@paperbits/common/ui/IContextCommandSet";
import { IComponent } from "@paperbits/common/ui/IComponent";
import { SecurityModelEditor } from "./securityModelEditor";
import { IContextCommand } from "@paperbits/common/ui";

export interface IVisibilityCommandProvider {
/**
* Provider for visibility context command. Using widget context, it determines whether visibility command
* should be displayed for the given widget.
*/
export interface IVisibilityContextCommandProvider {
/**
* Creates a visibility command for the given widget context.
* @param context Widget context.
*/
create(context: WidgetContext): IContextCommand;
}

export function createStandardVisibilityCommand(callback: IContextCommand["callback"], overrides?: Partial<Exclude<IContextCommand, "callback">>): IContextCommand {
return {
controlType: "toolbox-button",
tooltip: "Change access",
iconClass: "paperbits-icon paperbits-a-security",
position: "top right",
color: "#607d8b",
...overrides,
callback,
};
}

export function createSecurityModelEditorComponent(context: WidgetContext, componentSelector: string): IComponent {
const securityModelEditorParams: SecurityModelEditor = {
securityModel: context.binding.model.security,
onChange: (securityModel): void => {
context.binding.model.security = securityModel;
context.binding.applyChanges(context.model);
},
};
return {
name: componentSelector,
params: securityModelEditorParams,
};
}
}

0 comments on commit 30b0c9a

Please sign in to comment.