flexing
TypeScript icon, indicating that this package has built-in type declarations

1.0.8 • Public • Published

Flexing

Based on Golden Layout, Glayout allows to use Angular component inside Golden Layout structure

##Installation

Run the command

npm run flexing

Import the Glayout in the main module: import { FlexingModule } from "flexing";

In main module declaration, make sure to insert the Angular Components that would be hosted by the layout inside the entryComponents array.

Using Flexing

Layout components definition

Example:

<flexing-layout name="layout-name" [components]="components"></flexing-layout>

name is needed as an id for the Glayout component

components is an array of WidgetConfig element (see next paragraph)

Component Definition

Glayout component has to be provided with an array of WidgetConfig in its input attribute components

Here it is an example of WidgetConfig element:

    {
         componentName: "ExampleComponent", //unique identifier of the component
         component: ExampleComponent, // the Angular Component to be hosted
         title: "Example", //the default tab title
         icon: "fa fa-circle", // the component icon that can be used in the component selector menu (see relative section)
         listeners: [
             {
               event: "eventName",
               callback(data) {
                   this.getInstance().text = data;
               }
             }
           ], //an array of listeners for events emitted from other components
         tabActions: [
            {
              label: "Link...",
              icon: "fa fa-link",
              action: (widgetApi) => {
                  widgetApi.link();
              }
            }
         ], //the array of actions that will be represented as buttons in the tab
         menuActions: [
            {
              label: "Change name",
              icon: "fa fa-pencil",
              action: (widgetApi) => {
                  widgetApi.setTitle("Menu Title");
              }
            },
         ] //the array of actions that will be represented in the tab dropdown menu
    }

Actions

Every action has to implement the ActionItem interface

interface ActionItem {
  label: string; //The displayed name of the action
  icon?: string; // The displayed icon of the action
  iconColor?: string; //The color of the icon. If not defined, it is the same of the text(see Theming section)
  action: (widgetApi: WidgetApi)=>void; //the function executed on action click
}

Listeners

Listeners have to implement Listener interface

interface Listener {
  event: string;
  callback: Function;
}

Component API

The Component API contains methods to operate on a generic component:

setTitle(title: string) //sets a new title for the component tab
getTitle() //returns current component tab title
link() //starts linking process for current component (see "Linking Components" paragraph)
unlink() //detaches current component from its source (see "Linking Components" paragraph)
getInstance() //returns the component instance
setTabActions(actions: Array<ActionItem>) //sets Tab Actions
setMenuActions(actions: Array<ActionItem>) //sets Menu Actions

Layout API

The Layout API contains methods to operate on layouts defined in the application.

To use Layout API, import FlexingLayoutApi in the component who will use it:

import { FlexingLayoutApi } from "flexing"

These are the available calls for Layout API:

getLayoutState(name: string) //returns the object representing the specified layout state
setLayoutState(layout: string, layoutConfig: GoldenLayout.Config) //sets the layout configuration for the specified layout
getRegisteredComponents(layout: string) //returns the available layout components for the specified layout

Components Menu Definition

To retrieve the components array for a certain layout:

import FlexingLayoutApi in the component hosting the menu:

import { FlexingLayoutApi } from "flexing"

call getRegisteredComponents method providing the layout name:

export class MenuComponent{
    menuComponents:Array<WidgetConfig>
    constructor(private glApi: FlexingLayoutApi) {
        ...
        this.menuComponents=glApi.getRegisteredComponents(layoutName);
        ...
    }
}

In the HTML definition of MenuComponent, use flexing-element directive to define draggable elements. When the element representing the component will be dragged on the layout, a new layout component will be created

<div *ngFor="let c of components" flexing-element layout="layout" [component]="c">
    <i [class]=c.icon></i>
    <span>{{ c.title }}</span>
</div>

Linking components

Glayout allows to link different components with an event-based system. In order to link two components, there has to be a match between the events emitted by the "source" (defined through @Output decorator in the Angular component) and the listeners array defined in the layout component definition: if the listening component has at least a listener that matches an event emitted by the source, the link can be created.

To link a component to a source, a "link" action has to be defined in the tabAction or in the menuAction of the component.

Example:

{
    label: "Link...",
    icon: "fa fa-link",
    action: (widgetApi) => {
      widgetApi.link();
    }
  }

During runtime, the possible sources for the selected component will be highlighted. The link is created by linking on the source component.

The relationship will be signaled in the components tab: the source will have a full circle icon on the left of the tab title, the listener will have a full ring of the same color.

To remove a link, an "unlink" action has to be defined in the listening component.

Example:

{
    label: "Unlink",
    icon: "fa fa-cancel",
    action: (widgetApi) {
      widgetApi.unlink();
    }
  }

Theming

It is possible to customize the default theme overriding the SASS variables

Variable Scope
$font-family font family
$font-size font size
$active-title Color of active tab title
$menu-item-color Color of text in the action menu
$core-bg-color Color of flexing-layout background
$splitter-color Color of the splitter between components on hover
$overlay-panel-color Highlighting color of components while linking
$overlay-panel-color-hover Highlighting color of components on hover

Readme

Keywords

none

Package Sidebar

Install

npm i flexing

Weekly Downloads

0

Version

1.0.8

License

ISC

Unpacked Size

542 kB

Total Files

31

Last publish

Collaborators

  • iboffa