@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.
@@ -127,7 +127,7 @@ import { Spreadsheet, isNumber, SpreadsheetModule, SelectionService as Selection
127
127
  import * as i4$1 from '@ctrl/ngx-emoji-mart';
128
128
  import { PickerModule } from '@ctrl/ngx-emoji-mart';
129
129
  import * as i11$1 from '@syncfusion/ej2-angular-diagrams';
130
- 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';
130
+ 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';
131
131
  import * as i9$2 from '@syncfusion/ej2-angular-schedule';
132
132
  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';
133
133
  import * as i10$2 from '@syncfusion/ej2-angular-kanban';
@@ -1239,6 +1239,8 @@ class MailboxService {
1239
1239
  };
1240
1240
  messaging.new$.
1241
1241
  subscribe(m => {
1242
+ if (m.userId !== _session.profile.userId)
1243
+ return;
1242
1244
  _session.profile.inboxCount++;
1243
1245
  const folder = _session.profile.folders.find(f => f.name === m.model.folderId);
1244
1246
  folder.count++;
@@ -1923,7 +1925,7 @@ const STRINGS = {
1923
1925
  NoEstimate: '(No estimate)',
1924
1926
  EstimateTime: '(Estimated time {0})',
1925
1927
  NodeStandardTime: '(Standard time: {0})',
1926
- EstimateTimeRange: '(Estimated time {0} - {1})',
1928
+ EstimateTimeRange: '(Estimated time between {0} and {1})',
1927
1929
  Connect: 'Connect',
1928
1930
  Requirments: 'Requirments',
1929
1931
  Anyone: 'Anyone',
@@ -6928,7 +6930,7 @@ class ExpandedItemComponent {
6928
6930
  this._refreshTask = setInterval(() => this._refresh(), REFRESH_TIME);
6929
6931
  }
6930
6932
  async _note() {
6931
- const { ownerId, issued, substitutingId, received, replied, log, id, note, byId, action, toId } = this.item;
6933
+ const { ownerId, issued, substitutingId, received, replied, log, id, note, byId, action, toId, escalated } = this.item;
6932
6934
  if (substitutingId) {
6933
6935
  this._accounts.get(substitutingId).subscribe(u => {
6934
6936
  if (replied) {
@@ -6938,19 +6940,15 @@ class ExpandedItemComponent {
6938
6940
  else
6939
6941
  this.note = this._translate.personalize('YouSubstituteActionTaken', u.gender, adjective, this._formatUserElement(u), time);
6940
6942
  }
6943
+ else if (escalated) {
6944
+ const escalations = log.filter(l => l.time > issued &&
6945
+ l.type === 'Escalation'
6946
+ && l.recipientId === id);
6947
+ this.note = this._translate.personalize('EscalatedFrom', u.gender, this._formatUserElement(u), this._duration(escalations[0].duration));
6948
+ }
6941
6949
  else {
6942
- const escalations = issued &&
6943
- log.filter(l => l.time > issued &&
6944
- l.type === 'Escalation'
6945
- && l.recipientId === id);
6946
- if (escalations && escalations.length) {
6947
- const duration = dayjs(escalations[0].time).diff(received, 's');
6948
- this.note = this._translate.personalize('EscalatedFrom', u.gender, this._formatUserElement(u), this._duration(duration));
6949
- }
6950
- else {
6951
- const time = this._fromNow(received);
6952
- this.note = this._translate.personalize('SubstitutingNote', u.gender, this._formatUserElement(u), time, note || '');
6953
- }
6950
+ const time = this._fromNow(received);
6951
+ this.note = this._translate.personalize('SubstitutingNote', u.gender, this._formatUserElement(u), time, note || '');
6954
6952
  }
6955
6953
  });
6956
6954
  }
@@ -6959,9 +6957,9 @@ class ExpandedItemComponent {
6959
6957
  if (byId) {
6960
6958
  if (byId === this._session.profile.byId) {
6961
6959
  if (toId)
6962
- this._accounts.get(toId).subscribe(u => this.note = this._translate.get('ActionTakenByYou', this._actionName(action, 'you'), this._formatUserElement(u), this._session.profile.name, time));
6960
+ this._accounts.get(toId).subscribe(u => this.note = this._translate.get('ActionTakenByYouTo', this._actionName(action, 'you'), this._formatUserElement(u), this._session.profile.name, time));
6963
6961
  else
6964
- this.note = this._translate.get('ActionTakenByYouTo', this._actionName(action, 'you'), this._session.profile.name, time);
6962
+ this.note = this._translate.get('ActionTakenByYou', this._actionName(action, 'you'), this._session.profile.name, time);
6965
6963
  }
6966
6964
  else
6967
6965
  this._accounts.get(byId).subscribe(u => {
@@ -7245,7 +7243,7 @@ class BrowseItemsComponent {
7245
7243
  this._remove(item);
7246
7244
  });
7247
7245
  this._messaging.new$.pipe(takeUntil(this._destroy)).subscribe(m => {
7248
- if (!this.dataSource)
7246
+ if (!this.dataSource || m.userId !== this._session.profile.userId)
7249
7247
  return;
7250
7248
  const item = this.dataSource.data.find(c => c.id === m.model.id);
7251
7249
  if (!item && this.folderId === m.model.folderId) {
@@ -8450,7 +8448,7 @@ class ComposeFormComponent {
8450
8448
  return this._mailbox.send(id, version, formId, model, action, params).
8451
8449
  subscribe(r => {
8452
8450
  if (r.toId)
8453
- this._accounts.get(r.toId).subscribe(u => this._sb.toast('Sent', number, this._getActionAdjective(action), u.name));
8451
+ this._accounts.get(r.toId).subscribe(u => this._sb.toast('SentTo', number, this._getActionAdjective(action), u.name));
8454
8452
  else
8455
8453
  this._sb.toast('Sent', number, this._getActionAdjective(action));
8456
8454
  this.working = false;
@@ -11925,6 +11923,7 @@ class ExploreItemsComponent {
11925
11923
  });
11926
11924
  }
11927
11925
  _datasource(data) {
11926
+ this._data = data;
11928
11927
  this.dataSource = new MatTableDataSource(data);
11929
11928
  this.dataSource.sort = this.sort;
11930
11929
  this.dataSource.paginator = this.paginator;
@@ -11949,7 +11948,7 @@ class ExploreItemsComponent {
11949
11948
  }
11950
11949
  }))
11951
11950
  }];
11952
- this.dataSource.data.forEach((r, i) => rows.push({
11951
+ this._data.forEach((r, i) => rows.push({
11953
11952
  index: i + 2,
11954
11953
  cells: this.columns.map((c, j) => {
11955
11954
  const isnumber = c.type === 'Currency' || c.type === 'Number';
@@ -12054,6 +12053,7 @@ class CubeExplorePaneComponent {
12054
12053
  relativeTo: this._pane,
12055
12054
  queryParams: this.axes,
12056
12055
  state: { item },
12056
+ policy: OpenPolicy.Tab | OpenPolicy.Dismissable,
12057
12057
  group: this._pane.group
12058
12058
  });
12059
12059
  this.loading = false;
@@ -13173,8 +13173,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
13173
13173
  args: [{ name: 'amDurationFormat' }]
13174
13174
  }], ctorParameters: function () { return [{ type: TranslateService }]; } });
13175
13175
 
13176
- Diagram.Inject(ComplexHierarchicalTree, BpmnDiagrams, DataBinding /*, LayoutAnimation, LineRouting, ConnectorBridging*/);
13177
- 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';
13176
+ Diagram.Inject(ComplexHierarchicalTree, BpmnDiagrams, DataBinding, LineDistribution /*, LayoutAnimation, LineRouting, ConnectorBridging*/);
13177
+ 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',
13178
+ 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';
13178
13179
  /** flow-view component*/
13179
13180
  class FlowViewComponent extends TraceBase {
13180
13181
  /** workflow-view ctor */
@@ -13196,13 +13197,15 @@ class FlowViewComponent extends TraceBase {
13196
13197
  connectionPointOrigin: ConnectionPointOrigin.DifferentPoint,
13197
13198
  horizontalSpacing: 50,
13198
13199
  verticalSpacing: 50,
13199
- verticalAlignment: 'Top',
13200
+ //connectorSegments: 'Layout',
13201
+ //arrangement: ChildArrangement.Linear,
13202
+ horizontalAlignment: 'Center',
13200
13203
  connectionDirection: 'Orientation',
13201
13204
  orientation: this._session.inverse ? 'RightToLeft' : 'LeftToRight',
13202
- margin: { left: 10, right: 10, top: 10, bottom: 10 }
13203
13205
  };
13204
13206
  this.scrollSettings = {
13205
13207
  minZoom: .5,
13208
+ scrollLimit: 'Limited',
13206
13209
  canAutoScroll: true,
13207
13210
  currentZoom: 1.2,
13208
13211
  padding: { top: 0, bottom: 0 },
@@ -13285,7 +13288,6 @@ class FlowViewComponent extends TraceBase {
13285
13288
  obj.style.strokeWidth = 0;
13286
13289
  }
13287
13290
  else {
13288
- // obj.shape = { type: 'Bpmn', shape: 'Event' } as BpmnShapeModel;
13289
13291
  obj.width = obj.height = 50;
13290
13292
  if (obj.annotations && obj.annotations.length)
13291
13293
  obj.annotations[0].style.color = this._session.theme.dark ? 'white' : 'black';
@@ -13296,7 +13298,8 @@ class FlowViewComponent extends TraceBase {
13296
13298
  }
13297
13299
  else {
13298
13300
  obj.style.strokeColor = this._accentColor;
13299
- obj.style.fill = recipient && recipient.pending ? this._session.getAccent(400) : 'transparent';
13301
+ obj.style.fill = recipient && recipient.pending ?
13302
+ this._session.getAccent(recipient.userId === this._session.userId ? 500 : 400) : 'transparent';
13300
13303
  }
13301
13304
  obj.style.strokeWidth = 2;
13302
13305
  }
@@ -13391,7 +13394,7 @@ class FlowViewComponent extends TraceBase {
13391
13394
  }
13392
13395
  }]
13393
13396
  };
13394
- if (r > 0) {
13397
+ if (r > 0)
13395
13398
  dconnectors.forEach(c => {
13396
13399
  if (c.targetId === node.id)
13397
13400
  connectors.push({
@@ -13401,7 +13404,10 @@ class FlowViewComponent extends TraceBase {
13401
13404
  estimate: c.estimate
13402
13405
  }
13403
13406
  });
13404
- if (c.sourceId === node.id)
13407
+ if (c.sourceId === node.id) {
13408
+ //
13409
+ if (c.virtual && c.originId !== recipient.id)
13410
+ return;
13405
13411
  connectors.push({
13406
13412
  sourceID: nod.id,
13407
13413
  targetID: c.targetId,
@@ -13409,8 +13415,8 @@ class FlowViewComponent extends TraceBase {
13409
13415
  estimate: c.estimate
13410
13416
  }
13411
13417
  });
13418
+ }
13412
13419
  });
13413
- }
13414
13420
  nodes.push(nod);
13415
13421
  if (recipient.action) {
13416
13422
  const action = this._session.profile.actions.find(a => a.name === recipient.action);
@@ -13433,56 +13439,40 @@ class FlowViewComponent extends TraceBase {
13433
13439
  indicators.push(actionIndicator);
13434
13440
  }
13435
13441
  }
13436
- if (recipient.pending && !recipient.estimate)
13442
+ if (recipient.fyi)
13437
13443
  indicators.push({
13438
- id: nod.id + 'pending',
13444
+ id: nod.id + 'fyi',
13439
13445
  shape: {
13440
13446
  type: 'Path',
13441
- data: PENDING_PATH,
13442
- align: this._session.inverse ? 'XMaxYMax' : 'XMinYMax'
13447
+ data: FYI_PATH,
13448
+ align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13443
13449
  },
13444
13450
  style: {
13445
- fill: this._session.getAccent(900)
13451
+ fill: '#1976d2'
13446
13452
  },
13447
13453
  addInfo: {
13448
13454
  indicator: true,
13449
13455
  parentId: nod.id
13450
13456
  }
13451
13457
  });
13452
- if (recipient.fyi)
13453
- indicators.push({
13454
- id: nod.id + 'fyi',
13458
+ if (recipient.escalated) {
13459
+ const escalateIndicator = {
13460
+ id: nod.id + 'escalate',
13455
13461
  shape: {
13456
13462
  type: 'Path',
13457
- data: FYI_PATH,
13463
+ data: ESCALATED_PATH,
13458
13464
  align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13459
13465
  },
13460
13466
  style: {
13461
- fill: '#1976d2'
13467
+ fill: this._session.getAccent(900)
13462
13468
  },
13463
13469
  addInfo: {
13464
13470
  indicator: true,
13465
13471
  parentId: nod.id
13466
13472
  }
13467
- });
13468
- // if (this.model.log.filter(l => l.time > this._submitted && l.type === 'Escalation' && l.recipientId === recipient.id).length) {
13469
- // const escalateIndicator = {
13470
- // id: nod.id + 'escalate',
13471
- // shape: {
13472
- // type: 'Path',
13473
- // data: ESCALATED_PATH,
13474
- // align: this._session.inverse ? 'XMinYMax' : 'XMaxYMax'
13475
- // },
13476
- // style: {
13477
- // fill: this._session.getAccent(900)
13478
- // },
13479
- // addInfo: {
13480
- // indicator: true,
13481
- // parentId: nod.id
13482
- // } as NodeInfoModel
13483
- // } as NodeModel;
13484
- // indicators.push(escalateIndicator);
13485
- // }
13473
+ };
13474
+ indicators.push(escalateIndicator);
13475
+ }
13486
13476
  }
13487
13477
  }
13488
13478
  else {
@@ -13549,36 +13539,6 @@ class FlowViewComponent extends TraceBase {
13549
13539
  }
13550
13540
  }
13551
13541
  }
13552
- /**
13553
- *
13554
- * @param connector
13555
- * @param index
13556
- * @param vconnectors
13557
- */
13558
- function reroute(connector, index) {
13559
- while (index < dconnectors.length) {
13560
- let dconnector = dconnectors[index];
13561
- if (dconnector.sourceId === connector.targetId) {
13562
- if (nodes.some(n => n.id === dconnector.targetId))
13563
- connectors.push({
13564
- sourceID: connector.sourceId,
13565
- targetID: dconnector.targetId,
13566
- addInfo: {
13567
- estimate: dconnector.estimate,
13568
- time: dconnector.time
13569
- }
13570
- });
13571
- else
13572
- reroute({
13573
- time: dconnector.time,
13574
- targetId: dconnector.targetId,
13575
- estimate: dconnector.estimate,
13576
- sourceId: connector.sourceId
13577
- }, index + 1);
13578
- }
13579
- index++;
13580
- }
13581
- }
13582
13542
  return { connectors, nodes, indicators };
13583
13543
  }
13584
13544
  /**
@@ -13594,7 +13554,7 @@ class FlowViewComponent extends TraceBase {
13594
13554
  const stateLog = log.find(l => l.type === 'StateChange');
13595
13555
  if (stateLog) {
13596
13556
  state = this._session.profile.states.find(s => s.name === stateLog.state);
13597
- annotation = state ? ((node.estimate ? state.future : state.past) || state.title) : stateLog.state;
13557
+ annotation = (node.estimate ? state.future : state.past) || state.title;
13598
13558
  }
13599
13559
  if (node.type === START_NODE) {
13600
13560
  if (!node.estimate) {
@@ -13615,8 +13575,8 @@ class FlowViewComponent extends TraceBase {
13615
13575
  const { min, max } = super._estimateTime(node);
13616
13576
  if (max)
13617
13577
  return !min || min === max ?
13618
- this._translate.get('EstimateTime', this._duration.transform(max)) :
13619
- this._translate.get('EstimateTimeRange', this._duration.transform(min), this._duration.transform(max));
13578
+ this._translate.get('EstimateTime', dayjs.duration(max).humanize()) :
13579
+ this._translate.get('EstimateTimeRange', dayjs.duration(min).humanize(), dayjs.duration(max).humanize());
13620
13580
  }
13621
13581
  _tooltip(obj) {
13622
13582
  const { note, role, substituting, escalation, duration, standardTime, estimatedTime, error, fyi } = obj;
@@ -13770,11 +13730,25 @@ class FlowViewComponent extends TraceBase {
13770
13730
  tooltip.substituting = this._translate.personalize('SubstitutingFor', substituting.gender, substituting.name);
13771
13731
  }
13772
13732
  }
13773
- const escalations = this.model.log.filter(l => l.time > this._issued && l.type === 'Escalation' && l.recipientId === recipient.id);
13774
- if (escalations.length) {
13733
+ if (recipient.originId) {
13734
+ const origin = this.model.recipients.find(r => r.id === recipient.originId);
13735
+ if (origin.toId) {
13736
+ const action = this._session.profile.actions.find(a => a.name === origin.action);
13737
+ const id = origin.byId || origin.userId, name = action.adjective || action.past || action.title;
13738
+ if (id === this._session.userId) {
13739
+ tooltip.substituting = this._translate.get('ByYou', name);
13740
+ }
13741
+ else {
13742
+ const who = await this._accounts.get(id).toPromise();
13743
+ tooltip.substituting = this._translate.get('By', who.name, name);
13744
+ }
13745
+ }
13746
+ }
13747
+ if (recipient.escalated) {
13748
+ const escalations = this.model.log.filter(l => l.type === 'Escalation' && l.recipientId === recipient.id);
13775
13749
  const userIds = escalations.map(e => e.userId);
13776
13750
  const users = await this._accounts.getAll(userIds).toPromise();
13777
- const duration = this._duration.transform(dayjs(escalations[escalations.length - 1].time).diff(recipient.received, 's'));
13751
+ const duration = this._duration.transform(dayjs.duration(escalations[escalations.length - 1].duration, 's'));
13778
13752
  tooltip.escalation = this._translate.get('EscalatedTo', this._translate.join(users.map(u => u.name)), duration);
13779
13753
  }
13780
13754
  if (recipient.replied) {
@@ -14103,30 +14077,28 @@ class TraceViewComponent extends TraceBase {
14103
14077
  step.role = by.role;
14104
14078
  }
14105
14079
  }
14106
- else {
14080
+ else if (recipient.escalated) {
14107
14081
  let escalations = this.model.log.filter(l => l.time > issued &&
14108
14082
  l.type === 'Escalation' && l.recipientId === recipient.id);
14109
- if (escalations.length) {
14110
- let escalate = [];
14111
- for (let escalation of escalations) {
14112
- let who = await profileOf(escalation.userId);
14113
- escalate.push(who);
14114
- }
14115
- let who = await profileOf(recipient.userId);
14116
- if (escalations.length === 1 && escalate[0] === this._session.userId)
14117
- step.name = this._translate.get('EscalatedByYou', nameOf(who));
14118
- else
14119
- step.name = this._translate.get('EscalatedBy', nameOf(who), this._translate.join(escalate.map(e => nameOf(e))));
14083
+ let escalate = [];
14084
+ for (let escalation of escalations) {
14085
+ let who = await profileOf(escalation.userId);
14086
+ escalate.push(who);
14120
14087
  }
14088
+ let who = await profileOf(recipient.userId);
14089
+ if (escalations.length === 1 && escalate[0] === this._session.userId)
14090
+ step.name = this._translate.get('EscalatedByYou', nameOf(who));
14091
+ else
14092
+ step.name = this._translate.get('EscalatedBy', nameOf(who), this._translate.join(escalate.map(e => nameOf(e))));
14093
+ }
14094
+ else {
14095
+ if (recipient.userId === this._session.userId)
14096
+ step.name = this._translate.get('You');
14121
14097
  else {
14122
- if (recipient.userId === this._session.userId)
14123
- step.name = this._translate.get('You');
14124
- else {
14125
- let who = await profileOf(recipient.userId);
14126
- step.name = nameOf(who);
14127
- if (who.role)
14128
- step.role = who.role;
14129
- }
14098
+ let who = await profileOf(recipient.userId);
14099
+ step.name = nameOf(who);
14100
+ if (who.role)
14101
+ step.role = who.role;
14130
14102
  }
14131
14103
  }
14132
14104
  trace.push(step);
@@ -14729,7 +14701,7 @@ class CubeMatrixComponent {
14729
14701
  this.refresh();
14730
14702
  }
14731
14703
  _addindices() {
14732
- const collection = this.indexAt === 'series' ? this.rows : this.columns;
14704
+ const collection = this.indexAt === 'xAxis' ? this.columns : this.rows;
14733
14705
  this.indices.forEach((x, i) => {
14734
14706
  const header = {
14735
14707
  key: x.name,
@@ -14737,10 +14709,10 @@ class CubeMatrixComponent {
14737
14709
  index: x,
14738
14710
  accumulate: x.accumulate
14739
14711
  };
14740
- if (this.placeAt === 'leading')
14741
- collection.splice(i, 0, header);
14742
- else
14712
+ if (this.placeAt === 'trailing')
14743
14713
  collection.push(header);
14714
+ else
14715
+ collection.splice(i, 0, header);
14744
14716
  });
14745
14717
  }
14746
14718
  _addsumheaders() {
@@ -14806,17 +14778,17 @@ class CubeMatrixComponent {
14806
14778
  const d = {};
14807
14779
  series.forEach(s => {
14808
14780
  if (s.index) {
14809
- if (this.indexAt === 'series') {
14810
- const row = d[s.index] = {};
14811
- s.points.forEach(p => row[p.x] = p.y);
14812
- }
14813
- else
14781
+ if (this.indexAt === 'xAxis')
14814
14782
  s.points.forEach(p => {
14815
14783
  let row = d[p.x];
14816
14784
  if (!row)
14817
14785
  row = d[p.x] = {};
14818
14786
  row[s.index] = p.y;
14819
14787
  });
14788
+ else {
14789
+ const row = d[s.index] = {};
14790
+ s.points.forEach(p => row[p.x] = p.y);
14791
+ }
14820
14792
  }
14821
14793
  else {
14822
14794
  const row = d[s.name] = {};
@@ -14839,20 +14811,20 @@ class CubeMatrixComponent {
14839
14811
  this.rows.forEach(r => {
14840
14812
  const datarow = data[r.key];
14841
14813
  if (datarow) {
14842
- let sum = 0;
14814
+ let columnTotal = 0;
14843
14815
  this.columns.forEach(c => {
14844
14816
  if (c.accumulate === false || c.sum !== undefined)
14845
14817
  return;
14846
14818
  let val = datarow[c.key];
14847
14819
  if (val !== undefined)
14848
- sum += this.indices.length === 0 || this.indexAt === 'series' ||
14820
+ columnTotal += this.indices.length === 0 || this.indexAt !== 'xAxis' ||
14849
14821
  c.index !== undefined ? val : -val;
14850
14822
  });
14851
- datarow['_total'] = this._format(sum, r);
14823
+ datarow['_total'] = this._format(columnTotal, r);
14852
14824
  if (!r.sum)
14853
14825
  grand += this.indices.length === 0 ||
14854
14826
  this.indexAt === 'xAxis' ||
14855
- r.index !== undefined ? sum : -sum;
14827
+ r.index !== undefined ? columnTotal : -columnTotal;
14856
14828
  }
14857
14829
  else
14858
14830
  data[r.key] = {
@@ -14862,16 +14834,16 @@ class CubeMatrixComponent {
14862
14834
  const totals = data['_total'] = this.totals = {};
14863
14835
  totals['_grand'] = this._format(grand);
14864
14836
  this.columns.forEach(c => {
14865
- let sum = 0;
14837
+ let rowTotal = 0;
14866
14838
  this.rows.forEach(row => {
14867
14839
  if (row.accumulate === false || row.sum !== undefined)
14868
14840
  return;
14869
14841
  const val = data[row.key][c.key];
14870
14842
  if (val !== undefined)
14871
- sum += this.indices.length === 0 || this.indexAt === 'xAxis' ||
14843
+ rowTotal += this.indices.length === 0 || this.indexAt === 'xAxis' ||
14872
14844
  row.index !== undefined ? val : -val;
14873
14845
  });
14874
- totals[c.key] = this._format(sum, c);
14846
+ totals[c.key] = this._format(rowTotal, c);
14875
14847
  });
14876
14848
  }
14877
14849
  _calculatesum(data) {
@@ -17222,7 +17194,7 @@ class HomeBase {
17222
17194
  this._messaging.new$.subscribe(m => {
17223
17195
  const { model: { formId: name, subject, number } } = m;
17224
17196
  const form = this._session.profile.forms.find(f => f.name === name), msg = this._translate.get('NewMail', form.title, number, subject || '');
17225
- this._snackBar.open(msg, this._translate.get('OpenNew'), {
17197
+ this._snackBar.open(msg, m.userId === this._session.profile.userId ? this._translate.get('OpenNew') : null, {
17226
17198
  duration: 5000,
17227
17199
  direction: this._session.direction,
17228
17200
  politeness: 'assertive'
@@ -18655,7 +18627,7 @@ class SlotsComponent {
18655
18627
  }
18656
18628
  }
18657
18629
  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 });
18658
- 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,
18630
+ 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,
18659
18631
  panesTitleAnimation,
18660
18632
  paneAnimation,
18661
18633
  paramAnimation,
@@ -18672,7 +18644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
18672
18644
  queryAnimation,
18673
18645
  tabsAnimation,
18674
18646
  tabAnimation
18675
- ], 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"] }]
18647
+ ], 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"] }]
18676
18648
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
18677
18649
  type: Inject,
18678
18650
  args: [PANES_DATA]
@@ -26377,7 +26349,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
26377
26349
  args: ['attr.aria-describedby']
26378
26350
  }] } });
26379
26351
 
26380
- dayjs.extend(relativeTime);
26352
+ // https://day.js.org/docs/en/customization/relative-time
26353
+ dayjs.extend(relativeTime, {
26354
+ thresholds: [
26355
+ { l: 's', r: 1 },
26356
+ { l: 'm', r: 1 },
26357
+ { l: 'mm', r: 59, d: 'minute' },
26358
+ { l: 'h', r: 1 },
26359
+ { l: 'hh', r: 24, d: 'hour' },
26360
+ { l: 'd', r: 1 },
26361
+ { l: 'dd', r: 29, d: 'day' },
26362
+ { l: 'M', r: 1 },
26363
+ { l: 'MM', r: 11, d: 'month' },
26364
+ { l: 'y' },
26365
+ { l: 'yy', d: 'year' }
26366
+ ]
26367
+ });
26381
26368
  dayjs.extend(duration);
26382
26369
  dayjs.extend(calendar);
26383
26370
  const CORE_COMPONENTS = [CubeParallelViewComponent, CubeExploreViewComponent, CubeChartViewComponent, CubeDocumentSumComponent, CubeDocumentMatrixComponent, CubeDocumentViewComponent, CubePivotViewComponent, TimelineViewComponent,
@@ -26759,34 +26746,30 @@ class TraceElementComponent {
26759
26746
  this.none = log.length === 0,
26760
26747
  this.nodeType = this._session.profile.nodes.find(n => n.name === addInfo.nodeType);
26761
26748
  }
26762
- recipientInfo(recipient) {
26763
- const observables = [], observe = this._accounts.get(recipient.userId);
26764
- observables.push(observe);
26765
- const escalations = this.timeline.log.filter(l => l.time > this.timeline.startDate && l.type === 'Escalation' && l.recipientId === recipient.id);
26766
- if (escalations.length)
26767
- escalations.forEach(e => {
26768
- const observe = this._accounts.get(e.userId);
26769
- observables.push(observe);
26770
- });
26771
- else if (recipient.byId) {
26772
- const observe = this._accounts.get(recipient.byId);
26773
- observables.push(observe);
26749
+ async recipientInfo(recipient) {
26750
+ const info = [];
26751
+ const who = await this._accounts.get(recipient.userId).toPromise();
26752
+ if (recipient.escalated) {
26753
+ const escalations = this.timeline.log.filter(l => l.type === 'Escalation' && l.recipientId === recipient.id);
26754
+ const escalate = await this._accounts.get(escalations[0].userId).toPromise();
26755
+ info.push(this._translate.get('EscalatedBy', this._chat.format(escalate), this._chat.format(who)));
26774
26756
  }
26775
26757
  if (recipient.substitutingId) {
26776
- const observe = this._accounts.get(recipient.substitutingId);
26777
- observables.push(observe);
26758
+ const substitute = await this._accounts.get(recipient.substitutingId).toPromise();
26759
+ if (recipient.byId) {
26760
+ const by = await this._accounts.get(recipient.byId).toPromise();
26761
+ info.push(this._translate.get('SubstitutingBy', this._chat.format(who), this._chat.format(substitute), this._chat.format(by)));
26762
+ }
26763
+ else
26764
+ info.push(this._translate.get('Substituting', this._chat.format(who), this._chat.format(substitute)));
26778
26765
  }
26779
- return forkJoin(observables).pipe(map(us => us.map(u => this._chat.format(u))), map(us => {
26780
- if (escalations.length)
26781
- return this._translate.get('EscalatedBy', us[0], this._translate.join(us.slice(1)));
26782
- else if (recipient.byId && recipient.substitutingId)
26783
- return this._translate.get('SubstitutingBy', us[0], us[2], us[1]);
26784
- else if (recipient.substitutingId)
26785
- return this._translate.get('Substituting', us[0], us[1]);
26786
- else if (recipient.byId)
26787
- return this._translate.get('By', us[0], us[1]);
26788
- return us[0];
26789
- }));
26766
+ else if (recipient.byId) {
26767
+ const by = await this._accounts.get(recipient.byId).toPromise();
26768
+ info.push(this._translate.get('By', this._chat.format(who), this._chat.format(by)));
26769
+ }
26770
+ else
26771
+ info.push(this._chat.format(who));
26772
+ return info.join(this._translate.comma);
26790
26773
  }
26791
26774
  logInfo(log) {
26792
26775
  const observables = [];