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

c-ngx-grid-layout

v2.0.0

Published

ngx-grid-layout是一个类似于[Gridster](http://dsmorse.github.io/gridster.js/)适用于angular9.X之上。[demo地址](https://ngx-library.now.sh/tools/grid-layout)

Downloads

3

Readme

NgxGridLayout

ngx-grid-layout是一个类似于Gridster适用于angular9.X之上。demo地址

开始使用

  • 安装
  • 使用

内部类型定义

export interface ILayout {
  x: number;
  y: number;
  w: number;
  h: number;
  i: any;
  minW?: number,
  minH?: number,
  maxW?: number,
  maxH?: number,
  moved?: boolean,
  isDraggable?: boolean,
  isResizable?: boolean
  static?: boolean;
}
  
export interface ILayoutCols {
  lg?: number;
  md?: number;
  sm?: number;
  xs?: number;
  xxs?: number;
}

安装

npm i c-ngx-grid-layout

使用

NgxGridLayoutModule应用在SharedModule中;

app.module.ts

// app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { SharedModule } from './shared/shared.module';
import { AppRoutingModule } from './app-routing.module';

import { AppComponent } from './app.component';
import { NotFoundComponent } from './not-found/not-found.component';

@NgModule({
  declarations: [
    AppComponent,
    NotFoundComponent
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    SharedModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

SharedModule.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

import { NgZorroAntdModule } from 'ng-zorro-antd';
import { NgxGridLayoutModule } from 'ngx-grid-layout';

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    RouterModule,
    FormsModule,
    ReactiveFormsModule,
    NgZorroAntdModule,
    NgxGridLayoutModule,
  ],
  exports: [
    NgZorroAntdModule,
    NgxGridLayoutModule,
  ]
})
export class SharedModule { }

开始使用

grid-layout.component.ts

// grid-layout.component.ts
import { Component, OnInit, ViewChild, ElementRef, Renderer2 } from '@angular/core';
// 测试数据
const testLayout = [
  { "x": 0, "y": 0, "w": 2, "h": 2, "i": "0", minW: 3, resizable: false, draggable: false, static: false },
  { "x": 2, "y": 0, "w": 2, "h": 4, "i": "1", resizable: false, draggable: false, static: false },
  { "x": 4, "y": 0, "w": 2, "h": 5, "i": "2", resizable: false, draggable: false, static: false },
  { "x": 6, "y": 0, "w": 2, "h": 3, "i": "3", resizable: false, draggable: false, static: false },
  { "x": 8, "y": 0, "w": 2, "h": 3, "i": "4", resizable: false, draggable: false, static: false },
  { "x": 10, "y": 0, "w": 2, "h": 3, "i": "5", resizable: false, draggable: false, static: false },
  { "x": 0, "y": 5, "w": 2, "h": 5, "i": "6", resizable: false, draggable: false, static: false },
  { "x": 2, "y": 5, "w": 2, "h": 5, "i": "7", resizable: false, draggable: false, static: false },
  { "x": 4, "y": 5, "w": 2, "h": 5, "i": "8", resizable: false, draggable: false, static: false },
  { "x": 6, "y": 3, "w": 2, "h": 4, "i": "9", resizable: false, draggable: false, static: true },
  { "x": 8, "y": 4, "w": 2, "h": 4, "i": "10", resizable: false, draggable: false, static: false },
  { "x": 10, "y": 4, "w": 2, "h": 4, "i": "11", resizable: false, draggable: false, static: false },
  { "x": 0, "y": 10, "w": 2, "h": 5, "i": "12", resizable: false, draggable: false, static: false },
  { "x": 2, "y": 10, "w": 2, "h": 5, "i": "13", resizable: false, draggable: false, static: false },
  { "x": 4, "y": 8, "w": 2, "h": 4, "i": "14", resizable: false, draggable: false, static: false },
  { "x": 6, "y": 8, "w": 2, "h": 4, "i": "15", resizable: false, draggable: false, static: false },
  { "x": 8, "y": 10, "w": 2, "h": 5, "i": "16", resizable: false, draggable: false, static: false },
  { "x": 10, "y": 4, "w": 2, "h": 2, "i": "17", resizable: false, draggable: false, static: false },
  { "x": 0, "y": 9, "w": 2, "h": 3, "i": "18", resizable: false, draggable: false, static: false },
  { "x": 2, "y": 6, "w": 2, "h": 2, "i": "19", resizable: false, draggable: false, static: false }
];

@Component({
  selector: 'app-grid-layout',
  templateUrl: './grid-layout.component.html',
  style: `
    ngx-grid-item {
    background: #ccc;
    border    : 1px solid black;
    text-align: center;
    }
    ngx-grid-layout {
    background-color: #fff;
    }

    .layoutJSON {
    background: #ddd;
    border: 1px solid black;
    margin-top: 10px;
    padding: 10px;
    }

    .columns {
    -moz-columns: 120px;
    -webkit-columns: 120px;
    columns: 120px;
    }

    :host ::ng-deep .ngx-grid-static {
    background-color: #cce;
    }
	`
})
export class GridLayoutComponent implements OnInit {
  @ViewChild('content') public contentEl: ElementRef;
  public layout = JSON.parse(JSON.stringify(testLayout));
  public index: number = 0;
  public draggable = true;
  public resizable = true;
  public mirrored = false;
  public responsive = true;
  public preventCollision = false;
  public rowHeight = 30;
  public colNum = 12;

  constructor(
    private renderer: Renderer2
  ) { }

  ngOnInit() {
    this.index = this.layout.length;
    console.log(this.layout, 'this is demo init layout');
  }

  layoutChanged(layout: any): void {
    console.log('LAYOUT CHANGED:', layout);
  }

  layoutReady(layout: any): void {
    console.log('LAYOUT READY: ', layout);
  }

  containerResized(layoutItem: any): void {
    console.log('CONTAINER RESIZED:', layoutItem);
  }

  public decreaseWidth(): void {
    const conentHtml: HTMLElement = this.contentEl.nativeElement;
    let width = conentHtml.offsetWidth;
    width -= 20;
    this.renderer.setStyle(this.contentEl.nativeElement, 'width', `${width}px`);
  }

  public increaseWidth(): void {
    const conentHtml: HTMLElement = this.contentEl.nativeElement;
    let width = conentHtml.offsetWidth;
    width += 20;
    this.renderer.setStyle(this.contentEl.nativeElement, 'width', `${width}px`);
  }

  public addItem(): void {
    const item = { "x": 0, "y": 0, "w": 2, "h": 2, "i": this.index + "", whatever: "bbb" };
    this.index++;
    this.layout = [...this.layout, item];
  }
  
  trackByFn(index) { return index }
}

grid-layout.compnent.html

<!-- grid-layout.compnent.html 模板 -->
<div #content>
  <ngx-grid-layout
    [(layout)]="layout"
    [colNum]="colNum"
    [rowHeight]="rowHeight"
    [isDraggable]="draggable"
    [isResizable]="resizable"
    [isMirrored]="mirrored"
    [preventCollision]="preventCollision"
    [verticalCompact]="true"
    [useCssTransforms]="true"
    [responsive]="responsive"
    (layoutChanged)="layoutChanged($event)"
    (layoutReady)="layoutReady($event)"
  >
    <ngx-grid-item 
      *ngFor="let item of layout; trackBy: trackByFn"
      [static]="item.static"
      [x]="item.x"
      [y]="item.y"
      [h]="item.h"
      [w]="item.w"
      [i]="item.i"
      [minW]="item.minW"
    >
      <div class="ngx-grid-item-draggable--box">
        {{item.i}}
      </div>
    </ngx-grid-item>
  </ngx-grid-layout>
</div>

ngx-grid-layout API

| name | DESCRIPTION | TYPE | DEFAULT | REQUIRED | | -------------------- | ------------------------------------------------------------ | ------------------------- | ---------- | -------- | | [(layout)] | 数据源; | ILayout[] | - | true | | [colNum] | 定义栅格系统的列数,其值需为自然如 | number | 12 | false | | [rowHeight] | 每行的高度,单位像素 | number | 150 | false | | [margin] | 定义栅格中的元素边距;数组中的一个元素表示水平边距,第二个表示垂直边距,单位为像素 | number[] | [10, 10] | false | | [isDraggable] | 标识栅格中的元素是否可以拖拽。 | boolean | true | false | | [isResizable] | 标识栅格中的元素是否可以调整大小。 | boolean | true | false | | [isMirrored] | 标识栅格中的元素是否可镜像反转。 | boolean | false | false | | [autoSize] | 标识容器是否自动调整大小。 | boolean | true | false | | [verticalCompact] | 标识布局是否垂直压缩。 | boolean | true | false | | [useCssTransforms] | 标识是否使用css属性transition-property: transform | boolean | true | false | | [responsive] | 标识布局是否为响应式。 | boolean | false | false | | (layoutReady) | layout最近加载完成 | EventEmitter<ILayout[]> | - | false | | (layoutChanged) | layout数据有所改变的回调函数。 | EventEmitter<ILayout[]> | - | false |

ngx-grid-item API

| NAME | DESCRIPTION | TYPE | DEFAULT | REQUIRED | | -------------------- | ------------------------------------------------------------ | --------------------------------------------- | ---------- | -------- | | [i] | 栅格中元素的ID | string | - | true | | [x] | 标识栅格元素位于第几列,需为自然数。 | number | - | true | | [y] | 标识栅格元素位于第几行,需为自然数 | number | - | true | | [w] | 标识栅格元素的初始宽度,值为colWidth的倍数。 | number | - | true | | [h] | 标识栅格元素的初始高度,值为rowHeight的倍数。 | number | - | true | | [minW] | 栅格元素的最小宽度,值为colWidth的倍数。如果w小于minW,则minW的值会被w覆盖。 | number | 1 | false | | [minH] | 格栅元素的最小高度,值为rowHeight的倍数。如果h小于minH,则minH的值会被h覆盖。 | number | 1 | false | | [maxW] | 栅格元素的最大宽度,值为colWidth的倍数。如果w大于maxW,则maxW的值会被w覆盖 | number | Infinity | false | | [maxH] | 栅格元素的最大高度,值为rowHeight的倍数。如果h大于maxH,则maxH的值会被h覆盖。 | number | Infinity | false | | [isDraggable] | 标识栅格元素是否可拖拽。如果值为null则取决于父容器。 | boolean | null | false | | [isResizable] | 标识栅格元素是否可调整大小。如果值为null则取决于父容器。 | boolean | null | false | | [static] | 标识栅格元素是否为静态的(无法拖拽、调整大小或被其他元素移动)。 | boolean | false | false | | [dragIgnoreFrom] | 标识栅格元素中哪些子元素无法触发拖拽事件,值为css-like选择器。请参考 interact.js docs中的ignoreFrom。 | string | a,button | false | | [dragAllowFrom] | 标识栅格元素中哪些子元素可以触发拖拽事件,值为css-like选择器。如果值为null则表示所有子元素(dragIgnoreFrom的除外)。请参考 interact.js docs中的allowFrom。 | string | null | false | | [resizeIgnoreFrom] | 标识栅格元素中哪些子元素无法触发调整大小的事件,值为css-like选择器。请参考 interact.js docs中的ignoreFrom。 | string | a,button | false | | (move) | 移动过程中的回调函数 | EventEmitter<{i: string;x:number;y:number}> | - | false | | (moved) | 移动完成的回调 | EventEmitter<{i: string;x:number;y:number}> | - | false | | (resize) | 放大的过程的回调函数 | EventEmitter<{i: string;x:number;y:number}> | - | false | | (resized) | 放大完成的回调函数 | EventEmitter<{i: string;x:number;y:number}> | - | false |