npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@mediacologne/ng-utility

v13.2.0

Published

Downloads

19

Readme

@mediacologne/ng-utility

News

  • Achtung! Dies ist eine Angular >= 6 Library!

Installation

Install the NPM Module

$ npm install @mediacologne/ng-utility

Using the Library

Nach der Installation muss die Library durch das Importieren des UtilityModule verfügbar gemacht werden.

// Import your library
import { DataModule } from '@mediacologne/ng-utility';

@NgModule({
  imports: [
    UtilityModule.forRoot({
        logging: {
            enableConsoleRedirection: true,
            enableRemote: true,
            appId: "ApplicationName"
        }
    }),
  ]
})
export class AppModule { }

Polyfills !

Wichtig ist das Hinzufügen folgender Zeile in die ./src/polyfills.ts Datei:

(window as any).global = window;

Documentation

Logging

tbw;

LoadingIndicator

Show a LoadingIndicator with UiUtil.showLoadingIndicator("Einen Moment bitte"); and hide it via //UiUtil.hideLoadingIndicator(); Attention: The old way of showing and hiding a LoadingIndicator via UiUtil.toggleLoadingIndicator(true, "Einen Moment bitte"); is deprecated!

LoadingIndicator for asynchronous Operations in loops

If you have multiple (for example) save operations inside a loop, which are obviously asynchronous, it's difficult to show and hide the LoadingIndicator.
With the incrementIndicator you can define the count of operations and then show the LoadingIndicator

UiUtil.incrementIndicator(3).then(() => {
    console.log("All Operations are finished");
});
UiUtil.showLoadingIndicator("Einen Moment bitte");

Inside the (for example) subscribe method of every (save) operation you have to call the decrementIndicator method. After the internal increment counter has reached 0, the LoadingIndicator will disappear and additionally/optionally the Promise of the incrementIndicator will be called.

ContextMenu

This UtilityModule exports a simple to use ContextMenu based on MatMenu. The following is an example on how to use a simple ContextMenu.

<ul>
    <li [contextmenu]="'mainMenu'" [contextmenuData]="{id: 1, name: 'Tom'}">
        Right click on me
    </li>
</ul>

This is the TriggerElement which opens the ContextMenu on right click. The [contextmenu]="'mainMenu'" specifies which ContextMenu should be opened. The [contextmenuData]="{id: 1, name: 'Tom'}" gives you a way to pass data into the ContextMenu.

<contextmenu [name]="'mainMenu'">
    <ng-template contextmenuContent let-user="contextmenuData">
        <button mat-menu-item (click)="console.log('Click (call the delete method)!', user);">
            <i class="fa fa-trash"></i>
            <span>Löschen</span>
        </button>
    </ng-template>
</contextmenu>

This is the ContextMenu. The [name]="'mainMenu'" specifies the name of the ContextMenu which is used by the TriggerElement. Inside the <ng-template contextmenuContent let-user="contextmenuData"> you can put you ContextMenu content. It's important that the <ng-template> has the contextmenuContent diretive! Via let-user="contextmenuData" you can catch the provided [contextmenuData] from the TriggerElement. The naming of let-user is yours!

Sub Menus

If you want a nested ContextMenu like MatMenu allready supports, I'm sad to tell you that it isn't possible with MatMenu (https://github.com/angular/material2/issues/11880). But! You can open a second ContextMenu inside the ContextMenu with some hacks.

<!-- This is the MainMenu -->
<contextmenu [name]="'mainMenu'">
    <ng-template contextmenuContent let-user="contextmenuData">
        <!-- This button is the TriggerElement* for a second ContextMenu named 'subMenu' -->
        <button mat-menu-item [contextmenu]="'subMenu'" [contextmenuData]="user" [contextmenuEvent]="'click'" [contextmenuStayOpen]="true">Open SubMenu...</button>

    </ng-template>
</contextmenu>

<!-- This is the SubMenu -->
<contextmenu [name]="'subMenu'">
    <ng-template contextmenuContent let-user="contextmenuData">
        <button mat-menu-item [contextmenuForceClose]="'mainMenu'"
                (click)="console.log('SubMenu Clicked')">
            <i class="fa fa-database"></i>
            <span> {{user.name}}</span>
        </button>
    </ng-template>
</contextmenu>

Notice the special directives which are necessary if you want a SubMenu! The [contextmenuEvent]="click" and [contextmenuStayOpen]="true" at the TriggerElement and the [contextmenuForceClose]="'mainMenu'" on the ContextMenu.

Socket Broker

This module comes with built in support for the Socket Broker (mediacologne/internal/application-management-platform/socket-broker).
To enable the feature set the enabled Flag to true

UtilityModule.forRoot({
    socket: {
        appId: 'appId', // replace with your AppId
        enabled: true
    }
})

You can inject the brokerService: BrokerService into your component and start listening for new events with this.brokerService.subscribe('yourEventName', (data) => {}) or emit a new Event with this.brokerService.publish('yourEventName', {your: 'data'});

Associates

The default behaviour of the Socket Broker (on the server-side) is to broadcast all events to all clients with the same appId. If your want to subscribe or publish events only from/ to specific clients, there are different reasons why this is not possible. For example: you will never know the server-side Client-Socket-ID of your target, which should receive your event...

In a situation where you want to build something like a private chat between two specific users, the concept of associates becomes important. Every event can be associated. These associates are something like tagged events which enables a more precise event targeting. Both, the subscribe and publish methods accept a third parameter of a string array, containing the associates (imagine tags).

/**
* Example Client 'Tom'
*/
const loggedInUser = 'tom';
// Associate the chatMessage event with 'sender=tom' and 'receiver=lisa'
brokerService.publish('chatMessage', {messag: 'Hello Tom'}, ['sender='+loggedInUser, 'receiver=lisa']);


/**
* Example Client 'Lisa'
*/
const loggedInUser = 'lisa';
brokerService.subscribe('chatMessage', (data) => {
    console.log('received a private chatMessage for Lisa => ' + data.message);
}, ['receiver='+loggedInUser]);

Default Associates

You can set an array of default associates which are always merged with your given associates and are used in all .publish() and .subscribe() usages.
To set the default associates you can call the static BrokerService.setDefaultAssociates([]).

You can also use BrokerService.setDefaultPublishingAssociates([]) and BrokerService.setDefaultSubscribingAssociates([]) to differ between sending and receiving.