Browse Source

dom strategy service added

feature/ssr-migration-schematic
erdemcaygor 1 year ago
parent
commit
cfb5eee22e
  1. 28
      npm/ng-packs/packages/core/src/lib/services/dom-strategy.service.ts
  2. 36
      npm/ng-packs/packages/core/src/lib/strategies/dom.strategy.ts

28
npm/ng-packs/packages/core/src/lib/services/dom-strategy.service.ts

@ -0,0 +1,28 @@
import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { DomStrategy } from '../strategies';
@Injectable({ providedIn: 'root' })
export class DomStrategyService {
constructor(@Inject(DOCUMENT) private document: Document) {}
afterElement(el: HTMLElement) {
return new DomStrategy(() => el, 'afterend');
}
beforeElement(el: HTMLElement) {
return new DomStrategy(() => el, 'beforebegin');
}
appendToBody() {
return new DomStrategy(() => this.document.body, 'beforeend');
}
appendToHead() {
return new DomStrategy(() => this.document.head, 'beforeend');
}
prependToHead() {
return new DomStrategy(() => this.document.head, 'afterbegin');
}
}

36
npm/ng-packs/packages/core/src/lib/strategies/dom.strategy.ts

@ -1,29 +1,31 @@
import { inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser, DOCUMENT } from '@angular/common';
export class DomStrategy {
private readonly isBrowser: boolean;
constructor(
private targetFactory: () => HTMLElement,
private getTarget: () => HTMLElement,
public position: InsertPosition = 'beforeend',
) {
const platformId = inject(PLATFORM_ID);
this.isBrowser = isPlatformBrowser(platformId);
}
) {}
insertElement<T extends HTMLElement>(element: T) {
if (this.isBrowser) {
const target = this.targetFactory();
if (typeof document !== 'undefined') {
const target = this.getTarget();
target.insertAdjacentElement(this.position, element);
}
}
}
export const DOM_STRATEGY = {
AfterElement: (el: HTMLElement) => new DomStrategy(() => el, 'afterend'),
BeforeElement: (el: HTMLElement) => new DomStrategy(() => el, 'beforebegin'),
AppendToBody: () => new DomStrategy(() => inject(DOCUMENT).body, 'beforeend'),
AppendToHead: () => new DomStrategy(() => inject(DOCUMENT).head, 'beforeend'),
PrependToHead: () => new DomStrategy(() => inject(DOCUMENT).head, 'afterbegin'),
AfterElement(element: HTMLElement) {
return new DomStrategy(() => element, 'afterend');
},
AppendToBody() {
return new DomStrategy(() => document?.body, 'beforeend');
},
AppendToHead() {
return new DomStrategy(() => document?.head, 'beforeend');
},
BeforeElement(element: HTMLElement) {
return new DomStrategy(() => element, 'beforebegin');
},
PrependToHead() {
return new DomStrategy(() => document?.head, 'afterbegin');
},
};

Loading…
Cancel
Save