@things-factory/worklist 8.0.26 → 8.0.38

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.
@@ -1,4 +1,5 @@
1
1
  import '@operato/data-grist';
2
+ import '@operato/input/ox-input-select-buttons.js';
2
3
  import { FetchOption, DataGrist } from '@operato/data-grist';
3
4
  import { PageView } from '@operato/shell';
4
5
  declare const ActivityInstanceListPage_base: (new (...args: any[]) => {
@@ -7,11 +8,17 @@ declare const ActivityInstanceListPage_base: (new (...args: any[]) => {
7
8
  disconnectedCallback(): void;
8
9
  stateChanged(_state: unknown): void;
9
10
  readonly isConnected: boolean;
11
+ }) & (new (...args: any[]) => {
12
+ __preferenceProviders: {
13
+ [element: string]: import("@operato/p13n").PagePreferenceProvider;
14
+ };
15
+ getPagePreferenceProvider(element: string): import("@operato/p13n").PagePreferenceProvider | undefined;
10
16
  }) & (new (...args: any[]) => import("lit").LitElement) & typeof PageView;
11
17
  export declare class ActivityInstanceListPage extends ActivityInstanceListPage_base {
12
18
  static styles: import("lit").CSSResult[];
13
19
  gristConfig: any;
14
- mode: string;
20
+ mode: 'CARD' | 'GRID' | 'LIST';
21
+ private issuedByMe?;
15
22
  grist: DataGrist;
16
23
  get context(): {
17
24
  title: string;
@@ -23,7 +30,12 @@ export declare class ActivityInstanceListPage extends ActivityInstanceListPage_b
23
30
  handler: () => void;
24
31
  };
25
32
  help: string;
26
- actions: never[];
33
+ actions: {
34
+ title: string;
35
+ action: () => Promise<void>;
36
+ icon: string;
37
+ }[];
38
+ toolbar: boolean;
27
39
  };
28
40
  render(): import("lit-html").TemplateResult<1>;
29
41
  pageInitialized(lifecycle: any): Promise<void>;
@@ -31,5 +43,8 @@ export declare class ActivityInstanceListPage extends ActivityInstanceListPage_b
31
43
  total: any;
32
44
  records: any;
33
45
  }>;
46
+ abortActivityInstances(): Promise<void>;
47
+ showToast(message: any): void;
48
+ dueTimer(exp: any): AsyncGenerator<string, void, unknown>;
34
49
  }
35
50
  export {};
