Skip to content

Commit

Permalink
Merge pull request #17860 from abpframework/issue/17854
Browse files Browse the repository at this point in the history
Add `FileUtilsService` to provide utility methods for file operations
  • Loading branch information
masum-ulu committed Oct 17, 2023
2 parents 56b0405 + 69b92e5 commit b10a4a0
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 2 deletions.
41 changes: 41 additions & 0 deletions docs/en/UI/Angular/Abp-Window-Service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Abp Window Service


## Download Blob as File
AbpWindowService is an Angular service designed to provide utility methods related to window operations. The service has a `downloadBlob` function, which is used for downloading blobs as files within the context of a web application.

### Usage

To make use of the `AbpWindowService` in your Angular application, follow the steps below:

### Injection
Firstly, ensure that the service is injected into the component or any other Angular entity where you wish to use it.

```js
import { AbpWindowService } from '@abp/ng.core';

constructor(private abpWindowService: AbpWindowService) { }
// or
// private abpWindowService = inject(AbpWindowService)
```

### Downloading a Blob

Once you have the service injected, you can use the downloadBlob method to initiate the download of blob data as a file. For instance:

```js
someMethod() {
const myBlob = new Blob(["Hello, World!"], { type: "text/plain" });
this.abpWindowService.downloadBlob(myBlob, "hello.txt");
}
```

### Permissions & Considerations

Ensure that you have appropriate permissions and user interactions before triggering a download. Since downloadBlob initiates a download programmatically, it's best to tie this action to direct user interactions, such as button clicks, to prevent unexpected behaviors or browser restrictions.


### DOCUMENT Token in Service

Angular, being a platform-agnostic framework, is designed to support not only browser-based applications but also other environments like server-side rendering (SSR) through Angular Universal. This design philosophy introduces challenges when accessing global browser-specific objects like window or document directly. To address this, Angular provides a DOCUMENT token that can be used to inject the document object into Angular entities like components and services.

4 changes: 4 additions & 0 deletions docs/en/docs-nav.json
Original file line number Diff line number Diff line change
Expand Up @@ -1153,6 +1153,10 @@
{
"text": "Content Security Strategy",
"path": "UI/Angular/Content-Security-Strategy.md"
},
{
"text":"Abp Window Service",
"path":"UI/Angular/Abp-Window-Service.md"
}
]
},
Expand Down
2 changes: 1 addition & 1 deletion npm/ng-packs/packages/core/src/lib/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ export * from './subscription.service';
export * from './track-by.service';
export * from './local-storage.service';
export * from './window.service';
export * from './internet-connection-service'
export * from './internet-connection-service'
20 changes: 19 additions & 1 deletion npm/ng-packs/packages/core/src/lib/services/window.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { DOCUMENT } from '@angular/common';

@Injectable({ providedIn: 'root' })
export class AbpWindowService {
protected readonly window = inject(DOCUMENT).defaultView;
protected readonly document = inject(DOCUMENT);
protected readonly window = this.document.defaultView;
protected readonly navigator = this.window.navigator;

copyToClipboard(text: string): Promise<void> {
Expand All @@ -17,4 +18,21 @@ export class AbpWindowService {
reloadPage(): void {
this.window.location.reload();
}
downloadBlob(blob: Blob, fileName: string) {
const blobUrl = this.window.URL.createObjectURL(blob);
const a = this.document.createElement('a');
a.style.display = 'none';
a.href = blobUrl;
a.download = fileName;
this.document.body.appendChild(a);
a.dispatchEvent(
new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: this.window,
}),
);
this.window.URL.revokeObjectURL(blobUrl);
this.document.body.removeChild(a);
}
}

0 comments on commit b10a4a0

Please sign in to comment.