Project

General

Profile

1
import {Component, Input, OnDestroy, OnInit} from "@angular/core";
2
import {AbstractControl, FormBuilder, FormGroup, ValidationErrors, Validators} from "@angular/forms";
3
import {Subscriber} from "rxjs";
4
import {StringUtils} from "../../utils/string-utils.class";
5
import {Email} from "../../utils/email/email";
6
import {Body} from "../../utils/email/body";
7
import {CommunityService} from "../../connect/community/community.service";
8
import {Composer} from "../../utils/email/composer";
9
import {Session, User} from "../../login/utils/helper.class";
10
import {EmailService} from "../../utils/email/email.service";
11
import {properties} from "../../../../environments/environment";
12
import {CommunityInfo} from "../../connect/community/communityInfo";
13

    
14
declare var UIkit;
15

    
16
@Component({
17
  selector: 'subscriber-invite',
18
  template: `
19
    <div class="uk-grid uk-child-width-1-1" uk-grid [formGroup]="inviteForm">
20
      <div dashboard-input [formInput]="inviteForm.get('name')" [gridSmall]="true">
21
        <div class="uk-text-bold field-label">
22
          From:
23
        </div>
24
      </div>
25
      <div dashboard-input [formInput]="inviteForm.get('recipients')" [gridSmall]="true">
26
        <div class="uk-text-bold field-label uk-margin-bottom">
27
          To *:
28
        </div>
29
        <span note>Separate multiple emails with a comma</span>
30
      </div>
31
      <div class="uk-grid uk-grid-small" uk-grid>
32
        <div class="uk-text-bold field-label">
33
          Message *:
34
        </div>
35
        <div class="uk-width-expand">
36
          <ckeditor *ngIf="isManager" class="form-control" formControlName="message" id="message"
37
                    debounce="400"
38
                    [config]="{ extraAllowedContent: '* [uk-*](*) ; span', disallowedContent: 'script; *[on*]', removeButtons: 'Save,NewPage,DocProps,Preview,Print',
39
                                                                   extraPlugins: 'divarea'}"></ckeditor>
40
          <div *ngIf="!isManager" [innerHTML]="body.paragraphs"></div>
41
          <div class="uk-margin-top">
42
            {{body.signature}}
43
            <span *ngIf="body.fromName == ''" class="uk-text-muted">
44
              <i>{{body.fromMessage}}...</i>
45
            </span>
46
            <span *ngIf="body.fromName !=''">
47
              {{body.fromMessage}}
48
              <b>{{body.fromName}}</b>
49
            </span><br>
50
            <a href="https://www.openaire.eu">www.openaire.eu</a>
51
          </div>
52
        </div>
53
      </div>
54
    </div>
55
  `,
56
  styleUrls: ['subscriber-invite.component.css']
57
})
58
export class SubscriberInviteComponent implements OnInit, OnDestroy {
59
  @Input()
60
  public user: User;
61
  public community: CommunityInfo
62
  public inviteForm: FormGroup;
63
  public email: Email;
64
  public body: Body;
65
  public loading: boolean = false;
66
  private subscriptions: any[] = [];
67
  
68
  constructor(private fb: FormBuilder,
69
              private emailService: EmailService,
70
              private communityService: CommunityService) {
71
  }
72
  
73
  ngOnInit() {
74
    this.reset();
75
  }
76
  
77
  ngOnDestroy() {
78
    this.unsubscribe();
79
  }
80
  
81
  unsubscribe() {
82
    this.subscriptions.forEach(subscription => {
83
      if(subscription instanceof Subscriber) {
84
        subscription.unsubscribe();
85
      }
86
    });
87
  }
88
  
89
  reset() {
90
    this.unsubscribe();
91
    this.inviteForm = this.fb.group({
92
      name: this.fb.control('', Validators.required),
93
      recipients: this.fb.control('', [Validators.required, this.emailsValidator]),
94
      message: this.fb.control('', Validators.required)
95
    });
96
    this.subscriptions.push(this.communityService.getCommunityAsObservable().subscribe(community => {
97
      this.community = community;
98
      this.inviteForm.get('name').enable();
99
      this.inviteForm.get('name').setValue(this.user.fullname);
100
      this.inviteForm.get('name').disable();
101
      this.body = Composer.initializeInvitationsBody(community.communityId, community.title, this.user.fullname);
102
      this.email = Composer.initializeInvitationsEmail(community.title);
103
      this.inviteForm.get('message').setValue(this.body.paragraphs);
104
    }));
105
  }
106
  
107
  emailsValidator(control: AbstractControl): ValidationErrors | null {
108
    if (control.value === '' || !control.value || StringUtils.validateEmails(control.value)) {
109
      return null;
110
    }
111
    return { emails: true };
112
  }
113
  
114
  invite() {
115
    this.loading = true;
116
    this.parseRecipients();
117
    this.body.paragraphs = this.inviteForm.value.message;
118
    this.email.body = Composer.formatEmailBodyForInvitation(this.body);
119
    this.subscriptions.push(this.emailService.sendEmail(properties, this.email).subscribe(res => {
120
      if(res['success']) {
121
        UIkit.notification('Invitation to subscribe has been <b>sent</b>', {
122
          status: 'success',
123
          timeout: 6000,
124
          pos: 'bottom-right'
125
        });
126
      } else {
127
        UIkit.notification('An error has occurred. Please try again later', {
128
          status: 'danger',
129
          timeout: 6000,
130
          pos: 'bottom-right'
131
        });
132
      }
133
      this.loading = false;
134
    },error => {
135
      UIkit.notification('An error has occurred. Please try again later', {
136
        status: 'danger',
137
        timeout: 6000,
138
        pos: 'bottom-right'
139
      });
140
      this.loading = false;
141
    }));
142
  }
143
  
144
  public parseRecipients() {
145
    // remove spaces
146
    let emails = this.inviteForm.get('recipients').value.replace(/\s/g, '');
147
    // remove commas
148
    emails = emails.split(",");
149
    
150
    // remove empty fields
151
    for (let i = 0; i < emails.length; i++) {
152
      if (!(emails[i] == "")) {
153
        this.email.recipients.push(emails[i]);
154
      }
155
    }
156
  }
157
  
158
  get isManager() {
159
    return Session.isPortalAdministrator(this.user) || Session.isCurator('community', this.user) || Session.isManager('community', this.community.communityId, this.user);
160
  }
161
  
162
  get valid() {
163
    return this.inviteForm && this.inviteForm.valid;
164
  }
165
}
(2-2/3)