@@ -1,19 +1,70 @@
1
- import { __decorate, __metadata } from "tslib";
1
+ import { __asyncGenerator, __await, __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
+ import '@operato/input/ox-input-select-buttons.js';
3
4
  import gql from 'graphql-tag';
4
5
  import { css, html } from 'lit';
5
- import { customElement, property, query } from 'lit/decorators.js';
6
+ import { customElement, property, query, state } from 'lit/decorators.js';
7
+ import { asyncReplace } from 'lit/directives/async-replace.js';
6
8
  import { connect } from 'pwa-helpers/connect-mixin.js';
7
9
  import { DataGrist } from '@operato/data-grist';
8
10
  import { client } from '@operato/graphql';
9
11
  import { i18next, localize } from '@operato/i18n';
10
- import { PageView, store } from '@operato/shell';
11
- import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
12
- import { isMobileDevice } from '@operato/utils';
13
- let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(store)(localize(i18next)(PageView)) {
12
+ import { CustomAlert, PageView, store } from '@operato/shell';
13
+ import { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
14
+ import { isMobileDevice, sleep } from '@operato/utils';
15
+ import { p13n } from '@operato/p13n';
16
+ import { ActivityInstanceStatus } from '../../types/activity-instance.js';
17
+ const MIN = 60;
18
+ const HOUR = 60 * MIN;
19
+ const DAY = 24 * HOUR;
20
+ function getActivityInstanceStatus() {
21
+ return [
22
+ { display: '', value: '' },
23
+ {
24
+ display: i18next.t('label.activity-state-draft'),
25
+ value: ActivityInstanceStatus.Draft
26
+ },
27
+ {
28
+ display: i18next.t('label.activity-state-issued'),
29
+ value: ActivityInstanceStatus.Issued
30
+ },
31
+ {
32
+ display: i18next.t('label.activity-state-unassigned'),
33
+ value: ActivityInstanceStatus.Unassigned
34
+ },
35
+ {
36
+ display: i18next.t('label.activity-state-assigned'),
37
+ value: ActivityInstanceStatus.Assigned
38
+ },
39
+ {
40
+ display: i18next.t('label.activity-state-started'),
41
+ value: ActivityInstanceStatus.Started
42
+ },
43
+ {
44
+ display: i18next.t('label.activity-state-pending'),
45
+ value: ActivityInstanceStatus.Pending
46
+ },
47
+ {
48
+ display: i18next.t('label.activity-state-ended'),
49
+ value: ActivityInstanceStatus.Ended
50
+ },
51
+ {
52
+ display: i18next.t('label.activity-state-aborted'),
53
+ value: ActivityInstanceStatus.Aborted
54
+ }
55
+ ];
56
+ }
57
+ const isDueable = (state) => {
58
+ return (state === ActivityInstanceStatus.Issued ||
59
+ state === ActivityInstanceStatus.Assigned ||
60
+ state === ActivityInstanceStatus.Started ||
61
+ state === ActivityInstanceStatus.Pending);
62
+ };
63
+ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(store)(p13n(localize(i18next)(PageView))) {
14
64
  constructor() {
15
65
  super(...arguments);
16
66
  this.mode = isMobileDevice() ? 'CARD' : 'GRID';
67
+ this.issuedByMe = false;
17
68
  }
18
69
  get context() {
19
70
  var _a;
@@ -30,19 +81,45 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
30
81
  this.grist.toggleHeadroom();
31
82
  }
32
83
  },
33
- help: 'worklist/activity-instance-list',
34
- actions: []
84
+ help: 'worklist/activity-instance-list-page',
85
+ actions: [
86
+ {
87
+ title: i18next.t('button.abort'),
88
+ action: this.abortActivityInstances.bind(this),
89
+ icon: 'cancel'
90
+ }
91
+ ],
92
+ toolbar: false
35
93
  };
36
94
  }
37
95
  render() {
38
96
  const mode = this.mode;
39
97
  return html `
40
- <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
98
+ <ox-grist
99
+ .mode=${mode}
100
+ .config=${this.gristConfig}
101
+ .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')}
102
+ .fetchHandler=${this.fetchHandler.bind(this)}
103
+ >
41
104
  <div slot="headroom" class="header">
42
105
  <div class="filters">
106
+ <ox-checkbox
107
+ .checked=${this.issuedByMe}
108
+ @change=${(e) => {
109
+ var _a;
110
+ this.issuedByMe = (_a = e.currentTarget) === null || _a === void 0 ? void 0 : _a.checked;
111
+ this.grist.fetch();
112
+ }}
113
+ ></ox-checkbox>
114
+ ${i18next.t('label.issued-by-me')}
115
+
43
116
  <ox-filters-form autofocus without-search></ox-filters-form>
44
117
  </div>
118
+
119
+ <ox-context-page-toolbar class="actions" .context=${this.context}> </ox-context-page-toolbar>
45
120
  </div>
121
+
122
+ <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
46
123
  </ox-grist>
47
124
  `;
48
125
  }
@@ -65,7 +142,7 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
65
142
  },
66
143
  filter: 'search',
67
144
  sortable: true,
68
- width: 150
145
+ width: 200
69
146
  },
70
147
  {
71
148
  type: 'string',
@@ -75,7 +152,7 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
75
152
  editable: false
76
153
  },
77
154
  filter: 'search',
78
- width: 200
155
+ width: 240
79
156
  },
80
157
  {
81
158
  type: 'number',
@@ -92,18 +169,36 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
92
169
  width: 60
93
170
  },
94
171
  {
95
- type: 'string',
172
+ type: 'select',
96
173
  name: 'state',
174
+ label: i18next.t('field.status'),
97
175
  header: i18next.t('field.status'),
98
176
  record: {
99
- editable: false
177
+ editable: false,
178
+ options: getActivityInstanceStatus()
100
179
  },
180
+ filter: true,
101
181
  width: 80
102
182
  },
