@bizdoc/core 1.13.0-next.1 → 1.13.0-next.5

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.
@@ -128,7 +128,7 @@ import { Spreadsheet, isNumber, SpreadsheetModule, SelectionService as Selection
128
128
  import * as i4$1 from '@ctrl/ngx-emoji-mart';
129
129
  import { PickerModule } from '@ctrl/ngx-emoji-mart';
130
130
  import * as i11$1 from '@syncfusion/ej2-angular-diagrams';
131
- import { Diagram, UndoRedo, ConnectorDrawingTool, DiagramConstraints, DiagramTools, NodeConstraints, ConnectorConstraints, SelectorConstraints, Node, SymbolPaletteComponent, ComplexHierarchicalTree, BpmnDiagrams, DataBinding, ConnectionPointOrigin, SnapConstraints, ComplexHierarchicalTreeService, DiagramModule, SymbolPaletteModule, ConnectorBridgingService, LineRoutingService, BpmnDiagramsService, LayoutAnimationService, UndoRedoService, SnappingService, ConnectorEditingService, ToolBase } from '@syncfusion/ej2-angular-diagrams';
131
+ import { Diagram, UndoRedo, ConnectorDrawingTool, DiagramConstraints, DiagramTools, NodeConstraints, ConnectorConstraints, SelectorConstraints, Node, SymbolPaletteComponent, ComplexHierarchicalTree, BpmnDiagrams, DataBinding, LineDistribution, ConnectionPointOrigin, SnapConstraints, ComplexHierarchicalTreeService, DiagramModule, SymbolPaletteModule, ConnectorBridgingService, LineRoutingService, BpmnDiagramsService, LayoutAnimationService, UndoRedoService, SnappingService, ConnectorEditingService, ToolBase } from '@syncfusion/ej2-angular-diagrams';
132
132
  import * as i9$2 from '@syncfusion/ej2-angular-schedule';
133
133
  import { Schedule, Day, WorkWeek, Month, MonthAgenda, Agenda, Year, ScheduleModule, ExcelExportService as ExcelExportService$2, DayService, WorkWeekService, MonthService, MonthAgendaService, ICalendarExportService, AgendaService, YearService } from '@syncfusion/ej2-angular-schedule';
134
134
  import * as i10$2 from '@syncfusion/ej2-angular-kanban';
@@ -1247,6 +1247,8 @@ class MailboxService {
1247
1247
  };
1248
1248
  messaging.new$.
1249
1249
  subscribe(m => {
1250
+ if (m.userId !== _session.profile.userId)
1251
+ return;
1250
1252
  _session.profile.inboxCount++;
1251
1253
  const folder = _session.profile.folders.find(f => f.name === m.model.folderId);
1252
1254
  folder.count++;
@@ -1928,7 +1930,7 @@ const STRINGS = {
1928
1930
  NoEstimate: '(No estimate)',
1929
1931
  EstimateTime: '(Estimated time {0})',
1930
1932
  NodeStandardTime: '(Standard time: {0})',
1931
- EstimateTimeRange: '(Estimated time {0} - {1})',
1933
+ EstimateTimeRange: '(Estimated time between {0} and {1})',
1932
1934
  Connect: 'Connect',
1933
1935
  Requirments: 'Requirments',
1934
1936
  Anyone: 'Anyone',
@@ -6958,7 +6960,7 @@ class ExpandedItemComponent {
6958
6960
  }
6959
6961
  _note() {
6960
6962
  return __awaiter(this, void 0, void 0, function* () {
6961
- const { ownerId, issued, substitutingId, received, replied, log, id, note, byId, action, toId } = this.item;
6963
+ const { ownerId, issued, substitutingId, received, replied, log, id, note, byId, action, toId, escalated } = this.item;
6962
6964
  if (substitutingId) {
6963
6965
  this._accounts.get(substitutingId).subscribe(u => {
6964
6966
  if (replied) {
@@ -6968,19 +6970,15 @@ class ExpandedItemComponent {
6968
6970
  else
6969
6971
  this.note = this._translate.personalize('YouSubstituteActionTaken', u.gender, adjective, this._formatUserElement(u), time);
6970
6972
  }
6973
+ else if (escalated) {
6974
+ const escalations = log.filter(l => l.time > issued &&
6975
+ l.type === 'Escalation'
6976
+ && l.recipientId === id);
6977
+ this.note = this._translate.personalize('EscalatedFrom', u.gender, this._formatUserElement(u), this._duration(escalations[0].duration));
6978
+ }
6971
6979
  else {
6972
- const escalations = issued &&
6973
- log.filter(l => l.time > issued &&
6974
- l.type === 'Escalation'
6975
- && l.recipientId === id);
6976
- if (escalations && escalations.length) {
6977
- const duration = dayjs(escalations[0].time).diff(received, 's');
6978
- this.note = this._translate.personalize('EscalatedFrom', u.gender, this._formatUserElement(u), this._duration(duration));
6979
- }
6980
- else {
6981
- const time = this._fromNow(received);
6982
- this.note = this._translate.personalize('SubstitutingNote', u.gender, this._formatUserElement(u), time, note || '');
6983
- }
6980
+ const time = this._fromNow(received);
6981
+ this.note = this._translate.personalize('SubstitutingNote', u.gender, this._formatUserElement(u), time, note || '');
6984
6982
  }
6985
6983
  });
6986
6984
  }
@@ -6989,9 +6987,9 @@ class ExpandedItemComponent {
6989
6987
  if (byId) {
6990
6988
  if (byId === this._session.profile.byId) {
6991
6989
  if (toId)
6992
- this._accounts.get(toId).subscribe(u => this.note = this._translate.get('ActionTakenByYou', this._actionName(action, 'you'), this._formatUserElement(u), this._session.profile.name, time));
6990
+ this._accounts.get(toId).subscribe(u => this.note = this._translate.get('ActionTakenByYouTo', this._actionName(action, 'you'), this._formatUserElement(u), this._session.profile.name, time));
6993
6991
  else
6994
- this.note = this._translate.get('ActionTakenByYouTo', this._actionName(action, 'you'), this._session.profile.name, time);
6992
+ this.note = this._translate.get('ActionTakenByYou', this._actionName(action, 'you'), this._session.profile.name, time);
6995
6993
  }
6996
6994
  else
6997
6995
  this._accounts.get(byId).subscribe(u => {
@@ -7280,7 +7278,7 @@ class BrowseItemsComponent {
7280
7278
  this._remove(item);
7281
7279
  });
7282
7280
  this._messaging.new$.pipe(takeUntil(this._destroy)).subscribe(m => {
7283
- if (!this.dataSource)
7281
+ if (!this.dataSource || m.userId !== this._session.profile.userId)
7284
7282
  return;
7285
7283
  const item = this.dataSource.data.find(c => c.id === m.model.id);
7286
7284
  if (!item && this.folderId === m.model.folderId) {
@@ -8493,7 +8491,7 @@ class ComposeFormComponent {
8493
8491
  return this._mailbox.send(id, version, formId, model, action, params).
8494
8492
  subscribe(r => {
8495
8493
  if (r.toId)
8496
- this._accounts.get(r.toId).subscribe(u => this._sb.toast('Sent', number, this._getActionAdjective(action), u.name));
8494
+ this._accounts.get(r.toId).subscribe(u => this._sb.toast('SentTo', number, this._getActionAdjective(action), u.name));
8497
8495
  else
8498
8496
  this._sb.toast('Sent', number, this._getActionAdjective(action));
8499
8497
  this.working = false;
@@ -11976,6 +11974,7 @@ class ExploreItemsComponent {
11976
11974
  });
11977
11975
  }
11978
11976
  _datasource(data) {
11977
+ this._data = data;
11979
11978
  this.dataSource = new MatTableDataSource(data);
11980
11979
  this.dataSource.sort = this.sort;
11981
11980
  this.dataSource.paginator = this.paginator;
@@ -12000,7 +11999,7 @@ class ExploreItemsComponent {
12000
11999
  }
12001
12000
  }))
12002
12001
  }];
12003
- this.dataSource.data.forEach((r, i) => rows.push({
12002
+ this._data.forEach((r, i) => rows.push({
12004
12003
  index: i + 2,
12005
12004
  cells: this.columns.map((c, j) => {
12006
12005
  const isnumber = c.type === 'Currency' || c.type === 'Number';
@@ -12105,6 +12104,7 @@ class CubeExplorePaneComponent {
12105
12104
  relativeTo: this._pane,
12106
12105
  queryParams: this.axes,
12107
12106
  state: { item },
12107
+ policy: OpenPolicy.Tab | OpenPolicy.Dismissable,
12108
12108
  group: this._pane.group
12109
12109
  });
12110
12110
  this.loading = false;
@@ -13228,8 +13228,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
13228
13228
  args: [{ name: 'amDurationFormat' }]
13229
13229
  }], ctorParameters: function () { return [{ type: TranslateService }]; } });
13230
13230
 
13231
- Diagram.Inject(ComplexHierarchicalTree, BpmnDiagrams, DataBinding /*, LayoutAnimation, LineRouting, ConnectorBridging*/);
13232
- const PENDING_PATH = 'M18,22l-0.01-6L14,12l3.99-4.01L18,2H6v6l4,4l-4,3.99V22H18z M8,7.5V4h8v3.5l-4,4L8,7.5z', FYI_PATH = 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z', ESCALATED_PATH = 'M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z', WARNNING_PATH$1 = 'M 13.763735,1.8433735 H 6.3037349 l -5.27,5.27 v 7.4599995 l 5.27,5.27 h 7.4600001 l 5.27,-5.27 V 7.1133735 Z m -3.73,14.2999995 c -0.7200001,0 -1.3000001,-0.58 -1.3000001,-1.3 0,-0.72 0.58,-1.3 1.3000001,-1.3 0.72,0 1.3,0.58 1.3,1.3 0,0.72 -0.58,1.3 -1.3,1.3 z m 1,-4.3 H 9.0337349 V 5.8433735 h 2.0000001 z';
13231
+ Diagram.Inject(ComplexHierarchicalTree, BpmnDiagrams, DataBinding, LineDistribution /*, LayoutAnimation, LineRouting, ConnectorBridging*/);
13232
+ const //PENDING_PATH = 'M18,22l-0.01-6L14,12l3.99-4.01L18,2H6v6l4,4l-4,3.99V22H18z M8,7.5V4h8v3.5l-4,4L8,7.5z',
13233
+ ELLIPSIS = 'M 650, 150 a 75,150 0 1,0 1,0 z', FYI_PATH = 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z', ESCALATED_PATH = 'M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z', WARNNING_PATH$1 = 'M 13.763735,1.8433735 H 6.3037349 l -5.27,5.27 v 7.4599995 l 5.27,5.27 h 7.4600001 l 5.27,-5.27 V 7.1133735 Z m -3.73,14.2999995 c -0.7200001,0 -1.3000001,-0.58 -1.3000001,-1.3 0,-0.72 0.58,-1.3 1.3000001,-1.3 0.72,0 1.3,0.58 1.3,1.3 0,0.72 -0.58,1.3 -1.3,1.3 z m 1,-4.3 H 9.0337349 V 5.8433735 h 2.0000001 z';
13233
13234
  /** flow-view component*/
13234
13235
  class FlowViewComponent extends TraceBase {
13235
13236
  /** workflow-view ctor */
@@ -13251,13 +13252,15 @@ class FlowViewComponent extends TraceBase {
13251
13252
  connectionPointOrigin: ConnectionPointOrigin.DifferentPoint,
13252
13253
  horizontalSpacing: 50,
13253
13254
  verticalSpacing: 50,
13254
- verticalAlignment: 'Top',
13255
+ //connectorSegments: 'Layout',
13256
+ //arrangement: ChildArrangement.Linear,
13257
+ horizontalAlignment: 'Center',
13255
13258
  connectionDirection: 'Orientation',
13256
13259
  orientation: this._session.inverse ? 'RightToLeft' : 'LeftToRight',
13257
- margin: { left: 10, right: 10, top: 10, bottom: 10 }
13258
13260
  };
13259
13261
  this.scrollSettings = {
13260
13262
  minZoom: .5,
13263
+ scrollLimit: 'Limited',
13261
13264
  canAutoScroll: true,
13262
13265
  currentZoom: 1.2,
13263
13266
  padding: { top: 0, bottom: 0 },
@@ -13342,7 +13345,6 @@ class FlowViewComponent extends TraceBase {
13342
13345
  obj.style.strokeWidth = 0;
13343
13346
  }
13344
13347
  else {
13345
- // obj.shape = { type: 'Bpmn', shape: 'Event' } as BpmnShapeModel;
13346
13348
  obj.width = obj.height = 50;
13347
13349
  if (obj.annotations && obj.annotations.length)
13348
13350
  obj.annotations[0].style.color = this._session.theme.dark ? 'white' : 'black';
@@ -13353,7 +13355,8 @@ class FlowViewComponent extends TraceBase {
13353
13355
  }
13354
13356
  else {
13355
13357
  obj.style.strokeColor = this._accentColor;
13356
- obj.style.fill = recipient && recipient.pending ? this._session.getAccent(400) : 'transparent';
13358
+ obj.style.fill = recipient && recipient.pending ?
13359
+ this._session.getAccent(recipient.userId === this._session.userId ? 500 : 400) : 'transparent';
13357
13360
  }
13358
13361
  obj.style.strokeWidth = 2;
13359
13362
  }
@@ -13449,7 +13452,7 @@ class FlowViewComponent extends TraceBase {
13449
13452
  }
13450
13453
  }]
13451
13454
  };
13452
- if (r > 0) {
13455
+ if (r > 0)
13453
13456
  dconnectors.forEach(c => {
13454
13457
  if (c.targetId === node.id)
13455
13458
  connectors.push({
@@ -13459,7 +13462,10 @@ class FlowViewComponent extends TraceBase {
13459
13462
  estimate: c.estimate
13460
13463
  }
13461
13464
  });
13462
- if (c.sourceId === node.id)
13465
+ if (c.sourceId === node.id) {
13466
+ //
13467
+ if (c.virtual && c.originId !== recipient.id)
13468
+ return;
13463
13469
  connectors.push({
13464
13470
  sourceID: nod.id,
13465
13471
  targetID: c.targetId,
@@ -13467,8 +13473,8 @@ class FlowViewComponent extends TraceBase {
13467
13473
  estimate: c.estimate
13468
13474
  }
13469
13475
  });
13476
+ }
13470
13477
  });
13471
- }
13472
13478
  nodes.push(nod);
13473
13479
  if (recipient.action) {
13474
13480
  const action = this._session.profile.actions.find(a => a.name === recipient.action);
@@ -13491,56 +13497,40 @@ class FlowViewComponent extends TraceBase {
13491
13497
  indicators.push(actionIndicator);
13492
13498
  }
13493
13499
  }
13494
- if (recipient.pending && !recipient.estimate)
13500
+ if (recipient.fyi)
13495
13501
  indicators.push({
13496
- id: nod.id + 'pending',
13502
+ id: nod.id + 'fyi',
13497
13503
  shape: {
13498
13504
  type: 'Path',
13499
- data: PENDING_PATH,
13500
- align: this._session.inverse ? 'XMaxYMax' : 'XMinYMax'
13505
+ data: FYI_PATH,
13506
+ align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13501
13507
  },
13502
13508
  style: {
13503
- fill: this._session.getAccent(900)
13509
+ fill: '#1976d2'
13504
13510
  },
13505
13511
  addInfo: {
13506
13512
  indicator: true,
13507
13513
  parentId: nod.id
13508
13514
  }
13509
13515
  });
13510
- if (recipient.fyi)
13511
- indicators.push({
13512
- id: nod.id + 'fyi',
13516
+ if (recipient.escalated) {
13517
+ const escalateIndicator = {
13518
+ id: nod.id + 'escalate',
13513
13519
  shape: {
13514
13520
  type: 'Path',
13515
- data: FYI_PATH,
13521
+ data: ESCALATED_PATH,
13516
13522
  align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13517
13523
  },
13518
13524
  style: {
13519
- fill: '#1976d2'
13525
+ fill: this._session.getAccent(900)
13520
13526
  },
13521
13527
  addInfo: {
13522
13528
  indicator: true,
13523
13529
  parentId: nod.id
13524
13530
  }
13525
- });
13526
- // if (this.model.log.filter(l => l.time > this._submitted && l.type === 'Escalation' && l.recipientId === recipient.id).length) {
13527
- // const escalateIndicator = {
13528
- // id: nod.id + 'escalate',
13529
- // shape: {
13530
- // type: 'Path',
13531
- // data: ESCALATED_PATH,
13532
- // align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13533
- // },
13534
- // style: {
13535
- // fill: this._session.getAccent(900)
13536
- // },
13537
- // addInfo: {
13538
- // indicator: true,
13539
- // parentId: nod.id
13540
- // } as NodeInfoModel
13541
- // } as NodeModel;
13542
- // indicators.push(escalateIndicator);
13543
- // }
13531
+ };
13532
+ indicators.push(escalateIndicator);
13533
+ }
13544
13534
  }
13545
13535
  }
13546
13536
  else {
@@ -13607,36 +13597,6 @@ class FlowViewComponent extends TraceBase {
13607
13597
  }
13608
13598
  }
13609
13599
  }
13610
- /**
13611
- *
13612
- * @param connector
13613
- * @param index
13614
- * @param vconnectors
13615
- */
13616
- function reroute(connector, index) {
13617
- while (index < dconnectors.length) {
13618
- let dconnector = dconnectors[index];
13619
- if (dconnector.sourceId === connector.targetId) {
13620
- if (nodes.some(n => n.id === dconnector.targetId))
13621
- connectors.push({
13622
- sourceID: connector.sourceId,
13623
- targetID: dconnector.targetId,
13624
- addInfo: {
13625
- estimate: dconnector.estimate,
13626
- time: dconnector.time
13627
- }
13628
- });
13629
- else
13630
- reroute({
13631
- time: dconnector.time,
13632
- targetId: dconnector.targetId,
13633
- estimate: dconnector.estimate,
13634
- sourceId: connector.sourceId
13635
- }, index + 1);
13636
- }
13637
- index++;
13638
- }
13639
- }
13640
13600
  return { connectors, nodes, indicators };
13641
13601
  });
13642
13602
  }
@@ -13654,7 +13614,7 @@ class FlowViewComponent extends TraceBase {
13654
13614
  const stateLog = log.find(l => l.type === 'StateChange');
13655
13615
  if (stateLog) {
13656
13616
  state = this._session.profile.states.find(s => s.name === stateLog.state);
13657
- annotation = state ? ((node.estimate ? state.future : state.past) || state.title) : stateLog.state;
13617
+ annotation = (node.estimate ? state.future : state.past) || state.title;
13658
13618
  }
13659
13619
  if (node.type === START_NODE) {
13660
13620
  if (!node.estimate) {
@@ -13676,8 +13636,8 @@ class FlowViewComponent extends TraceBase {
13676
13636
  const { min, max } = super._estimateTime(node);
13677
13637
  if (max)
13678
13638
  return !min || min === max ?
13679
- this._translate.get('EstimateTime', this._duration.transform(max)) :
13680
- this._translate.get('EstimateTimeRange', this._duration.transform(min), this._duration.transform(max));
13639
+ this._translate.get('EstimateTime', dayjs.duration(max).humanize()) :
13640
+ this._translate.get('EstimateTimeRange', dayjs.duration(min).humanize(), dayjs.duration(max).humanize());
13681
13641
  }
13682
13642
  _tooltip(obj) {
13683
13643
  const { note, role, substituting, escalation, duration, standardTime, estimatedTime, error, fyi } = obj;
@@ -13834,11 +13794,25 @@ class FlowViewComponent extends TraceBase {
13834
13794
  tooltip.substituting = this._translate.personalize('SubstitutingFor', substituting.gender, substituting.name);
13835
13795
  }
13836
13796
  }
13837
- const escalations = this.model.log.filter(l => l.time > this._issued && l.type === 'Escalation' && l.recipientId === recipient.id);
13838
- if (escalations.length) {
13797
+ if (recipient.originId) {
13798
+ const origin = this.model.recipients.find(r => r.id === recipient.originId);
13799
+ if (origin.toId) {
13800
+ const action = this._session.profile.actions.find(a => a.name === origin.action);
13801
+ const id = origin.byId || origin.userId, name = action.adjective || action.past || action.title;
13802
+ if (id === this._session.userId) {
13803
+ tooltip.substituting = this._translate.get('ByYou', name);
13804
+ }
13805
+ else {
13806
+ const who = yield this._accounts.get(id).toPromise();
13807
+ tooltip.substituting = this._translate.get('By', who.name, name);
13808
+ }
13809
+ }
13810
+ }
13811
+ if (recipient.escalated) {
13812
+ const escalations = this.model.log.filter(l => l.type === 'Escalation' && l.recipientId === recipient.id);
13839
13813
  const userIds = escalations.map(e => e.userId);
13840
13814
  const users = yield this._accounts.getAll(userIds).toPromise();
13841
- const duration = this._duration.transform(dayjs(escalations[escalations.length - 1].time).diff(recipient.received, 's'));
13815
+ const duration = this._duration.transform(dayjs.duration(escalations[escalations.length - 1].duration, 's'));
13842
13816
  tooltip.escalation = this._translate.get('EscalatedTo', this._translate.join(users.map(u => u.name)), duration);
13843
13817
  }
13844
13818
  if (recipient.replied) {
@@ -14174,30 +14148,28 @@ class TraceViewComponent extends TraceBase {
14174
14148
  step.role = by.role;
14175
14149
  }
14176
14150
  }
14177
- else {
14151
+ else if (recipient.escalated) {
14178
14152
  let escalations = this.model.log.filter(l => l.time > issued &&
14179
14153
  l.type === 'Escalation' && l.recipientId === recipient.id);
14180
- if (escalations.length) {
14181
- let escalate = [];
14182
- for (let escalation of escalations) {
14183
- let who = yield profileOf(escalation.userId);
14184
- escalate.push(who);
14185
- }
14186
- let who = yield profileOf(recipient.userId);
14187
- if (escalations.length === 1 && escalate[0] === this._session.userId)
14188
- step.name = this._translate.get('EscalatedByYou', nameOf(who));
14189
- else
14190
- step.name = this._translate.get('EscalatedBy', nameOf(who), this._translate.join(escalate.map(e => nameOf(e))));
14154
+ let escalate = [];
14155
+ for (let escalation of escalations) {
14156
+ let who = yield profileOf(escalation.userId);
14157
+ escalate.push(who);
14191
14158
  }
14159
+ let who = yield profileOf(recipient.userId);
14160
+ if (escalations.length === 1 && escalate[0] === this._session.userId)
14161
+ step.name = this._translate.get('EscalatedByYou', nameOf(who));
14162
+ else
14163
+ step.name = this._translate.get('EscalatedBy', nameOf(who), this._translate.join(escalate.map(e => nameOf(e))));
14164
+ }
14165
+ else {
14166
+ if (recipient.userId === this._session.userId)
14167
+ step.name = this._translate.get('You');
14192
14168
  else {
14193
- if (recipient.userId === this._session.userId)
14194
- step.name = this._translate.get('You');
14195
- else {
14196
- let who = yield profileOf(recipient.userId);
14197
- step.name = nameOf(who);
14198
- if (who.role)
14199
- step.role = who.role;
14200
- }
14169
+ let who = yield profileOf(recipient.userId);
14170
+ step.name = nameOf(who);
14171
+ if (who.role)
14172
+ step.role = who.role;
14201
14173
  }
14202
14174
  }
14203
14175
  trace.push(step);
@@ -14798,7 +14770,7 @@ class CubeMatrixComponent {
14798
14770
  this.refresh();
14799
14771
  }
14800
14772
  _addindices() {
14801
- const collection = this.indexAt === 'series' ? this.rows : this.columns;
14773
+ const collection = this.indexAt === 'xAxis' ? this.columns : this.rows;
14802
14774
  this.indices.forEach((x, i) => {
14803
14775
  const header = {
14804
14776
  key: x.name,
@@ -14806,10 +14778,10 @@ class CubeMatrixComponent {
14806
14778
  index: x,
14807
14779
  accumulate: x.accumulate
14808
14780
  };
14809
- if (this.placeAt === 'leading')
14810
- collection.splice(i, 0, header);
14811
- else
14781
+ if (this.placeAt === 'trailing')
14812
14782
  collection.push(header);
14783
+ else
14784
+ collection.splice(i, 0, header);
14813
14785
  });
14814
14786
  }
14815
14787
  _addsumheaders() {
@@ -14875,17 +14847,17 @@ class CubeMatrixComponent {
14875
14847
  const d = {};
14876
14848
  series.forEach(s => {
14877
14849
  if (s.index) {
14878
- if (this.indexAt === 'series') {
14879
- const row = d[s.index] = {};
14880
- s.points.forEach(p => row[p.x] = p.y);
14881
- }
14882
- else
14850
+ if (this.indexAt === 'xAxis')
14883
14851
  s.points.forEach(p => {
14884
14852
  let row = d[p.x];
14885
14853
  if (!row)
14886
14854
  row = d[p.x] = {};
14887
14855
  row[s.index] = p.y;
14888
14856
  });
14857
+ else {
14858
+ const row = d[s.index] = {};
14859
+ s.points.forEach(p => row[p.x] = p.y);
14860
+ }
14889
14861
  }
14890
14862
  else {
14891
14863
  const row = d[s.name] = {};
@@ -14908,20 +14880,20 @@ class CubeMatrixComponent {
14908
14880
  this.rows.forEach(r => {
14909
14881
  const datarow = data[r.key];
14910
14882
  if (datarow) {
14911
- let sum = 0;
14883
+ let columnTotal = 0;
14912
14884
  this.columns.forEach(c => {
14913
14885
  if (c.accumulate === false || c.sum !== undefined)
14914
14886
  return;
14915
14887
  let val = datarow[c.key];
14916
14888
  if (val !== undefined)
14917
- sum += this.indices.length === 0 || this.indexAt === 'series' ||
14889
+ columnTotal += this.indices.length === 0 || this.indexAt !== 'xAxis' ||
14918
14890
  c.index !== undefined ? val : -val;
14919
14891
  });
14920
- datarow['_total'] = this._format(sum, r);
14892
+ datarow['_total'] = this._format(columnTotal, r);
14921
14893
  if (!r.sum)
14922
14894
  grand += this.indices.length === 0 ||
14923
14895
  this.indexAt === 'xAxis' ||
14924
- r.index !== undefined ? sum : -sum;
14896
+ r.index !== undefined ? columnTotal : -columnTotal;
14925
14897
  }
14926
14898
  else
14927
14899
  data[r.key] = {
@@ -14931,16 +14903,16 @@ class CubeMatrixComponent {
14931
14903
  const totals = data['_total'] = this.totals = {};
14932
14904
  totals['_grand'] = this._format(grand);
14933
14905
  this.columns.forEach(c => {
14934
- let sum = 0;
14906
+ let rowTotal = 0;
14935
14907
  this.rows.forEach(row => {
14936
14908
  if (row.accumulate === false || row.sum !== undefined)
14937
14909
  return;
14938
14910
  const val = data[row.key][c.key];
14939
14911
  if (val !== undefined)
14940
- sum += this.indices.length === 0 || this.indexAt === 'xAxis' ||
14912
+ rowTotal += this.indices.length === 0 || this.indexAt === 'xAxis' ||
14941
14913
  row.index !== undefined ? val : -val;
14942
14914
  });
14943
- totals[c.key] = this._format(sum, c);
14915
+ totals[c.key] = this._format(rowTotal, c);
14944
14916
  });
14945
14917
  }
14946
14918
  _calculatesum(data) {
@@ -17324,7 +17296,7 @@ class HomeBase {
17324
17296
  this._messaging.new$.subscribe(m => {
17325
17297
  const { model: { formId: name, subject, number } } = m;
17326
17298
  const form = this._session.profile.forms.find(f => f.name === name), msg = this._translate.get('NewMail', form.title, number, subject || '');
17327
- this._snackBar.open(msg, this._translate.get('OpenNew'), {
17299
+ this._snackBar.open(msg, m.userId === this._session.profile.userId ? this._translate.get('OpenNew') : null, {
17328
17300
  duration: 5000,
17329
17301
  direction: this._session.direction,
17330
17302
  politeness: 'assertive'
@@ -18778,7 +18750,7 @@ class SlotsComponent {
18778
18750
  }
18779
18751
  }
18780
18752
  SlotsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: SlotsComponent, deps: [{ token: PANES_DATA }, { token: PromptService }, { token: SessionService }, { token: i0.ChangeDetectorRef }, { token: PanesRouter }, { token: WindowTitleService }, { token: GuideService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
18781
- SlotsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: SlotsComponent, selector: "bizdoc-panes", host: { listeners: { "document:keydown.escape": "collapse()" } }, viewQueries: [{ propertyName: "_panesContainerRef", first: true, predicate: ["paning"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_tabsElement", first: true, predicate: ["tabing"], descendants: true }, { propertyName: "_scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }], ngImport: i0, template: "<div class=\"panes\">\r\n <div class=\"backdrop\" [style.display]=\"dialog ? '' : 'none'\"></div>\r\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\"\r\n *ngIf=\"prev\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\">\r\n arrow_back_ios\r\n </i>\r\n </div>\r\n <div class=\"panes-title\" [@title]=\"titleAnimation\">\r\n <h1>\r\n <button mat-icon-button (click)=\"back()\" *ngIf=\"swap\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_circle_left</mat-icon></button>\r\n <ng-container *ngFor=\"let p of panes; let first = first\">\r\n <span class=\"mat-icon-rtl-mirror\" *ngIf=\"!first\">\\</span>\r\n {{p.title}}\r\n </ng-container>\r\n <button mat-icon-button (click)=\"guide(panes[0].guide)\" *ngIf=\"panes[0]?.guide\" [bizdocTooltip]=\"'Help'|translate\"><mat-icon>help</mat-icon></button>\r\n </h1>\r\n <span class=\"divider\">\r\n </span>\r\n <bizdoc-quicktools></bizdoc-quicktools>\r\n </div>\r\n <div #paning class=\"panes-container\"\r\n cdkScrollable\r\n @panes\r\n (scroll)=\"navigationArrows($event)\">\r\n <ng-container *ngFor=\"let p of panes; let i = index\">\r\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\r\n (click)=\"select(i)\"\r\n [class.active]=\"selectedIndex === i\" class=\"pane-content\" @pane>\r\n <ngx-component-outlet [type]=\"p.component\" [injector]=\"p.injector\" (create)=\"p._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n <div class=\"pane-separator\" *ngIf=\"i < panes.length - 1\" (mousedown)=\"onResize(p, $event)\">&nbsp;</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"scroll-arrow forward\"\r\n *ngIf=\"next\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\r\n (click)=\"scrollBy(400)\">\r\n arrow_forward_ios\r\n </i>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"tabs.length\">\r\n <div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\">&nbsp;</div>\r\n <div class=\"mat-elevation-z18 tabs\" [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\" #tabing>\r\n <div class=\"row tabs-title\">\r\n <button mat-icon-button (click)=\"tabBack()\" *ngIf=\"swapTab\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\r\n <h2>{{group}}</h2>\r\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon inline=\"true\" class=\"mat-icon-rtl-mirror\">open_in_full</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\">\r\n <a mat-tab-link *ngFor=\"let p of tabs; let i = index\" class=\"mat-tab-link\"\r\n (click)=\"selectedTabIndex = i\"\r\n [active]=\"selectedTabIndex === i\">\r\n <mat-icon [matBadge]=\"p.badge\" [matBadgeHidden]=\"!p.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\">{{p.icon}}</mat-icon>&nbsp;\r\n {{p.title}}\r\n <mat-icon *ngIf=\"p.dismissable\" (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\r\n <!--inline=\"true\"-->\r\n </a>\r\n </nav>\r\n <div *ngFor=\"let t of tabs; let i = index\" [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\r\n <ngx-component-outlet [type]=\"t.component\" [injector]=\"t.injector\" (create)=\"t._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:row;flex-grow:1;overflow-x:hidden}.panes{flex-grow:1;position:relative;overflow-x:hidden;display:inline-flex;flex-direction:column;flex-basis:100%}.panes .panes-title{display:flex;flex-direction:row;align-items:center;min-width:max-content}.panes .panes-title h1{font-size:xx-large;margin:12px;font-weight:100}.panes .panes-title h1 button{vertical-align:middle}.panes .scroll-arrow{position:absolute;cursor:pointer;top:50%;z-index:1000}.panes .scroll-arrow i{font-size:50px;opacity:.2}.panes .scroll-arrow i:hover{opacity:.9}.panes .scroll-arrow:last-child{right:0}.panes .panes-container{overflow-x:auto;height:100%;display:flex;flex-direction:row}.panes .panes-container .pane-content{display:block;border-right:1px solid #00000014;height:inherit;border-left-width:1px;border-left-style:double;border-left-color:transparent;flex-grow:1;min-width:420px;overflow-y:auto}.panes .panes-container .pane-content .pane{flex-grow:1}.panes .panes-container .pane-separator{width:8px}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-webkit-user-select:none;user-select:none}.tabs-separator{width:12px}::ng-deep [dir=rtl] .scroll-arrow:last-child{right:unset;left:0}.tabs{display:flex;flex-direction:column;z-index:1;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-tab-link .tool{opacity:0}.tabs .mat-tab-link:hover .tool{opacity:1}.tabs .tab{flex-grow:1;overflow-y:auto;overflow-x:hidden;display:flex}\n"], components: [{ type: i7$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: QuickToolsComponent, selector: "bizdoc-quicktools" }, { type: i9$3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color"], exportAs: ["matTabNavBar", "matTabNav"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { type: TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13$1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { type: NgxComponentOutlet, selector: "ngx-component-outlet", inputs: ["type", "injector", "ngxComponentOutletContent"], outputs: ["create"] }, { type: i9$3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matTabLink"] }, { type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], pipes: { "translate": TranslatePipe }, animations: [panesAnimation,
18753
+ SlotsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: SlotsComponent, selector: "bizdoc-panes", host: { listeners: { "document:keydown.escape": "collapse()" } }, viewQueries: [{ propertyName: "_panesContainerRef", first: true, predicate: ["paning"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_tabsElement", first: true, predicate: ["tabing"], descendants: true }, { propertyName: "_scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }], ngImport: i0, template: "<div class=\"panes\">\r\n <div class=\"backdrop\" [style.display]=\"dialog ? '' : 'none'\"></div>\r\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\"\r\n *ngIf=\"prev\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\">\r\n arrow_back_ios\r\n </i>\r\n </div>\r\n <div class=\"panes-title\" [@title]=\"titleAnimation\">\r\n <h1>\r\n <button mat-icon-button (click)=\"back()\" *ngIf=\"swap\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_circle_left</mat-icon></button>\r\n <ng-container *ngFor=\"let p of panes; let first = first\">\r\n <span class=\"breadcrumbs\" *ngIf=\"!first\">\\</span>\r\n {{p.title}}\r\n </ng-container>\r\n <button mat-icon-button (click)=\"guide(panes[0].guide)\" *ngIf=\"panes[0]?.guide\" [bizdocTooltip]=\"'Help'|translate\"><mat-icon>help</mat-icon></button>\r\n </h1>\r\n <span class=\"divider\">\r\n </span>\r\n <bizdoc-quicktools></bizdoc-quicktools>\r\n </div>\r\n <div #paning class=\"panes-container\"\r\n cdkScrollable\r\n @panes\r\n (scroll)=\"navigationArrows($event)\">\r\n <ng-container *ngFor=\"let p of panes; let i = index\">\r\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\r\n (click)=\"select(i)\"\r\n [class.active]=\"selectedIndex === i\" class=\"pane-content\" @pane>\r\n <ngx-component-outlet [type]=\"p.component\" [injector]=\"p.injector\" (create)=\"p._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n <div class=\"pane-separator\" *ngIf=\"i < panes.length - 1\" (mousedown)=\"onResize(p, $event)\">&nbsp;</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"scroll-arrow forward\"\r\n *ngIf=\"next\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\r\n (click)=\"scrollBy(400)\">\r\n arrow_forward_ios\r\n </i>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"tabs.length\">\r\n <div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\">&nbsp;</div>\r\n <div class=\"mat-elevation-z18 tabs\" [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\" #tabing>\r\n <div class=\"row tabs-title\">\r\n <button mat-icon-button (click)=\"tabBack()\" *ngIf=\"swapTab\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\r\n <h2>{{group}}</h2>\r\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon inline=\"true\" class=\"mat-icon-rtl-mirror\">open_in_full</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\">\r\n <a mat-tab-link *ngFor=\"let p of tabs; let i = index\" class=\"mat-tab-link\"\r\n (click)=\"selectedTabIndex = i\"\r\n [active]=\"selectedTabIndex === i\">\r\n <mat-icon [matBadge]=\"p.badge\" [matBadgeHidden]=\"!p.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\">{{p.icon}}</mat-icon>&nbsp;\r\n {{p.title}}\r\n <mat-icon *ngIf=\"p.dismissable\" (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\r\n <!--inline=\"true\"-->\r\n </a>\r\n </nav>\r\n <div *ngFor=\"let t of tabs; let i = index\" [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\r\n <ngx-component-outlet [type]=\"t.component\" [injector]=\"t.injector\" (create)=\"t._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:row;flex-grow:1;overflow-x:hidden}.panes{flex-grow:1;position:relative;overflow-x:hidden;display:inline-flex;flex-direction:column;flex-basis:100%}.panes .panes-title{display:flex;flex-direction:row;align-items:center;min-width:max-content}.panes .panes-title h1{font-size:xx-large;margin:12px;font-weight:100}.panes .panes-title h1 button{vertical-align:middle}.panes .panes-title h1 .breadcrumbs{font-size:smaller}.panes .scroll-arrow{position:absolute;cursor:pointer;top:50%;z-index:1000}.panes .scroll-arrow i{font-size:50px;opacity:.2}.panes .scroll-arrow i:hover{opacity:.9}.panes .scroll-arrow:last-child{right:0}.panes .panes-container{overflow-x:auto;height:100%;display:flex;flex-direction:row}.panes .panes-container .pane-content{display:block;border-right:1px solid #00000014;height:inherit;border-left-width:1px;border-left-style:double;border-left-color:transparent;flex-grow:1;min-width:420px;overflow-y:auto}.panes .panes-container .pane-content .pane{flex-grow:1}.panes .panes-container .pane-separator{width:8px}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-webkit-user-select:none;user-select:none}.tabs-separator{width:12px}::ng-deep [dir=rtl] .scroll-arrow:last-child{right:unset;left:0}.tabs{display:flex;flex-direction:column;z-index:1;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-tab-link .tool{opacity:0}.tabs .mat-tab-link:hover .tool{opacity:1}.tabs .tab{flex-grow:1;overflow-y:auto;overflow-x:hidden;display:flex}\n"], components: [{ type: i7$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: QuickToolsComponent, selector: "bizdoc-quicktools" }, { type: i9$3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color"], exportAs: ["matTabNavBar", "matTabNav"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { type: TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13$1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { type: NgxComponentOutlet, selector: "ngx-component-outlet", inputs: ["type", "injector", "ngxComponentOutletContent"], outputs: ["create"] }, { type: i9$3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matTabLink"] }, { type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], pipes: { "translate": TranslatePipe }, animations: [panesAnimation,
18782
18754
  panesTitleAnimation,
18783
18755
  paneAnimation,
18784
18756
  paramAnimation,
@@ -18795,7 +18767,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
18795
18767
  queryAnimation,
18796
18768
  tabsAnimation,
18797
18769
  tabAnimation
18798
- ], template: "<div class=\"panes\">\r\n <div class=\"backdrop\" [style.display]=\"dialog ? '' : 'none'\"></div>\r\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\"\r\n *ngIf=\"prev\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\">\r\n arrow_back_ios\r\n </i>\r\n </div>\r\n <div class=\"panes-title\" [@title]=\"titleAnimation\">\r\n <h1>\r\n <button mat-icon-button (click)=\"back()\" *ngIf=\"swap\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_circle_left</mat-icon></button>\r\n <ng-container *ngFor=\"let p of panes; let first = first\">\r\n <span class=\"mat-icon-rtl-mirror\" *ngIf=\"!first\">\\</span>\r\n {{p.title}}\r\n </ng-container>\r\n <button mat-icon-button (click)=\"guide(panes[0].guide)\" *ngIf=\"panes[0]?.guide\" [bizdocTooltip]=\"'Help'|translate\"><mat-icon>help</mat-icon></button>\r\n </h1>\r\n <span class=\"divider\">\r\n </span>\r\n <bizdoc-quicktools></bizdoc-quicktools>\r\n </div>\r\n <div #paning class=\"panes-container\"\r\n cdkScrollable\r\n @panes\r\n (scroll)=\"navigationArrows($event)\">\r\n <ng-container *ngFor=\"let p of panes; let i = index\">\r\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\r\n (click)=\"select(i)\"\r\n [class.active]=\"selectedIndex === i\" class=\"pane-content\" @pane>\r\n <ngx-component-outlet [type]=\"p.component\" [injector]=\"p.injector\" (create)=\"p._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n <div class=\"pane-separator\" *ngIf=\"i < panes.length - 1\" (mousedown)=\"onResize(p, $event)\">&nbsp;</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"scroll-arrow forward\"\r\n *ngIf=\"next\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\r\n (click)=\"scrollBy(400)\">\r\n arrow_forward_ios\r\n </i>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"tabs.length\">\r\n <div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\">&nbsp;</div>\r\n <div class=\"mat-elevation-z18 tabs\" [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\" #tabing>\r\n <div class=\"row tabs-title\">\r\n <button mat-icon-button (click)=\"tabBack()\" *ngIf=\"swapTab\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\r\n <h2>{{group}}</h2>\r\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon inline=\"true\" class=\"mat-icon-rtl-mirror\">open_in_full</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\">\r\n <a mat-tab-link *ngFor=\"let p of tabs; let i = index\" class=\"mat-tab-link\"\r\n (click)=\"selectedTabIndex = i\"\r\n [active]=\"selectedTabIndex === i\">\r\n <mat-icon [matBadge]=\"p.badge\" [matBadgeHidden]=\"!p.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\">{{p.icon}}</mat-icon>&nbsp;\r\n {{p.title}}\r\n <mat-icon *ngIf=\"p.dismissable\" (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\r\n <!--inline=\"true\"-->\r\n </a>\r\n </nav>\r\n <div *ngFor=\"let t of tabs; let i = index\" [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\r\n <ngx-component-outlet [type]=\"t.component\" [injector]=\"t.injector\" (create)=\"t._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:row;flex-grow:1;overflow-x:hidden}.panes{flex-grow:1;position:relative;overflow-x:hidden;display:inline-flex;flex-direction:column;flex-basis:100%}.panes .panes-title{display:flex;flex-direction:row;align-items:center;min-width:max-content}.panes .panes-title h1{font-size:xx-large;margin:12px;font-weight:100}.panes .panes-title h1 button{vertical-align:middle}.panes .scroll-arrow{position:absolute;cursor:pointer;top:50%;z-index:1000}.panes .scroll-arrow i{font-size:50px;opacity:.2}.panes .scroll-arrow i:hover{opacity:.9}.panes .scroll-arrow:last-child{right:0}.panes .panes-container{overflow-x:auto;height:100%;display:flex;flex-direction:row}.panes .panes-container .pane-content{display:block;border-right:1px solid #00000014;height:inherit;border-left-width:1px;border-left-style:double;border-left-color:transparent;flex-grow:1;min-width:420px;overflow-y:auto}.panes .panes-container .pane-content .pane{flex-grow:1}.panes .panes-container .pane-separator{width:8px}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-webkit-user-select:none;user-select:none}.tabs-separator{width:12px}::ng-deep [dir=rtl] .scroll-arrow:last-child{right:unset;left:0}.tabs{display:flex;flex-direction:column;z-index:1;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-tab-link .tool{opacity:0}.tabs .mat-tab-link:hover .tool{opacity:1}.tabs .tab{flex-grow:1;overflow-y:auto;overflow-x:hidden;display:flex}\n"] }]
18770
+ ], template: "<div class=\"panes\">\r\n <div class=\"backdrop\" [style.display]=\"dialog ? '' : 'none'\"></div>\r\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\"\r\n *ngIf=\"prev\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\">\r\n arrow_back_ios\r\n </i>\r\n </div>\r\n <div class=\"panes-title\" [@title]=\"titleAnimation\">\r\n <h1>\r\n <button mat-icon-button (click)=\"back()\" *ngIf=\"swap\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_circle_left</mat-icon></button>\r\n <ng-container *ngFor=\"let p of panes; let first = first\">\r\n <span class=\"breadcrumbs\" *ngIf=\"!first\">\\</span>\r\n {{p.title}}\r\n </ng-container>\r\n <button mat-icon-button (click)=\"guide(panes[0].guide)\" *ngIf=\"panes[0]?.guide\" [bizdocTooltip]=\"'Help'|translate\"><mat-icon>help</mat-icon></button>\r\n </h1>\r\n <span class=\"divider\">\r\n </span>\r\n <bizdoc-quicktools></bizdoc-quicktools>\r\n </div>\r\n <div #paning class=\"panes-container\"\r\n cdkScrollable\r\n @panes\r\n (scroll)=\"navigationArrows($event)\">\r\n <ng-container *ngFor=\"let p of panes; let i = index\">\r\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\r\n (click)=\"select(i)\"\r\n [class.active]=\"selectedIndex === i\" class=\"pane-content\" @pane>\r\n <ngx-component-outlet [type]=\"p.component\" [injector]=\"p.injector\" (create)=\"p._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n <div class=\"pane-separator\" *ngIf=\"i < panes.length - 1\" (mousedown)=\"onResize(p, $event)\">&nbsp;</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"scroll-arrow forward\"\r\n *ngIf=\"next\">\r\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\r\n (click)=\"scrollBy(400)\">\r\n arrow_forward_ios\r\n </i>\r\n </div>\r\n</div>\r\n<ng-container *ngIf=\"tabs.length\">\r\n <div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\">&nbsp;</div>\r\n <div class=\"mat-elevation-z18 tabs\" [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\" #tabing>\r\n <div class=\"row tabs-title\">\r\n <button mat-icon-button (click)=\"tabBack()\" *ngIf=\"swapTab\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\r\n <h2>{{group}}</h2>\r\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon inline=\"true\" class=\"mat-icon-rtl-mirror\">open_in_full</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\">\r\n <a mat-tab-link *ngFor=\"let p of tabs; let i = index\" class=\"mat-tab-link\"\r\n (click)=\"selectedTabIndex = i\"\r\n [active]=\"selectedTabIndex === i\">\r\n <mat-icon [matBadge]=\"p.badge\" [matBadgeHidden]=\"!p.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\">{{p.icon}}</mat-icon>&nbsp;\r\n {{p.title}}\r\n <mat-icon *ngIf=\"p.dismissable\" (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\r\n <!--inline=\"true\"-->\r\n </a>\r\n </nav>\r\n <div *ngFor=\"let t of tabs; let i = index\" [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\r\n <ngx-component-outlet [type]=\"t.component\" [injector]=\"t.injector\" (create)=\"t._instance = $event\"></ngx-component-outlet>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:row;flex-grow:1;overflow-x:hidden}.panes{flex-grow:1;position:relative;overflow-x:hidden;display:inline-flex;flex-direction:column;flex-basis:100%}.panes .panes-title{display:flex;flex-direction:row;align-items:center;min-width:max-content}.panes .panes-title h1{font-size:xx-large;margin:12px;font-weight:100}.panes .panes-title h1 button{vertical-align:middle}.panes .panes-title h1 .breadcrumbs{font-size:smaller}.panes .scroll-arrow{position:absolute;cursor:pointer;top:50%;z-index:1000}.panes .scroll-arrow i{font-size:50px;opacity:.2}.panes .scroll-arrow i:hover{opacity:.9}.panes .scroll-arrow:last-child{right:0}.panes .panes-container{overflow-x:auto;height:100%;display:flex;flex-direction:row}.panes .panes-container .pane-content{display:block;border-right:1px solid #00000014;height:inherit;border-left-width:1px;border-left-style:double;border-left-color:transparent;flex-grow:1;min-width:420px;overflow-y:auto}.panes .panes-container .pane-content .pane{flex-grow:1}.panes .panes-container .pane-separator{width:8px}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-webkit-user-select:none;user-select:none}.tabs-separator{width:12px}::ng-deep [dir=rtl] .scroll-arrow:last-child{right:unset;left:0}.tabs{display:flex;flex-direction:column;z-index:1;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-tab-link .tool{opacity:0}.tabs .mat-tab-link:hover .tool{opacity:1}.tabs .tab{flex-grow:1;overflow-y:auto;overflow-x:hidden;display:flex}\n"] }]
18799
18771
  }], ctorParameters: function () {
18800
18772
  return [{ type: undefined, decorators: [{
18801
18773
  type: Inject,
@@ -26551,7 +26523,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
26551
26523
  args: ['attr.aria-describedby']
26552
26524
  }] } });
26553
26525
 
26554
- dayjs.extend(relativeTime);
26526
+ // https://day.js.org/docs/en/customization/relative-time
26527
+ dayjs.extend(relativeTime, {
26528
+ thresholds: [
26529
+ { l: 's', r: 1 },
26530
+ { l: 'm', r: 1 },
26531
+ { l: 'mm', r: 59, d: 'minute' },
26532
+ { l: 'h', r: 1 },
26533
+ { l: 'hh', r: 24, d: 'hour' },
26534
+ { l: 'd', r: 1 },
26535
+ { l: 'dd', r: 29, d: 'day' },
26536
+ { l: 'M', r: 1 },
26537
+ { l: 'MM', r: 11, d: 'month' },
26538
+ { l: 'y' },
26539
+ { l: 'yy', d: 'year' }
26540
+ ]
26541
+ });
26555
26542
  dayjs.extend(duration);
26556
26543
  dayjs.extend(calendar);
26557
26544
  const CORE_COMPONENTS = [CubeParallelViewComponent, CubeExploreViewComponent, CubeChartViewComponent, CubeDocumentSumComponent, CubeDocumentMatrixComponent, CubeDocumentViewComponent, CubePivotViewComponent, TimelineViewComponent,
@@ -26936,33 +26923,31 @@ class TraceElementComponent {
26936
26923
  this.nodeType = this._session.profile.nodes.find(n => n.name === addInfo.nodeType);
26937
26924
  }
26938
26925
  recipientInfo(recipient) {
26939
- const observables = [], observe = this._accounts.get(recipient.userId);
26940
- observables.push(observe);
26941
- const escalations = this.timeline.log.filter(l => l.time > this.timeline.startDate && l.type === 'Escalation' && l.recipientId === recipient.id);
26942
- if (escalations.length)
26943
- escalations.forEach(e => {
26944
- const observe = this._accounts.get(e.userId);
26945
- observables.push(observe);
26946
- });
26947
- else if (recipient.byId) {
26948
- const observe = this._accounts.get(recipient.byId);
26949
- observables.push(observe);
26950
- }
26951
- if (recipient.substitutingId) {
26952
- const observe = this._accounts.get(recipient.substitutingId);
26953
- observables.push(observe);
26954
- }
26955
- return forkJoin(observables).pipe(map(us => us.map(u => this._chat.format(u))), map(us => {
26956
- if (escalations.length)
26957
- return this._translate.get('EscalatedBy', us[0], this._translate.join(us.slice(1)));
26958
- else if (recipient.byId && recipient.substitutingId)
26959
- return this._translate.get('SubstitutingBy', us[0], us[2], us[1]);
26960
- else if (recipient.substitutingId)
26961
- return this._translate.get('Substituting', us[0], us[1]);
26962
- else if (recipient.byId)
26963
- return this._translate.get('By', us[0], us[1]);
26964
- return us[0];
26965
- }));
26926
+ return __awaiter(this, void 0, void 0, function* () {
26927
+ const info = [];
26928
+ const who = yield this._accounts.get(recipient.userId).toPromise();
26929
+ if (recipient.escalated) {
26930
+ const escalations = this.timeline.log.filter(l => l.type === 'Escalation' && l.recipientId === recipient.id);
26931
+ const escalate = yield this._accounts.get(escalations[0].userId).toPromise();
26932
+ info.push(this._translate.get('EscalatedBy', this._chat.format(escalate), this._chat.format(who)));
26933
+ }
26934
+ if (recipient.substitutingId) {
26935
+ const substitute = yield this._accounts.get(recipient.substitutingId).toPromise();
26936
+ if (recipient.byId) {
26937
+ const by = yield this._accounts.get(recipient.byId).toPromise();
26938
+ info.push(this._translate.get('SubstitutingBy', this._chat.format(who), this._chat.format(substitute), this._chat.format(by)));
26939
+ }
26940
+ else
26941
+ info.push(this._translate.get('Substituting', this._chat.format(who), this._chat.format(substitute)));
26942
+ }
26943
+ else if (recipient.byId) {
26944
+ const by = yield this._accounts.get(recipient.byId).toPromise();
26945
+ info.push(this._translate.get('By', this._chat.format(who), this._chat.format(by)));
26946
+ }
26947
+ else
26948
+ info.push(this._chat.format(who));
26949
+ return info.join(this._translate.comma);
26950
+ });
26966
26951
  }
26967
26952
  logInfo(log) {
26968
26953
  const observables = [];