mirror of
https://github.com/goharbor/harbor.git
synced 2024-09-29 22:07:32 +02:00
add third party lib
This commit is contained in:
parent
969066f2c7
commit
0623ef460e
@ -36,7 +36,6 @@
|
|||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
"mutationobserver-shim": "^0.3.2",
|
"mutationobserver-shim": "^0.3.2",
|
||||||
"ngx-clipboard": "^8.0.2",
|
|
||||||
"ngx-cookie": "^1.0.0",
|
"ngx-cookie": "^1.0.0",
|
||||||
"rxjs": "^5.0.1",
|
"rxjs": "^5.0.1",
|
||||||
"ts-helpers": "^1.1.1",
|
"ts-helpers": "^1.1.1",
|
||||||
|
@ -19,25 +19,24 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/vmware/harbor#readme",
|
"homepage": "https://github.com/vmware/harbor#readme",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/animations": "~4.1.3",
|
"@angular/animations": "^4.0.1",
|
||||||
"@angular/common": "~4.1.3",
|
"@angular/common": "^4.0.1",
|
||||||
"@angular/compiler": "~4.1.3",
|
"@angular/compiler": "^4.0.1",
|
||||||
"@angular/core": "~4.1.3",
|
"@angular/core": "^4.0.1",
|
||||||
"@angular/forms": "~4.1.3",
|
"@angular/forms": "^4.0.1",
|
||||||
"@angular/http": "~4.1.3",
|
"@angular/http": "^4.0.1",
|
||||||
"@angular/platform-browser": "~4.1.3",
|
"@angular/platform-browser": "^4.0.1",
|
||||||
"@angular/platform-browser-dynamic": "~4.1.3",
|
"@angular/platform-browser-dynamic": "^4.0.1",
|
||||||
"@angular/router": "~4.1.3",
|
"@angular/router": "^4.0.1",
|
||||||
"@ngx-translate/core": "^6.0.0",
|
"@ngx-translate/core": "^6.0.0",
|
||||||
"@ngx-translate/http-loader": "0.0.3",
|
"@ngx-translate/http-loader": "0.0.3",
|
||||||
"@webcomponents/custom-elements": "1.0.0-alpha.3",
|
"@webcomponents/custom-elements": "1.0.0-alpha.3",
|
||||||
"clarity-angular": "~0.9.8",
|
"clarity-angular": "^0.9.8",
|
||||||
"clarity-icons": "~0.9.8",
|
"clarity-icons": "^0.9.8",
|
||||||
"clarity-ui": "~0.9.8",
|
"clarity-ui": "^0.9.8",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
"mutationobserver-shim": "^0.3.2",
|
"mutationobserver-shim": "^0.3.2",
|
||||||
"ngx-clipboard": "^8.0.2",
|
|
||||||
"ngx-cookie": "^1.0.0",
|
"ngx-cookie": "^1.0.0",
|
||||||
"rxjs": "^5.0.1",
|
"rxjs": "^5.0.1",
|
||||||
"ts-helpers": "^1.1.1",
|
"ts-helpers": "^1.1.1",
|
||||||
|
@ -18,7 +18,6 @@ export default {
|
|||||||
'@ngx-translate/core',
|
'@ngx-translate/core',
|
||||||
'@ngx-translate/http-loader',
|
'@ngx-translate/http-loader',
|
||||||
'ngx-cookie',
|
'ngx-cookie',
|
||||||
'ngx-clipboard',
|
|
||||||
'rxjs',
|
'rxjs',
|
||||||
'rxjs/Rx',
|
'rxjs/Rx',
|
||||||
'rxjs/Subject',
|
'rxjs/Subject',
|
||||||
@ -36,7 +35,6 @@ export default {
|
|||||||
'@angular/http': 'ng.http',
|
'@angular/http': 'ng.http',
|
||||||
'@angular/platform-browser': 'ng.platformBrowser',
|
'@angular/platform-browser': 'ng.platformBrowser',
|
||||||
'@angular/router': 'ng.router',
|
'@angular/router': 'ng.router',
|
||||||
'ngx-clipboard': 'ngx.clipboard',
|
|
||||||
'clarity-angular': 'ng.clarity',
|
'clarity-angular': 'ng.clarity',
|
||||||
'ngx-cookie': 'ngx.cookie',
|
'ngx-cookie': 'ngx.cookie',
|
||||||
'@ngx-translate/core': 'ngx.translate',
|
'@ngx-translate/core': 'ngx.translate',
|
||||||
|
@ -13,4 +13,5 @@ export * from './list-replication-rule/index';
|
|||||||
export * from './replication/index';
|
export * from './replication/index';
|
||||||
export * from './vulnerability-scanning/index';
|
export * from './vulnerability-scanning/index';
|
||||||
export * from './i18n/index';
|
export * from './i18n/index';
|
||||||
export * from './push-image/index';
|
export * from './push-image/index';
|
||||||
|
export * from './third-party/index';
|
@ -9,7 +9,7 @@ import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|||||||
import { TranslatorJsonLoader } from '../i18n/local-json.loader';
|
import { TranslatorJsonLoader } from '../i18n/local-json.loader';
|
||||||
import { IServiceConfig, SERVICE_CONFIG } from '../service.config';
|
import { IServiceConfig, SERVICE_CONFIG } from '../service.config';
|
||||||
import { CookieService, CookieModule } from 'ngx-cookie';
|
import { CookieService, CookieModule } from 'ngx-cookie';
|
||||||
import { ClipboardModule } from 'ngx-clipboard';
|
import { ClipboardModule } from '../third-party/ngx-clipboard/index';
|
||||||
|
|
||||||
/*export function HttpLoaderFactory(http: Http) {
|
/*export function HttpLoaderFactory(http: Http) {
|
||||||
return new TranslateHttpLoader(http, 'i18n/lang/', '-lang.json');
|
return new TranslateHttpLoader(http, 'i18n/lang/', '-lang.json');
|
||||||
|
2
src/ui_ng/lib/src/third-party/index.ts
vendored
Normal file
2
src/ui_ng/lib/src/third-party/index.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './ngx-window-token/index';
|
||||||
|
export * from './ngx-clipboard/index';
|
49
src/ui_ng/lib/src/third-party/ngx-clipboard/clipboard.directive.ts
vendored
Normal file
49
src/ui_ng/lib/src/third-party/ngx-clipboard/clipboard.directive.ts
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { ClipboardService } from './clipboard.service';
|
||||||
|
import { Directive, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output, Renderer, ElementRef } from '@angular/core';
|
||||||
|
|
||||||
|
@Directive({
|
||||||
|
selector: '[ngxClipboard]'
|
||||||
|
})
|
||||||
|
export class ClipboardDirective implements OnInit, OnDestroy {
|
||||||
|
@Input('ngxClipboard') public targetElm: HTMLInputElement;
|
||||||
|
|
||||||
|
@Input() public cbContent: string;
|
||||||
|
|
||||||
|
@Output() public cbOnSuccess: EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
|
||||||
|
@Output() public cbOnError: EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
constructor(
|
||||||
|
private clipboardSrv: ClipboardService,
|
||||||
|
private renderer: Renderer
|
||||||
|
|
||||||
|
) { }
|
||||||
|
|
||||||
|
public ngOnInit() { }
|
||||||
|
|
||||||
|
public ngOnDestroy() {
|
||||||
|
this.clipboardSrv.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostListener('click', ['$event.target']) private onClick(button: ElementRef) {
|
||||||
|
if (!this.clipboardSrv.isSupported) {
|
||||||
|
this.handleResult(false, undefined);
|
||||||
|
} else if (this.targetElm && this.clipboardSrv.isTargetValid(this.targetElm)) {
|
||||||
|
this.handleResult(this.clipboardSrv.copyFromInputElement(this.targetElm, this.renderer),
|
||||||
|
this.targetElm.value);
|
||||||
|
} else if (this.cbContent) {
|
||||||
|
this.handleResult(this.clipboardSrv.copyFromContent(this.cbContent, this.renderer), this.cbContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fires an event based on the copy operation result.
|
||||||
|
* @param {Boolean} succeeded
|
||||||
|
*/
|
||||||
|
private handleResult(succeeded: Boolean, copiedContent: string) {
|
||||||
|
if (succeeded) {
|
||||||
|
this.cbOnSuccess.emit({ isSuccess: true, content: copiedContent });
|
||||||
|
} else {
|
||||||
|
this.cbOnError.emit({ isSuccess: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
110
src/ui_ng/lib/src/third-party/ngx-clipboard/clipboard.service.ts
vendored
Normal file
110
src/ui_ng/lib/src/third-party/ngx-clipboard/clipboard.service.ts
vendored
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import { Inject, InjectionToken, Injectable, Optional, Renderer, SkipSelf } from '@angular/core';
|
||||||
|
import { DOCUMENT } from '@angular/platform-browser';
|
||||||
|
import { WINDOW } from "../ngx-window-token/index";
|
||||||
|
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ClipboardService {
|
||||||
|
private tempTextArea: HTMLTextAreaElement;
|
||||||
|
constructor(
|
||||||
|
@Inject(DOCUMENT) private document: any,
|
||||||
|
@Inject(WINDOW) private window: any,
|
||||||
|
) { }
|
||||||
|
public get isSupported(): boolean {
|
||||||
|
return !!this.document.queryCommandSupported && !!this.document.queryCommandSupported('copy');
|
||||||
|
}
|
||||||
|
|
||||||
|
public isTargetValid(element: HTMLInputElement | HTMLTextAreaElement): boolean {
|
||||||
|
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
||||||
|
if (element.hasAttribute('disabled')) {
|
||||||
|
// tslint:disable-next-line:max-line-length
|
||||||
|
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw new Error('Target should be input or textarea');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* copyFromInputElement
|
||||||
|
*/
|
||||||
|
public copyFromInputElement(targetElm: HTMLInputElement | HTMLTextAreaElement, renderer: Renderer): boolean {
|
||||||
|
try {
|
||||||
|
this.selectTarget(targetElm, renderer);
|
||||||
|
const re = this.copyText();
|
||||||
|
this.clearSelection(targetElm, this.window);
|
||||||
|
return re;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a fake textarea element, sets its value from `text` property,
|
||||||
|
* and makes a selection on it.
|
||||||
|
*/
|
||||||
|
public copyFromContent(content: string, renderer: Renderer) {
|
||||||
|
if (!this.tempTextArea) {
|
||||||
|
this.tempTextArea = this.createTempTextArea(this.document, this.window);
|
||||||
|
this.document.body.appendChild(this.tempTextArea);
|
||||||
|
}
|
||||||
|
this.tempTextArea.value = content;
|
||||||
|
return this.copyFromInputElement(this.tempTextArea, renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove temporary textarea if any
|
||||||
|
public destroy() {
|
||||||
|
if (this.tempTextArea) {
|
||||||
|
this.document.body.removeChild(this.tempTextArea);
|
||||||
|
this.tempTextArea = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// select the target html input element
|
||||||
|
private selectTarget(inputElement: HTMLInputElement | HTMLTextAreaElement, renderer: Renderer): number | undefined {
|
||||||
|
renderer.invokeElementMethod(inputElement, 'select');
|
||||||
|
renderer.invokeElementMethod(inputElement, 'setSelectionRange', [0, inputElement.value.length]);
|
||||||
|
return inputElement.value.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
private copyText(): boolean {
|
||||||
|
return this.document.execCommand('copy');
|
||||||
|
}
|
||||||
|
// Removes current selection and focus from `target` element.
|
||||||
|
private clearSelection(inputElement: HTMLInputElement | HTMLTextAreaElement, window: Window) {
|
||||||
|
// tslint:disable-next-line:no-unused-expression
|
||||||
|
inputElement && inputElement.blur();
|
||||||
|
window.getSelection().removeAllRanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a fake textarea for copy command
|
||||||
|
private createTempTextArea(doc: Document, window: Window): HTMLTextAreaElement {
|
||||||
|
const isRTL = doc.documentElement.getAttribute('dir') === 'rtl';
|
||||||
|
let ta: HTMLTextAreaElement;
|
||||||
|
ta = doc.createElement('textarea');
|
||||||
|
// Prevent zooming on iOS
|
||||||
|
ta.style.fontSize = '12pt';
|
||||||
|
// Reset box model
|
||||||
|
ta.style.border = '0';
|
||||||
|
ta.style.padding = '0';
|
||||||
|
ta.style.margin = '0';
|
||||||
|
// Move element out of screen horizontally
|
||||||
|
ta.style.position = 'absolute';
|
||||||
|
ta.style[isRTL ? 'right' : 'left'] = '-9999px';
|
||||||
|
// Move element to the same position vertically
|
||||||
|
let yPosition = window.pageYOffset || doc.documentElement.scrollTop;
|
||||||
|
ta.style.top = yPosition + 'px';
|
||||||
|
ta.setAttribute('readonly', '');
|
||||||
|
return ta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// this pattern is mentioned in https://github.com/angular/angular/issues/13854 in #43
|
||||||
|
export function CLIPBOARD_SERVICE_PROVIDER_FACTORY(doc: Document, win: Window, parentDispatcher: ClipboardService) {
|
||||||
|
return parentDispatcher || new ClipboardService(doc, win);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const CLIPBOARD_SERVICE_PROVIDER = {
|
||||||
|
provide: ClipboardService,
|
||||||
|
deps: [DOCUMENT, WINDOW, [new Optional(), new SkipSelf(), ClipboardService]],
|
||||||
|
useFactory: CLIPBOARD_SERVICE_PROVIDER_FACTORY
|
||||||
|
};
|
15
src/ui_ng/lib/src/third-party/ngx-clipboard/index.ts
vendored
Normal file
15
src/ui_ng/lib/src/third-party/ngx-clipboard/index.ts
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { ClipboardDirective } from './clipboard.directive';
|
||||||
|
import { CLIPBOARD_SERVICE_PROVIDER } from './clipboard.service';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { WindowTokenModule } from '../ngx-window-token/index';
|
||||||
|
export * from './clipboard.directive';
|
||||||
|
export * from './clipboard.service';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [CommonModule, WindowTokenModule],
|
||||||
|
declarations: [ClipboardDirective],
|
||||||
|
exports: [ClipboardDirective],
|
||||||
|
providers: [CLIPBOARD_SERVICE_PROVIDER]
|
||||||
|
})
|
||||||
|
export class ClipboardModule { }
|
1
src/ui_ng/lib/src/third-party/ngx-window-token/index.ts
vendored
Normal file
1
src/ui_ng/lib/src/third-party/ngx-window-token/index.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { WindowTokenModule, WINDOW } from './window-token';
|
16
src/ui_ng/lib/src/third-party/ngx-window-token/window-token.ts
vendored
Normal file
16
src/ui_ng/lib/src/third-party/ngx-window-token/window-token.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { InjectionToken } from '@angular/core';
|
||||||
|
|
||||||
|
export const WINDOW = new InjectionToken<Window>('WindowToken');
|
||||||
|
|
||||||
|
export function _window(): Window {
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
providers: [{
|
||||||
|
provide: WINDOW,
|
||||||
|
useFactory: _window
|
||||||
|
}]
|
||||||
|
})
|
||||||
|
export class WindowTokenModule { }
|
@ -31,7 +31,7 @@
|
|||||||
"clarity-icons": "^0.9.8",
|
"clarity-icons": "^0.9.8",
|
||||||
"clarity-ui": "^0.9.8",
|
"clarity-ui": "^0.9.8",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"harbor-ui": "^0.2.12",
|
"harbor-ui": "^0.2.13",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
"mutationobserver-shim": "^0.3.2",
|
"mutationobserver-shim": "^0.3.2",
|
||||||
"ngx-clipboard": "^8.0.2",
|
"ngx-clipboard": "^8.0.2",
|
||||||
@ -69,4 +69,4 @@
|
|||||||
"typings": "^1.4.0",
|
"typings": "^1.4.0",
|
||||||
"webdriver-manager": "10.2.5"
|
"webdriver-manager": "10.2.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user