183
+ {
184
+ type: 'string',
185
+ name: 'dueIn',
186
+ header: i18next.t('field.due-in'),
187
+ record: {
188
+ editable: false,
189
+ renderer: (value, column, record, rowIndex, field) => {
190
+ if (isDueable(record.state)) {
191
+ return html ` <span>${asyncReplace(this.dueTimer(record.dueAt))}</span>`;
192
+ }
193
+ }
194
+ },
195
+ sortable: false,
196
+ width: 180
197
+ },
103
198
  {
104
199
  type: 'resource-object',
105
- name: 'updater',
106
- header: i18next.t('field.updater'),
200
+ name: 'issuer',
201
+ header: i18next.t('field.issuer'),
107
202
  record: {
108
203
  editable: false
109
204
  },
@@ -112,8 +207,38 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
112
207
  },
113
208
  {
114
209
  type: 'datetime',
115
- name: 'updatedAt',
116
- header: i18next.t('field.updated_at'),
210
+ name: 'issuedAt',
211
+ header: i18next.t('field.issued-at'),
212
+ record: {
213
+ editable: false
214
+ },
215
+ sortable: true,
216
+ width: 180
217
+ },
218
+ {
219
+ type: 'datetime',
220
+ name: 'dueAt',
221
+ header: i18next.t('field.due-at'),
222
+ record: {
223
+ editable: false
224
+ },
225
+ sortable: true,
226
+ width: 180
227
+ },
228
+ {
229
+ type: 'datetime',
230
+ name: 'startedAt',
231
+ header: i18next.t('field.started-at'),
232
+ record: {
233
+ editable: false
234
+ },
235
+ sortable: true,
236
+ width: 180
237
+ },
238
+ {
239
+ type: 'datetime',
240
+ name: 'terminatedAt',
241
+ header: i18next.t('field.terminated-at'),
117
242
  record: {
118
243
  editable: false
119
244
  },
@@ -135,7 +260,8 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
135
260
  },
136
261
  sorters: [
137
262
  {
138
- name: 'name'
263
+ name: 'issuedAt',
264
+ desc: true
139
265
  }
140
266
  ]
141
267
  };
