From cb6465d8bd0c29730d34860785a874203fe0019c Mon Sep 17 00:00:00 2001 From: Dave Wilson Date: Fri, 19 May 2017 15:09:30 +0100 Subject: [PATCH] Add protection to items which are not available when running in nodejs --- package.json | 6 +++--- src/components/body/body-cell.component.ts | 1 + .../body/body-row-wrapper.component.ts | 1 + src/components/body/body-row.component.ts | 1 + src/components/body/body.component.ts | 1 + src/components/body/scroller.component.ts | 2 ++ src/components/body/selection.component.ts | 1 + src/components/datatable.component.ts | 1 + src/components/header/header-cell.component.ts | 2 +- src/components/header/header.component.ts | 1 + src/directives/draggable.directive.ts | 1 + src/directives/long-press.directive.ts | 1 + src/directives/resizeable.directive.ts | 1 + src/events.ts | 4 ++++ src/utils/elm-from-point.ts | 4 +++- src/utils/prefixes.ts | 18 ++++++++++-------- src/utils/translate.ts | 2 +- 17 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 src/events.ts diff --git a/package.json b/package.json index 4a7928051..901e3f77c 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "build:aot": "ngc", "build:sass": "node-sass -r build/ -o build/", "build:css": "postcss --use autoprefixer dist/*.css -d dist/", - "copy:build": "cpx 'src/**/*' 'build'", - "copy:styles": "cpx 'build/**/*.css' 'release'", + "copy:build": "cpx -v \"src/**/*\" \"build\"", + "copy:styles": "cpx -v \"build/**/*.css\" \"release\"", "watch": "webpack --display-error-details --watch", "start": "webpack-dev-server", "start:hmr": "webpack-dev-server --env.HMR", @@ -126,7 +126,7 @@ "tslint-config-swimlane": "^3.0.0", "tslint-loader": "^3.5.3", "typescript": "^2.2.2", - "uglifyjs": "^2.4.10", + "uglifyjs": "~2.4.10", "url-loader": "^0.5.8", "webpack": "^2.4.1", "webpack-combine-loaders": "^2.0.3", diff --git a/src/components/body/body-cell.component.ts b/src/components/body/body-cell.component.ts index 7fba618b6..dee795e29 100644 --- a/src/components/body/body-cell.component.ts +++ b/src/components/body/body-cell.component.ts @@ -6,6 +6,7 @@ import { import { Keys } from '../../utils'; import { SortDirection } from '../../types'; import { TableColumn } from '../../types/table-column.type'; +import { MouseEvent, KeyboardEvent } from '../../events'; @Component({ selector: 'datatable-body-cell', diff --git a/src/components/body/body-row-wrapper.component.ts b/src/components/body/body-row-wrapper.component.ts index 7597d0fd2..9ae0c07cb 100644 --- a/src/components/body/body-row-wrapper.component.ts +++ b/src/components/body/body-row-wrapper.component.ts @@ -1,6 +1,7 @@ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core'; +import { MouseEvent } from '../../events'; @Component({ selector: 'datatable-row-wrapper', diff --git a/src/components/body/body-row.component.ts b/src/components/body/body-row.component.ts index ac4c42312..a2bf959bd 100644 --- a/src/components/body/body-row.component.ts +++ b/src/components/body/body-row.component.ts @@ -6,6 +6,7 @@ import { columnsByPin, columnGroupWidths, columnsByPinArr, translateXY, Keys } from '../../utils'; import { ScrollbarHelper } from '../../services'; +import { MouseEvent, KeyboardEvent } from '../../events'; @Component({ selector: 'datatable-body-row', diff --git a/src/components/body/body.component.ts b/src/components/body/body.component.ts index 1cb080738..b4ccb1820 100644 --- a/src/components/body/body.component.ts +++ b/src/components/body/body.component.ts @@ -4,6 +4,7 @@ import { import { translateXY, columnsByPin, columnGroupWidths, RowHeightCache } from '../../utils'; import { SelectionType } from '../../types'; import { ScrollerComponent } from './scroller.component'; +import { MouseEvent } from '../../events'; @Component({ selector: 'datatable-body', diff --git a/src/components/body/scroller.component.ts b/src/components/body/scroller.component.ts index e590429d4..224bef327 100644 --- a/src/components/body/scroller.component.ts +++ b/src/components/body/scroller.component.ts @@ -3,6 +3,8 @@ import { OnInit, OnDestroy, HostBinding } from '@angular/core'; +import { MouseEvent } from '../../events'; + @Component({ selector: 'datatable-scroller', template: ` diff --git a/src/components/body/selection.component.ts b/src/components/body/selection.component.ts index c178adb7e..78bc138f8 100644 --- a/src/components/body/selection.component.ts +++ b/src/components/body/selection.component.ts @@ -1,6 +1,7 @@ import { Component, Input, Output, EventEmitter } from '@angular/core'; import { Keys, selectRows, selectRowsBetween } from '../../utils'; import { SelectionType } from '../../types'; +import { MouseEvent, KeyboardEvent } from '../../events'; export interface Model { type: string; diff --git a/src/components/datatable.component.ts b/src/components/datatable.component.ts index 86a019714..52a6192d7 100644 --- a/src/components/datatable.component.ts +++ b/src/components/datatable.component.ts @@ -15,6 +15,7 @@ import { DataTableBodyComponent } from './body'; import { DataTableColumnDirective } from './columns'; import { DatatableRowDetailDirective } from './row-detail'; import { DatatableFooterDirective } from './footer'; +import { MouseEvent } from '../events'; @Component({ selector: 'ngx-datatable', diff --git a/src/components/header/header-cell.component.ts b/src/components/header/header-cell.component.ts index c3c77b884..7842ec7b8 100644 --- a/src/components/header/header-cell.component.ts +++ b/src/components/header/header-cell.component.ts @@ -1,9 +1,9 @@ import { Component, Input, EventEmitter, Output, HostBinding, HostListener } from '@angular/core'; - import { SortDirection, SortType, SelectionType, TableColumn } from '../../types'; import { nextSortDir } from '../../utils'; +import { MouseEvent } from '../../events'; @Component({ selector: 'datatable-header-cell', diff --git a/src/components/header/header.component.ts b/src/components/header/header.component.ts index 1d02fb234..a6dae3b7b 100644 --- a/src/components/header/header.component.ts +++ b/src/components/header/header.component.ts @@ -4,6 +4,7 @@ import { import { SortType, SelectionType } from '../../types'; import { columnsByPin, columnGroupWidths, columnsByPinArr, translateXY } from '../../utils'; import { DataTableColumnDirective } from '../columns'; +import { MouseEvent } from '../../events'; @Component({ selector: 'datatable-header', diff --git a/src/directives/draggable.directive.ts b/src/directives/draggable.directive.ts index 2c735476b..7572ae5b3 100644 --- a/src/directives/draggable.directive.ts +++ b/src/directives/draggable.directive.ts @@ -4,6 +4,7 @@ import { import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription'; import 'rxjs/add/operator/takeUntil'; +import { MouseEvent } from '../events'; /** * Draggable Directive for Angular2 diff --git a/src/directives/long-press.directive.ts b/src/directives/long-press.directive.ts index c6a7aa7de..b0dd6ddd3 100644 --- a/src/directives/long-press.directive.ts +++ b/src/directives/long-press.directive.ts @@ -5,6 +5,7 @@ import { import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription'; import 'rxjs/add/operator/takeUntil'; +import { MouseEvent } from './../events'; @Directive({ selector: '[long-press]' }) export class LongPressDirective implements OnDestroy { diff --git a/src/directives/resizeable.directive.ts b/src/directives/resizeable.directive.ts index 934352c67..3a77f8f6f 100644 --- a/src/directives/resizeable.directive.ts +++ b/src/directives/resizeable.directive.ts @@ -3,6 +3,7 @@ import { } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription'; +import { MouseEvent } from '../events'; import 'rxjs/add/operator/takeUntil'; @Directive({ diff --git a/src/events.ts b/src/events.ts new file mode 100644 index 000000000..626a29608 --- /dev/null +++ b/src/events.ts @@ -0,0 +1,4 @@ +declare let global:any; + +export const MouseEvent = (global as any).MouseEvent as MouseEvent; +export const KeyboardEvent = (global as any).KeyboardEvent as KeyboardEvent; diff --git a/src/utils/elm-from-point.ts b/src/utils/elm-from-point.ts index 20f887ea1..31f7118a9 100644 --- a/src/utils/elm-from-point.ts +++ b/src/utils/elm-from-point.ts @@ -1,4 +1,4 @@ -if (!document.elementsFromPoint) { +if (document !== undefined && !document.elementsFromPoint) { document.elementsFromPoint = elementsFromPoint; } @@ -22,6 +22,8 @@ export function elementsFromPoint(x: number, y: number) { let i; let d; + //if (document === undefined) return elements; + // get all elements via elementFromPoint, and remove them from hit-testing in order while ((current = document.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current != null) { diff --git a/src/utils/prefixes.ts b/src/utils/prefixes.ts index add98f54a..97b472959 100644 --- a/src/utils/prefixes.ts +++ b/src/utils/prefixes.ts @@ -1,32 +1,34 @@ import { camelCase } from './camel-case'; const cache = {}; -const testStyle = document.createElement('div').style; +const testStyle = document !== undefined ? document.createElement('div').style : undefined; // Get Prefix // http://davidwalsh.name/vendor-prefix const prefix = (function() { - const styles = window.getComputedStyle(document.documentElement, ''); - const pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/))[1]; - const dom = ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1]; + const styles = window !== undefined ? window.getComputedStyle(document.documentElement, '') : undefined; + const pre = styles !== undefined ? (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/))[1] : undefined; + const dom = pre !== undefined ? ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1] : undefined; - return { + return dom ? { dom, lowercase: pre, css: `-${pre}-`, js: pre[0].toUpperCase() + pre.substr(1) - }; + } : undefined; })(); export function getVendorPrefixedName(property: string) { const name = camelCase(property); - if(!cache[name]) { - if(testStyle[prefix.css + property] !== undefined) { + + if(!cache[name]) { + if(prefix !== undefined && testStyle[prefix.css + property] !== undefined) { cache[name] = prefix.css + property; } else if(testStyle[property] !== undefined) { cache[name] = property; } + } return cache[name]; diff --git a/src/utils/translate.ts b/src/utils/translate.ts index 9fe023ba3..f53b98c01 100644 --- a/src/utils/translate.ts +++ b/src/utils/translate.ts @@ -6,7 +6,7 @@ const transform = getVendorPrefixedName('transform'); const backfaceVisibility = getVendorPrefixedName('backfaceVisibility'); const hasCSSTransforms = !!getVendorPrefixedName('transform'); const hasCSS3DTransforms = !!getVendorPrefixedName('perspective'); -const ua = window.navigator.userAgent; +const ua = window ? window.navigator.userAgent : "Chrome"; const isSafari = (/Safari\//).test(ua) && !(/Chrome\//).test(ua); export function translateXY(styles: any, x: number, y: number) {