{"id":13497500,"url":"https://github.com/flowjs/ngx-flow","last_synced_at":"2025-04-04T07:06:15.852Z","repository":{"id":18854071,"uuid":"84564253","full_name":"flowjs/ngx-flow","owner":"flowjs","description":"flow.js file upload for angular","archived":false,"fork":false,"pushed_at":"2024-10-24T15:07:53.000Z","size":1563,"stargazers_count":60,"open_issues_count":10,"forks_count":19,"subscribers_count":14,"default_branch":"master","last_synced_at":"2024-10-29T22:37:19.650Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flowjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-10T13:47:39.000Z","updated_at":"2024-07-23T11:03:21.000Z","dependencies_parsed_at":"2023-11-29T10:40:51.686Z","dependency_job_id":"db994079-d373-4f4a-b662-f692c94f36a2","html_url":"https://github.com/flowjs/ngx-flow","commit_stats":{"total_commits":123,"total_committers":16,"mean_commits":7.6875,"dds":"0.46341463414634143","last_synced_commit":"fa05a90ea87b1322acb561d19815531a22217e01"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowjs%2Fngx-flow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowjs%2Fngx-flow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowjs%2Fngx-flow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowjs%2Fngx-flow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flowjs","download_url":"https://codeload.github.com/flowjs/ngx-flow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247107828,"owners_count":20884797,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T20:00:32.102Z","updated_at":"2025-04-04T07:06:15.838Z","avatar_url":"https://github.com/flowjs.png","language":"JavaScript","readme":"# NgxFlow\n\n[![Build Status](https://travis-ci.com/flowjs/ngx-flow.svg?branch=master)](https://travis-ci.com/flowjs/ngx-flow)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/29153dcefffff1fe5a5c/test_coverage)](https://codeclimate.com/github/flowjs/ngx-flow/test_coverage)\n[![Maintainability](https://api.codeclimate.com/v1/badges/29153dcefffff1fe5a5c/maintainability)](https://codeclimate.com/github/flowjs/ngx-flow/maintainability)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n\nThe purpose of this package is to create a wrapper for Angular for fileupload using [flow.js](https://github.com/flowjs/flow.js).\n\n## Demo\n\n[https://stackblitz.com/edit/ngx-flow-example](https://stackblitz.com/edit/ngx-flow-example)\n\nYou can also find example source code in the `src` folder.\n\n## Roadmap\n\n- ✅ upload single file\n- ✅ upload multiple files\n- ✅ queue management\n- ✅ error handling\n- ✅ pause / resume upload\n- ✅ cancel upload, cancel all uploads\n- ✅ upload progress\n- ✅ file / directory restrictions\n- ✅ drag \u0026 drop\n- ✅ display uploaded image\n- ✅ tests\n- ✅ upload right after selecting file\n- ✅ run tests using TravisCI\n- ✅ demo using Stackblitz\n- ✅ support for server side rendering\n\n## Compatibility\n\n| Angular | @flowjs/ngx-flow |\n| :-----: | :--------------: |\n| 19      | ^19.0.0 |\n| 18      | ^18.0.0 |\n| 17      | 0.8.1   |\n| 16      | 0.7.2   |\n| 15      | \\-      |\n| 14      | 0.6.0   |\n| 13      | 0.5.0   |\n| 12      | \\-      |\n| 6 -\u003e 11 | 0.4.6   |\n\n\n## Install\n\n`npm install @flowjs/flow.js @flowjs/ngx-flow`\n\nImport in your module:\n\n```typescript\nimport { NgxFlowModule, FlowInjectionToken } from '@flowjs/ngx-flow';\nimport Flow from '@flowjs/flow.js';\n\n@NgModule({\n  imports: [NgxFlowModule],\n  providers: [\n    {\n      provide: FlowInjectionToken,\n      useValue: Flow\n    }\n  ]\n})\nexport class AppModule\n```\n\nWe use dependecy injection to provide flow.js library.\n\n## How to use\n\n1. Start up server. There is a server example taken from [flow.js](https://github.com/flowjs/flow.js) here in `server` directory. In this repo you can run it using `npm run server`.\n\n1. First you need to initialize ngx-flow directive and export it as for example `flow` variable:\n\n   ```html\n   \u003cng-container #flow=\"flow\" [flowConfig]=\"{target: 'http://localhost:3000/upload'}\"\u003e\u003c/ng-container\u003e\n   ```\n\n1. Now you can use either directive `flowButton` for select file dialog:\n\n   ```html\n   \u003cinput type=\"file\" flowButton [flow]=\"flow.flowJs\" [flowAttributes]=\"{accept: 'image/*'}\" /\u003e\n   ```\n\n   Or `flowDrop` for drag\u0026drop feature:\n\n   ```html\n   \u003cdiv class=\"drop-area\" flowDrop [flow]=\"flow.flowJs\"\u003e\u003c/div\u003e\n   ```\n\n   For both you have to pass `[flow]=flow.flowJs` where `flow` is template variable exported in step 1.\n\n1. You can than subscribe to observable of transfers:\n\n   ```html\n   \u003cdiv *ngFor=\"let transfer of (flow.transfers$ | async).transfers\"\u003e\u003c/div\u003e\n   ```\n\n1. After adding files you can begin upload using `upload()` method:\n\n   ```html\n   \u003cbutton type=\"button\" (click)=\"flow.upload()\" [disabled]=\"!(flow.somethingToUpload$ | async)\"\u003eStart upload\u003c/button\u003e\n   ```\n\n### How does `transfers$` data look like?\n\nObservable `flow.transfers$` emits state in form:\n\n```typescript\n{\n  totalProgress: 0.5,\n  transfers: [\n    {\n      name: \"somefile.txt\",\n      flowFile: FlowFile,\n      progress: number,\n      error: boolean,\n      paused: boolean,\n      success: boolean,\n      complete: boolean,\n      currentSpeed: number,\n      averageSpeed: number,\n      size: number,\n      timeRemaining: number,\n    },\n    {\n      name: \"uploading.txt\",\n      flowFile: FlowFile,\n      progress: 0.5,\n      error: false,\n      paused: false,\n      success: false,\n      complete: false,\n      currentSpeed: number,\n      averageSpeed: number,\n      size: number,\n      timeRemaining: number,\n    },\n    {\n      name: \"failed-to-upload.txt\",\n      flowFile: FlowFile,\n      progress: number,\n      error: true,\n      paused: false,\n      success: false,\n      complete: true,\n      currentSpeed: number,\n      averageSpeed: number,\n      size: number,\n      timeRemaining: number,\n    }\n    {\n      name: \"uploaded.txt\",\n      flowFile: FlowFile,\n      progress: number,\n      error: false,\n      paused: false,\n      success: true,\n      complete: true,\n      currentSpeed: number,\n      averageSpeed: number,\n      size: number,\n      timeRemaining: number,\n    }\n  ],\n  flow: { /* flow.js instance*/ }\n}\n```\n\n## FAQ\n\n### I need access to flow.js object\n\nYou can find it under `flow` variable.\n\n```html\n\u003cp\u003eIs flowjs supported by the browser? {{flow.flowJs?.support}}\u003c/p\u003e\n```\n\n### I see flickering when upload is in progress\n\nUse `trackBy` for `ngFor`:\n\n```html\n\u003cdiv *ngFor=\"let transfer of (flow.transfers$ | async).transfers; trackBy: trackTransfer\"\u003e\u003c/div\u003e\n```\n\n```typescript\nexport class AppComponent {\n  trackTransfer(transfer: Transfer) {\n    return transfer.id;\n  }\n}\n```\n\n### I need just a single file\n\nAdd `singleFile: true` to your flow config:\n\n```html\n\u003cng-container #flow=\"flow\" [flowConfig]=\"{target: 'http://localhost:3000/upload', singleFile: true}\"\u003e\u003c/ng-container\u003e\n```\n\n### I want to upload whole directory\n\nAdd `flowDirectoryOnly=\"true\"` to your button:\n\n```html\n\u003cinput type=\"file\" flowButton [flow]=\"flow.flowJs\" flowDirectoryOnly=\"true\" [flowAttributes]=\"{accept: 'image/*'}\" /\u003e\n```\n\n### I want to display image which is going to be uploaded\n\nUse directive `flowSrc`:\n\n```html\n\u003cdiv *ngFor=\"let transfer of (flow.transfers$ | async).transfers\"\u003e\n  \u003cimg [flowSrc]=\"transfer\" /\u003e\n\u003c/div\u003e\n```\n\n### How to trigger upload right after picking the file?\n\nSubscribe to `events$`. NgxFlow listens for these events: `filesSubmitted`, `fileRemoved`, `fileRetry`, `fileProgress`, `fileSuccess`, `fileError` of flow.js. Event `fileSubmitted` is fired when user drops or selects a file.\n\n```typescript\nexport class AppComponent implements AfterViewInit, OnDestroy {\n  @ViewChild('flow')\n  flow: FlowDirective;\n\n  autoUploadSubscription: Subscription;\n\n  ngAfterViewInit() {\n    this.autoUploadSubscription = this.flow.events$.subscribe((event) =\u003e {\n      if (event.type === 'filesSubmitted') {\n        this.flow.upload();\n      }\n    });\n  }\n\n  ngOnDestroy() {\n    this.autoUploadSubscription.unsubscribe();\n  }\n}\n```\n\n### Development\n\n`npm run build:lib` - builds the library into dist folder\n\nAfter that you can publish to npm repository from `dist` folder:\n\n```\ncd dist/ngx-flow\nnpm publish\n```\n","funding_links":[],"categories":["Uncategorized","Third Party Components"],"sub_categories":["Uncategorized","File Upload"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowjs%2Fngx-flow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflowjs%2Fngx-flow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowjs%2Fngx-flow/lists"}