@@ -144,7 +270,7 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
144
270
  const response = await client.query({
145
271
  query: gql `
146
272
  query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
147
- responses: activityInstances(filters: $filters, pagination: $pagination, sortings: $sortings) {
273
+ responses: ${this.issuedByMe ? 'activityInstancesIssuedByMe' : 'activityInstances'}(filters: $filters, pagination: $pagination, sortings: $sortings) {
148
274
  items {
149
275
  id
150
276
  name
@@ -152,11 +278,18 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
152
278
  priority
153
279
  state
154
280
  thumbnail
281
+ issuer {
282
+ id
283
+ name
284
+ }
155
285
  updater {
156
286
  id
157
287
  name
158
288
  }
159
- updatedAt
289
+ issuedAt
290
+ dueAt
291
+ startedAt
292
+ terminatedAt
160
293
  }
161
294
  total
162
295
  }
@@ -173,9 +306,65 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends connect(st
173
306
  records: response.data.responses.items || []
174
307
  };
175
308
  }
309
+ async abortActivityInstances() {
310
+ const ids = this.grist.selected.map(record => record.id);
311
+ if (ids && ids.length > 0) {
312
+ const answer = await CustomAlert({
313
+ type: 'warning',
314
+ title: i18next.t('button.abort'),
315
+ text: i18next.t('text.are_you_sure'),
316
+ confirmButton: { text: i18next.t('button.abort') },
317
+ cancelButton: { text: i18next.t('button.cancel') }
318
+ });
319
+ if (!(answer === null || answer === void 0 ? void 0 : answer.value))
320
+ return;
321
+ const response = await client.query({
322
+ query: gql `
323
+ mutation ($ids: [String!]!) {
324
+ abortActivityInstances(ids: $ids)
325
+ }
326
+ `,
327
+ variables: {
328
+ ids
329
+ }
330
+ });
331
+ if (!response.errors) {
332
+ this.grist.fetch();
333
+ this.showToast(i18next.t('text.activity_instance_aborted_successfully'));
334
+ }
335
+ }
336
+ else {
337
+ CustomAlert({
338
+ title: i18next.t('text.nothing_selected'),
339
+ text: i18next.t('text.there_is_nothing_to_process')
340
+ });
341
+ }
342
+ }
343
+ showToast(message) {
344
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message } }));
345
+ }
346
+ dueTimer(exp) {
347
+ return __asyncGenerator(this, arguments, function* dueTimer_1() {
348
+ while (exp && this.active) {
349
+ var secs = Math.round((Date.parse(exp) - Date.now()) / 1000);
350
+ var positive = secs >= 0;
351
+ secs = Math.abs(secs);
352
+ const days = Math.floor(secs / DAY);
353
+ secs -= days * DAY;
354
+ const hours = Math.floor(secs / HOUR);
355
+ secs -= hours * HOUR;
356
+ const minutes = Math.floor(secs / MIN);
357
+ const seconds = secs - minutes * MIN;
358
+ const result = `${positive ? '' : '- '}${days ? `${days}${i18next.t('label.days')} ` : ''}${hours ? `${hours}${i18next.t('label.hours')} ` : ''}${minutes ? `${minutes}${i18next.t('label.minutes')} ` : ''}`;
359
+ yield yield __await(result);
360
+ yield __await(sleep(60 * 1000));
361
+ }
362
+ });
363
+ }
176
364
  };
177
365
  ActivityInstanceListPage.styles = [
178
366
  ScrollbarStyles,
367
+ CommonGristStyles,
179
368
  CommonHeaderStyles,
180
369
  css `
181
370
  :host {
@@ -185,12 +374,18 @@ ActivityInstanceListPage.styles = [
185
374
 
186
375
  --grid-record-emphasized-background-color: #8b0000;
187
376
  --grid-record-emphasized-color: #ff6b6b;
377
+
378
+ --grid-header-padding: 2px 0 2px 9px;
188
379
  }
189
380
 
190
381
  ox-grist {
191
382
  overflow-y: auto;
192
383
  flex: 1;
193
384
  }
385
+
386
+ .header {
387
+ grid-template-areas: 'filters actions';
388
+ }
194
389
  `
195
390
  ];
196
391
  __decorate([
@@ -201,6 +396,10 @@ __decorate([
201
396
  property({ type: String }),
202
397
  __metadata("design:type", String)
203
398
  ], ActivityInstanceListPage.prototype, "mode", void 0);
399
+ __decorate([
400
+ state(),
401
+ __metadata("design:type", Boolean)
402
+ ], ActivityInstanceListPage.prototype, "issuedByMe", void 0);
204
403
  __decorate([
205
404
  query('ox-grist'),
206
405
  __metadata("design:type", DataGrist)
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-list-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\n\nimport { FetchOption, DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView, store } from '@operato/shell'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\n@customElement('activity-instance-list-page')\nexport class ActivityInstanceListPage extends connect(store)(localize(i18next)(PageView)) {\n static styles = [\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: string = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('title.activity instance list'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n },\n help: 'worklist/activity-instance-list',\n actions: []\n }\n }\n\n render() {\n const mode = this.mode\n\n return html`\n <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form autofocus without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle) {\n this.gristConfig = {\n list: {\n thumbnail: 'thumbnail',\n fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: false\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: false\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'number',\n name: 'priority',\n header: i18next.t('field.priority'),\n record: {\n editable: false,\n renderer: function (value, column, record, rowIndex, field) {\n const color = ['', '#98FB98', '#87CEEB', '#FF6B6B', '#8B0000'][value || 0]\n const count = new Array(value > 4 ? 4 : value || 0).fill('')\n return html`${count.map(() => html`<md-icon style=\"color:${color};\">star</md-icon>`)}`\n }\n },\n width: 60\n },\n {\n type: 'string',\n name: 'state',\n header: i18next.t('field.status'),\n record: {\n editable: false\n },\n width: 80\n },\n {\n type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: {\n editable: false\n },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n },\n {\n type: 'image',\n name: 'thumbnail',\n header: i18next.t('field.thumbnail'),\n record: { editable: false },\n hidden: true\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n sorters: [\n {\n name: 'name'\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: activityInstances(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n priority\n state\n thumbnail\n updater {\n id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n}\n"]}
1
+ {"version":3,"file":"activity-instance-list-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { asyncReplace } from 'lit/directives/async-replace.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\n\nimport { FetchOption, DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CustomAlert, PageView, store } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice, sleep } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\nimport { ActivityInstanceStatus } from '../../types/activity-instance.js'\n\nconst MIN = 60\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\n\nfunction getActivityInstanceStatus() {\n return [\n { display: '', value: '' },\n {\n display: i18next.t('label.activity-state-draft'),\n value: ActivityInstanceStatus.Draft\n },\n {\n display: i18next.t('label.activity-state-issued'),\n value: ActivityInstanceStatus.Issued\n },\n {\n display: i18next.t('label.activity-state-unassigned'),\n value: ActivityInstanceStatus.Unassigned\n },\n {\n display: i18next.t('label.activity-state-assigned'),\n value: ActivityInstanceStatus.Assigned\n },\n {\n display: i18next.t('label.activity-state-started'),\n value: ActivityInstanceStatus.Started\n },\n {\n display: i18next.t('label.activity-state-pending'),\n value: ActivityInstanceStatus.Pending\n },\n {\n display: i18next.t('label.activity-state-ended'),\n value: ActivityInstanceStatus.Ended\n },\n {\n display: i18next.t('label.activity-state-aborted'),\n value: ActivityInstanceStatus.Aborted\n }\n ]\n}\n\nconst isDueable = (state: ActivityInstanceStatus) => {\n return (\n state === ActivityInstanceStatus.Issued ||\n state === ActivityInstanceStatus.Assigned ||\n state === ActivityInstanceStatus.Started ||\n state === ActivityInstanceStatus.Pending\n )\n}\n\n@customElement('activity-instance-list-page')\nexport class ActivityInstanceListPage extends connect(store)(p13n(localize(i18next)(PageView))) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n\n --grid-header-padding: 2px 0 2px 9px;\n }\n\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n\n .header {\n grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @state() private issuedByMe?: boolean = false\n\n @query('ox-grist') grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('title.activity instance list'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n },\n help: 'worklist/activity-instance-list-page',\n actions: [\n {\n title: i18next.t('button.abort'),\n action: this.abortActivityInstances.bind(this),\n icon: 'cancel'\n }\n ],\n toolbar: false\n }\n }\n\n render() {\n const mode = this.mode\n\n return html`\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n .fetchHandler=${this.fetchHandler.bind(this)}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-checkbox\n .checked=${this.issuedByMe}\n @change=${(e: CustomEvent) => {\n this.issuedByMe = (e.currentTarget as any)?.checked\n this.grist.fetch()\n }}\n ></ox-checkbox>\n ${i18next.t('label.issued-by-me')}\n\n <ox-filters-form autofocus without-search></ox-filters-form>\n </div>\n\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}> </ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle) {\n this.gristConfig = {\n list: {\n thumbnail: 'thumbnail',\n fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: false\n },\n filter: 'search',\n sortable: true,\n width: 200\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: false\n },\n filter: 'search',\n width: 240\n },\n {\n type: 'number',\n name: 'priority',\n header: i18next.t('field.priority'),\n record: {\n editable: false,\n renderer: function (value, column, record, rowIndex, field) {\n const color = ['', '#98FB98', '#87CEEB', '#FF6B6B', '#8B0000'][value || 0]\n const count = new Array(value > 4 ? 4 : value || 0).fill('')\n return html`${count.map(() => html`<md-icon style=\"color:${color};\">star</md-icon>`)}`\n }\n },\n width: 60\n },\n {\n type: 'select',\n name: 'state',\n label: i18next.t('field.status'),\n header: i18next.t('field.status'),\n record: {\n editable: false,\n options: getActivityInstanceStatus()\n },\n filter: true,\n width: 80\n },\n {\n type: 'string',\n name: 'dueIn',\n header: i18next.t('field.due-in'),\n record: {\n editable: false,\n renderer: (value, column, record, rowIndex, field) => {\n if (isDueable(record.state)) {\n return html` <span>${asyncReplace(this.dueTimer(record.dueAt))}</span>`\n }\n }\n },\n sortable: false,\n width: 180\n },\n {\n type: 'resource-object',\n name: 'issuer',\n header: i18next.t('field.issuer'),\n record: {\n editable: false\n },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'issuedAt',\n header: i18next.t('field.issued-at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.due-at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'startedAt',\n header: i18next.t('field.started-at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'terminatedAt',\n header: i18next.t('field.terminated-at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n },\n {\n type: 'image',\n name: 'thumbnail',\n header: i18next.t('field.thumbnail'),\n record: { editable: false },\n hidden: true\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n sorters: [\n {\n name: 'issuedAt',\n desc: true\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: ${this.issuedByMe ? 'activityInstancesIssuedByMe' : 'activityInstances'}(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n priority\n state\n thumbnail\n issuer {\n id\n name\n }\n updater {\n id\n name\n }\n issuedAt\n dueAt\n startedAt\n terminatedAt\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async abortActivityInstances() {\n const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) {\n const answer = await CustomAlert({\n type: 'warning',\n title: i18next.t('button.abort'),\n text: i18next.t('text.are_you_sure'),\n confirmButton: { text: i18next.t('button.abort') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n\n if (!answer?.value) return\n\n const response = await client.query({\n query: gql`\n mutation ($ids: [String!]!) {\n abortActivityInstances(ids: $ids)\n }\n `,\n variables: {\n ids\n }\n })\n\n if (!response.errors) {\n this.grist.fetch()\n this.showToast(i18next.t('text.activity_instance_aborted_successfully'))\n }\n } else {\n CustomAlert({\n title: i18next.t('text.nothing_selected'),\n text: i18next.t('text.there_is_nothing_to_process')\n })\n }\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\n }\n\n async *dueTimer(exp) {\n while (exp && this.active) {\n var secs = Math.round((Date.parse(exp) - Date.now()) / 1000)\n var positive = secs >= 0\n\n secs = Math.abs(secs)\n const days = Math.floor(secs / DAY)\n secs -= days * DAY\n const hours = Math.floor(secs / HOUR)\n secs -= hours * HOUR\n const minutes = Math.floor(secs / MIN)\n const seconds = secs - minutes * MIN\n\n const result = `${positive ? '' : '- '}${days ? `${days}${i18next.t('label.days')} ` : ''}${hours ? `${hours}${i18next.t('label.hours')} ` : ''}${\n minutes ? `${minutes}${i18next.t('label.minutes')} ` : ''\n }`\n\n yield result\n\n await sleep(60 * 1000)\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "activity" | "worklist-home" | "worklist-dashboard" | "activity-thread" | "activity-thread-view" | "done-list-calendar" | "todo-list" | "done-list" | "approval-pending-list" | "approval-done-list" | "draft-list" | "pickable-list" | "starter-list" | "reporter-list" | "activity-list" | "activity-instance-start" | "activity-approval" | "activity-instance-list" | "activity-instance-search" | "activity-template-list" | "activity-store" | "activity-thread-list" | "activity-approval-list" | "installable-activity-list" | "activity-stats-list" | undefined;
1
+ export default function route(page: string): "worklist-home" | "worklist-dashboard" | "done-list-calendar" | "todo-list" | "done-list" | "approval-pending-list" | "approval-done-list" | "draft-list" | "pickable-list" | "starter-list" | "reporter-list" | "activity-list" | "activity" | "activity-instance-start" | "activity-thread" | "activity-thread-view" | "activity-approval" | "activity-instance-list" | "activity-instance-search" | "activity-template-list" | "activity-store" | "activity-thread-list" | "activity-approval-list" | "installable-activity-list" | "activity-stats-list" | undefined;