From 8784e520a5880aa0a964249930d98cdb6283c8cc Mon Sep 17 00:00:00 2001 From: Timo Date: Wed, 7 Apr 2021 22:47:18 +0300 Subject: [PATCH] csv import sample --- .dev/export_summary.csv | 5 + .tmp/ar-overlay-position.ts | 121 ---------- .tmp/ar-tooltip/ar-tooltip.directive.ts | 127 ----------- .tmp/ar-tooltip/ar-tooltip.module.ts | 24 -- .tmp/ar-tooltip/index.ts | 3 - .tmp/ar-tooltip/tooltip-content/index.ts | 2 - .../tooltip-content.component.html | 10 - .../tooltip-content.component.scss | 22 -- .../tooltip-content.component.ts | 19 -- .../tooltip-content/tooltip.model.ts | 4 - .../src/app/modules/admin/admin.module.ts | 3 +- ...ttributes-csv-import-dialog.component.html | 83 +++++++ ...ttributes-csv-import-dialog.component.scss | 88 ++++++++ ...-attributes-csv-import-dialog.component.ts | 48 ++++ ...e-attributes-listing-screen.component.html | 9 + ...e-attributes-listing-screen.component.scss | 5 + ...ile-attributes-listing-screen.component.ts | 8 + .../services/admin-dialog-service.service.ts | 24 ++ apps/red-ui/src/assets/i18n/en.json | 15 ++ apps/red-ui/src/assets/styles/red-input.scss | 10 + package.json | 212 +++++++++--------- yarn.lock | 12 +- 22 files changed, 408 insertions(+), 446 deletions(-) create mode 100644 .dev/export_summary.csv delete mode 100644 .tmp/ar-overlay-position.ts delete mode 100644 .tmp/ar-tooltip/ar-tooltip.directive.ts delete mode 100644 .tmp/ar-tooltip/ar-tooltip.module.ts delete mode 100644 .tmp/ar-tooltip/index.ts delete mode 100644 .tmp/ar-tooltip/tooltip-content/index.ts delete mode 100644 .tmp/ar-tooltip/tooltip-content/tooltip-content.component.html delete mode 100644 .tmp/ar-tooltip/tooltip-content/tooltip-content.component.scss delete mode 100644 .tmp/ar-tooltip/tooltip-content/tooltip-content.component.ts delete mode 100644 .tmp/ar-tooltip/tooltip-content/tooltip.model.ts create mode 100644 apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.html create mode 100644 apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.scss create mode 100644 apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts diff --git a/.dev/export_summary.csv b/.dev/export_summary.csv new file mode 100644 index 000000000..c568dbe49 --- /dev/null +++ b/.dev/export_summary.csv @@ -0,0 +1,5 @@ +PMRA Document Number,GAP Active Ingredient,Regulatory Utility,Document Comment,SIC Number,Protocol Number,Protocol Number,Data Evaluation Record,Audience,Original Retirement Date,Regulatory Released,Regulatory Authority,Regulatory Authority (legacy to remove),Source Owner,Legacy Primary OECD Code,Legacy Source Organisation,Regulator Comments,Contains Registered Composition?,File Name,FTP Source Location,Submission Format Needed,Legacy Report Number,Sales Unit,Address,ANVISA Process Number,Source Number,Legacy Migration Path,Review Completion Date,Registration Number,Agency Dossier Registration Type,Submission Version,Media Comments,Literature Citation,Document Language,Notes,Study Location,Materials,Approver,Subtype,Test Facility,Is Latest Version,Consumer,Classification,Guideline,TRP Type,Legacy System Date,Function,Artist,Document Title,PI Number,Legacy Version Description,PI Number,Incoming from,Annotations (Unresolved),Work To Date,Copyright Clearance Obtained?,Summary Type,Annotations (Claim Links),Latest Source Minor Version,Regulatory Category,SYN Letter Number,Work From Date,Product,Version Creation Date,Governance Committee,Test Facility (legacy to remove),Regulatory Finalization Date,Imported file?,Status,Information Tracking Submission Package,Approval Type,Media Description,Duration,Legacy System,Archive Date,Exporting country,Regulatory Tracking Number,Annotations (Anchors),Information Tracking,Document Number,GAP Usage Information,Report Number,Legacy Reg Document Number,Legal Representative 2,Registering Company,File Created By,Legacy EPA Decision Code,Meeting Minutes,Product Safety Finalization Date,Report Type,Archived Date,Legacy Other PMRA Data Codes,Template Document Type,Color Space,Legal Representative 1,Document Author,CrossLink,Annotations (Notes),Suggested Links,Assessment Type,Legacy Species Commodity,TK Number,Legacy Test Facilities,Planned Completion Date,PRF Number,Registration Item Country,Legacy Target Species,Legacy Owning Organisation,Archive Number,Protocol Type,Submission Output Format,Submission Date,Coordinator,Regulatory Reporting Date,Annotations (Lines),Field Trial Number,Batch Number,Legacy Version Number,External ID,Author Names,Sponsor Organisation (legacy to remove),Literature Type,Sponsor Organisation,Legacy Crop Host,Document Edition,Agreement Expiry Date,TRP Usage,Legacy EPA Submission Type,Security Classification,Source Document Name,Syngenta Address,Outgoing to (legacy to remove),Link Status,Legacy System Document ID,Copyright,PMRA Registration Number,Annotations (All),SU,Source Vault Name,Latest Source Major Version,Legacy Other OECD Codes,Version Created By,Subarea,Reviewer,Owning Organisation (legacy to remove),Project,Viewer,Regulatory Territory,Lifecycle,Claims,Bound Source Minor Version,Global ID,Legacy Regulatory Authorities,Outgoing to,Additional Information,Year,Organism,File Last Modified By,Requires Attachment of a Signature Page?,Source Binding Rule,Destination country,Cross-Reference Submission Number,Name,Issue Topic,Pages,Type,Reason for Retiring,Rule,Type of Review,Original Finalization Date,Trade Name,Transmittal Document,Pages OCR'ed (%),Legacy Object ID(s),Protocol Number,Last Modified By,Annotations (Approved Links),Request Type,Binder,Author,Last Modified Date,Non-English Document Title,Media Location,Created By,Editor,Owner,CRO Report Number,Format,Legacy Discipline,Major Version Number,Created From,Active Ingredients,Archive Location,EPA Registration Number,Retirement Date,Annotations (Links),TRP Document,Finalization Date,Legacy Task Number,Legal Details,OCR Requested,Global Version ID,Publicly Published,Document Date,MRID Number,Legacy Reg Topic,Requires Review and Approval?,Annotations (Auto Links),Subareas,Product Safety Reporting Date,Media Title,Minor Version Number,Legacy Primary PMRA Data Code,Requestor,Owning Organisation,Zone,File Last Modified Date,Contact Person,File Created Date,Amendment Justification,CDPR Number,Legacy EPA Submission Date,Supports Agency Dossier,Field Trial Year,Reason for Un-retiring,TRP Topic,Bound Source Major Version,Keywords,Legacy Author Name(s),Export File Name,Size,Source Link,This content is a translation?,Quality Assurance Standard,Legacy Fed Reg Number,Checksum,Created Date,Annotations (Resolved),User Task,Review Start Date,test list,Incoming from (legacy to remove),Rendition Profile,Path,URL +,,Country Specific,,,,,No,,,Yes,,,,,Syngenta,,,Lambda-cyhalothrin - EU AIR5 - Document A - Statement of the context in which the dossier is submit.doc,,,,,,,,,,,,,,,English,,,PP321,,Authority Form / Document,,TRUE,"All Internal Users, Syngenta Read Only Restricted, Syngenta Read Only Non Restricted",,,,16/07/2019,,,Lambda-cyhalothrin - EU AIR5 - Document A - Statement of the context in which the dossier is submitted,PI0015818,,,,0,,,,0,,,,,,26/03/2020 14:06 CET,,Syngenta Crop Protection AG (Switzerland),,No,Final,,,,,SmartDoc - EAME,,,,0,IT-624180,VV-731623,,N/A,PP321_12074,,,,,,,,,,,,,B Sochard,No,0,0,,,,,,,,,,,,,,,,0,,,1.0|CURRENT,090100b881afdd91,,Syngenta Crop Protection AG (Switzerland),,Syngenta Crop Protection AG,,Original,,,,Internal Use Only,,,ETL_blank,,090100b881afdd91,,,0,,,,,Berangere Sochard,,,Syngenta Crop Protection AG (Switzerland),,,European Union,General Lifecycle,,,40037_850361,,ETL_blank,,,,,,,,,Lambda-cyhalothrin - EU AIR5 - Document A - Statement of the context in which the dossier is submit,,2,Registration Supporting Documentation,,,,,,No,,090100b881afdd91 (cv),,CP Vault Support,0,,No,,24/02/2021 15:20 CET,,,Vault Migration,"Global Reg Ops, NA Reg Ops, PS Ops, EAME Reg Ops, Syngenta Business Administrator, Berangere Sochard, Simon Baker, Lily Williams, Clive Boxwell, Paul Parsons, Richard MacKenzie, Dan Pickford, Laurence Hand",Vault Migration,,application/msword,Regulatory,2,,PP321,,,,0,No,,PI0015818,,No,40037_850361_1958105,No,01/09/2020,,Regulatory,No,0,,,,0,,,Syngenta Crop Protection AG,,,,,,,,,,,,,,Sochard Berangere,,49152,,No,,,86d75e5da397fdadcd332f92234a4f62,29/11/2019 08:51 CET,0,,,,,,Lambda-cyhalothrin - EU AIR5 - Document A - Statement of the.pdf, +,,Country Specific,,,,,No,,,Yes,,,,,Syngenta,,,Lambda-cyhalothrin - EU AIR5 - MCA Section 5 - Toxicology (1).docx,,,,,,,,,,,,,,,English,,,PP321,,Summary / Overview,,TRUE,"All Internal Users, Syngenta Read Only Non Restricted, Syngenta Read Only Restricted",,,,16/07/2019,,,Lambda-cyhalothrin - EU AIR5 - MCA Section 5 - Toxicology,PI0015818,,,,0,,,OECD Tier 2 Summary,0,,,,,,17/02/2021 22:02 CET,,Syngenta Crop Protection AG (Switzerland),,Yes,Draft,,,,,SmartDoc - EAME,,,,0,IT-615930,VV-729845,,N/A,PP321_12086,,,Syngenta,,,,,,,,,,S Lloyd,No,0,0,,,,,,,,,,,,,,,,0,,,1.0|CURRENT,090100b881afde22,,Syngenta Crop Protection AG (Switzerland),,Syngenta Crop Protection AG,,Original,,,,Internal Use Only,,,,,090100b881afde22,,,0,,,,,Sonia Ellis,,,Syngenta Crop Protection AG (Switzerland),,,European Union,General Lifecycle,,,40037_848583,,,,,,Ellis Sonia (ext) GBGU,,,,,Lambda-cyhalothrin - EU AIR5 - MCA Section 5 - Toxicology,,893,Summary / Assessment,,,,,,No,,090100b881afde22 (cv),,CP Vault Support,0,,No,Syngenta,24/02/2021 15:20 CET,,,Vault Migration,"EAME Reg Ops, Syngenta Business Administrator, PS Ops, NA Reg Ops, Global Reg Ops, Berangere Sochard, Simon Baker, Lily Williams, Clive Boxwell, Paul Parsons, Richard MacKenzie, Dan Pickford, Laurence Hand, Claire McCombie, Elaine Buss",Vault Migration,,application/vnd.openxmlformats-officedocument.wordprocessingml.document,Toxicology,3,,PP321,,,,0,No,,PI0015818,,No,40037_848583_2033983,No,01/09/2020,,Tox,No,0,,,,1,,,Syngenta Crop Protection AG,,17/02/2021 21:35 CET,,04/09/2020 14:34 CEST,,,,,,,,,VV-729845,Lloyd Sara,,5089990,,No,,,3b13f57d1244e77844eba73ce0ae9813,29/11/2019 08:47 CET,0,,,,,,Lambda-cyhalothrin - EU AIR5 - MCA Section 5 - Toxicology.pdf, +,,Country Specific,,,,,No,,,Yes,,,,,Syngenta,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 5 Reference List (1).doc,,,,,,,,,,,,,,,English,,,PP321,,Summary / Overview,,TRUE,"All Internal Users, Syngenta Read Only Restricted, Syngenta Read Only Non Restricted",,,,16/07/2019,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 5 Reference List,PI0015818,,,,0,,,OECD Tier 1 Summary,0,,,,,,12/09/2020 15:48 CEST,,Syngenta Crop Protection AG (Switzerland),,Yes,Final,,,,,SmartDoc - EAME,,,,0,IT-615436,VV-729844,,N/A,PP321_12084,,,,,,,,,,,,,S Ellis,No,0,0,,,,,,,,,,,,,,,,0,,,1.0|CURRENT,090100b881afde20,,Syngenta Crop Protection AG (Switzerland),,Syngenta Crop Protection AG,,Original,,,,Internal Use Only,,,,,090100b881afde20,,,0,,,,,Sonia Ellis,,,Syngenta Crop Protection AG (Switzerland),,,European Union,General Lifecycle,,,40037_848582,,,,,,,,,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 5 Reference List,,147,Summary / Assessment,,,,,,No,,090100b881afde20 (cv),,CP Vault Support,0,,No,,24/02/2021 15:20 CET,,,Vault Migration,"NA Reg Ops, Global Reg Ops, EAME Reg Ops, PS Ops, Syngenta Business Administrator, Berangere Sochard, Paul Parsons",Vault Migration,,application/msword,Toxicology,2,,PP321,,,,0,No,,PI0015818,,No,40037_848582_2001744,No,01/09/2020,,Tox,No,0,,,,0,,,Syngenta Crop Protection AG,,,,,,,,,,,,,,Ellis Sonia,,651264,,No,,,eb0fdf698b528b67f54635395ec7fb52,29/11/2019 08:47 CET,0,,,,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 5 Reference List.pdf, +,,Country Specific,,,,,No,,,Yes,,,,,Syngenta,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 4 Reference List (5).doc,,,,,,,,,,,,,,,English,,,PP321,,Summary / Overview,,TRUE,"All Internal Users, Syngenta Read Only Restricted, Syngenta Read Only Non Restricted",,,,16/07/2019,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 4 Reference List,PI0015818,,,,0,,,OECD Tier 1 Summary,0,,,,,,21/09/2020 15:21 CEST,,Syngenta Crop Protection AG (Switzerland),,Yes,Final,,,,,SmartDoc - EAME,,,,0,IT-618210,VV-729843,,N/A,PP321_12083,,,,,,,,,,,,,S Ellis,No,0,0,,,,,,,,,,,,,,,,0,,,1.0|CURRENT,090100b881afde1f,,Syngenta Crop Protection AG (Switzerland),,Syngenta Crop Protection AG,,Original,,,,Internal Use Only,,,,,090100b881afde1f,,,0,,,,,Sonia Ellis,,,Syngenta Crop Protection AG (Switzerland),,,European Union,General Lifecycle,,,40037_848581,,,,,,,,,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 4 Reference List,,151,Summary / Assessment,,,,,,No,,090100b881afde1f (cv),,CP Vault Support,0,,No,,24/02/2021 15:20 CET,,,Vault Migration,"EAME Reg Ops, Global Reg Ops, PS Ops, Syngenta Business Administrator, NA Reg Ops, Berangere Sochard, Melanie Bottoms, Dan Pickford, Lynda Farrelly",Vault Migration,,application/msword,Chemistry - Regulatory,2,,PP321,,,,0,No,,PI0015818,,No,40037_848581_2003177,No,01/09/2020,,Chem - Analytical Methods,No,0,,,,0,,,Syngenta Crop Protection AG,,,,,,,,,,,,,,Ellis Sonia,,699392,,No,,,2c476f477f6e2b55ecb537683f5d1cee,29/11/2019 08:47 CET,0,,,,,,Lambda-cyhalothrin - EU AIR5 - LCA Section 4 Reference List.pdf, diff --git a/.tmp/ar-overlay-position.ts b/.tmp/ar-overlay-position.ts deleted file mode 100644 index f91f888e2..000000000 --- a/.tmp/ar-overlay-position.ts +++ /dev/null @@ -1,121 +0,0 @@ -import {ConnectedPosition} from '@angular/cdk/overlay'; -import {isArray} from 'rxjs/internal-compatibility'; - -export declare type Placement = 'auto' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left-top' | 'left-bottom' | 'right-top' | 'right-bottom'; -export declare type PlacementArray = Placement | Array; - -export class ArOverlayPosition { - - private static readonly _offsetYVal = 7; - - public static TOP_LEFT: ConnectedPosition = { - originX: 'end', - originY: 'top', - overlayX: 'end', - overlayY: 'bottom', - offsetY: -ArOverlayPosition._offsetYVal - }; - - public static TOP_RIGHT: ConnectedPosition = { - originX: 'start', - originY: 'top', - overlayX: 'start', - overlayY: 'bottom', - offsetY: -ArOverlayPosition._offsetYVal - }; - - public static BOTTOM_LEFT: ConnectedPosition = { - originX: 'end', - originY: 'bottom', - overlayX: 'end', - overlayY: 'top', - offsetY: ArOverlayPosition._offsetYVal - }; - - public static BOTTOM_RIGHT: ConnectedPosition = { - originX: 'start', - originY: 'bottom', - overlayX: 'start', - overlayY: 'top', - offsetY: ArOverlayPosition._offsetYVal - }; - - public static LEFT_TOP: ConnectedPosition = { - originX: 'start', - originY: 'top', - overlayX: 'end', - overlayY: 'top', - offsetX: -ArOverlayPosition._offsetYVal - }; - - public static LEFT_BOTTOM: ConnectedPosition = { - originX: 'start', - originY: 'bottom', - overlayX: 'end', - overlayY: 'bottom', - offsetX: -ArOverlayPosition._offsetYVal - }; - - public static RIGHT_TOP: ConnectedPosition = { - originX: 'end', - originY: 'top', - overlayX: 'start', - overlayY: 'top', - offsetX: ArOverlayPosition._offsetYVal - }; - - public static RIGHT_BOTTOM: ConnectedPosition = { - originX: 'end', - originY: 'bottom', - overlayX: 'start', - overlayY: 'bottom', - offsetX: ArOverlayPosition._offsetYVal - }; - - public static getConnectedPosition(position: PlacementArray): ConnectedPosition[] { - if (isArray(position)) { - return Array.from(position).map(pos => this.getPosition(pos as Placement)); - } else if (position === 'auto') { - return this.getAutoPosition(); - } else { - return [this.getPosition(position as Placement)]; - } - } - - private static getPosition(position: Placement) { - switch (position) { - case 'top': - return ArOverlayPosition.TOP_RIGHT; - case 'bottom': - return ArOverlayPosition.BOTTOM_RIGHT; - case 'left': - return ArOverlayPosition.LEFT_TOP; - case 'right': - return ArOverlayPosition.RIGHT_TOP; - case 'top-left': - return ArOverlayPosition.TOP_LEFT; - case 'top-right': - return ArOverlayPosition.TOP_RIGHT; - case 'bottom-left': - return ArOverlayPosition.BOTTOM_LEFT; - case 'bottom-right': - return ArOverlayPosition.BOTTOM_RIGHT; - case 'left-top': - return ArOverlayPosition.LEFT_TOP; - case 'left-bottom': - return ArOverlayPosition.LEFT_BOTTOM; - case 'right-top': - return ArOverlayPosition.RIGHT_TOP; - case 'right-bottom': - return ArOverlayPosition.RIGHT_BOTTOM; - } - } - - private static getAutoPosition(): ConnectedPosition[] { - return [ArOverlayPosition.TOP_LEFT, ArOverlayPosition.TOP_RIGHT, - ArOverlayPosition.BOTTOM_LEFT, ArOverlayPosition.BOTTOM_RIGHT, - ArOverlayPosition.LEFT_TOP, ArOverlayPosition.LEFT_BOTTOM, - ArOverlayPosition.RIGHT_TOP, ArOverlayPosition.RIGHT_BOTTOM - ]; - } -} diff --git a/.tmp/ar-tooltip/ar-tooltip.directive.ts b/.tmp/ar-tooltip/ar-tooltip.directive.ts deleted file mode 100644 index 8023191e9..000000000 --- a/.tmp/ar-tooltip/ar-tooltip.directive.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { - ComponentRef, - Directive, - ElementRef, - HostListener, - Input, - OnChanges, - OnDestroy, - OnInit, - SimpleChanges -} from '@angular/core'; -import {Overlay, OverlayPositionBuilder, OverlayRef} from '@angular/cdk/overlay'; -import {ComponentPortal} from '@angular/cdk/portal'; -import {TooltipContentComponent} from './tooltip-content/tooltip-content.component'; -import {TooltipModel} from './tooltip-content/tooltip.model'; -import {ArOverlayPosition, Placement} from '../../common/model/ar-overlay-position'; -import {NavigationStart, Router} from '@angular/router'; - -@Directive({ - selector: '[upExtTooltip]', - exportAs: 'upExtTooltip' -}) -export class ArTooltipDirective implements OnInit, OnChanges, OnDestroy { - - @Input() upExtTooltip: string | TooltipModel; - - @Input() placement: Placement = 'top'; - - private overlayRef: OverlayRef; - private tooltipRef: ComponentRef; - - private _enable = true; - protected test:string; - - constructor(protected overlayPositionBuilder: OverlayPositionBuilder, - protected router: Router, - protected elementRef: ElementRef, - protected overlay: Overlay) { - } - - ngOnInit(): void { - this.router.events.subscribe(event => { - if (event instanceof NavigationStart) { - this.destroyOverlay(); - } - }); - } - - ngOnChanges(changes: SimpleChanges): void { - if (this.tooltipRef && this.upExtTooltip) { - this.tooltipRef.instance.tooltip = this.upExtTooltip instanceof TooltipModel ? this.upExtTooltip : new TooltipModel(null, this.upExtTooltip); - } - } - - ngOnDestroy(): void { - this.destroyOverlay(); - } - - @HostListener('mouseover', ['$event']) - show($event) { - if (this._enable) { - $event.stopPropagation(); - $event.preventDefault(); - this.open(); - } - } - - open(model?: TooltipModel) { - if (!this.overlayRef) { - this.createOverlay(); - } - - if (model) { - this.upExtTooltip = model; - } - if (this.upExtTooltip) { - this.overlayRef.detach(); - const tooltipPortal = new ComponentPortal(TooltipContentComponent); - this.tooltipRef = this.overlayRef.attach(tooltipPortal); - this.tooltipRef.instance.tooltip = this.upExtTooltip instanceof TooltipModel ? this.upExtTooltip : new TooltipModel(null, this.upExtTooltip); - } - } - - close() { - this.destroyOverlay(); - } - - @HostListener('mouseout') - hideFromMouseOut() { - this.detachOverlay(); - } - - @HostListener('mousedown') - hideFromClick() { - this._enable = false; - this.destroyOverlay(); - } - - @HostListener('mouseup') - _enableTooltip() { - this._enable = true; - } - - private createOverlay() { - const positionStrategy = this.overlayPositionBuilder - .flexibleConnectedTo(this.elementRef) - .withPositions(ArOverlayPosition.getConnectedPosition(this.placement)); - this.overlayRef = this.overlay.create({ - positionStrategy, - scrollStrategy: this.overlay.scrollStrategies.close() - }); - } - - private destroyOverlay() { - if (this.overlayRef) { - this.overlayRef.dispose(); - this.overlayRef = null; - } - } - - private detachOverlay() { - if (this.overlayRef && this.overlayRef.hasAttached()) { - this.overlayRef.detach(); - } - } - -} diff --git a/.tmp/ar-tooltip/ar-tooltip.module.ts b/.tmp/ar-tooltip/ar-tooltip.module.ts deleted file mode 100644 index ad8f97236..000000000 --- a/.tmp/ar-tooltip/ar-tooltip.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {OverlayModule} from '@angular/cdk/overlay'; -import {ArTooltipDirective} from './ar-tooltip.directive'; -import {TooltipContentComponent} from './tooltip-content/tooltip-content.component'; - -@NgModule({ - imports: [ - CommonModule, - OverlayModule, - ], - declarations: [ - ArTooltipDirective, - TooltipContentComponent, - ], - exports: [ - ArTooltipDirective, - ], - entryComponents: [ - TooltipContentComponent, - ] -}) -export class ArTooltipModule { -} diff --git a/.tmp/ar-tooltip/index.ts b/.tmp/ar-tooltip/index.ts deleted file mode 100644 index 891dee5a3..000000000 --- a/.tmp/ar-tooltip/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './ar-tooltip.directive'; -export * from './ar-tooltip.module'; -export * from './tooltip-content/index'; diff --git a/.tmp/ar-tooltip/tooltip-content/index.ts b/.tmp/ar-tooltip/tooltip-content/index.ts deleted file mode 100644 index 897456b22..000000000 --- a/.tmp/ar-tooltip/tooltip-content/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './tooltip-content.component'; -export * from './tooltip.model'; diff --git a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.html b/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.html deleted file mode 100644 index 0580c0afb..000000000 --- a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
{{tooltip.title}}
-
{{tooltip.body}}
-
- -
{{tooltip.title}}
-
{{tooltip.body}}
-
-
diff --git a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.scss b/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.scss deleted file mode 100644 index 11aaad4b8..000000000 --- a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import "../../../../../../../assets/styles/ar-typography"; - -.tooltip-wrapper { - background-color: $aci-white; - box-shadow: 2px 3px 20px 0 rgba(0, 0, 0, 0.1); - padding: 12px 16px; - max-width: 300px; - font-size: 13px; - opacity: 0.95; - - .tooltip-title { - @extend .aci-font-style-f8, .aci-grey-1; - padding-bottom: 4px; - } - - .tooltip-body { - @extend .aci-font-style-f9, .aci-grey-1; - } - -} - - diff --git a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.ts b/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.ts deleted file mode 100644 index c89660bee..000000000 --- a/.tmp/ar-tooltip/tooltip-content/tooltip-content.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {TooltipModel} from './tooltip.model'; - -@Component({ - selector: 'up-ext-tooltip-content', - templateUrl: './tooltip-content.component.html', - styleUrls: ['./tooltip-content.component.scss'] -}) -export class TooltipContentComponent implements OnInit { - - @Input() tooltip: TooltipModel; - - constructor() { - } - - ngOnInit() { - } - -} diff --git a/.tmp/ar-tooltip/tooltip-content/tooltip.model.ts b/.tmp/ar-tooltip/tooltip-content/tooltip.model.ts deleted file mode 100644 index 818aa7742..000000000 --- a/.tmp/ar-tooltip/tooltip-content/tooltip.model.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class TooltipModel { - constructor(public title: string, public body: string) { - } -} diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index eddefe81f..2215a086f 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -31,6 +31,7 @@ import { SmtpAuthDialogComponent } from './dialogs/smtp-auth-dialog/smtp-auth-di import { AddEditUserDialogComponent } from './dialogs/add-edit-user-dialog/add-edit-user-dialog.component'; import { UsersStatsComponent } from './components/users-stats/users-stats.component'; import { ConfirmDeleteUsersDialogComponent } from './dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component'; +import { FileAttributesCsvImportDialogComponent } from './screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component'; const dialogs = [ AddEditRuleSetDialogComponent, @@ -70,7 +71,7 @@ const components = [ ]; @NgModule({ - declarations: [...components], + declarations: [...components, FileAttributesCsvImportDialogComponent], providers: [AdminDialogService], imports: [CommonModule, SharedModule, AdminRoutingModule, AceEditorModule, NgxChartsModule, ColorPickerModule] }) diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.html b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.html new file mode 100644 index 000000000..b1d242679 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.html @@ -0,0 +1,83 @@ +
+
+ +
+
+
+
+ {{ csvFile.name }} +
+
+ {{ 'file-attributes-csv-import.total-rows' | translate: { rows: parseResult?.data?.length } }} +
+
+
+
+ + {{ 'file-attributes-csv-import.key-column' | translate }} + + + {{ field }} + + + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+
+
+ {{ 'file-attributes-csv-import.available' | translate: { value: parseResult?.meta?.fields.length } }} +
+
+ {{ 'file-attributes-csv-import.selected' | translate: { value: selectedFields.length } }} +
+
+
+
+ {{ field }} +
+
+
+
+
+
+ {{ 'file-attributes-csv-import.csv-column' | translate }} +
+
+
+
+
+ +
+
+
+ +
+ + + +
+ + +
diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.scss b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.scss new file mode 100644 index 000000000..ffb9ec981 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.scss @@ -0,0 +1,88 @@ +@import '../../../../../assets/styles/red-variables'; + +.sub-header { + display: flex; + flex-direction: row; + margin-bottom: 25px; + + .left { + width: 375px; + display: flex; + flex-direction: column; + + .large-label { + font-weight: bold; + } + } + + .right { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + + .red-input-group { + margin-left: 8px; + margin-right: 8px; + height: 60px; + } + } +} + +.dialog-content { + padding-bottom: 0; +} + +.csv-part { + margin-left: -32px; + margin-right: -32px; + display: flex; + max-height: calc(90vh - 251px); + + .csv-part-header { + height: 50px; + background: $white; + border-top: 1px solid $grey-4; + border-bottom: 1px solid $grey-4; + display: flex; + align-items: center; + padding-left: 16px; + padding-right: 16px; + } + + .left { + width: 375px; + background: $grey-2; + + .csv-header-pill-content { + overflow: auto; + padding-top: 7px; + padding-bottom: 7px; + background: $grey-2; + height: calc(100% - 65px); + + .csv-header-pill { + height: 32px; + width: 325px; + margin: 3px 10px; + border-radius: 8px; + padding: 10px; + background: $white; + } + } + + border-right: 1px solid $grey-4; + } + + .center { + width: 149px; + background: $grey-2; + border-right: 1px solid $grey-4; + } + + .right { + overflow: auto; + max-width: calc(90vw - 525px); + flex: 1 1 auto; + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts new file mode 100644 index 000000000..7e5b0f0fc --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts @@ -0,0 +1,48 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; +import { FileAttributesControllerService } from '../../../../../../../../libs/red-ui-http/src'; +import { AppStateService } from '../../../../state/app-state.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import * as Papa from 'papaparse'; + +@Component({ + selector: 'redaction-file-attributes-csv-import-dialog', + templateUrl: './file-attributes-csv-import-dialog.component.html', + styleUrls: ['./file-attributes-csv-import-dialog.component.scss'] +}) +export class FileAttributesCsvImportDialogComponent implements OnInit { + public csvFile: File; + public ruleSetId: string; + public parseResult: any; + public encoding = 'UTF-8'; + public delimiter: string = undefined; + + selectedFields: any[] = []; + + constructor( + private readonly _appStateService: AppStateService, + private readonly _formBuilder: FormBuilder, + private readonly _fileAttributesService: FileAttributesControllerService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { csv: File; ruleSetId: string } + ) { + this.csvFile = data.csv; + this.ruleSetId = data.ruleSetId; + + this._readFile(); + } + + ngOnInit(): void {} + + private _readFile() { + const reader = new FileReader(); + reader.addEventListener('load', async (event) => { + const parsedCsv = event.target.result; + this.parseResult = Papa.parse(parsedCsv, { header: true, delimiter: this.delimiter }); + if (!this.delimiter) { + this.delimiter = this.parseResult.meta.delimiter; + } + }); + reader.readAsText(this.csvFile, this.encoding); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html index b4feb342a..72c37c21d 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html @@ -40,6 +40,15 @@
+ + + + { + await this._loadData(); + }); + } } diff --git a/apps/red-ui/src/app/modules/admin/services/admin-dialog-service.service.ts b/apps/red-ui/src/app/modules/admin/services/admin-dialog-service.service.ts index b117385a8..9564a5657 100644 --- a/apps/red-ui/src/app/modules/admin/services/admin-dialog-service.service.ts +++ b/apps/red-ui/src/app/modules/admin/services/admin-dialog-service.service.ts @@ -24,6 +24,14 @@ import { TranslateService } from '@ngx-translate/core'; import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component'; import { AddEditUserDialogComponent } from '../dialogs/add-edit-user-dialog/add-edit-user-dialog.component'; import { ConfirmDeleteUsersDialogComponent } from '../dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component'; +import { FileAttributesCsvImportDialogComponent } from '../screens/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component'; + +const largeDialogConfig = { + width: '90vw', + maxWidth: '90vw', + maxHeight: '90vh', + autoFocus: false +}; const dialogConfig = { width: '662px', @@ -116,6 +124,22 @@ export class AdminDialogService { return ref; } + public openImportFileAttributeCSVDialog(csv: File, ruleSetId: string, cb?: Function): MatDialogRef { + const ref = this._dialog.open(FileAttributesCsvImportDialogComponent, { + ...largeDialogConfig, + data: { csv, ruleSetId }, + autoFocus: true + }); + + ref.afterClosed().subscribe((result) => { + if (result && cb) { + cb(result); + } + }); + + return ref; + } + public openAddEditFileAttributeDialog( fileAttribute: FileAttributeConfig, ruleSetId: string, diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 29b32ce52..f41f85c77 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1092,5 +1092,20 @@ "INACTIVE": "Inactive", "MANAGER_ADMIN": "Manager & Admin", "REGULAR": "Regular" + }, + "file-attributes-csv-import": { + "title": "Select CSV columns to use as File Attributes", + "cancel": "Cancel", + "save": "Save Attributes", + "delimiter": "Delimiter", + "delimiter-placeholder": ",", + "encoding": "Encoding", + "encoding-placeholder": "UTF-8", + "key-column": "Key Column", + "key-column-placeholder": "Select Column ...", + "total-rows": "{{rows}} rows in total", + "available": "{{value}} available", + "selected": "{{value}} selected", + "csv-column": "CSV Column" } } diff --git a/apps/red-ui/src/assets/styles/red-input.scss b/apps/red-ui/src/assets/styles/red-input.scss index 6dc75c330..b3b202b3f 100644 --- a/apps/red-ui/src/assets/styles/red-input.scss +++ b/apps/red-ui/src/assets/styles/red-input.scss @@ -216,6 +216,16 @@ form { max-width: 75px; } + &.w-110 { + width: 110px; + max-width: 110px; + } + + &.w-160 { + width: 160px; + max-width: 160px; + } + &.w-250 { width: 250px; max-width: 250px; diff --git a/package.json b/package.json index 37de64887..c4560050a 100644 --- a/package.json +++ b/package.json @@ -1,109 +1,109 @@ { - "name": "redaction", - "version": "1.0.46", - "private": true, - "license": "MIT", - "scripts": { - "affected": "nx affected", - "affected:apps": "nx affected:apps", - "affected:build": "nx affected:build", - "affected:dep-graph": "nx affected:dep-graph", - "affected:e2e": "nx affected:e2e", - "affected:libs": "nx affected:libs", - "affected:lint": "nx affected:lint", - "affected:test": "nx affected:test", - "build": "nx build", - "build-lint-all": "ng lint --project=red-ui-http --fix && ng build --project=red-ui-http && ng lint --project=red-ui --fix && ng build --project=red-ui --prod", - "dep-graph": "nx dep-graph", - "e2e": "nx e2e", - "format": "nx format:write", - "format:check": "nx format:check", - "format:write": "nx format:write", - "help": "nx help", - "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points", - "lint": "nx workspace-lint && nx lint", - "nx": "nx", - "start": "nx serve", - "test": "nx test", - "update": "nx migrate latest", - "workspace-schematic": "nx workspace-schematic" - }, - "husky": { - "hooks": { - "pre-commit": "pretty-quick --staged && ng lint --project=red-ui-http && ng lint --project=red-ui --fix" + "name": "redaction", + "version": "1.0.46", + "private": true, + "license": "MIT", + "scripts": { + "affected": "nx affected", + "affected:apps": "nx affected:apps", + "affected:build": "nx affected:build", + "affected:dep-graph": "nx affected:dep-graph", + "affected:e2e": "nx affected:e2e", + "affected:libs": "nx affected:libs", + "affected:lint": "nx affected:lint", + "affected:test": "nx affected:test", + "build": "nx build", + "build-lint-all": "ng lint --project=red-ui-http --fix && ng build --project=red-ui-http && ng lint --project=red-ui --fix && ng build --project=red-ui --prod", + "dep-graph": "nx dep-graph", + "e2e": "nx e2e", + "format": "nx format:write", + "format:check": "nx format:check", + "format:write": "nx format:write", + "help": "nx help", + "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points", + "lint": "nx workspace-lint && nx lint", + "nx": "nx", + "start": "nx serve", + "test": "nx test", + "update": "nx migrate latest", + "workspace-schematic": "nx workspace-schematic" + }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged && ng lint --project=red-ui-http && ng lint --project=red-ui --fix" + } + }, + "dependencies": { + "@angular/animations": "~11.0.1", + "@angular/cdk": "~11.0.1", + "@angular/common": "~11.0.1", + "@angular/compiler": "~11.0.1", + "@angular/core": "~11.0.1", + "@angular/forms": "~11.0.1", + "@angular/material": "~11.0.1", + "@angular/material-moment-adapter": "^11.0.2", + "@angular/platform-browser": "~11.0.1", + "@angular/platform-browser-dynamic": "~11.0.1", + "@angular/router": "~11.0.1", + "@angular/service-worker": "~11.0.1", + "@ngx-translate/core": "^13.0.0", + "@ngx-translate/http-loader": "^6.0.0", + "@nrwl/angular": "^10.2.0", + "@pdftron/webviewer": "7.3.0-20210223", + "@swimlane/ngx-charts": "^17.0.0", + "file-saver": "^2.0.2", + "jwt-decode": "^3.0.0", + "keycloak-angular": "^8.0.1", + "keycloak-js": "10.0.2", + "lint-staged": "^10.5.0", + "ng2-ace-editor": "^0.3.9", + "ngp-sort-pipe": "^0.0.4", + "ngx-color-picker": "^10.1.0", + "ngx-dropzone": "^2.2.2", + "ngx-toastr": "^13.0.0", + "papaparse": "^5.3.0", + "rxjs": "~6.6.0", + "scroll-into-view-if-needed": "^2.2.26", + "streamsaver": "^2.0.5", + "tslib": "^2.0.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.1100.2", + "@angular-devkit/build-ng-packagr": "~0.1002.0", + "@angular/cli": "~11.0.2", + "@angular/compiler": "~11.0.1", + "@angular/compiler-cli": "~11.0.1", + "@angular/language-service": "~11.0.2", + "@nrwl/cypress": "10.2.0", + "@nrwl/jest": "10.2.0", + "@nrwl/workspace": "10.2.0", + "@types/cypress": "^1.1.3", + "@types/jasmine": "~3.6.0", + "@types/jest": "26.0.8", + "@types/node": "^12.11.1", + "codelyzer": "^6.0.0", + "cypress": "^5.6.0", + "cypress-file-upload": "^4.1.1", + "cypress-keycloak": "^1.5.0", + "cypress-keycloak-commands": "^1.2.0", + "cypress-localstorage-commands": "^1.2.4", + "dotenv": "6.2.0", + "eslint": "6.8.0", + "google-translate-api-browser": "^1.1.71", + "husky": "^4.3.0", + "jest": "26.2.2", + "jest-preset-angular": "8.2.1", + "lodash": "^4.17.20", + "moment": "^2.29.1", + "ng-packagr": "^10.1.2", + "prettier": "2.0.4", + "pretty-quick": "^3.1.0", + "superagent": "^6.1.0", + "superagent-promise": "^1.1.0", + "ts-jest": "26.1.4", + "ts-node": "~8.3.0", + "tslint": "~6.1.0", + "typescript": "~4.0.2" } - }, - "dependencies": { - "@angular/animations": "~11.0.1", - "@angular/cdk": "~11.0.1", - "@angular/common": "~11.0.1", - "@angular/compiler": "~11.0.1", - "@angular/core": "~11.0.1", - "@angular/forms": "~11.0.1", - "@angular/material": "~11.0.1", - "@angular/material-moment-adapter": "^11.0.2", - "@angular/platform-browser": "~11.0.1", - "@angular/platform-browser-dynamic": "~11.0.1", - "@angular/router": "~11.0.1", - "@angular/service-worker": "~11.0.1", - "@ngx-translate/core": "^13.0.0", - "@ngx-translate/http-loader": "^6.0.0", - "@nrwl/angular": "^10.2.0", - "@pdftron/webviewer": "7.3.0-20210223", - "@swimlane/ngx-charts": "^17.0.0", - "csv-parser": "^3.0.0", - "file-saver": "^2.0.2", - "jwt-decode": "^3.0.0", - "keycloak-angular": "^8.0.1", - "keycloak-js": "10.0.2", - "lint-staged": "^10.5.0", - "ng2-ace-editor": "^0.3.9", - "ngp-sort-pipe": "^0.0.4", - "ngx-color-picker": "^10.1.0", - "ngx-dropzone": "^2.2.2", - "ngx-toastr": "^13.0.0", - "rxjs": "~6.6.0", - "scroll-into-view-if-needed": "^2.2.26", - "streamsaver": "^2.0.5", - "tslib": "^2.0.0", - "zone.js": "~0.10.2" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.1100.2", - "@angular-devkit/build-ng-packagr": "~0.1002.0", - "@angular/cli": "~11.0.2", - "@angular/compiler": "~11.0.1", - "@angular/compiler-cli": "~11.0.1", - "@angular/language-service": "~11.0.2", - "@nrwl/cypress": "10.2.0", - "@nrwl/jest": "10.2.0", - "@nrwl/workspace": "10.2.0", - "@types/cypress": "^1.1.3", - "@types/jasmine": "~3.6.0", - "@types/jest": "26.0.8", - "@types/node": "^12.11.1", - "codelyzer": "^6.0.0", - "cypress": "^5.6.0", - "cypress-file-upload": "^4.1.1", - "cypress-keycloak": "^1.5.0", - "cypress-keycloak-commands": "^1.2.0", - "cypress-localstorage-commands": "^1.2.4", - "dotenv": "6.2.0", - "eslint": "6.8.0", - "google-translate-api-browser": "^1.1.71", - "husky": "^4.3.0", - "jest": "26.2.2", - "jest-preset-angular": "8.2.1", - "lodash": "^4.17.20", - "moment": "^2.29.1", - "ng-packagr": "^10.1.2", - "prettier": "2.0.4", - "pretty-quick": "^3.1.0", - "superagent": "^6.1.0", - "superagent-promise": "^1.1.0", - "ts-jest": "26.1.4", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~4.0.2" - } } diff --git a/yarn.lock b/yarn.lock index 6638d181d..0075279d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4578,13 +4578,6 @@ cssstyle@^2.2.0: dependencies: cssom "~0.3.6" -csv-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-3.0.0.tgz#b88a6256d79e090a97a1b56451f9327b01d710e7" - integrity sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ== - dependencies: - minimist "^1.2.0" - cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" @@ -9211,6 +9204,11 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +papaparse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.0.tgz#ab1702feb96e79ab4309652f36db9536563ad05a" + integrity sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg== + parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"