@smarterplan/ngx-smarterplan-admin 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/lib/admin/admin.component.mjs +33 -0
- package/esm2020/lib/chevron/chevron.component.mjs +19 -0
- package/esm2020/lib/guest-link/guest-link.component.mjs +62 -0
- package/esm2020/lib/guide.guard.mjs +25 -0
- package/esm2020/lib/name-from-id.pipe.mjs +29 -0
- package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +47 -0
- package/esm2020/lib/ngx-smarterplan-admin.module.mjs +90 -0
- package/esm2020/lib/ngx-smarterplan-admin.service.mjs +14 -0
- package/esm2020/lib/organisation/organisation.component.mjs +166 -0
- package/esm2020/lib/sp-admin.guard.mjs +31 -0
- package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +160 -0
- package/esm2020/lib/user/form-mission/form-mission.component.mjs +205 -0
- package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +125 -0
- package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +106 -0
- package/esm2020/lib/user/user.component.mjs +325 -0
- package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +108 -0
- package/esm2020/lib/visitor/template/template.component.mjs +219 -0
- package/esm2020/lib/visitor/visitor.component.mjs +284 -0
- package/esm2020/public-api.mjs +6 -0
- package/esm2020/smarterplan-ngx-smarterplan-admin.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +2026 -0
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +1921 -0
- package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
- package/lib/admin/admin.component.d.ts +13 -0
- package/lib/chevron/chevron.component.d.ts +9 -0
- package/lib/guest-link/guest-link.component.d.ts +20 -0
- package/lib/guide.guard.d.ts +11 -0
- package/lib/name-from-id.pipe.d.ts +11 -0
- package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-admin.module.d.ts +26 -0
- package/lib/ngx-smarterplan-admin.service.d.ts +6 -0
- package/lib/organisation/organisation.component.d.ts +53 -0
- package/lib/sp-admin.guard.d.ts +12 -0
- package/lib/user/detail-organisation/detail-organisation.component.d.ts +39 -0
- package/lib/user/form-mission/form-mission.component.d.ts +54 -0
- package/lib/user/form-organisation/form-organisation.component.d.ts +32 -0
- package/lib/user/user-mission-form/user-mission-form.component.d.ts +28 -0
- package/lib/user/user.component.d.ts +100 -0
- package/lib/visitor/create-batch/create-batch.component.d.ts +23 -0
- package/lib/visitor/template/template.component.d.ts +52 -0
- package/lib/visitor/visitor.component.d.ts +65 -0
- package/package.json +39 -0
- package/public-api.d.ts +2 -0
- package/smarterplan-ngx-smarterplan-admin.d.ts +5 -0
|
@@ -0,0 +1,2026 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, Component, Input, EventEmitter, Output, ViewChild, NgModule, Pipe } from '@angular/core';
|
|
3
|
+
import { __awaiter } from 'tslib';
|
|
4
|
+
import * as i2 from '@angular/forms';
|
|
5
|
+
import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import * as i1 from 'ngx-smarterplan-core';
|
|
7
|
+
import { RoleStatus, ProfileEntity, removeNullKeysFromObject, stringLocaleToEnum, enumToArray, Locale, LevelStatus, EmailStatus, filterUniqueArrayByID, DomainType, sortAlphabeticallyOnName, validEmail, NgxSmarterplanCoreModule } from 'ngx-smarterplan-core';
|
|
8
|
+
import * as i3 from '@ngx-translate/core';
|
|
9
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
10
|
+
import * as i4 from '@angular/common';
|
|
11
|
+
import { CommonModule } from '@angular/common';
|
|
12
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
13
|
+
import * as CryptoJS from 'crypto-js';
|
|
14
|
+
import * as i4$1 from '@ng-bootstrap/ng-bootstrap';
|
|
15
|
+
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
|
16
|
+
import * as i4$2 from 'ngx-clipboard';
|
|
17
|
+
import { ClipboardModule } from 'ngx-clipboard';
|
|
18
|
+
import { DateTime } from 'luxon';
|
|
19
|
+
import { v4 } from 'uuid';
|
|
20
|
+
import * as i2$1 from '@angular/router';
|
|
21
|
+
import { RouterModule } from '@angular/router';
|
|
22
|
+
import * as Papa from 'papaparse';
|
|
23
|
+
|
|
24
|
+
class NgxSmarterplanAdminService {
|
|
25
|
+
constructor() { }
|
|
26
|
+
}
|
|
27
|
+
NgxSmarterplanAdminService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
28
|
+
NgxSmarterplanAdminService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminService, providedIn: 'root' });
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminService, decorators: [{
|
|
30
|
+
type: Injectable,
|
|
31
|
+
args: [{
|
|
32
|
+
providedIn: 'root'
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: function () { return []; } });
|
|
35
|
+
|
|
36
|
+
class ChevronComponent {
|
|
37
|
+
constructor() {
|
|
38
|
+
this.conditionShowing = false;
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
ChevronComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ChevronComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44
|
+
ChevronComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: ChevronComponent, selector: "lib-chevron", inputs: { conditionShowing: "conditionShowing" }, ngImport: i0, template: "<div style=\"height: 30px; width: 30px;\">\r\n <span class=\"icon-container\" >\r\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\r\n </span>\r\n</div>\r\n", styles: [".icon-container{height:30px;width:30px}.icon-img-down{width:30px;height:100%;background:url(https://api.iconify.design/mdi-light/chevron-right.svg?width=28) no-repeat center center/contain}.icon-img-up{width:30px;height:100%;background:url(https://api.iconify.design/mdi-light/chevron-down.svg?width=28) no-repeat center center/contain}\n"] });
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ChevronComponent, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ selector: 'lib-chevron', template: "<div style=\"height: 30px; width: 30px;\">\r\n <span class=\"icon-container\" >\r\n <div [class]=\"conditionShowing ? 'icon-img-up' : 'icon-img-down'\"></div>\r\n </span>\r\n</div>\r\n", styles: [".icon-container{height:30px;width:30px}.icon-img-down{width:30px;height:100%;background:url(https://api.iconify.design/mdi-light/chevron-right.svg?width=28) no-repeat center center/contain}.icon-img-up{width:30px;height:100%;background:url(https://api.iconify.design/mdi-light/chevron-down.svg?width=28) no-repeat center center/contain}\n"] }]
|
|
48
|
+
}], ctorParameters: function () { return []; }, propDecorators: { conditionShowing: [{
|
|
49
|
+
type: Input
|
|
50
|
+
}] } });
|
|
51
|
+
|
|
52
|
+
class OrganisationComponent {
|
|
53
|
+
constructor(orgService, fb, userService, missionService, translate, propertyService) {
|
|
54
|
+
this.orgService = orgService;
|
|
55
|
+
this.fb = fb;
|
|
56
|
+
this.userService = userService;
|
|
57
|
+
this.missionService = missionService;
|
|
58
|
+
this.translate = translate;
|
|
59
|
+
this.propertyService = propertyService;
|
|
60
|
+
this.admins = [];
|
|
61
|
+
this.clients = [];
|
|
62
|
+
this.details = -1;
|
|
63
|
+
this.query = "";
|
|
64
|
+
this.error = null;
|
|
65
|
+
this.create = false;
|
|
66
|
+
this.working = false;
|
|
67
|
+
this.isAddingAdmin = false;
|
|
68
|
+
this.loading = false;
|
|
69
|
+
this.editing = false;
|
|
70
|
+
// fullAccess true gives access to all orgs
|
|
71
|
+
// this is reserved to Smarterplan ADMINs
|
|
72
|
+
this.fullAccess = false;
|
|
73
|
+
}
|
|
74
|
+
ngOnInit() {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
this.resetList();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* resetList fetches a fresh organisation list from server
|
|
81
|
+
*/
|
|
82
|
+
resetList() {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
this.loading = true;
|
|
85
|
+
yield this.missionService
|
|
86
|
+
.getMissionsByOrderedOrganisation("6e28201f-4679-4c29-9d2d-8a325f57cee9")
|
|
87
|
+
.then((missions) => __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
if (missions) {
|
|
89
|
+
const client = {};
|
|
90
|
+
yield Promise.all(missions.map((m) => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
if (!client.hasOwnProperty(m.organisationID)) {
|
|
92
|
+
client[m.organisationID] = {
|
|
93
|
+
name: m.organisation.name,
|
|
94
|
+
organisation: m.organisation,
|
|
95
|
+
adminMissions: [],
|
|
96
|
+
properties: [],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (m.role === RoleStatus.ADMIN && !m.deletedAt) {
|
|
100
|
+
const alreadyAdmin = client[m.organisationID].adminMissions.filter((mis) => mis.user.id === m.userID);
|
|
101
|
+
if (alreadyAdmin.length === 0) {
|
|
102
|
+
client[m.organisationID].adminMissions.push({
|
|
103
|
+
user: new ProfileEntity(m.user),
|
|
104
|
+
mission: m,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// get properties
|
|
109
|
+
const properties = yield this.propertyService.getPropertiesForOrganisation(m.organisationID);
|
|
110
|
+
client[m.organisationID].properties = properties
|
|
111
|
+
.filter((property) => !property.deletedAt && property.space)
|
|
112
|
+
.map((property) => property.space.name);
|
|
113
|
+
})));
|
|
114
|
+
this.clients = Object.values(client);
|
|
115
|
+
}
|
|
116
|
+
this.loading = false;
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* onToggleDetail folds/unfolds details for a given organisation
|
|
122
|
+
* @param i index of the organisation to be toggled
|
|
123
|
+
*/
|
|
124
|
+
onToggleDetail(index) {
|
|
125
|
+
this.details = index === this.details ? -1 : index;
|
|
126
|
+
}
|
|
127
|
+
onAdd() {
|
|
128
|
+
this.create = true;
|
|
129
|
+
this.form = this.fb.group({
|
|
130
|
+
name: [null, [Validators.required]],
|
|
131
|
+
address: [""],
|
|
132
|
+
city: [""],
|
|
133
|
+
postal: [null],
|
|
134
|
+
siret: [null],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
onEdit(org) {
|
|
138
|
+
this.create = false;
|
|
139
|
+
this.editing = true;
|
|
140
|
+
this.form = this.fb.group({
|
|
141
|
+
id: [org.id],
|
|
142
|
+
name: [org.name, [Validators.required]],
|
|
143
|
+
address: [org.address],
|
|
144
|
+
city: [org.city],
|
|
145
|
+
postal: [org.postal],
|
|
146
|
+
siret: [org.siret],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
onCancel() {
|
|
150
|
+
// this.form = null;
|
|
151
|
+
this.form.reset();
|
|
152
|
+
this.create = false;
|
|
153
|
+
this.editing = false;
|
|
154
|
+
}
|
|
155
|
+
get name() {
|
|
156
|
+
return this.form.get("name");
|
|
157
|
+
}
|
|
158
|
+
get email() {
|
|
159
|
+
return this.form.get("user").get("email");
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Handle creation or update of organisation
|
|
163
|
+
* @see 174
|
|
164
|
+
*/
|
|
165
|
+
onSubmitOrg() {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
this.working = true;
|
|
168
|
+
const formValue = this.form.value;
|
|
169
|
+
removeNullKeysFromObject(formValue);
|
|
170
|
+
try {
|
|
171
|
+
if (this.create) {
|
|
172
|
+
const organisation = yield this.orgService.createOrganisation(formValue);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
yield this.orgService.updateOrganisation(formValue);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
this.error = true;
|
|
180
|
+
console.error(error);
|
|
181
|
+
}
|
|
182
|
+
yield this.resetList();
|
|
183
|
+
this.working = false;
|
|
184
|
+
this.create = false;
|
|
185
|
+
this.editing = false;
|
|
186
|
+
this.form.reset();
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
onArchive(_) {
|
|
190
|
+
console.log("Unimplemented");
|
|
191
|
+
}
|
|
192
|
+
onDismiss() {
|
|
193
|
+
this.error = null;
|
|
194
|
+
}
|
|
195
|
+
onDeleteOrg(org) {
|
|
196
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
197
|
+
const message = this.translate.instant("confirm.deleteOrganisation");
|
|
198
|
+
if (window.confirm(message) &&
|
|
199
|
+
org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
|
|
200
|
+
const propertiesToDelete = yield this.propertyService.getPropertiesForOrganisation(org.id);
|
|
201
|
+
yield this.orgService.deleteOrganisation(org.id);
|
|
202
|
+
(yield this.missionService.getMissionsByOrganisation(org.id)).map((m) => this.missionService.softDeleteMission(m.id));
|
|
203
|
+
yield Promise.all(propertiesToDelete.map((property) => __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
yield this.propertyService.deleteProperty(property.id);
|
|
205
|
+
})));
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
OrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: OrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.FormBuilder }, { token: i1.BaseUserService }, { token: i1.MissionService }, { token: i3.TranslateService }, { token: i1.PropertyService }], target: i0.ɵɵFactoryTarget.Component });
|
|
211
|
+
OrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: OrganisationComponent, selector: "lib-organisation", ngImport: i0, template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\"> \r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: OrganisationComponent, decorators: [{
|
|
213
|
+
type: Component,
|
|
214
|
+
args: [{ selector: 'lib-organisation', template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\"> \r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
215
|
+
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.FormBuilder }, { type: i1.BaseUserService }, { type: i1.MissionService }, { type: i3.TranslateService }, { type: i1.PropertyService }]; } });
|
|
216
|
+
|
|
217
|
+
class GuestLinkComponent {
|
|
218
|
+
constructor(spaceService, activeModal) {
|
|
219
|
+
this.spaceService = spaceService;
|
|
220
|
+
this.activeModal = activeModal;
|
|
221
|
+
}
|
|
222
|
+
ngOnInit() {
|
|
223
|
+
this.setModel3D();
|
|
224
|
+
}
|
|
225
|
+
setModel3D() {
|
|
226
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
227
|
+
this.model3D = yield this.spaceService.getModel3DForSpace(this.spaceID);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
onGenerate() {
|
|
231
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
232
|
+
const inputElement = document.querySelector("#password");
|
|
233
|
+
const password = inputElement.value;
|
|
234
|
+
if (password.length < 8) {
|
|
235
|
+
this.errorMessage = "register.password.weak";
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
this.errorMessage = null;
|
|
239
|
+
const encrypted = CryptoJS.AES.encrypt(JSON.stringify({
|
|
240
|
+
user: this.username,
|
|
241
|
+
password,
|
|
242
|
+
}), "EncryptedUser").toString();
|
|
243
|
+
const redirect = `redirect?spaceID=${this.spaceID}&model3D=${this.model3D}&user=${encrypted}`;
|
|
244
|
+
const { origin } = document.location;
|
|
245
|
+
this.link = `${origin}/${redirect}`;
|
|
246
|
+
setTimeout(() => {
|
|
247
|
+
const hyperlink = document.querySelector("#linkHref");
|
|
248
|
+
if (hyperlink) {
|
|
249
|
+
hyperlink.setAttribute("href", this.link);
|
|
250
|
+
}
|
|
251
|
+
}, 200); // wait until the element is rendered because of *ngIf
|
|
252
|
+
yield this.spaceService.updateSpace({
|
|
253
|
+
id: this.spaceID,
|
|
254
|
+
guestLink: redirect,
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
onCancel() {
|
|
259
|
+
if (this.activeModal) {
|
|
260
|
+
this.activeModal.close();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
GuestLinkComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: GuestLinkComponent, deps: [{ token: i1.SpaceService }, { token: i4$1.NgbActiveModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
265
|
+
GuestLinkComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: GuestLinkComponent, selector: "lib-guest-link", inputs: { spaceID: "spaceID", username: "username" }, ngImport: i0, template: "<div class=\"main\">\r\n <p>{{'Current password for account:' | translate}} {{username}}</p>\r\n <input type=\"password\" class=\"form-control\" id=\"password\">\r\n <p *ngIf=\"errorMessage\">{{errorMessage}}</p>\r\n <div class=\"row ml-0 mt-3\" *ngIf=\"link\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div ngxClipboard [cbContent]=\"link\" [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\"\r\n ngbTooltip=\"Copied!\" triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row ml-0 mt-3\">\r\n <button class=\"btn btn-primary rounded-pill mr-2\" (click)=\"onGenerate()\">{{'Generate link' | translate\r\n }}</button>\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' | translate }}</button>\r\n </div>\r\n\r\n</div>\r\n", styles: [".main{margin:1.5rem}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.ClipboardDirective, selector: "[ngxClipboard]", inputs: ["ngxClipboard", "container", "cbContent", "cbSuccessMsg"], outputs: ["cbOnSuccess", "cbOnError"] }, { type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
266
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: GuestLinkComponent, decorators: [{
|
|
267
|
+
type: Component,
|
|
268
|
+
args: [{ selector: 'lib-guest-link', template: "<div class=\"main\">\r\n <p>{{'Current password for account:' | translate}} {{username}}</p>\r\n <input type=\"password\" class=\"form-control\" id=\"password\">\r\n <p *ngIf=\"errorMessage\">{{errorMessage}}</p>\r\n <div class=\"row ml-0 mt-3\" *ngIf=\"link\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div ngxClipboard [cbContent]=\"link\" [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\"\r\n ngbTooltip=\"Copied!\" triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row ml-0 mt-3\">\r\n <button class=\"btn btn-primary rounded-pill mr-2\" (click)=\"onGenerate()\">{{'Generate link' | translate\r\n }}</button>\r\n <button class=\"btn btn-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' | translate }}</button>\r\n </div>\r\n\r\n</div>\r\n", styles: [".main{margin:1.5rem}\n"] }]
|
|
269
|
+
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i4$1.NgbActiveModal }]; }, propDecorators: { spaceID: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], username: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}] } });
|
|
274
|
+
|
|
275
|
+
class FormMissionComponent {
|
|
276
|
+
constructor(fb, spaceService, userService, domainService, organisationService, zoneService, hashtagService, localeService) {
|
|
277
|
+
this.fb = fb;
|
|
278
|
+
this.spaceService = spaceService;
|
|
279
|
+
this.userService = userService;
|
|
280
|
+
this.domainService = domainService;
|
|
281
|
+
this.organisationService = organisationService;
|
|
282
|
+
this.zoneService = zoneService;
|
|
283
|
+
this.hashtagService = hashtagService;
|
|
284
|
+
this.localeService = localeService;
|
|
285
|
+
this.addedMissionInput = new EventEmitter();
|
|
286
|
+
this.availableHashtags = [];
|
|
287
|
+
this.isGuide = false;
|
|
288
|
+
this.missionTimeStart = 12 * 60 * 60000; // midday in milliseconds
|
|
289
|
+
this.missionTimeEnd = 12 * 60 * 60000;
|
|
290
|
+
this.addedHashtags = [];
|
|
291
|
+
}
|
|
292
|
+
ngOnInit() {
|
|
293
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
294
|
+
this.updateUserInfo();
|
|
295
|
+
yield this.setDomains();
|
|
296
|
+
if (this.isSP) {
|
|
297
|
+
this.allOrgs = yield this.organisationService.listOrganisations();
|
|
298
|
+
}
|
|
299
|
+
this.currentLocale = stringLocaleToEnum(this.localeService.getLocale()); // to match enum Locale
|
|
300
|
+
this.locales = enumToArray(Locale);
|
|
301
|
+
if (this.missionToEdit) {
|
|
302
|
+
this.initFormForEdit();
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
this.initEmptyForm();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
updateUserInfo() {
|
|
310
|
+
this.availableRoles =
|
|
311
|
+
this.userService.getAvailableRolesForCurrentUser();
|
|
312
|
+
this.availableLevels =
|
|
313
|
+
this.userService.getAvalableLevelsForCurrentUser();
|
|
314
|
+
this.isGuide = this.userService.isGuide();
|
|
315
|
+
}
|
|
316
|
+
setDomains() {
|
|
317
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
318
|
+
if (!this.isGuide) {
|
|
319
|
+
const domains = yield this.domainService.getDomainsForMissionsForOrg(this.currentUserOrganisation.id);
|
|
320
|
+
this.domains = domains;
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
setHashtags(spaceID) {
|
|
325
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
326
|
+
this.availableHashtags = yield this.hashtagService.getHashtagsForSpace(spaceID);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
get spaceID() {
|
|
330
|
+
return this.missionForm.get("space");
|
|
331
|
+
}
|
|
332
|
+
get role() {
|
|
333
|
+
return this.missionForm.get("role");
|
|
334
|
+
}
|
|
335
|
+
initFormForEdit() {
|
|
336
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
337
|
+
const m = this.missionToEdit;
|
|
338
|
+
this.userForMissionID = m.userID;
|
|
339
|
+
this.availableSpaces = yield this.spaceService.getAllowedSpacesForOrg(this.missionToEdit.organisationID, this.currentUserOrganisation.id);
|
|
340
|
+
yield this.setHashtags(m.spaceID);
|
|
341
|
+
this.missionForm = this.fb.group({
|
|
342
|
+
id: m.id,
|
|
343
|
+
organisation: [{ value: m.organisation.name, disabled: true }],
|
|
344
|
+
organisationID: m.organisationID,
|
|
345
|
+
orderedOrganisationID: m.orderedOrganisationID,
|
|
346
|
+
role: [m.role],
|
|
347
|
+
level: [m.level],
|
|
348
|
+
space: [m.spaceID],
|
|
349
|
+
description: [m.description],
|
|
350
|
+
domains: [m.domains],
|
|
351
|
+
zone: [m.zoneID],
|
|
352
|
+
locale: [m.locale],
|
|
353
|
+
});
|
|
354
|
+
if (m.hashtags && m.hashtags.length > 0) {
|
|
355
|
+
this.addedHashtags = this.availableHashtags.filter((hashtag) => m.hashtags.includes(hashtag.id));
|
|
356
|
+
}
|
|
357
|
+
if (m.startDateTime) {
|
|
358
|
+
const date = DateTime.fromISO(m.startDateTime);
|
|
359
|
+
this.missionTimeStart = (date.hour * 60 + date.minute) * 60 * 1000;
|
|
360
|
+
this.startDate = date.toMillis() - this.missionTimeStart;
|
|
361
|
+
}
|
|
362
|
+
if (m.endDateTime) {
|
|
363
|
+
const date = DateTime.fromISO(m.endDateTime);
|
|
364
|
+
this.missionTimeEnd = (date.hour * 60 + date.minute) * 60 * 1000;
|
|
365
|
+
this.endDate = date.toMillis() - this.missionTimeEnd;
|
|
366
|
+
}
|
|
367
|
+
this.onSpaceClick();
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
onSpaceClick() {
|
|
371
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
372
|
+
const zones = yield this.zoneService.getZonesBySpace(this.spaceID.value);
|
|
373
|
+
this.defaultZone = zones.find((zone) => !zone.parentID);
|
|
374
|
+
const indexOfDefaultZone = zones.indexOf(this.defaultZone);
|
|
375
|
+
zones.splice(indexOfDefaultZone, 1);
|
|
376
|
+
this.zonesForSpace = zones;
|
|
377
|
+
yield this.setHashtags(this.spaceID.value);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
initEmptyForm() {
|
|
381
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
382
|
+
this.availableSpaces = yield this.spaceService.getAllowedSpacesForOrg(this.organisationForMission.id, this.currentUserOrganisation.id);
|
|
383
|
+
this.missionForm = this.fb.group({
|
|
384
|
+
role: [null, Validators.required],
|
|
385
|
+
level: [LevelStatus.MINIMUM],
|
|
386
|
+
organisation: [
|
|
387
|
+
{ value: this.organisationForMission.name, disabled: true },
|
|
388
|
+
],
|
|
389
|
+
organisationID: this.organisationForMission.id,
|
|
390
|
+
orderedOrganisationID: this.currentUserOrganisation.id,
|
|
391
|
+
space: [null, Validators.required],
|
|
392
|
+
zone: [null],
|
|
393
|
+
description: [""],
|
|
394
|
+
domains: [null],
|
|
395
|
+
locale: [this.currentLocale],
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
onHashtagClick(hashtag) {
|
|
400
|
+
if (!this.hashtagAdded(hashtag)) {
|
|
401
|
+
this.addedHashtags.push(hashtag);
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
this.addedHashtags.splice(this.addedHashtags.indexOf(hashtag), 1);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
hashtagAdded(hashtag) {
|
|
408
|
+
return (this.addedHashtags.find((_hashtag) => _hashtag.id === hashtag.id) !== undefined);
|
|
409
|
+
}
|
|
410
|
+
removeHashtag(hashtag) {
|
|
411
|
+
this.addedHashtags.splice(this.addedHashtags.indexOf(hashtag), 1);
|
|
412
|
+
}
|
|
413
|
+
onSubmit() {
|
|
414
|
+
const formValue = this.missionForm.value;
|
|
415
|
+
if (!this.missionForm.valid) {
|
|
416
|
+
// this shows errors in the form
|
|
417
|
+
this.missionForm.markAllAsTouched();
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
let startDateString;
|
|
421
|
+
let endDateString;
|
|
422
|
+
if (this.startDate) {
|
|
423
|
+
const dateHourStartNumber = this.startDate + this.missionTimeStart;
|
|
424
|
+
const startDate = DateTime.fromMillis(dateHourStartNumber);
|
|
425
|
+
startDateString = startDate.toISO();
|
|
426
|
+
}
|
|
427
|
+
if (this.endDate) {
|
|
428
|
+
const dateHourEndNumber = this.endDate + this.missionTimeEnd;
|
|
429
|
+
const endDate = DateTime.fromMillis(dateHourEndNumber);
|
|
430
|
+
endDateString = endDate.toISO();
|
|
431
|
+
}
|
|
432
|
+
const missionInput = {
|
|
433
|
+
organisationID: formValue.organisationID,
|
|
434
|
+
orderedOrganisationID: formValue.orderedOrganisationID,
|
|
435
|
+
level: formValue.level,
|
|
436
|
+
role: formValue.role,
|
|
437
|
+
description: formValue.description,
|
|
438
|
+
startDateTime: startDateString,
|
|
439
|
+
endDateTime: endDateString,
|
|
440
|
+
domains: formValue.domains,
|
|
441
|
+
userID: this.userForMissionID,
|
|
442
|
+
emailStatus: this.missionToEdit
|
|
443
|
+
? this.missionToEdit.emailStatus
|
|
444
|
+
: EmailStatus.CREATION_TO_DELIVER,
|
|
445
|
+
locale: formValue.locale,
|
|
446
|
+
};
|
|
447
|
+
missionInput.hashtags = this.addedHashtags.map((h) => h.id);
|
|
448
|
+
if (formValue.space) {
|
|
449
|
+
missionInput.spaceID = formValue.space;
|
|
450
|
+
}
|
|
451
|
+
if (formValue.zone) {
|
|
452
|
+
missionInput.zoneID = formValue.zone;
|
|
453
|
+
}
|
|
454
|
+
if (this.missionToEdit) {
|
|
455
|
+
missionInput.id = this.missionToEdit.id;
|
|
456
|
+
}
|
|
457
|
+
this.addedMissionInput.emit(missionInput);
|
|
458
|
+
}
|
|
459
|
+
onCancel() {
|
|
460
|
+
this.addedMissionInput.emit(null);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
FormMissionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, deps: [{ token: i2.FormBuilder }, { token: i1.SpaceService }, { token: i1.BaseUserService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i1.ZoneService }, { token: i1.HashtagService }, { token: i1.LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
464
|
+
FormMissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormMissionComponent, selector: "lib-form-mission", inputs: { missionToEdit: "missionToEdit", organisationForMission: "organisationForMission", isSP: "isSP", userForMissionID: "userForMissionID", currentUserOrganisation: "currentUserOrganisation" }, outputs: { addedMissionInput: "addedMissionInput" }, ngImport: i0, template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"></textarea>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" [class.is-invalid]=\"role.invalid && role.touched\">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n {{'Role is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\" \r\n [class.is-invalid]=\"spaceID.invalid && spaceID.touched\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n {{'Location is required' | translate}}.\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <!-- Hashtags are available after Space is set -->\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n >{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i4$1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i4$1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
465
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, decorators: [{
|
|
466
|
+
type: Component,
|
|
467
|
+
args: [{ selector: 'lib-form-mission', template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"></textarea>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" [class.is-invalid]=\"role.invalid && role.touched\">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n {{'Role is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\" \r\n [class.is-invalid]=\"spaceID.invalid && spaceID.touched\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n {{'Location is required' | translate}}.\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <!-- Hashtags are available after Space is set -->\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n >{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
468
|
+
}], ctorParameters: function () { return [{ type: i2.FormBuilder }, { type: i1.SpaceService }, { type: i1.BaseUserService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i1.ZoneService }, { type: i1.HashtagService }, { type: i1.LocaleService }]; }, propDecorators: { missionToEdit: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], organisationForMission: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], isSP: [{
|
|
473
|
+
type: Input
|
|
474
|
+
}], userForMissionID: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], currentUserOrganisation: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], addedMissionInput: [{
|
|
479
|
+
type: Output
|
|
480
|
+
}] } });
|
|
481
|
+
|
|
482
|
+
class UserMissionFormComponent {
|
|
483
|
+
constructor(fb, userService, translate) {
|
|
484
|
+
this.fb = fb;
|
|
485
|
+
this.userService = userService;
|
|
486
|
+
this.translate = translate;
|
|
487
|
+
this.createForExistingUser = false;
|
|
488
|
+
this.added = new EventEmitter();
|
|
489
|
+
this.working = false;
|
|
490
|
+
}
|
|
491
|
+
ngOnInit() {
|
|
492
|
+
this.onAddNewUserMissionToOrg();
|
|
493
|
+
}
|
|
494
|
+
onAddNewUserMissionToOrg() {
|
|
495
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
496
|
+
this.form = this.fb.group({
|
|
497
|
+
email: [null, [Validators.required]],
|
|
498
|
+
lastName: [""],
|
|
499
|
+
firstName: [""],
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
onCancel() {
|
|
504
|
+
this.added.emit(false);
|
|
505
|
+
}
|
|
506
|
+
get email() {
|
|
507
|
+
return this.form.get("email");
|
|
508
|
+
}
|
|
509
|
+
onSubmit() {
|
|
510
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
511
|
+
this.working = true;
|
|
512
|
+
let p;
|
|
513
|
+
try {
|
|
514
|
+
const formValue = this.form.value;
|
|
515
|
+
p = yield this.userService.profileForMail(formValue.email);
|
|
516
|
+
if (p) {
|
|
517
|
+
alert("User with this email exists already!");
|
|
518
|
+
this.working = false;
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
try {
|
|
522
|
+
const profile = yield this.userService.createUserAWSandProfile(formValue, true);
|
|
523
|
+
console.log("User created!", profile.metadata);
|
|
524
|
+
this.createdUser = profile;
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
this.working = false;
|
|
528
|
+
alert(this.translate.instant(JSON.stringify(error)));
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
console.error(error);
|
|
534
|
+
}
|
|
535
|
+
this.working = false;
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
// async updateAllMissionsFromTemplate(missionInput: UpdateMissionInput) {
|
|
539
|
+
// // all missions of this organisation
|
|
540
|
+
// const missionsFromTemplate =
|
|
541
|
+
// await this.missionService.getMissionsByTemplate(
|
|
542
|
+
// this.missionToEdit.id,
|
|
543
|
+
// );
|
|
544
|
+
// await Promise.all(
|
|
545
|
+
// missionsFromTemplate.map(async (mission) => {
|
|
546
|
+
// const missionTemplate = { ...missionInput };
|
|
547
|
+
// if (this.sendUpdate) {
|
|
548
|
+
// missionTemplate.emailStatus = EmailStatus.UPDATE_TO_DELIVER;
|
|
549
|
+
// }
|
|
550
|
+
// missionTemplate.id = mission.id;
|
|
551
|
+
// await this.missionService.update(missionTemplate);
|
|
552
|
+
// }),
|
|
553
|
+
// );
|
|
554
|
+
// }
|
|
555
|
+
onMissionInput(mission) {
|
|
556
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
557
|
+
if (mission) {
|
|
558
|
+
this.missionInput = mission;
|
|
559
|
+
yield this.userService.createOrUpdateMissionForOrgWithProperty(this.missionInput, this.missionInput.organisationID);
|
|
560
|
+
this.added.emit(true);
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
this.added.emit(false);
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i2.FormBuilder }, { token: i1.BaseUserService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
569
|
+
UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i4$1.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
570
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, decorators: [{
|
|
571
|
+
type: Component,
|
|
572
|
+
args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
573
|
+
}], ctorParameters: function () { return [{ type: i2.FormBuilder }, { type: i1.BaseUserService }, { type: i3.TranslateService }]; }, propDecorators: { addToOrganisation: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], isSP: [{
|
|
576
|
+
type: Input
|
|
577
|
+
}], createForExistingUser: [{
|
|
578
|
+
type: Input
|
|
579
|
+
}], currentOrg: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], added: [{
|
|
582
|
+
type: Output
|
|
583
|
+
}] } });
|
|
584
|
+
|
|
585
|
+
class FormOrganisationComponent {
|
|
586
|
+
constructor(orgService, fb, userService) {
|
|
587
|
+
this.orgService = orgService;
|
|
588
|
+
this.fb = fb;
|
|
589
|
+
this.userService = userService;
|
|
590
|
+
this.working = false;
|
|
591
|
+
this.added = new EventEmitter();
|
|
592
|
+
}
|
|
593
|
+
ngOnInit() {
|
|
594
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
595
|
+
this.isSP = this.userService.isSPAdmin();
|
|
596
|
+
this.initForm();
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
ngAfterViewInit() {
|
|
600
|
+
const handlePaste = function handlePaste(event) {
|
|
601
|
+
const pastedData = event.clipboardData.getData("Text");
|
|
602
|
+
if (pastedData.length > 10) {
|
|
603
|
+
this.findOrgByToken(pastedData);
|
|
604
|
+
}
|
|
605
|
+
}.bind(this);
|
|
606
|
+
if (this.existing) {
|
|
607
|
+
setTimeout(() => {
|
|
608
|
+
const inputElement = document.querySelector("#tokenInput");
|
|
609
|
+
inputElement.addEventListener("paste", handlePaste);
|
|
610
|
+
inputElement.addEventListener("keydown", ({ key }) => {
|
|
611
|
+
if (key === "Backspace" || key === "Delete") {
|
|
612
|
+
this.initForm();
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
inputElement.addEventListener("keydown", ({ key }) => {
|
|
616
|
+
if (key === "Enter") {
|
|
617
|
+
const { value } = inputElement;
|
|
618
|
+
this.findOrgByToken(value);
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
}, 600);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
initForm() {
|
|
625
|
+
this.form = this.fb.group({
|
|
626
|
+
name: [null, [Validators.required]],
|
|
627
|
+
address: [""],
|
|
628
|
+
city: [""],
|
|
629
|
+
postal: [null],
|
|
630
|
+
siret: [null],
|
|
631
|
+
});
|
|
632
|
+
if (this.existing) {
|
|
633
|
+
const orgControls = this.form;
|
|
634
|
+
for (const control of Object.keys(orgControls.controls)) {
|
|
635
|
+
orgControls.controls[control].disable();
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
onCancel() {
|
|
640
|
+
this.form = null;
|
|
641
|
+
this.added.emit(false);
|
|
642
|
+
}
|
|
643
|
+
get name() {
|
|
644
|
+
return this.form.get("name");
|
|
645
|
+
}
|
|
646
|
+
onSubmit() {
|
|
647
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
648
|
+
this.working = true;
|
|
649
|
+
const formValue = this.form.value;
|
|
650
|
+
removeNullKeysFromObject(formValue);
|
|
651
|
+
try {
|
|
652
|
+
if (!this.existing) {
|
|
653
|
+
const organisation = yield this.orgService.createOrganisation(formValue);
|
|
654
|
+
if (organisation) {
|
|
655
|
+
this.createdOrg = organisation;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
// orgID = this.existingOrgID;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
catch (error) {
|
|
663
|
+
console.error(error);
|
|
664
|
+
this.added.emit(false);
|
|
665
|
+
}
|
|
666
|
+
this.working = false;
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
findOrgByToken(token) {
|
|
670
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
671
|
+
const org = yield this.orgService.getOrganisationByToken(token);
|
|
672
|
+
if (org) {
|
|
673
|
+
this.form.setValue({
|
|
674
|
+
name: [org.name],
|
|
675
|
+
address: [org.address],
|
|
676
|
+
city: [org.city],
|
|
677
|
+
postal: [org.postal],
|
|
678
|
+
siret: [org.siret],
|
|
679
|
+
});
|
|
680
|
+
this.existingOrgID = org.id;
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
alert("No organisation found. Maybe token is expired?");
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
userAndMissionAdded(added) {
|
|
688
|
+
this.added.emit(added);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
FormOrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.FormBuilder }, { token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
692
|
+
FormOrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormOrganisationComponent, selector: "lib-form-organisation", inputs: { currentOrg: "currentOrg", currentUser: "currentUser", existing: "existing" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <h4>{{ 'Organisation' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\" *ngIf=\"existing\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Organisation Token' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" id=\"tokenInput\" placeholder=\"Paste organisation token here\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'Name is mandatory' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal Code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"createdOrg; else noOrg\">\r\n <div class=\"alert alert-info\">\r\n {{'Organisation successfully created' | translate}}\r\n </div>\r\n <lib-user-mission-form [addToOrganisation]=\"createdOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAndMissionAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <ng-template #noOrg>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Create organisation' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style='margin-top: 1rem'>\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create new organisation first' | translate}}\r\n </ngb-alert>\r\n\r\n </ng-template>\r\n\r\n\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: i4$1.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
693
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormOrganisationComponent, decorators: [{
|
|
694
|
+
type: Component,
|
|
695
|
+
args: [{ selector: 'lib-form-organisation', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <h4>{{ 'Organisation' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\" *ngIf=\"existing\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Organisation Token' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" id=\"tokenInput\" placeholder=\"Paste organisation token here\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'Name is mandatory' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal Code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"createdOrg; else noOrg\">\r\n <div class=\"alert alert-info\">\r\n {{'Organisation successfully created' | translate}}\r\n </div>\r\n <lib-user-mission-form [addToOrganisation]=\"createdOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAndMissionAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <ng-template #noOrg>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Create organisation' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style='margin-top: 1rem'>\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create new organisation first' | translate}}\r\n </ngb-alert>\r\n\r\n </ng-template>\r\n\r\n\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
696
|
+
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.FormBuilder }, { type: i1.BaseUserService }]; }, propDecorators: { currentOrg: [{
|
|
697
|
+
type: Input
|
|
698
|
+
}], currentUser: [{
|
|
699
|
+
type: Input
|
|
700
|
+
}], existing: [{
|
|
701
|
+
type: Input
|
|
702
|
+
}], added: [{
|
|
703
|
+
type: Output
|
|
704
|
+
}] } });
|
|
705
|
+
|
|
706
|
+
class DetailOrganisationComponent {
|
|
707
|
+
constructor(organisationService,
|
|
708
|
+
// private localStripe: StripeService,
|
|
709
|
+
formBuilder) {
|
|
710
|
+
this.organisationService = organisationService;
|
|
711
|
+
this.formBuilder = formBuilder;
|
|
712
|
+
this.orgChanged = new EventEmitter();
|
|
713
|
+
this.loading = false;
|
|
714
|
+
this.connectingStripe = false;
|
|
715
|
+
}
|
|
716
|
+
ngOnInit() {
|
|
717
|
+
this.myOrg = this.currentOrg.id === this.org.id;
|
|
718
|
+
if (!this.org.connectedAccountStripeID && (this.myOrg || this.isSP)) {
|
|
719
|
+
this.setConnectStripeLink();
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
ngOnChanges() {
|
|
723
|
+
this.myOrg = this.currentOrg.id === this.org.id;
|
|
724
|
+
}
|
|
725
|
+
onToken() {
|
|
726
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
727
|
+
const token = v4();
|
|
728
|
+
const expires = new Date();
|
|
729
|
+
expires.setDate(expires.getDate() + 7); // 7 days expiration
|
|
730
|
+
this.org = yield this.organisationService.updateOrganisation({
|
|
731
|
+
id: this.org.id,
|
|
732
|
+
shareToken: token,
|
|
733
|
+
tokenExpiresAt: expires.getTime(),
|
|
734
|
+
});
|
|
735
|
+
this.orgChanged.emit(true);
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
prettifyToken() {
|
|
739
|
+
const expirationDate = new Date(this.org.tokenExpiresAt);
|
|
740
|
+
const diffTime = expirationDate.getTime() - Date.now();
|
|
741
|
+
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
742
|
+
const expirationString = diffTime < 0 ? "expired!" : `expires in ${diffDays} days`;
|
|
743
|
+
return `${this.org.shareToken.slice(0, 6)}... ${expirationString}`;
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Created New Stripe Account and launches onboarding procedure (mail, phone, business details..) by Stripe
|
|
747
|
+
* @returns null
|
|
748
|
+
*/
|
|
749
|
+
// async onCreateStripe() {
|
|
750
|
+
// this.loading = true;
|
|
751
|
+
// // Make the request
|
|
752
|
+
// const responseAccount = await API.post(
|
|
753
|
+
// "stripeApi",
|
|
754
|
+
// "/create/account",
|
|
755
|
+
// {},
|
|
756
|
+
// );
|
|
757
|
+
// console.log(responseAccount);
|
|
758
|
+
// if (responseAccount.err) {
|
|
759
|
+
// this.handleStripeError(responseAccount);
|
|
760
|
+
// return;
|
|
761
|
+
// }
|
|
762
|
+
// const { account } = responseAccount;
|
|
763
|
+
// // save account id to organisation
|
|
764
|
+
// await this.organisationService.update({
|
|
765
|
+
// id: this.org.id,
|
|
766
|
+
// connectedAccountStripeID: account.id,
|
|
767
|
+
// stripeOnBoardingCompleted: false,
|
|
768
|
+
// });
|
|
769
|
+
// const { origin } = document.location;
|
|
770
|
+
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
771
|
+
// account.id,
|
|
772
|
+
// origin,
|
|
773
|
+
// );
|
|
774
|
+
// if (responseAccountLinks.err) {
|
|
775
|
+
// this.handleStripeError(responseAccountLinks);
|
|
776
|
+
// return;
|
|
777
|
+
// }
|
|
778
|
+
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
779
|
+
// this.loading = false;
|
|
780
|
+
// }
|
|
781
|
+
// async onCompleteOnboardingStripe() {
|
|
782
|
+
// this.loading = true;
|
|
783
|
+
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
784
|
+
// this.org.connectedAccountStripeID,
|
|
785
|
+
// origin,
|
|
786
|
+
// );
|
|
787
|
+
// if (responseAccountLinks.err) {
|
|
788
|
+
// this.handleStripeError(responseAccountLinks);
|
|
789
|
+
// return;
|
|
790
|
+
// }
|
|
791
|
+
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
792
|
+
// this.loading = false;
|
|
793
|
+
// }
|
|
794
|
+
// handleStripeError(stripeResponse) {
|
|
795
|
+
// alert(stripeResponse.err.raw.message);
|
|
796
|
+
// this.loading = false;
|
|
797
|
+
// }
|
|
798
|
+
/**
|
|
799
|
+
* Generate link for Launching OAuth connection with Stripe: https://stripe.com/docs/connect/oauth-standard-accounts#integrating-oauth
|
|
800
|
+
*/
|
|
801
|
+
setConnectStripeLink() {
|
|
802
|
+
setTimeout(() => {
|
|
803
|
+
const hyperlink = document.querySelector("#linkStripe");
|
|
804
|
+
if (hyperlink) {
|
|
805
|
+
const clientID = "ca_KQhYOlgR1ipOxLBBQHfQeCLoaySRVD5P"; // TODO change for live Stripe Account
|
|
806
|
+
const { origin } = document.location;
|
|
807
|
+
const returnUrl = `${origin}/stripe/redirect`;
|
|
808
|
+
hyperlink.setAttribute("href", `https://connect.stripe.com/oauth/authorize?response_type=code&client_id=${clientID}&scope=read_write&redirect_uri=${returnUrl}&state=${this.org.id}`);
|
|
809
|
+
}
|
|
810
|
+
}, 200); // wait until the element is rendered
|
|
811
|
+
}
|
|
812
|
+
/** Edit */
|
|
813
|
+
onEdit() {
|
|
814
|
+
this.editForm = this.formBuilder.group({
|
|
815
|
+
id: this.org.id,
|
|
816
|
+
name: this.org.name,
|
|
817
|
+
siret: this.org.siret,
|
|
818
|
+
city: this.org.city,
|
|
819
|
+
address: this.org.address,
|
|
820
|
+
contactDetails: this.org.contactDetails,
|
|
821
|
+
postal: this.org.postal,
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
get name() {
|
|
825
|
+
return this.editForm.get("name");
|
|
826
|
+
}
|
|
827
|
+
onSubmit() {
|
|
828
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
829
|
+
const formValue = this.editForm.value;
|
|
830
|
+
removeNullKeysFromObject(formValue);
|
|
831
|
+
try {
|
|
832
|
+
const updatedOrg = yield this.organisationService.updateOrganisation(formValue);
|
|
833
|
+
this.org = updatedOrg;
|
|
834
|
+
}
|
|
835
|
+
catch (error) {
|
|
836
|
+
console.error(JSON.stringify(error));
|
|
837
|
+
}
|
|
838
|
+
this.editForm = null;
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
onCancel() {
|
|
842
|
+
this.editForm = null;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
DetailOrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DetailOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
846
|
+
DetailOrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: { org: "org", currentOrg: "currentOrg", isSP: "isSP" }, outputs: { orgChanged: "orgChanged" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" ngxClipboard [cbContent]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate\r\n token' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul>\r\n <!-- <a *ngIf=\"(myOrg || isSP) && !org.connectedAccountStripeID\" id=\"linkStripe\" \r\n class=\"ml-3 stripe-connect\"><span>Connect with</span>\r\n </a>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-3 no-lowercase\"\r\n *ngIf=\"(myOrg || isSP) && org.connectedAccountStripeID && !org.stripeOnBoardingCompleted\"\r\n (click)=\"onCompleteOnboardingStripe()\">{{'stripe.toComplete' | translate}}</button> -->\r\n\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.ClipboardDirective, selector: "[ngxClipboard]", inputs: ["ngxClipboard", "container", "cbContent", "cbSuccessMsg"], outputs: ["cbOnSuccess", "cbOnError"] }, { type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
847
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DetailOrganisationComponent, decorators: [{
|
|
848
|
+
type: Component,
|
|
849
|
+
args: [{ selector: 'lib-detail-organisation', template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" ngxClipboard [cbContent]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate\r\n token' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul>\r\n <!-- <a *ngIf=\"(myOrg || isSP) && !org.connectedAccountStripeID\" id=\"linkStripe\" \r\n class=\"ml-3 stripe-connect\"><span>Connect with</span>\r\n </a>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-3 no-lowercase\"\r\n *ngIf=\"(myOrg || isSP) && org.connectedAccountStripeID && !org.stripeOnBoardingCompleted\"\r\n (click)=\"onCompleteOnboardingStripe()\">{{'stripe.toComplete' | translate}}</button> -->\r\n\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
850
|
+
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.FormBuilder }]; }, propDecorators: { org: [{
|
|
851
|
+
type: Input
|
|
852
|
+
}], currentOrg: [{
|
|
853
|
+
type: Input
|
|
854
|
+
}], isSP: [{
|
|
855
|
+
type: Input
|
|
856
|
+
}], orgChanged: [{
|
|
857
|
+
type: Output
|
|
858
|
+
}] } });
|
|
859
|
+
|
|
860
|
+
class UserComponent {
|
|
861
|
+
constructor(userService, missionService, domainService, organisationService, modalService, translate) {
|
|
862
|
+
this.userService = userService;
|
|
863
|
+
this.missionService = missionService;
|
|
864
|
+
this.domainService = domainService;
|
|
865
|
+
this.organisationService = organisationService;
|
|
866
|
+
this.modalService = modalService;
|
|
867
|
+
this.translate = translate;
|
|
868
|
+
this.detailsUser = '-1';
|
|
869
|
+
this.detailsOrg = '-1';
|
|
870
|
+
this.query = '';
|
|
871
|
+
this.create = false;
|
|
872
|
+
this.edit = false;
|
|
873
|
+
this.working = false;
|
|
874
|
+
this.createForExistingUser = false;
|
|
875
|
+
this.isAddingOrg = false;
|
|
876
|
+
this.isAddingToExistingOrg = false;
|
|
877
|
+
this.isManager = false;
|
|
878
|
+
this.hideList = false;
|
|
879
|
+
this.orgsUsersMissions = [];
|
|
880
|
+
this.isSP = false;
|
|
881
|
+
this.isGuide = false;
|
|
882
|
+
this.clientsSP = [];
|
|
883
|
+
this.prestataireClients = [];
|
|
884
|
+
this.loading = false;
|
|
885
|
+
this.destroy$ = new Subject();
|
|
886
|
+
this.userService.isChanged
|
|
887
|
+
.pipe(takeUntil(this.destroy$))
|
|
888
|
+
.subscribe((isConnected) => {
|
|
889
|
+
if (isConnected) {
|
|
890
|
+
this.initInfo();
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
// @todo list my org and sub orgs
|
|
895
|
+
/**
|
|
896
|
+
* resetList fetches a fresh user list from server
|
|
897
|
+
*/
|
|
898
|
+
resetList() {
|
|
899
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
900
|
+
this.orgsUsersMissions = [];
|
|
901
|
+
let allMissions = [];
|
|
902
|
+
this.loading = true;
|
|
903
|
+
if (this.isSP) {
|
|
904
|
+
this.orgsUsersMissions = yield this.initListForSP();
|
|
905
|
+
this.filteredOrgsUsersMissions = this.orgsUsersMissions;
|
|
906
|
+
this.loading = false;
|
|
907
|
+
return;
|
|
908
|
+
}
|
|
909
|
+
allMissions = yield this.missionService.getMissionsByOrderedOrganisation(this.currentOrg.id);
|
|
910
|
+
const currentOrgMissions = yield this.missionService.getMissionsByOrganisation(this.currentOrg.id);
|
|
911
|
+
allMissions = [...allMissions, ...currentOrgMissions];
|
|
912
|
+
allMissions = allMissions.filter((mission) => mission.user && !mission.user.deletedAt);
|
|
913
|
+
allMissions = filterUniqueArrayByID(allMissions);
|
|
914
|
+
if (allMissions) {
|
|
915
|
+
const orgs = allMissions.map((mis) => mis.organisation);
|
|
916
|
+
const profiles = allMissions.map((mis) => mis.user);
|
|
917
|
+
const uniqueOrg = filterUniqueArrayByID(orgs);
|
|
918
|
+
const uniqueUsers = filterUniqueArrayByID(profiles);
|
|
919
|
+
uniqueOrg.map((org) => {
|
|
920
|
+
const orgMissions = allMissions.filter((mis) => {
|
|
921
|
+
return mis.organisationID === org.id;
|
|
922
|
+
});
|
|
923
|
+
let users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
|
|
924
|
+
users = users.sort((user) => (user.user.email ? 0 : -1));
|
|
925
|
+
const object = {
|
|
926
|
+
org,
|
|
927
|
+
users,
|
|
928
|
+
};
|
|
929
|
+
this.orgsUsersMissions.push(object);
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
this.filteredOrgsUsersMissions = this.orgsUsersMissions;
|
|
933
|
+
this.loading = false;
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
initInfo() {
|
|
937
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
938
|
+
const currentUser = this.userService.cu;
|
|
939
|
+
if (currentUser) {
|
|
940
|
+
this.me = currentUser;
|
|
941
|
+
this.currentOrg = this.userService.currentOrganisation();
|
|
942
|
+
this.isManager = this.userService.hasManagerRoleInAnyMission();
|
|
943
|
+
this.isSP = this.userService.isSPAdmin();
|
|
944
|
+
this.isGuide = this.userService.isGuide();
|
|
945
|
+
this.resetList();
|
|
946
|
+
this.setDomains();
|
|
947
|
+
}
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
ngOnInit() {
|
|
951
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
952
|
+
this.initInfo();
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
ngOnDestroy() {
|
|
956
|
+
this.destroy$.next(true);
|
|
957
|
+
this.destroy$.complete();
|
|
958
|
+
}
|
|
959
|
+
initListForSP() {
|
|
960
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
961
|
+
const results = [];
|
|
962
|
+
let allMissions = [];
|
|
963
|
+
let allOrgs = [];
|
|
964
|
+
allOrgs = yield this.organisationService.listOrganisations();
|
|
965
|
+
yield Promise.all(allOrgs.map((org) => __awaiter(this, void 0, void 0, function* () {
|
|
966
|
+
const missions = yield this.missionService.getMissionsByOrganisation(org.id);
|
|
967
|
+
allMissions = [...allMissions, ...missions];
|
|
968
|
+
})));
|
|
969
|
+
const profiles = allMissions
|
|
970
|
+
.map((mis) => mis.user)
|
|
971
|
+
.filter((user) => !user.deletedAt);
|
|
972
|
+
const uniqueUsers = filterUniqueArrayByID(profiles.filter((profile) => profile !== null));
|
|
973
|
+
allOrgs.map((org) => {
|
|
974
|
+
const orgMissions = allMissions.filter((mis) => {
|
|
975
|
+
return mis.organisationID === org.id;
|
|
976
|
+
});
|
|
977
|
+
if (orgMissions.length > 0) {
|
|
978
|
+
if (orgMissions.filter((m) => m.orderedOrganisationID === '6e28201f-4679-4c29-9d2d-8a325f57cee9').length > 0) {
|
|
979
|
+
this.clientsSP.push(org.id);
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
this.prestataireClients.push({
|
|
983
|
+
orgOwner: orgMissions[0].orderedOrganisationID,
|
|
984
|
+
prestataire: org.id,
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
const users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
|
|
989
|
+
const object = {
|
|
990
|
+
org,
|
|
991
|
+
users,
|
|
992
|
+
};
|
|
993
|
+
results.push(object);
|
|
994
|
+
});
|
|
995
|
+
return results;
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
// eslint-disable-next-line class-methods-use-this
|
|
999
|
+
getUsersForOrgMissions(uniqueUsers, orgMissions) {
|
|
1000
|
+
const users = uniqueUsers.map((user) => {
|
|
1001
|
+
const userMissions = orgMissions.filter((m) => m.userID === user.id);
|
|
1002
|
+
if (userMissions.length > 0) {
|
|
1003
|
+
const userProfile = new ProfileEntity(user);
|
|
1004
|
+
// once we got the user we check filter only active missions (not deleted)
|
|
1005
|
+
const activeMissions = userMissions.filter((mis) => !mis.deletedAt);
|
|
1006
|
+
return {
|
|
1007
|
+
missions: activeMissions,
|
|
1008
|
+
user: userProfile,
|
|
1009
|
+
};
|
|
1010
|
+
}
|
|
1011
|
+
return null;
|
|
1012
|
+
});
|
|
1013
|
+
return users.filter((us) => us !== null);
|
|
1014
|
+
}
|
|
1015
|
+
setDomains() {
|
|
1016
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1017
|
+
const domains = yield this.domainService.getDomainsForOrgExcludingTypes([DomainType.FEATURE, DomainType.BOOKING], this.currentOrg.id);
|
|
1018
|
+
this.domains = domains;
|
|
1019
|
+
});
|
|
1020
|
+
}
|
|
1021
|
+
/**
|
|
1022
|
+
* onToggleDetail folds/unfolds details for a given organisation
|
|
1023
|
+
* @param i index of the organisation to be toggled
|
|
1024
|
+
*/
|
|
1025
|
+
onToggleDetailOrg(index, org) {
|
|
1026
|
+
this.detailsOrg = index === this.detailsOrg ? '-1' : index;
|
|
1027
|
+
this.orgSelectedDetails = this.detailsOrg === '-1' ? null : org;
|
|
1028
|
+
}
|
|
1029
|
+
onToggleDetailUser(index) {
|
|
1030
|
+
this.detailsUser = index === this.detailsUser ? '-1' : index;
|
|
1031
|
+
}
|
|
1032
|
+
onAdd(org) {
|
|
1033
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1034
|
+
this.create = true;
|
|
1035
|
+
this.hideList = true;
|
|
1036
|
+
this.addToOrg = org;
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
onEdit(m) {
|
|
1040
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1041
|
+
this.edit = true;
|
|
1042
|
+
this.hideList = true;
|
|
1043
|
+
this.missionToEdit = m;
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
onCancel() {
|
|
1047
|
+
this.working = false;
|
|
1048
|
+
this.create = false;
|
|
1049
|
+
this.missionToEdit = null;
|
|
1050
|
+
this.createForExistingUser = false;
|
|
1051
|
+
}
|
|
1052
|
+
onAddForUser(org, user) {
|
|
1053
|
+
this.hideList = true;
|
|
1054
|
+
this.createForExistingUser = true;
|
|
1055
|
+
this.userForAddingMission = user;
|
|
1056
|
+
this.addToOrg = org;
|
|
1057
|
+
}
|
|
1058
|
+
onAddOrg() {
|
|
1059
|
+
this.hideList = true;
|
|
1060
|
+
this.isAddingOrg = true;
|
|
1061
|
+
}
|
|
1062
|
+
orgAdded(isAdded) {
|
|
1063
|
+
this.hideList = false;
|
|
1064
|
+
this.isAddingOrg = false;
|
|
1065
|
+
this.isAddingToExistingOrg = false;
|
|
1066
|
+
if (isAdded) {
|
|
1067
|
+
this.resetList();
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
userAdded(isAdded) {
|
|
1071
|
+
console.log(isAdded);
|
|
1072
|
+
this.hideList = false;
|
|
1073
|
+
this.create = false;
|
|
1074
|
+
this.addToOrg = null;
|
|
1075
|
+
this.createForExistingUser = false;
|
|
1076
|
+
this.userForAddingMission = null;
|
|
1077
|
+
if (isAdded) {
|
|
1078
|
+
this.resetList();
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
onMissionEdited(mission) {
|
|
1082
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1083
|
+
this.edit = false;
|
|
1084
|
+
this.missionToEdit = null;
|
|
1085
|
+
if (mission) {
|
|
1086
|
+
yield this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID, false);
|
|
1087
|
+
this.resetList();
|
|
1088
|
+
}
|
|
1089
|
+
this.hideList = false;
|
|
1090
|
+
});
|
|
1091
|
+
}
|
|
1092
|
+
onMissionCreated(mission) {
|
|
1093
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1094
|
+
this.createForExistingUser = false;
|
|
1095
|
+
this.userForAddingMission = null;
|
|
1096
|
+
if (mission) {
|
|
1097
|
+
yield this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID);
|
|
1098
|
+
this.resetList();
|
|
1099
|
+
}
|
|
1100
|
+
this.hideList = false;
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
getOrderedOrg(orgID) {
|
|
1104
|
+
let name;
|
|
1105
|
+
this.prestataireClients.map((presta) => __awaiter(this, void 0, void 0, function* () {
|
|
1106
|
+
if (presta.prestataire === orgID) {
|
|
1107
|
+
const org = this.orgsUsersMissions.filter((object) => object.org.id === presta.orgOwner);
|
|
1108
|
+
if (org.length > 0) {
|
|
1109
|
+
name = org[0].org.name;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
}));
|
|
1113
|
+
return name;
|
|
1114
|
+
}
|
|
1115
|
+
domainIdsToStringForMission(mission) {
|
|
1116
|
+
let names = '';
|
|
1117
|
+
for (const domainID of mission.domains) {
|
|
1118
|
+
const domain = this.domains.find((dom) => dom.id === domainID);
|
|
1119
|
+
if (domain) {
|
|
1120
|
+
names = `${names} ${domain.name},`;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
return names.slice(0, -1); // to remove last comma
|
|
1124
|
+
}
|
|
1125
|
+
onDeleteMission(mission) {
|
|
1126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1127
|
+
const message = this.translate.instant('confirm.deleteMission');
|
|
1128
|
+
if (window.confirm(message)) {
|
|
1129
|
+
yield this.missionService.softDeleteMission(mission.id);
|
|
1130
|
+
this.resetList();
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
onDeleteUser(user) {
|
|
1135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1136
|
+
const message = this.translate.instant('confirm.deleteUser');
|
|
1137
|
+
if (window.confirm(message)) {
|
|
1138
|
+
const userMissions = yield this.missionService.getMissionsFromUserID(user.id);
|
|
1139
|
+
if (userMissions.length > 0) {
|
|
1140
|
+
const resultDelete = [];
|
|
1141
|
+
yield Promise.all(userMissions.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1142
|
+
if (mission.orderedOrganisationID === this.currentOrg.id ||
|
|
1143
|
+
this.isSP) {
|
|
1144
|
+
const deletedMission = yield this.missionService.softDeleteMission(mission.id);
|
|
1145
|
+
if (deletedMission) {
|
|
1146
|
+
resultDelete.push(deletedMission);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
})));
|
|
1150
|
+
if (resultDelete.length > 0) {
|
|
1151
|
+
yield this.userService.softDeleteUser(user.id);
|
|
1152
|
+
yield this.resetList();
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
else {
|
|
1156
|
+
yield this.userService.softDeleteUser(user.id);
|
|
1157
|
+
yield this.resetList();
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
applyResultsSearchBar(results) {
|
|
1163
|
+
this.orgSelectedDetails = null;
|
|
1164
|
+
this.filteredOrgsUsersMissions = results || this.orgsUsersMissions;
|
|
1165
|
+
}
|
|
1166
|
+
onAddInExistingOrg() {
|
|
1167
|
+
this.hideList = true;
|
|
1168
|
+
this.isAddingToExistingOrg = true;
|
|
1169
|
+
}
|
|
1170
|
+
/**
|
|
1171
|
+
* Creates encypted link and sets it for guestLink for Space.
|
|
1172
|
+
* @param mis
|
|
1173
|
+
*/
|
|
1174
|
+
onSetForShareableLink(user, mission) {
|
|
1175
|
+
const modalReference = this.modalService.open(GuestLinkComponent);
|
|
1176
|
+
modalReference.componentInstance.username = user.email;
|
|
1177
|
+
modalReference.componentInstance.spaceID = mission.spaceID;
|
|
1178
|
+
}
|
|
1179
|
+
onClearToken(user) {
|
|
1180
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1181
|
+
yield this.userService.clearUserToken(user.user.id);
|
|
1182
|
+
const firstMessage = this.translate.instant('firstTokenMessage');
|
|
1183
|
+
const secondMessage = this.translate.instant('secondTokenMessage');
|
|
1184
|
+
alert(firstMessage + user.user.displayName + secondMessage);
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i4$1.NgbModal }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1189
|
+
UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"isManager && !isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], pipes: { "translate": i3.TranslatePipe, "async": i4.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
|
|
1190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, decorators: [{
|
|
1191
|
+
type: Component,
|
|
1192
|
+
args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"isManager && !isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"] }]
|
|
1193
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i4$1.NgbModal }, { type: i3.TranslateService }]; } });
|
|
1194
|
+
|
|
1195
|
+
class TemplateComponent {
|
|
1196
|
+
constructor(route, fb, userService, spaceService, zoneService, location, hashtagService, translate, templateService) {
|
|
1197
|
+
this.route = route;
|
|
1198
|
+
this.fb = fb;
|
|
1199
|
+
this.userService = userService;
|
|
1200
|
+
this.spaceService = spaceService;
|
|
1201
|
+
this.zoneService = zoneService;
|
|
1202
|
+
this.location = location;
|
|
1203
|
+
this.hashtagService = hashtagService;
|
|
1204
|
+
this.translate = translate;
|
|
1205
|
+
this.templateService = templateService;
|
|
1206
|
+
this.updatedTemplate = new EventEmitter();
|
|
1207
|
+
this.createdTemplate = new EventEmitter();
|
|
1208
|
+
this.working = false;
|
|
1209
|
+
this.missionTimeStart = 12 * 60 * 60000; // midday in milliseconds
|
|
1210
|
+
this.missionTimeEnd = 12 * 60 * 60000;
|
|
1211
|
+
this.availableHashtags = [];
|
|
1212
|
+
this.addedHashtags = [];
|
|
1213
|
+
this.userService.isChanged.subscribe(() => {
|
|
1214
|
+
this.updateUserInfo();
|
|
1215
|
+
});
|
|
1216
|
+
}
|
|
1217
|
+
ngOnInit() {
|
|
1218
|
+
this.setup();
|
|
1219
|
+
const lang = this.translate.currentLang
|
|
1220
|
+
? this.translate.currentLang
|
|
1221
|
+
: this.translate.defaultLang;
|
|
1222
|
+
/** Transforme '_fr' to 'fr' */
|
|
1223
|
+
this.currentLocale = stringLocaleToEnum(lang.slice(1)); // to match enum Locale
|
|
1224
|
+
this.locales = enumToArray(Locale);
|
|
1225
|
+
}
|
|
1226
|
+
setup() {
|
|
1227
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1228
|
+
this.initForm();
|
|
1229
|
+
if (this.zoneID) {
|
|
1230
|
+
this.inputZone = yield this.zoneService.getZone(this.zoneID);
|
|
1231
|
+
yield this.setHashtags(this.inputZone.spaceID);
|
|
1232
|
+
}
|
|
1233
|
+
if (this.editTemplate) {
|
|
1234
|
+
// we are editing a template
|
|
1235
|
+
this.onSpaceClick();
|
|
1236
|
+
}
|
|
1237
|
+
yield this.updateUserInfo();
|
|
1238
|
+
});
|
|
1239
|
+
}
|
|
1240
|
+
updateUserInfo() {
|
|
1241
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1242
|
+
if (this.userService.cu) {
|
|
1243
|
+
this.availableLevels =
|
|
1244
|
+
this.userService.getAvalableLevelsForCurrentUser();
|
|
1245
|
+
this.currentOrg = this.userService.currentOrganisation();
|
|
1246
|
+
this.availableSpaces = yield this.spaceService.getSpacesForOrg(this.currentOrg.id);
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
initForm() {
|
|
1251
|
+
if (this.editTemplate) {
|
|
1252
|
+
this.form = this.fb.group({
|
|
1253
|
+
title: [this.editTemplate.title],
|
|
1254
|
+
level: [this.editTemplate.level],
|
|
1255
|
+
organisationID: [this.editTemplate.organisationID],
|
|
1256
|
+
space: [this.editTemplate.spaceID],
|
|
1257
|
+
description: [this.editTemplate.description],
|
|
1258
|
+
zone: [
|
|
1259
|
+
this.editTemplate.zoneID,
|
|
1260
|
+
Validators.required,
|
|
1261
|
+
],
|
|
1262
|
+
locale: [this.editTemplate.locale],
|
|
1263
|
+
});
|
|
1264
|
+
if (this.editTemplate.startDateTime) {
|
|
1265
|
+
const date = DateTime.fromISO(this.editTemplate.startDateTime);
|
|
1266
|
+
this.missionTimeStart = (date.hour * 60 + date.minute) * 60 * 1000;
|
|
1267
|
+
this.startDate = date.toMillis() - this.missionTimeStart;
|
|
1268
|
+
}
|
|
1269
|
+
if (this.editTemplate.endDateTime) {
|
|
1270
|
+
const date = DateTime.fromISO(this.editTemplate.endDateTime);
|
|
1271
|
+
this.missionTimeEnd = (date.hour * 60 + date.minute) * 60 * 1000;
|
|
1272
|
+
this.endDate = date.toMillis() - this.missionTimeEnd;
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
else {
|
|
1276
|
+
this.form = this.fb.group({
|
|
1277
|
+
title: [""],
|
|
1278
|
+
level: [LevelStatus.MINIMUM],
|
|
1279
|
+
organisationID: this.currentOrg.id,
|
|
1280
|
+
space: this.inputZone ? this.inputZone.spaceID : [null],
|
|
1281
|
+
description: [null],
|
|
1282
|
+
zone: [
|
|
1283
|
+
this.inputZone ? this.inputZone.id : null,
|
|
1284
|
+
Validators.required,
|
|
1285
|
+
],
|
|
1286
|
+
locale: [this.currentLocale],
|
|
1287
|
+
});
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
onSubmit() {
|
|
1291
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1292
|
+
this.working = true;
|
|
1293
|
+
const formValue = this.form.getRawValue();
|
|
1294
|
+
let startDateString;
|
|
1295
|
+
let endDateString;
|
|
1296
|
+
if (this.startDate) {
|
|
1297
|
+
const dateHourStartNumber = this.startDate + this.missionTimeStart;
|
|
1298
|
+
const startDate = DateTime.fromMillis(dateHourStartNumber);
|
|
1299
|
+
startDateString = startDate.toISO();
|
|
1300
|
+
}
|
|
1301
|
+
if (this.endDate) {
|
|
1302
|
+
const dateHourEndNumber = this.endDate + this.missionTimeEnd;
|
|
1303
|
+
const endDate = DateTime.fromMillis(dateHourEndNumber);
|
|
1304
|
+
endDateString = endDate.toISO();
|
|
1305
|
+
}
|
|
1306
|
+
try {
|
|
1307
|
+
if (this.editTemplate) {
|
|
1308
|
+
// update
|
|
1309
|
+
const template = {
|
|
1310
|
+
id: this.editTemplate.id,
|
|
1311
|
+
title: formValue.title,
|
|
1312
|
+
level: formValue.level,
|
|
1313
|
+
description: formValue.description,
|
|
1314
|
+
organisationID: formValue.organisationID,
|
|
1315
|
+
startDateTime: startDateString,
|
|
1316
|
+
endDateTime: endDateString,
|
|
1317
|
+
hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
|
|
1318
|
+
locale: formValue.locale,
|
|
1319
|
+
};
|
|
1320
|
+
if (formValue.space) {
|
|
1321
|
+
template.spaceID = formValue.space;
|
|
1322
|
+
}
|
|
1323
|
+
if (formValue.zone) {
|
|
1324
|
+
template.zoneID = formValue.zone;
|
|
1325
|
+
}
|
|
1326
|
+
this.updatedTemplate.emit(template);
|
|
1327
|
+
}
|
|
1328
|
+
else {
|
|
1329
|
+
//create
|
|
1330
|
+
if (this.currentOrg) {
|
|
1331
|
+
const template = {
|
|
1332
|
+
title: formValue.title,
|
|
1333
|
+
organisationID: this.currentOrg.id,
|
|
1334
|
+
level: formValue.level,
|
|
1335
|
+
description: formValue.description,
|
|
1336
|
+
startDateTime: startDateString,
|
|
1337
|
+
endDateTime: endDateString,
|
|
1338
|
+
hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
|
|
1339
|
+
locale: formValue.locale,
|
|
1340
|
+
};
|
|
1341
|
+
if (formValue.space) {
|
|
1342
|
+
template.spaceID = formValue.space;
|
|
1343
|
+
}
|
|
1344
|
+
if (formValue.zone) {
|
|
1345
|
+
template.zoneID = formValue.zone;
|
|
1346
|
+
}
|
|
1347
|
+
this.createdTemplate.emit(template);
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
catch (error) {
|
|
1352
|
+
console.error(error);
|
|
1353
|
+
}
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1356
|
+
onCancel() {
|
|
1357
|
+
this.form = null;
|
|
1358
|
+
if (this.editTemplate) {
|
|
1359
|
+
this.updatedTemplate.emit(null);
|
|
1360
|
+
}
|
|
1361
|
+
else {
|
|
1362
|
+
this.createdTemplate.emit(null);
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
get title() {
|
|
1366
|
+
return this.form.get("title");
|
|
1367
|
+
}
|
|
1368
|
+
get spaceID() {
|
|
1369
|
+
return this.form.get("space");
|
|
1370
|
+
}
|
|
1371
|
+
onSpaceClick() {
|
|
1372
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1373
|
+
const zones = yield this.zoneService.getZonesBySpace(this.spaceID.value);
|
|
1374
|
+
const museumZones = zones.filter((zone) => zone.isMuseumVisitZone);
|
|
1375
|
+
this.zonesForSpace = sortAlphabeticallyOnName(museumZones);
|
|
1376
|
+
yield this.setHashtags(this.spaceID.value);
|
|
1377
|
+
});
|
|
1378
|
+
}
|
|
1379
|
+
onHashtagClick(hashtag) {
|
|
1380
|
+
if (!this.addedHashtags.includes(hashtag)) {
|
|
1381
|
+
this.addedHashtags.push(hashtag);
|
|
1382
|
+
}
|
|
1383
|
+
else {
|
|
1384
|
+
this.addedHashtags.splice(this.addedHashtags.indexOf(hashtag), 1);
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
setHashtags(spaceID) {
|
|
1388
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1389
|
+
this.availableHashtags = yield this.hashtagService.getHashtagsForSpace(spaceID);
|
|
1390
|
+
});
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
TemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, deps: [{ token: i2$1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i1.BaseUserService }, { token: i1.SpaceService }, { token: i1.ZoneService }, { token: i4.Location }, { token: i1.HashtagService }, { token: i3.TranslateService }, { token: i1.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1394
|
+
TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"title.invalid && title.touched\" required\r\n formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">{{'No hashtags created for this\r\n location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i4$1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i4$1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
1395
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, decorators: [{
|
|
1396
|
+
type: Component,
|
|
1397
|
+
args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"title.invalid && title.touched\" required\r\n formControlName=\"title\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">{{'No hashtags created for this\r\n location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" [(ngModel)]=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" [ngModelOptions]=\"{standalone: true}\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
|
|
1398
|
+
}], ctorParameters: function () { return [{ type: i2$1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i1.BaseUserService }, { type: i1.SpaceService }, { type: i1.ZoneService }, { type: i4.Location }, { type: i1.HashtagService }, { type: i3.TranslateService }, { type: i1.TemplateService }]; }, propDecorators: { currentOrg: [{
|
|
1399
|
+
type: Input
|
|
1400
|
+
}], editTemplate: [{
|
|
1401
|
+
type: Input
|
|
1402
|
+
}], zoneID: [{
|
|
1403
|
+
type: Input
|
|
1404
|
+
}], updatedTemplate: [{
|
|
1405
|
+
type: Output
|
|
1406
|
+
}], createdTemplate: [{
|
|
1407
|
+
type: Output
|
|
1408
|
+
}] } });
|
|
1409
|
+
|
|
1410
|
+
class CreateBatchComponent {
|
|
1411
|
+
constructor(missionService, userService, translate) {
|
|
1412
|
+
this.missionService = missionService;
|
|
1413
|
+
this.userService = userService;
|
|
1414
|
+
this.translate = translate;
|
|
1415
|
+
this.createdMissions = new EventEmitter();
|
|
1416
|
+
this.addedEmails = [];
|
|
1417
|
+
this.working = false;
|
|
1418
|
+
}
|
|
1419
|
+
ngOnInit() { }
|
|
1420
|
+
onAddEmail(value) {
|
|
1421
|
+
if (value) {
|
|
1422
|
+
if (validEmail(value)) {
|
|
1423
|
+
this.addedEmails.push(value);
|
|
1424
|
+
}
|
|
1425
|
+
else {
|
|
1426
|
+
alert("Please, enter a valid email address");
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
onDelete(index) {
|
|
1431
|
+
this.addedEmails.splice(index, 1);
|
|
1432
|
+
}
|
|
1433
|
+
onCancel() {
|
|
1434
|
+
this.createdMissions.emit(null);
|
|
1435
|
+
}
|
|
1436
|
+
onCreateMissions() {
|
|
1437
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1438
|
+
const createdMissions = [];
|
|
1439
|
+
let user;
|
|
1440
|
+
this.working = true;
|
|
1441
|
+
yield Promise.all(this.addedEmails.map((mail) => __awaiter(this, void 0, void 0, function* () {
|
|
1442
|
+
user = yield this.userService.profileForMail(mail);
|
|
1443
|
+
if (!user) {
|
|
1444
|
+
try {
|
|
1445
|
+
const profile = yield this.userService.createUserAWSandProfile({
|
|
1446
|
+
email: mail,
|
|
1447
|
+
lastName: mail,
|
|
1448
|
+
firstName: "",
|
|
1449
|
+
phone: "",
|
|
1450
|
+
}, true);
|
|
1451
|
+
user = profile;
|
|
1452
|
+
}
|
|
1453
|
+
catch (error) {
|
|
1454
|
+
alert(`Error creating users: ${this.translate.instant(error)}`);
|
|
1455
|
+
this.working = false;
|
|
1456
|
+
return;
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
if (user) {
|
|
1460
|
+
const missionInput = {
|
|
1461
|
+
organisationID: this.template.organisationID,
|
|
1462
|
+
orderedOrganisationID: this.template.organisationID,
|
|
1463
|
+
level: this.template.level,
|
|
1464
|
+
role: RoleStatus.VISITOR_MUSEUM,
|
|
1465
|
+
description: "Generated from template",
|
|
1466
|
+
userID: user.id,
|
|
1467
|
+
startDateTime: this.template.startDateTime,
|
|
1468
|
+
endDateTime: this.template.endDateTime,
|
|
1469
|
+
spaceID: this.template.spaceID,
|
|
1470
|
+
zoneID: this.template.zoneID,
|
|
1471
|
+
templateMissionID: this.template.id,
|
|
1472
|
+
hashtags: this.template.hashtags,
|
|
1473
|
+
};
|
|
1474
|
+
const mission = yield this.missionService.create(missionInput);
|
|
1475
|
+
createdMissions.push(mission);
|
|
1476
|
+
}
|
|
1477
|
+
})));
|
|
1478
|
+
this.working = false;
|
|
1479
|
+
this.createdMissions.emit(createdMissions);
|
|
1480
|
+
this.addedEmails = [];
|
|
1481
|
+
});
|
|
1482
|
+
}
|
|
1483
|
+
handleFileInput(eventTarget) {
|
|
1484
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1485
|
+
const files = eventTarget.files;
|
|
1486
|
+
const uploaded = files.item(0);
|
|
1487
|
+
if (uploaded.name.includes(".csv")) {
|
|
1488
|
+
Papa.parse(uploaded, {
|
|
1489
|
+
complete: function onComplete(results) {
|
|
1490
|
+
for (const mail of results.data) {
|
|
1491
|
+
this.addedEmails.push(mail[0]);
|
|
1492
|
+
}
|
|
1493
|
+
console.log(this.addedEmails);
|
|
1494
|
+
// eslint-disable-next-line no-extra-bind
|
|
1495
|
+
}.bind(this),
|
|
1496
|
+
});
|
|
1497
|
+
}
|
|
1498
|
+
else {
|
|
1499
|
+
alert("Not a csv file");
|
|
1500
|
+
}
|
|
1501
|
+
});
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
CreateBatchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CreateBatchComponent, deps: [{ token: i1.MissionService }, { token: i1.BaseUserService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1505
|
+
CreateBatchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CreateBatchComponent, selector: "lib-create-batch", inputs: { template: "template" }, outputs: { createdMissions: "createdMissions" }, ngImport: i0, template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
1506
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CreateBatchComponent, decorators: [{
|
|
1507
|
+
type: Component,
|
|
1508
|
+
args: [{ selector: 'lib-create-batch', template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
1509
|
+
}], ctorParameters: function () { return [{ type: i1.MissionService }, { type: i1.BaseUserService }, { type: i3.TranslateService }]; }, propDecorators: { template: [{
|
|
1510
|
+
type: Input
|
|
1511
|
+
}], createdMissions: [{
|
|
1512
|
+
type: Output
|
|
1513
|
+
}] } });
|
|
1514
|
+
|
|
1515
|
+
class VisitorComponent {
|
|
1516
|
+
constructor(userService, missionService, router, translate, spaceService, zoneService, modalService, templateService) {
|
|
1517
|
+
this.userService = userService;
|
|
1518
|
+
this.missionService = missionService;
|
|
1519
|
+
this.router = router;
|
|
1520
|
+
this.translate = translate;
|
|
1521
|
+
this.spaceService = spaceService;
|
|
1522
|
+
this.zoneService = zoneService;
|
|
1523
|
+
this.modalService = modalService;
|
|
1524
|
+
this.templateService = templateService;
|
|
1525
|
+
this.editing = false;
|
|
1526
|
+
this.creating = false;
|
|
1527
|
+
this.isAddingBatch = false;
|
|
1528
|
+
this.allZoneTemplatesMap = new Map(); // zone=>its templates
|
|
1529
|
+
this.allTemplateMissionsMap = new Map(); // templateID, its derived Missions
|
|
1530
|
+
this.detailsForZones = [];
|
|
1531
|
+
this.csvHeaders = [
|
|
1532
|
+
"email",
|
|
1533
|
+
"user_status",
|
|
1534
|
+
"zone",
|
|
1535
|
+
"location",
|
|
1536
|
+
"start_date_time",
|
|
1537
|
+
"end_date_time",
|
|
1538
|
+
"access_level",
|
|
1539
|
+
];
|
|
1540
|
+
this.loading = false;
|
|
1541
|
+
this.toDuplicate = false;
|
|
1542
|
+
this.userService.isChanged.subscribe(() => this.setup());
|
|
1543
|
+
}
|
|
1544
|
+
ngOnInit() {
|
|
1545
|
+
this.setup();
|
|
1546
|
+
}
|
|
1547
|
+
setup() {
|
|
1548
|
+
this.setupUser();
|
|
1549
|
+
this.setZonesTemplates();
|
|
1550
|
+
}
|
|
1551
|
+
setZonesTemplates() {
|
|
1552
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1553
|
+
if (!this.currentOrg) {
|
|
1554
|
+
return;
|
|
1555
|
+
}
|
|
1556
|
+
this.loading = true;
|
|
1557
|
+
this.allZoneTemplatesMap = new Map();
|
|
1558
|
+
this.allTemplateMissionsMap = new Map();
|
|
1559
|
+
let locations = this.spaceService.locationsForUser;
|
|
1560
|
+
if (locations.length === 0) {
|
|
1561
|
+
locations = yield this.spaceService.getLocationsForCurrentUser();
|
|
1562
|
+
}
|
|
1563
|
+
yield Promise.all(locations.map((space) => __awaiter(this, void 0, void 0, function* () {
|
|
1564
|
+
let zones = yield this.zoneService.getZonesBySpace(space.id);
|
|
1565
|
+
zones = zones.filter((zone) => zone.isMuseumVisitZone);
|
|
1566
|
+
yield Promise.all(zones.map((zone) => __awaiter(this, void 0, void 0, function* () {
|
|
1567
|
+
const visitorsMissions = yield this.missionService.getMissionsByZoneByRole(zone.id, RoleStatus.VISITOR_MUSEUM);
|
|
1568
|
+
let templates = yield this.templateService.getTemplatesByZone(zone.id);
|
|
1569
|
+
templates = templates.filter((template) => !template.deletedAt);
|
|
1570
|
+
templates = templates.sort((a, b) =>
|
|
1571
|
+
// @ts-ignore
|
|
1572
|
+
// eslint-disable-next-line prettier/prettier
|
|
1573
|
+
new Date(b.startDateTime) - new Date(a.startDateTime));
|
|
1574
|
+
for (const template of templates) {
|
|
1575
|
+
const missionsFromTemplate = visitorsMissions.filter((mis) => mis.templateMissionID === template.id);
|
|
1576
|
+
this.allTemplateMissionsMap.set(template.id, missionsFromTemplate);
|
|
1577
|
+
}
|
|
1578
|
+
this.allZoneTemplatesMap.set(zone, templates);
|
|
1579
|
+
})));
|
|
1580
|
+
})));
|
|
1581
|
+
// sort list by zone name alphabetically
|
|
1582
|
+
this.allZoneTemplatesMapFiltered =
|
|
1583
|
+
new Map([...this.allZoneTemplatesMap.entries()].sort((a, b) => a[0].name.localeCompare(b[0].name)));
|
|
1584
|
+
this.loading = false;
|
|
1585
|
+
});
|
|
1586
|
+
}
|
|
1587
|
+
setupUser() {
|
|
1588
|
+
this.currentOrg = this.userService.currentOrganisation();
|
|
1589
|
+
}
|
|
1590
|
+
onCreateTemplate() {
|
|
1591
|
+
this.creating = true;
|
|
1592
|
+
}
|
|
1593
|
+
onDeleteMission(mission) {
|
|
1594
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1595
|
+
yield this.missionService.softDeleteMission(mission.id);
|
|
1596
|
+
this.setZonesTemplates();
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
onEditTemplate(template) {
|
|
1600
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1601
|
+
this.editing = true;
|
|
1602
|
+
this.templateToEdit = template;
|
|
1603
|
+
});
|
|
1604
|
+
}
|
|
1605
|
+
onUpdatedEvent(isAdded) {
|
|
1606
|
+
this.editing = false;
|
|
1607
|
+
this.templateToEdit = null;
|
|
1608
|
+
this.isAddingBatch = false;
|
|
1609
|
+
this.chosenTemplate = null;
|
|
1610
|
+
if (isAdded) {
|
|
1611
|
+
this.setZonesTemplates();
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
onUpdatedTemplate(template) {
|
|
1615
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1616
|
+
this.loading = true;
|
|
1617
|
+
this.editing = false;
|
|
1618
|
+
this.templateToEdit = null;
|
|
1619
|
+
if (template) {
|
|
1620
|
+
if (this.toDuplicate) {
|
|
1621
|
+
// create new template
|
|
1622
|
+
delete template.id;
|
|
1623
|
+
yield this.templateService.create(template);
|
|
1624
|
+
this.toDuplicate = false;
|
|
1625
|
+
yield this.setZonesTemplates();
|
|
1626
|
+
return;
|
|
1627
|
+
}
|
|
1628
|
+
yield this.templateService.update(template);
|
|
1629
|
+
yield this.setZonesTemplates();
|
|
1630
|
+
// update related Missions
|
|
1631
|
+
const missionsForTemplate = yield this.missionService.getMissionsByTemplate(template.id);
|
|
1632
|
+
yield Promise.all(missionsForTemplate.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1633
|
+
const missionUpdate = {
|
|
1634
|
+
id: mission.id,
|
|
1635
|
+
level: template.level,
|
|
1636
|
+
startDateTime: template.startDateTime,
|
|
1637
|
+
endDateTime: template.endDateTime,
|
|
1638
|
+
locale: template.locale,
|
|
1639
|
+
zoneID: template.zoneID,
|
|
1640
|
+
spaceID: template.spaceID,
|
|
1641
|
+
hashtags: template.hashtags,
|
|
1642
|
+
};
|
|
1643
|
+
yield this.missionService.update(missionUpdate);
|
|
1644
|
+
})));
|
|
1645
|
+
}
|
|
1646
|
+
this.loading = false;
|
|
1647
|
+
});
|
|
1648
|
+
}
|
|
1649
|
+
onCreatedTemplate(template) {
|
|
1650
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1651
|
+
this.loading = true;
|
|
1652
|
+
this.creating = false;
|
|
1653
|
+
if (template) {
|
|
1654
|
+
yield this.templateService.create(template);
|
|
1655
|
+
this.setZonesTemplates();
|
|
1656
|
+
}
|
|
1657
|
+
this.loading = false;
|
|
1658
|
+
});
|
|
1659
|
+
}
|
|
1660
|
+
onToggleMissionsForZone(zoneID) {
|
|
1661
|
+
if (this.detailsForZones.includes(zoneID)) {
|
|
1662
|
+
const index = this.detailsForZones.indexOf(zoneID);
|
|
1663
|
+
this.detailsForZones.splice(index, 1);
|
|
1664
|
+
}
|
|
1665
|
+
else {
|
|
1666
|
+
this.detailsForZones.push(zoneID);
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
onToggleTemplateDetails(template) {
|
|
1670
|
+
this.templateShowing =
|
|
1671
|
+
this.templateShowing === template.id ? null : template.id;
|
|
1672
|
+
}
|
|
1673
|
+
onAddNewTemplateToZone(zone) {
|
|
1674
|
+
this.zoneIDForNewTemplate = zone.id;
|
|
1675
|
+
this.creating = true;
|
|
1676
|
+
}
|
|
1677
|
+
onArchiveTemplate(template) {
|
|
1678
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1679
|
+
const message = this.translate.instant("confirm.archiveTemplate");
|
|
1680
|
+
if (window.confirm(message)) {
|
|
1681
|
+
const missionsToDelete = this.allTemplateMissionsMap.get(template.id);
|
|
1682
|
+
yield Promise.all(missionsToDelete.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1683
|
+
yield this.missionService.softDeleteMission(mission.id);
|
|
1684
|
+
})));
|
|
1685
|
+
yield this.templateService.softDelete(template.id);
|
|
1686
|
+
this.setZonesTemplates();
|
|
1687
|
+
}
|
|
1688
|
+
});
|
|
1689
|
+
}
|
|
1690
|
+
onGenerateBatch(template) {
|
|
1691
|
+
this.chosenTemplate = template;
|
|
1692
|
+
this.isAddingBatch = true;
|
|
1693
|
+
}
|
|
1694
|
+
generateCSVUsers(template) {
|
|
1695
|
+
const data = [];
|
|
1696
|
+
for (const mission of this.allTemplateMissionsMap.get(template.id)) {
|
|
1697
|
+
const user = new ProfileEntity(mission.user);
|
|
1698
|
+
data.push([
|
|
1699
|
+
user.email,
|
|
1700
|
+
mission.user.status,
|
|
1701
|
+
mission.zone.name,
|
|
1702
|
+
mission.space.name,
|
|
1703
|
+
mission.startDateTime,
|
|
1704
|
+
mission.endDateTime,
|
|
1705
|
+
mission.level,
|
|
1706
|
+
]);
|
|
1707
|
+
}
|
|
1708
|
+
return data;
|
|
1709
|
+
}
|
|
1710
|
+
onSendInvitation(template) {
|
|
1711
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1712
|
+
yield Promise.all(this.allTemplateMissionsMap
|
|
1713
|
+
.get(template.id)
|
|
1714
|
+
.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1715
|
+
if (mission.emailStatus !== EmailStatus.SENT) {
|
|
1716
|
+
yield this.missionService.update({
|
|
1717
|
+
id: mission.id,
|
|
1718
|
+
emailStatus: EmailStatus.CREATION_TO_DELIVER,
|
|
1719
|
+
});
|
|
1720
|
+
}
|
|
1721
|
+
})));
|
|
1722
|
+
});
|
|
1723
|
+
}
|
|
1724
|
+
onSendUpdate(template) {
|
|
1725
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1726
|
+
yield Promise.all(this.allTemplateMissionsMap
|
|
1727
|
+
.get(template.id)
|
|
1728
|
+
.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1729
|
+
yield this.missionService.update({
|
|
1730
|
+
id: mission.id,
|
|
1731
|
+
emailStatus: EmailStatus.UPDATE_TO_DELIVER,
|
|
1732
|
+
});
|
|
1733
|
+
})));
|
|
1734
|
+
});
|
|
1735
|
+
}
|
|
1736
|
+
onCancelTemplate(template) {
|
|
1737
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1738
|
+
const message = this.translate.instant("confirm.cancelTemplate");
|
|
1739
|
+
if (window.confirm(message)) {
|
|
1740
|
+
yield Promise.all(this.allTemplateMissionsMap
|
|
1741
|
+
.get(template.id)
|
|
1742
|
+
.map((mission) => __awaiter(this, void 0, void 0, function* () {
|
|
1743
|
+
yield this.missionService.update({
|
|
1744
|
+
id: mission.id,
|
|
1745
|
+
emailStatus: EmailStatus.CANCELLATION_TO_DELIVER,
|
|
1746
|
+
deletedAt: Date.now(),
|
|
1747
|
+
});
|
|
1748
|
+
})));
|
|
1749
|
+
}
|
|
1750
|
+
});
|
|
1751
|
+
}
|
|
1752
|
+
applyResultsSearchBar(results) {
|
|
1753
|
+
this.allZoneTemplatesMapFiltered = results || this.allZoneTemplatesMap;
|
|
1754
|
+
}
|
|
1755
|
+
onDeleteUsers(mis) {
|
|
1756
|
+
this.currentTemplateUsers = [];
|
|
1757
|
+
for (const mission of this.allTemplateMissionsMap.get(mis.id)) {
|
|
1758
|
+
this.currentTemplateUsers.push({
|
|
1759
|
+
mission,
|
|
1760
|
+
profile: new ProfileEntity(mission.user),
|
|
1761
|
+
checked: false,
|
|
1762
|
+
index: this.allTemplateMissionsMap.get(mis.id).indexOf(mission),
|
|
1763
|
+
});
|
|
1764
|
+
}
|
|
1765
|
+
this.modalRef = this.modalService.open(this.modal);
|
|
1766
|
+
}
|
|
1767
|
+
/**
|
|
1768
|
+
* Deletes mission of the user and checks if can hard delete the Profile (no other missions)
|
|
1769
|
+
*/
|
|
1770
|
+
onDeleteChosen() {
|
|
1771
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1772
|
+
const listToDelete = this.currentTemplateUsers.filter((object) => object.checked);
|
|
1773
|
+
yield Promise.all(listToDelete.map((object) => __awaiter(this, void 0, void 0, function* () {
|
|
1774
|
+
yield this.missionService.softDeleteMission(object.mission.id);
|
|
1775
|
+
yield this.userService.softDeleteUser(object.profile.id);
|
|
1776
|
+
this.allTemplateMissionsMap
|
|
1777
|
+
.get(object.mission.templateMissionID)
|
|
1778
|
+
.splice(object.index, 1);
|
|
1779
|
+
})));
|
|
1780
|
+
this.modalRef.close();
|
|
1781
|
+
});
|
|
1782
|
+
}
|
|
1783
|
+
onDuplicateTemplate(template) {
|
|
1784
|
+
this.editing = true;
|
|
1785
|
+
this.templateToEdit = template;
|
|
1786
|
+
this.toDuplicate = true;
|
|
1787
|
+
}
|
|
1788
|
+
onCleanTimeTemplate(template) {
|
|
1789
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1790
|
+
yield this.templateService.update({
|
|
1791
|
+
id: template.id,
|
|
1792
|
+
realEndedAt: null,
|
|
1793
|
+
realStartedAt: null
|
|
1794
|
+
});
|
|
1795
|
+
yield this.setZonesTemplates();
|
|
1796
|
+
});
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
VisitorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: VisitorComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i2$1.Router }, { token: i3.TranslateService }, { token: i1.SpaceService }, { token: i1.ZoneService }, { token: i4$1.NgbModal }, { token: i1.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1800
|
+
VisitorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: VisitorComponent, selector: "lib-visitor", viewQueries: [{ propertyName: "modal", first: true, predicate: ["deleteUsers"], descendants: true }], ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} - \r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}: \r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} / \r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\" [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n \r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem>\r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem>\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i1.CsvExportComponent, selector: "lib-csv-export", inputs: ["headers", "rowsInput", "getRows", "title", "buttonLabel"] }, { type: TemplateComponent, selector: "lib-template", inputs: ["currentOrg", "editTemplate", "zoneID"], outputs: ["updatedTemplate", "createdTemplate"] }, { type: CreateBatchComponent, selector: "lib-create-batch", inputs: ["template"], outputs: ["createdMissions"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4$1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4$1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i4$1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i4$1.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i3.TranslatePipe, "keyvalue": i4.KeyValuePipe, "async": i4.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
|
|
1801
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: VisitorComponent, decorators: [{
|
|
1802
|
+
type: Component,
|
|
1803
|
+
args: [{ selector: 'lib-visitor', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} - \r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}: \r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} / \r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\" [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n \r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem>\r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem>\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
|
|
1804
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i2$1.Router }, { type: i3.TranslateService }, { type: i1.SpaceService }, { type: i1.ZoneService }, { type: i4$1.NgbModal }, { type: i1.TemplateService }]; }, propDecorators: { modal: [{
|
|
1805
|
+
type: ViewChild,
|
|
1806
|
+
args: ["deleteUsers"]
|
|
1807
|
+
}] } });
|
|
1808
|
+
|
|
1809
|
+
class AdminComponent {
|
|
1810
|
+
constructor(userService) {
|
|
1811
|
+
this.userService = userService;
|
|
1812
|
+
this.isSmarterPlanUser = false;
|
|
1813
|
+
this.isGuide = false;
|
|
1814
|
+
this.userService.isChanged.subscribe((isChanged) => {
|
|
1815
|
+
if (isChanged) {
|
|
1816
|
+
this.isSmarterPlanUser = this.userService.isSPAdmin();
|
|
1817
|
+
}
|
|
1818
|
+
});
|
|
1819
|
+
}
|
|
1820
|
+
ngOnInit() {
|
|
1821
|
+
this.isSmarterPlanUser = this.userService.isSPAdmin();
|
|
1822
|
+
this.isGuide = this.userService.isGuide();
|
|
1823
|
+
}
|
|
1824
|
+
getIcon(path, isActive) {
|
|
1825
|
+
const suffix = isActive ? "-over" : "";
|
|
1826
|
+
return `/icons/${path.join("/")}${suffix}.svg`;
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
AdminComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminComponent, deps: [{ token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1830
|
+
AdminComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AdminComponent, selector: "lib-admin", ngImport: i0, template: "<div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"d-none col-md-3 col-lg-2 d-md-block sidebar\">\n <ul class=\"nav nav-pills flex-column\">\n <li class=\"nav-item\"><a class=\"nav-link\" routerLink=\"/admin/users\" [routerLinkActive]=\"['active']\"\n #rlaUser=\"routerLinkActive\">\n <img class=\"big-icon\" [src]=\"getIcon(['menu', 'user'], rlaUser.isActive)\" />{{'Users' |\n translate}}</a></li>\n <li class=\"nav-item\" *ngIf=\"isSmarterPlanUser\"><a class=\"nav-link\" routerLink=\"/admin/clients\"\n [routerLinkActive]=\"['active']\" #rlaOrganization=\"routerLinkActive\">\n <img class=\"big-icon\"\n [src]=\"getIcon(['menu', 'organisation'], rlaOrganization.isActive)\" />{{'Clients' |\n translate}}</a></li>\n <li class=\"nav-item\" *ngIf=\"isSmarterPlanUser || isGuide\"><a class=\"nav-link\"\n routerLink=\"/admin/visitors\" [routerLinkActive]=\"['active']\" #rlaVisitor=\"routerLinkActive\">\n <img class=\"big-icon\" [src]=\"getIcon(['menu', 'user'], rlaVisitor.isActive)\" />\n {{'Museum Visitors' | translate }}</a></li>\n </ul>\n </div> <!-- ml-sm-auto -->\n <main role=\"main\" class=\"col-12 col-md-9 col-lg-10 px-md-4\">\n <router-outlet></router-outlet>\n </main>\n </div>\n</div>", styles: [""], directives: [{ type: i2$1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i2$1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
1831
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminComponent, decorators: [{
|
|
1832
|
+
type: Component,
|
|
1833
|
+
args: [{ selector: 'lib-admin', template: "<div class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"d-none col-md-3 col-lg-2 d-md-block sidebar\">\n <ul class=\"nav nav-pills flex-column\">\n <li class=\"nav-item\"><a class=\"nav-link\" routerLink=\"/admin/users\" [routerLinkActive]=\"['active']\"\n #rlaUser=\"routerLinkActive\">\n <img class=\"big-icon\" [src]=\"getIcon(['menu', 'user'], rlaUser.isActive)\" />{{'Users' |\n translate}}</a></li>\n <li class=\"nav-item\" *ngIf=\"isSmarterPlanUser\"><a class=\"nav-link\" routerLink=\"/admin/clients\"\n [routerLinkActive]=\"['active']\" #rlaOrganization=\"routerLinkActive\">\n <img class=\"big-icon\"\n [src]=\"getIcon(['menu', 'organisation'], rlaOrganization.isActive)\" />{{'Clients' |\n translate}}</a></li>\n <li class=\"nav-item\" *ngIf=\"isSmarterPlanUser || isGuide\"><a class=\"nav-link\"\n routerLink=\"/admin/visitors\" [routerLinkActive]=\"['active']\" #rlaVisitor=\"routerLinkActive\">\n <img class=\"big-icon\" [src]=\"getIcon(['menu', 'user'], rlaVisitor.isActive)\" />\n {{'Museum Visitors' | translate }}</a></li>\n </ul>\n </div> <!-- ml-sm-auto -->\n <main role=\"main\" class=\"col-12 col-md-9 col-lg-10 px-md-4\">\n <router-outlet></router-outlet>\n </main>\n </div>\n</div>", styles: [""] }]
|
|
1834
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }]; } });
|
|
1835
|
+
|
|
1836
|
+
class GuideGuard {
|
|
1837
|
+
constructor(userService, router) {
|
|
1838
|
+
this.userService = userService;
|
|
1839
|
+
this.router = router;
|
|
1840
|
+
}
|
|
1841
|
+
canActivate(route, state) {
|
|
1842
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1843
|
+
if (this.userService.isGuide() || this.userService.isSPAdmin()) {
|
|
1844
|
+
return true;
|
|
1845
|
+
}
|
|
1846
|
+
return this.router.parseUrl("/notauthorized");
|
|
1847
|
+
});
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
GuideGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: GuideGuard, deps: [{ token: i1.BaseUserService }, { token: i2$1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1851
|
+
GuideGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: GuideGuard, providedIn: 'root' });
|
|
1852
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: GuideGuard, decorators: [{
|
|
1853
|
+
type: Injectable,
|
|
1854
|
+
args: [{
|
|
1855
|
+
providedIn: 'root'
|
|
1856
|
+
}]
|
|
1857
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2$1.Router }]; } });
|
|
1858
|
+
|
|
1859
|
+
class SpAdminGuard {
|
|
1860
|
+
constructor(userService, router) {
|
|
1861
|
+
this.userService = userService;
|
|
1862
|
+
this.router = router;
|
|
1863
|
+
}
|
|
1864
|
+
canActivate() {
|
|
1865
|
+
let canGo = false;
|
|
1866
|
+
if (this.userService.cu) {
|
|
1867
|
+
canGo = this.userService.isSPAdmin();
|
|
1868
|
+
}
|
|
1869
|
+
if (canGo) {
|
|
1870
|
+
return true;
|
|
1871
|
+
}
|
|
1872
|
+
alert("You are not authorised to access this page");
|
|
1873
|
+
this.router.navigate([""]);
|
|
1874
|
+
return false;
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
SpAdminGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, deps: [{ token: i1.BaseUserService }, { token: i2$1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1878
|
+
SpAdminGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, providedIn: 'root' });
|
|
1879
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, decorators: [{
|
|
1880
|
+
type: Injectable,
|
|
1881
|
+
args: [{
|
|
1882
|
+
providedIn: 'root'
|
|
1883
|
+
}]
|
|
1884
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2$1.Router }]; } });
|
|
1885
|
+
|
|
1886
|
+
const routes = [
|
|
1887
|
+
{
|
|
1888
|
+
path: "",
|
|
1889
|
+
component: AdminComponent,
|
|
1890
|
+
children: [
|
|
1891
|
+
{ path: "users", component: UserComponent },
|
|
1892
|
+
{
|
|
1893
|
+
path: "visitors",
|
|
1894
|
+
children: [
|
|
1895
|
+
{ path: "", component: VisitorComponent },
|
|
1896
|
+
{ path: "template", component: TemplateComponent },
|
|
1897
|
+
],
|
|
1898
|
+
canActivate: [GuideGuard]
|
|
1899
|
+
},
|
|
1900
|
+
{
|
|
1901
|
+
path: "clients",
|
|
1902
|
+
component: OrganisationComponent,
|
|
1903
|
+
canActivate: [SpAdminGuard]
|
|
1904
|
+
},
|
|
1905
|
+
{ path: "", redirectTo: "users", pathMatch: "full" },
|
|
1906
|
+
]
|
|
1907
|
+
},
|
|
1908
|
+
];
|
|
1909
|
+
class AdminRoutingModule {
|
|
1910
|
+
}
|
|
1911
|
+
AdminRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1912
|
+
AdminRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminRoutingModule, imports: [i2$1.RouterModule], exports: [RouterModule] });
|
|
1913
|
+
AdminRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminRoutingModule, imports: [[RouterModule.forChild(routes)], RouterModule] });
|
|
1914
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AdminRoutingModule, decorators: [{
|
|
1915
|
+
type: NgModule,
|
|
1916
|
+
args: [{
|
|
1917
|
+
imports: [RouterModule.forChild(routes)],
|
|
1918
|
+
exports: [RouterModule],
|
|
1919
|
+
}]
|
|
1920
|
+
}] });
|
|
1921
|
+
|
|
1922
|
+
class NameFromIdPipe {
|
|
1923
|
+
constructor(userService) {
|
|
1924
|
+
this.userService = userService;
|
|
1925
|
+
}
|
|
1926
|
+
transform(userId) {
|
|
1927
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1928
|
+
if (NameFromIdPipe.cache[userId] !== undefined) {
|
|
1929
|
+
return new Promise((resolve) => {
|
|
1930
|
+
resolve(NameFromIdPipe.cache[userId]);
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
const user = yield this.userService.userFromUserID(userId);
|
|
1934
|
+
// @ts-ignore
|
|
1935
|
+
NameFromId.cache[userId] = `${user.displayName}`;
|
|
1936
|
+
return NameFromIdPipe.cache[userId];
|
|
1937
|
+
});
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
NameFromIdPipe.cache = {};
|
|
1941
|
+
NameFromIdPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NameFromIdPipe, deps: [{ token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1942
|
+
NameFromIdPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NameFromIdPipe, name: "nameFromId" });
|
|
1943
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NameFromIdPipe, decorators: [{
|
|
1944
|
+
type: Pipe,
|
|
1945
|
+
args: [{
|
|
1946
|
+
name: 'nameFromId'
|
|
1947
|
+
}]
|
|
1948
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }]; } });
|
|
1949
|
+
|
|
1950
|
+
class NgxSmarterplanAdminModule {
|
|
1951
|
+
}
|
|
1952
|
+
NgxSmarterplanAdminModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1953
|
+
NgxSmarterplanAdminModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminModule, declarations: [AdminComponent,
|
|
1954
|
+
UserComponent,
|
|
1955
|
+
VisitorComponent,
|
|
1956
|
+
OrganisationComponent,
|
|
1957
|
+
GuestLinkComponent,
|
|
1958
|
+
ChevronComponent,
|
|
1959
|
+
FormMissionComponent,
|
|
1960
|
+
UserMissionFormComponent,
|
|
1961
|
+
FormOrganisationComponent,
|
|
1962
|
+
DetailOrganisationComponent,
|
|
1963
|
+
CreateBatchComponent,
|
|
1964
|
+
NameFromIdPipe,
|
|
1965
|
+
TemplateComponent], imports: [ClipboardModule,
|
|
1966
|
+
NgbModule,
|
|
1967
|
+
CommonModule,
|
|
1968
|
+
FormsModule,
|
|
1969
|
+
ReactiveFormsModule,
|
|
1970
|
+
NgxSmarterplanCoreModule, i3.TranslateModule, AdminRoutingModule] });
|
|
1971
|
+
NgxSmarterplanAdminModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminModule, imports: [[
|
|
1972
|
+
ClipboardModule,
|
|
1973
|
+
NgbModule,
|
|
1974
|
+
CommonModule,
|
|
1975
|
+
FormsModule,
|
|
1976
|
+
ReactiveFormsModule,
|
|
1977
|
+
NgxSmarterplanCoreModule,
|
|
1978
|
+
TranslateModule.forChild({
|
|
1979
|
+
extend: true
|
|
1980
|
+
}),
|
|
1981
|
+
AdminRoutingModule
|
|
1982
|
+
]] });
|
|
1983
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NgxSmarterplanAdminModule, decorators: [{
|
|
1984
|
+
type: NgModule,
|
|
1985
|
+
args: [{
|
|
1986
|
+
declarations: [
|
|
1987
|
+
AdminComponent,
|
|
1988
|
+
UserComponent,
|
|
1989
|
+
VisitorComponent,
|
|
1990
|
+
OrganisationComponent,
|
|
1991
|
+
GuestLinkComponent,
|
|
1992
|
+
ChevronComponent,
|
|
1993
|
+
FormMissionComponent,
|
|
1994
|
+
UserMissionFormComponent,
|
|
1995
|
+
FormOrganisationComponent,
|
|
1996
|
+
DetailOrganisationComponent,
|
|
1997
|
+
CreateBatchComponent,
|
|
1998
|
+
NameFromIdPipe,
|
|
1999
|
+
TemplateComponent,
|
|
2000
|
+
],
|
|
2001
|
+
imports: [
|
|
2002
|
+
ClipboardModule,
|
|
2003
|
+
NgbModule,
|
|
2004
|
+
CommonModule,
|
|
2005
|
+
FormsModule,
|
|
2006
|
+
ReactiveFormsModule,
|
|
2007
|
+
NgxSmarterplanCoreModule,
|
|
2008
|
+
TranslateModule.forChild({
|
|
2009
|
+
extend: true
|
|
2010
|
+
}),
|
|
2011
|
+
AdminRoutingModule
|
|
2012
|
+
],
|
|
2013
|
+
exports: []
|
|
2014
|
+
}]
|
|
2015
|
+
}] });
|
|
2016
|
+
|
|
2017
|
+
/*
|
|
2018
|
+
* Public API Surface of ngx-smarterplan-admin
|
|
2019
|
+
*/
|
|
2020
|
+
|
|
2021
|
+
/**
|
|
2022
|
+
* Generated bundle index. Do not edit.
|
|
2023
|
+
*/
|
|
2024
|
+
|
|
2025
|
+
export { NgxSmarterplanAdminModule, NgxSmarterplanAdminService };
|
|
2026
|
+
//# sourceMappingURL=smarterplan-ngx-smarterplan-admin.mjs.map
|