@things-factory/worklist 10.1.256 → 10.1.258

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.
Files changed (78) hide show
  1. package/dist-client/activity-state-counts.d.ts +3 -3
  2. package/dist-client/activity-state-counts.js +6 -5
  3. package/dist-client/activity-state-counts.js.map +1 -1
  4. package/dist-client/chip-counts.d.ts +1 -1
  5. package/dist-client/chip-counts.js +1 -1
  6. package/dist-client/chip-counts.js.map +1 -1
  7. package/dist-client/chip-filters.d.ts +3 -2
  8. package/dist-client/chip-filters.js +5 -3
  9. package/dist-client/chip-filters.js.map +1 -1
  10. package/dist-client/components/activity-/bowner-view.js +26 -40
  11. package/dist-client/components/activity-/bowner-view.js.map +1 -1
  12. package/dist-client/components/activity-instance-preview.js +37 -49
  13. package/dist-client/components/activity-instance-preview.js.map +1 -1
  14. package/dist-client/components/activity-intro-view.js +26 -40
  15. package/dist-client/components/activity-intro-view.js.map +1 -1
  16. package/dist-client/components/activity-reporter-view.js +26 -40
  17. package/dist-client/components/activity-reporter-view.js.map +1 -1
  18. package/dist-client/components/activity-starter-form.d.ts +2 -3
  19. package/dist-client/components/activity-starter-form.js +52 -64
  20. package/dist-client/components/activity-starter-form.js.map +1 -1
  21. package/dist-client/components/mutation-outcome.d.ts +6 -0
  22. package/dist-client/components/mutation-outcome.js +9 -0
  23. package/dist-client/components/mutation-outcome.js.map +1 -1
  24. package/dist-client/components/say-outcome.d.ts +3 -0
  25. package/dist-client/components/say-outcome.js +3 -0
  26. package/dist-client/components/say-outcome.js.map +1 -1
  27. package/dist-client/entity360/person-open-work-section.d.ts +2 -3
  28. package/dist-client/entity360/person-open-work-section.js +17 -31
  29. package/dist-client/entity360/person-open-work-section.js.map +1 -1
  30. package/dist-client/pages/activity/activity-list-page.d.ts +4 -2
  31. package/dist-client/pages/activity/activity-list-page.js +6 -11
  32. package/dist-client/pages/activity/activity-list-page.js.map +1 -1
  33. package/dist-client/pages/activity/activity-page.d.ts +13 -7
  34. package/dist-client/pages/activity/activity-page.js +111 -167
  35. package/dist-client/pages/activity/activity-page.js.map +1 -1
  36. package/dist-client/pages/activity-approval/activity-approval-page.d.ts +14 -8
  37. package/dist-client/pages/activity-approval/activity-approval-page.js +107 -123
  38. package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
  39. package/dist-client/pages/activity-catalog/activity-catalog-page.d.ts +10 -9
  40. package/dist-client/pages/activity-catalog/activity-catalog-page.js +38 -70
  41. package/dist-client/pages/activity-catalog/activity-catalog-page.js.map +1 -1
  42. package/dist-client/pages/activity-catalog/activity-detail-page.d.ts +6 -6
  43. package/dist-client/pages/activity-catalog/activity-detail-page.js +30 -57
  44. package/dist-client/pages/activity-catalog/activity-detail-page.js.map +1 -1
  45. package/dist-client/pages/activity-instance/activity-instance-list-page.js +2 -2
  46. package/dist-client/pages/activity-instance/activity-instance-list-page.js.map +1 -1
  47. package/dist-client/pages/activity-instance/activity-instance-search-page.d.ts +6 -3
  48. package/dist-client/pages/activity-instance/activity-instance-search-page.js +27 -29
  49. package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -1
  50. package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +15 -8
  51. package/dist-client/pages/activity-instance/activity-instance-start-page.js +130 -239
  52. package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
  53. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +2 -2
  54. package/dist-client/pages/activity-instance/activity-instance-view.js +109 -118
  55. package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
  56. package/dist-client/pages/activity-thread/activity-thread-page.d.ts +15 -6
  57. package/dist-client/pages/activity-thread/activity-thread-page.js +128 -131
  58. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
  59. package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +6 -6
  60. package/dist-client/pages/activity-thread/activity-thread-view-page.js +28 -53
  61. package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
  62. package/dist-client/pages/todo/approval-done-list-page.d.ts +3 -3
  63. package/dist-client/pages/todo/approval-done-list-page.js +5 -14
  64. package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
  65. package/dist-client/pages/todo/approval-pending-list-page.d.ts +19 -9
  66. package/dist-client/pages/todo/approval-pending-list-page.js +46 -59
  67. package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
  68. package/dist-client/pages/todo/draft-list-page.d.ts +8 -2
  69. package/dist-client/pages/todo/draft-list-page.js +24 -23
  70. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  71. package/dist-client/pages/todo/pickable-list-page.d.ts +3 -3
  72. package/dist-client/pages/todo/pickable-list-page.js +5 -14
  73. package/dist-client/pages/todo/pickable-list-page.js.map +1 -1
  74. package/dist-client/pages/todo/todo-list-page.d.ts +11 -5
  75. package/dist-client/pages/todo/todo-list-page.js +33 -36
  76. package/dist-client/pages/todo/todo-list-page.js.map +1 -1
  77. package/dist-client/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +16 -14
@@ -6,7 +6,7 @@ import { isApprovalStep } from '@things-factory/organization/dist-client';
6
6
  import gql from 'graphql-tag';
7
7
  import { css, html } from 'lit';
8
8
  import { customElement, state } from 'lit/decorators.js';
9
- import { client } from '@operato/graphql';
9
+ import { client, QueryController } from '@operato/graphql';
10
10
  import { i18next, localize } from '@operato/i18n';
11
11
  import { openPopup, entity360Name } from '@operato/layout';
12
12
  import { navigate, PageView } from '@operato/shell';
@@ -88,13 +88,12 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
88
88
  constructor() {
89
89
  super(...arguments);
90
90
  this.name = '';
91
- this.entry = null;
92
- this.activity = null;
93
- this.loaded = false;
94
91
  /** 구획이 「이 업무에는 보일 것 없음」을 알렸나. 이름으로 센다. */
95
92
  this.emptyPanels = {};
96
- /** 왜 못 읽었나 — ox-page-state 가 그것을 말하고 다시 시도를 준다. */
97
- this.loadError = null;
93
+ /* The catalog entry and the activity for the name the address carries (ADR-0190). */
94
+ this.detail = new QueryController(this, DETAIL, {
95
+ variables: () => (this.name ? { name: this.name } : undefined)
96
+ });
98
97
  }
99
98
  static { this.styles = [
100
99
  ScrollbarStyles,
@@ -206,6 +205,27 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
206
205
  }
207
206
  `
208
207
  ]; }
208
+ /*
209
+ * 목록에 필터가 없어서 전부 받아 하나를 고른다. 업무는 설치된 모듈이 선언하는 것이라 수가
210
+ * 닫혀 있다 [확인함 2026-09-23: 마흔 안쪽]. 그 전제가 깨지면 서버에 이름으로 찾는 갈래를
211
+ * 두는 것이 맞다 — 여기서 자르지 않는다.
212
+ *
213
+ * The entry is picked by the name shown now, so the tab never carries the previous activity's name
214
+ * [확인함 2026-09-24 :4000: 「교대 편성 변경 승인」 on the tab over 「계획 정비 연기 승인」].
215
+ */
216
+ get entry() {
217
+ return (this.detail.data?.responses?.items ?? []).find((one) => one.name === this.name) || null;
218
+ }
219
+ get activity() {
220
+ return this.detail.data?.activityByName || null;
221
+ }
222
+ get loaded() {
223
+ return !this.detail.loading && (this.detail.data !== undefined || this.detail.error !== undefined);
224
+ }
225
+ /** 왜 못 읽었나 — ox-page-state 가 그것을 말하고 다시 시도를 준다. */
226
+ get loadError() {
227
+ return this.detail.error ?? null;
228
+ }
209
229
  get context() {
210
230
  return {
211
231
  frame: 'document',
@@ -229,7 +249,7 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
229
249
  }
230
250
  /**
231
251
  * 이름이 주소로 온다. 같은 라우트 안에서 이름만 바뀌어도 이 콜백이 다시 오므로, **이름이 실제로
232
- * 바뀌었을 때만** 다시 읽는다.
252
+ * 바뀌었을 때만** 이름을 옮긴다. 읽기는 그 이름을 따른다.
233
253
  */
234
254
  async pageUpdated(changes, lifecycle) {
235
255
  this.readName(lifecycle);
@@ -258,7 +278,6 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
258
278
  this.name = name;
259
279
  /* 구획이 알린 것은 그 업무의 것이다. 다른 업무로 옮기면 다시 듣는다. */
260
280
  this.emptyPanels = {};
261
- this.fetch();
262
281
  }
263
282
  }
264
283
  shownName(one) {
@@ -266,36 +285,6 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
266
285
  return String(one?.name ?? '');
267
286
  return one.labelTKey ? String(i18next.t(one.labelTKey, { defaultValue: one.label })) : String(one.label);
268
287
  }
269
- async fetch() {
270
- this.loaded = false;
271
- this.loadError = null;
272
- /*
273
- * The tab and the document title come from `context`, and the shell reads it when the route
274
- * changes - before this answer arrives. Nothing read it again, so the tab kept the previous
275
- * activity's name while the page showed the next one [확인함 2026-09-24 :4000: 「교대 편성 변경
276
- * 승인」 on the tab over 「계획 정비 연기 승인」]. Drop the old entry so the wait says the generic
277
- * name, and hand the context over again once the answer is in.
278
- */
279
- this.entry = null;
280
- this.updateContext();
281
- try {
282
- const response = await client.query({ query: DETAIL, variables: { name: this.name }, fetchPolicy: 'no-cache' });
283
- /*
284
- * 목록에 필터가 없어서 전부 받아 하나를 고른다. 업무는 설치된 모듈이 선언하는 것이라 수가
285
- * 닫혀 있다 [확인함 2026-09-23: 마흔 안쪽]. 그 전제가 깨지면 서버에 이름으로 찾는 갈래를
286
- * 두는 것이 맞다 — 여기서 자르지 않는다.
287
- */
288
- const items = response?.data?.responses?.items || [];
289
- this.entry = items.find((one) => one.name === this.name) || null;
290
- this.activity = response?.data?.activityByName || null;
291
- this.loaded = true;
292
- }
293
- catch (thrown) {
294
- this.loadError = thrown;
295
- this.loaded = true;
296
- }
297
- this.updateContext();
298
- }
299
288
  render() {
300
289
  return html `<div class="page">
301
290
  <a
@@ -306,7 +295,7 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
306
295
  <md-icon>chevron_left</md-icon>${i18next.t('button.back-to-activity-catalog')}
307
296
  </a>
308
297
 
309
- <ox-page-state .loading=${!this.loaded} .error=${this.loadError} @retry=${() => this.fetch()}
298
+ <ox-page-state .loading=${!this.loaded} .error=${this.loadError} @retry=${() => this.detail.refetch()}
310
299
  >${this.loaded && !this.loadError ? this.renderDetail() : ''}</ox-page-state
311
300
  >
312
301
  </div>`;
@@ -465,7 +454,7 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
465
454
  }));
466
455
  if (!outcome.ok)
467
456
  return;
468
- this.fetch();
457
+ await this.detail.refetch();
469
458
  }
470
459
  /**
471
460
  * 결재선 편집기는 **organization 것을 그대로 부른다.** 이 화면이 자기 편집기를 따로 지으면 같은
@@ -491,33 +480,17 @@ let ActivityDetailPage = class ActivityDetailPage extends localize(i18next)(Page
491
480
  }));
492
481
  if (!outcome.ok)
493
482
  return;
494
- this.fetch();
483
+ await this.detail.refetch();
495
484
  }
496
485
  };
497
486
  __decorate([
498
487
  state(),
499
488
  __metadata("design:type", Object)
500
489
  ], ActivityDetailPage.prototype, "name", void 0);
501
- __decorate([
502
- state(),
503
- __metadata("design:type", Object)
504
- ], ActivityDetailPage.prototype, "entry", void 0);
505
- __decorate([
506
- state(),
507
- __metadata("design:type", Object)
508
- ], ActivityDetailPage.prototype, "activity", void 0);
509
- __decorate([
510
- state(),
511
- __metadata("design:type", Object)
512
- ], ActivityDetailPage.prototype, "loaded", void 0);
513
490
  __decorate([
514
491
  state(),
515
492
  __metadata("design:type", Object)
516
493
  ], ActivityDetailPage.prototype, "emptyPanels", void 0);
517
- __decorate([
518
- state(),
519
- __metadata("design:type", Object)
520
- ], ActivityDetailPage.prototype, "loadError", void 0);
521
494
  ActivityDetailPage = __decorate([
522
495
  customElement('activity-detail-page')
523
496
  ], ActivityDetailPage);
@@ -1 +1 @@
1
- {"version":3,"file":"activity-detail-page.js","sourceRoot":"","sources":["../../../client/pages/activity-catalog/activity-detail-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/list-state/ox-page-state.js'\nimport '@things-factory/organization'\nimport { isApprovalStep } from '@things-factory/organization/dist-client'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup, entity360Name } from '@operato/layout'\nimport { navigate, PageView } from '@operato/shell'\nimport { ButtonStyles, DocumentPageStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { ranMutation } from '../../components/say-outcome.js'\nimport { activityPanels, panelSection } from './activity-panels.js'\nimport { detailActions } from './activity-detail-actions.js'\nimport { canonicalStage } from './activity-stage.js'\nimport { guideLines } from './activity-guide.js'\n\n/**\n * 업무 하나 — **그 업무에 관한 일을 여기서 끝낸다.**\n *\n * ── 왜 이 화면이 생겼나 (2026-09-23) ───────────────────────────────────────\n * 결재선 하나를 세워서 문이 서는지 보려면 화면을 셋 열어야 했고, 역할에 사람이 없으면 넷에서\n * 다섯이었다 [확인함]. 카탈로그는 카드에 「결재선 없음」이라고 적어 놓고 **어디로 가야 하는지는\n * 말하지 않았다** — 그 파일 전체에 `navigate()` 도 `<a href>` 도 없었다. 사람은 메뉴로 돌아가\n * 이름으로 찾아야 했다.\n *\n * 그래서 카탈로그는 고르는 자리로 두고, 고른 뒤의 일은 이 화면 안에서 끝낸다.\n *\n * ── 돌아갈 길을 화면이 갖는다 ─────────────────────────────────────────────\n * 탭 줄에 카탈로그가 남아 있으니 됐다고 볼 수 없다. 탭 줄은 **없을 수 있다** — 페이지가\n * `mdibar: false` 를 적으면 셸이 걷고(`apptool-ui/client/layout/mdibar-visibility.ts`), 무엇보다\n * **주소를 받아서 바로 여는 사람에게는 이전 화면이 아예 없다.** 「이 업무 결재선 좀 봐 주세요」로\n * 링크를 받은 사람이 그 경우다. 그래서 머리에 돌아갈 자리를 직접 둔다.\n *\n * ── 못 하는 일은 까닭을 말한다 ────────────────────────────────────────────\n * 눌리지 않는 단추만 남기지 않는다. 무엇을 할 수 있는지와 못 하면 왜인지는\n * `activity-detail-actions.ts` 가 값으로 답하고, 이 화면은 그 값을 문장으로 바꾼다. 원인을 여기서\n * 지어내지 않는다.\n */\nconst DETAIL = gql`\n query ($name: String!) {\n responses: installableActivities {\n items {\n name\n label\n labelTKey\n description\n guide\n guideTKeys\n approvalSteps\n activity {\n id\n }\n readiness {\n stage\n }\n }\n }\n activityByName(name: $name) {\n id\n name\n description\n approvalLine {\n type\n value\n participation\n notifyAfter\n approver {\n id\n name\n description\n controlNo\n }\n }\n }\n }\n`\n\n/**\n * 결재선에서 **서명하는 단계만** 센다. 참조는 알기만 하고 막지 않는다.\n *\n * 손으로 `'reference'` 와 비교하지 않는다 — API 는 `Reference` 로 보내서, 참조 한 줄이 결재 한 단계로\n * 세어졌다. 목록의 수(`installableActivities.approvalSteps`)와 같은 규칙을 쓴다.\n */\nfunction approvalSteps(line?: any[]): number {\n return (line || []).filter(isApprovalStep).length\n}\n\n@customElement('activity-detail-page')\nexport class ActivityDetailPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n DocumentPageStyles,\n ButtonStyles,\n css`\n /*\n * ── On the document frame (ADR-0117) ─────────────────────────────────────\n * The screen imported the frame but drew outside its .page and styled its own section heads (small\n * capitals) and buttons (pills). None of the frame's gutter, sections or text ground reached it, and\n * long guide lines ran off the right edge. The parts are now page sections, the buttons sit in their\n * section heads, and the name line (drawn here, see context) takes the title bar's size.\n */\n\n /*\n * A section or panel the screen hides must stay hidden: .page-section sets display, which beat the\n * browser's own [hidden] rule and left the empty \"more settings\" head standing alone.\n */\n [hidden] {\n display: none;\n }\n\n /* Back to the catalog: above everything, read before the rest. */\n a.back {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n align-self: flex-start;\n }\n\n a.back md-icon {\n --md-icon-size: 16px;\n }\n\n /*\n * ── Say what the screen is for, then the one thing people come here to do ──\n * The screen read as a list of parts (a stage badge, an in-use badge, \"this activity is\", \"use here\",\n * \"approval line\", \"approval 2 steps\") and left the reader to work out what to do. Now: the name, one\n * sentence on what the activity is and what this screen decides, then who approves, with each step's\n * role and what that role is, then whether this site uses it, then the notes.\n */\n .head .name {\n margin: 0;\n font-size: var(--ui-t-page, 18px);\n font-weight: 700;\n text-wrap: balance;\n }\n\n\n .lead {\n margin: var(--spacing-small, 4px) 0 0;\n }\n\n .use {\n margin-left: var(--spacing-small, 4px);\n color: var(--ui-muted);\n font-size: var(--ui-t-small, 11.5px);\n font-weight: 400;\n }\n\n /* Why something cannot be done, or what the current state is: sentences, not badges. */\n .why {\n margin: 0;\n }\n\n .why {\n color: var(--ui-muted);\n }\n\n /* One approval step per row: the step and the name. */\n ol.steps {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n column-gap: var(--spacing-large, 12px);\n margin: 0 0 var(--spacing-medium, 8px);\n padding: 0;\n list-style: none;\n }\n\n ol.steps li {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n align-items: baseline;\n padding: var(--spacing-medium, 8px) 0;\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n ol.steps li:first-child {\n border-top: none;\n }\n\n .step {\n color: var(--ui-muted);\n font-size: var(--ui-t-small, 11.5px);\n font-variant-numeric: tabular-nums;\n }\n\n .who {\n font-weight: 600;\n }\n\n ul.notes {\n margin: 0;\n padding-left: var(--spacing-huge, 24px);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n `\n ]\n\n @state() private name = ''\n @state() private entry: any = null\n @state() private activity: any = null\n @state() private loaded = false\n /** 구획이 「이 업무에는 보일 것 없음」을 알렸나. 이름으로 센다. */\n @state() private emptyPanels: Record<string, boolean> = {}\n /** 왜 못 읽었나 — ox-page-state 가 그것을 말하고 다시 시도를 준다. */\n @state() private loadError: unknown = null\n\n get context() {\n return {\n frame: 'document',\n title: this.entry ? this.shownName(this.entry) : i18next.t('title.activity-detail'),\n /*\n * 이름은 **이 화면이 그린다.** 제목 줄은 끈다.\n *\n * 이름 옆에 단계 띠와 「사용 중」이 함께 서야 한다 — 그 셋이 한 줄에 있어야 이 업무를 지금\n * 믿고 쓸 수 있는지가 한눈에 읽힌다. 제목 줄은 그것들을 못 받는다.\n *\n * 끄지 않으면 같은 이름이 화면에 두 번 뜬다(실측 2026-09-24: 제목 줄 「부적합 처분 승인」,\n * 바로 아래 또 「부적합 처분 승인」). `title` 은 그대로 두므로 **탭 이름은 살아 있다** —\n * `heading: false` 가 그리는 자리마다 켜고 끄라고 둔 문이다.\n */\n heading: false,\n /* The menu has no row for one activity; it lights the catalog, where the back link goes. */\n menu: 'activity-catalog',\n help: 'worklist/activity-catalog-page',\n actions: this.useActions()\n }\n }\n\n /**\n * 이름이 주소로 온다. 같은 라우트 안에서 이름만 바뀌어도 이 콜백이 다시 오므로, **이름이 실제로\n * 바뀌었을 때만** 다시 읽는다.\n */\n async pageUpdated(changes: any, lifecycle: any) {\n this.readName(lifecycle)\n }\n\n /**\n * 처음 그린 뒤에도 한 번 읽는다 — **첫 방문이 통째로 비는 것을 봤다.**\n *\n * [확인함 2026-09-24 :4000] 카드에서 처음 들어가면 주소는 맞고(`?name=…`) `lifecycle.params.name`\n * 도 들어 있는데 화면에 돌아갈 링크만 남았다. 같은 자리로 두 번째 들어가면 멀쩡했고, 그 상태에서\n * 콜백을 손으로 한 번 부르면 바로 채워졌다.\n *\n * 이 화면은 주소로 처음 닿을 때 **모듈이 그때 실려 온다**(route.ts 의 동적 import). 셸은 화면을\n * 처음 세울 때 이 콜백을 다음 animationFrame 으로 미루는데(page-view 가 「엘리먼트가 아직 안\n * 만들어졌을 수 있다」고 적어 둔 그 갈래), 그 사이에 요소가 아직 이 클래스로 올라오지 않았으면\n * **아무 일도 안 하는 기반 클래스의 콜백**이 불린다. 그 뒤로는 생애주기가 더 안 바뀌므로 이름을\n * 받을 기회가 다시 오지 않는다.\n *\n * 그래서 이름을 받는 자리를 둘로 둔다. 둘 다 같은 판단을 지나므로 두 번 읽지 않는다.\n */\n firstUpdated() {\n this.readName()\n }\n\n private readName(lifecycle?: any) {\n const name = String((lifecycle ?? this.lifecycle)?.params?.name || '')\n\n if (name && name !== this.name) {\n this.name = name\n /* 구획이 알린 것은 그 업무의 것이다. 다른 업무로 옮기면 다시 듣는다. */\n this.emptyPanels = {}\n this.fetch()\n }\n }\n\n private shownName(one: any): string {\n if (!one?.label) return String(one?.name ?? '')\n return one.labelTKey ? String(i18next.t(one.labelTKey, { defaultValue: one.label })) : String(one.label)\n }\n\n private async fetch() {\n this.loaded = false\n this.loadError = null\n /*\n * The tab and the document title come from `context`, and the shell reads it when the route\n * changes - before this answer arrives. Nothing read it again, so the tab kept the previous\n * activity's name while the page showed the next one [확인함 2026-09-24 :4000: 「교대 편성 변경\n * 승인」 on the tab over 「계획 정비 연기 승인」]. Drop the old entry so the wait says the generic\n * name, and hand the context over again once the answer is in.\n */\n this.entry = null\n this.updateContext()\n\n try {\n const response = await client.query({ query: DETAIL, variables: { name: this.name }, fetchPolicy: 'no-cache' })\n\n /*\n * 목록에 필터가 없어서 전부 받아 하나를 고른다. 업무는 설치된 모듈이 선언하는 것이라 수가\n * 닫혀 있다 [확인함 2026-09-23: 마흔 안쪽]. 그 전제가 깨지면 서버에 이름으로 찾는 갈래를\n * 두는 것이 맞다 — 여기서 자르지 않는다.\n */\n const items = response?.data?.responses?.items || []\n\n this.entry = items.find((one: any) => one.name === this.name) || null\n this.activity = response?.data?.activityByName || null\n this.loaded = true\n } catch (thrown) {\n this.loadError = thrown\n this.loaded = true\n }\n\n this.updateContext()\n }\n\n render() {\n return html`<div class=\"page\">\n <a\n class=\"back page-nav-link\"\n href=\"activity-catalog\"\n @click=${(e: Event) => (e.preventDefault(), navigate('activity-catalog'))}\n >\n <md-icon>chevron_left</md-icon>${i18next.t('button.back-to-activity-catalog')}\n </a>\n\n <ox-page-state .loading=${!this.loaded} .error=${this.loadError} @retry=${() => this.fetch()}\n >${this.loaded && !this.loadError ? this.renderDetail() : ''}</ox-page-state\n >\n </div>`\n }\n\n private renderDetail() {\n if (!this.entry) {\n /* 없는 이름으로 들어온 주소. 빈 화면으로 두지 않는다 — 무엇을 못 찾았는지 이름을 댄다. */\n return html`<div class=\"why\">${i18next.t('text.activity-not-found', { name: this.name })}</div>`\n }\n\n const actions = detailActions(this.entry)\n const lines = guideLines(this.entry, (key, options) => i18next.t(key, options)).filter(Boolean)\n /* The first guide line says what the activity is; with no guide, the description does. */\n const [what, ...notes] = lines.length ? lines : [this.entry.description].filter(Boolean)\n\n return html`\n <div class=\"head\">\n <h2 class=\"name\">${this.shownName(this.entry)} ${this.renderUse(actions)}</h2>\n ${what ? html`<p class=\"lead\">${what}</p>` : ''}\n </div>\n\n ${this.renderApprovalLine(actions)} ${this.renderNotes(notes)} ${this.renderPanels()}\n `\n }\n\n /** 알아 둘 것 — 첫 줄(무엇인가)을 뺀 안내문. 없으면 구획을 세우지 않는다. */\n private renderNotes(notes: string[]) {\n if (!notes.length) return html``\n\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-what-is-it')}</h3></div>\n <ul class=\"notes page-prose\">\n ${notes.map(line => html`<li>${line}</li>`)}\n </ul>\n </section>\n `\n }\n\n /**\n * 이 업무를 쓸지 말지 — 화면 전체의 결정이라 하단 동작 줄에 둔다(page-standard §8).\n * 아직 만들어지지 않은 업무는 쓸 수 없으므로 단추가 없다.\n */\n private useActions() {\n if (!this.entry) return []\n const actions = detailActions(this.entry)\n if (!actions.registered) return []\n\n return actions.inUse\n ? [{ title: i18next.t('button.activity-stop-using'), action: () => this.setUse(false) }]\n : [{ title: i18next.t('button.activity-start-using'), action: () => this.setUse(true), emphasis: { raised: true } }]\n }\n\n /** 이름 옆의 상태 한 마디. */\n private renderUse(actions: ReturnType<typeof detailActions>) {\n if (!actions.registered) {\n return html`<span class=\"use\">${i18next.t('text.activity-line-not-built')}</span>`\n }\n\n return html`<span class=\"use\"\n >${actions.inUse ? i18next.t('text.activity-in-use-here') : i18next.t('text.activity-not-in-use-here')}</span\n >`\n }\n\n /**\n * 누가 승인하나 — 결재·배정 현황에서 이름을 누르고 온 사람이 보러 온 것. 그래서 맨 위다.\n *\n * 단계와 이름만 적는다.\n */\n private renderApprovalLine(actions: ReturnType<typeof detailActions>) {\n const line = this.activity?.approvalLine || []\n const steps = approvalSteps(line)\n\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\">\n <h3>${i18next.t('label.activity-approval-line')}</h3>\n <div class=\"page-section-actions\">\n <button\n ?raised=${!!actions.canSetApprovalLine && !steps}\n ?disabled=${!actions.canSetApprovalLine}\n @click=${() => this.openApprovalLine(line)}\n >\n ${i18next.t('button.activity-set-approval-line')}\n </button>\n </div>\n </div>\n\n ${steps\n ? html`<ol class=\"steps\">\n ${line.map(\n (one: any, at: number) =>\n html`<li>\n <span class=\"step\">${i18next.t('text.activity-step', { n: at + 1 })}</span>\n <span class=\"who\">${entity360Name(one.approver, one.approver?.name || one.value || '')}</span>\n </li>`\n )}\n </ol>`\n : ''}\n\n ${actions.approvalLineBlock\n ? html`<p class=\"why\">${i18next.t('text.activity-line-' + actions.approvalLineBlock)}</p>`\n : steps\n ? ''\n : html`<p class=\"why\">${i18next.t('text.activity-line-none')}</p>`}\n </section>\n `\n }\n\n /**\n * 다른 패키지가 건 구획.\n *\n * **하나도 안 걸렸으면 그 사실을 말한다.** 빈자리로 두면 「이 앱에는 그 구획이 없다」와\n * 「정할 것이 없다」가 같은 화면이 된다.\n */\n private renderPanels() {\n const context = { activityName: this.entry.name, activityId: this.activity?.id }\n const panels = activityPanels(context)\n const shape = panelSection(\n panels.map(one => one.name),\n this.emptyPanels\n )\n\n if (shape.kind === 'none-registered') {\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-panels')}</h3></div>\n <p class=\"why\">${i18next.t('text.activity-no-panels')}</p>\n </section>\n `\n }\n\n /*\n * 비었다고 알린 구획도 **그리기는 계속한다** — 숨길 뿐이다. 지우면 그 구획이 다시 읽고\n * 「있다」고 알릴 자리가 없어진다.\n */\n const hidden = shape.kind === 'all-empty' ? panels.map(one => one.name) : shape.hidden\n\n return html`\n <section class=\"page-section\" ?hidden=${shape.kind === 'all-empty'}>\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-panels')}</h3></div>\n ${panels.map(\n panel =>\n html`<div\n ?hidden=${hidden.includes(panel.name)}\n @activity-panel-content=${(event: CustomEvent) => this.panelReported(panel.name, event)}\n >\n ${panel.render(context)}\n </div>`\n )}\n </section>\n `\n }\n\n private panelReported(name: string, event: CustomEvent) {\n event.stopPropagation()\n this.emptyPanels = { ...this.emptyPanels, [name]: event.detail?.empty === true }\n }\n\n private async setUse(on: boolean) {\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: on\n ? gql`\n mutation ($name: String!) {\n activateInstallableActivity(name: $name) {\n name\n }\n }\n `\n : gql`\n mutation ($name: String!) {\n deactivateInstallableActivity(name: $name) {\n name\n }\n }\n `,\n variables: { name: this.entry.name }\n })\n )\n\n if (!outcome.ok) return\n\n this.fetch()\n }\n\n /**\n * 결재선 편집기는 **organization 것을 그대로 부른다.** 이 화면이 자기 편집기를 따로 지으면 같은\n * 결재선이 두 화면에서 다르게 편집된다.\n */\n private openApprovalLine(line: any[]) {\n const popup = openPopup(\n html`<approval-line-items-editor-popup\n .value=${line}\n .confirmCallback=${(after?: any[] | null) => this.saveApprovalLine(after || [])}\n ></approval-line-items-editor-popup>`,\n { backdrop: true, size: 'large', title: i18next.t('title.approval-line editor') }\n )\n\n return popup\n }\n\n private async saveApprovalLine(after: any[]) {\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($patches: [ActivityPatch!]!) {\n updateMultipleActivity(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches: [{ id: this.activity.id, approvalLine: after, cuFlag: 'M' }] }\n })\n )\n\n if (!outcome.ok) return\n\n this.fetch()\n }\n}\n"]}
1
+ {"version":3,"file":"activity-detail-page.js","sourceRoot":"","sources":["../../../client/pages/activity-catalog/activity-detail-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/list-state/ox-page-state.js'\nimport '@things-factory/organization'\nimport { isApprovalStep } from '@things-factory/organization/dist-client'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { client, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup, entity360Name } from '@operato/layout'\nimport { navigate, PageView } from '@operato/shell'\nimport { ButtonStyles, DocumentPageStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { ranMutation } from '../../components/say-outcome.js'\nimport { activityPanels, panelSection } from './activity-panels.js'\nimport { detailActions } from './activity-detail-actions.js'\nimport { canonicalStage } from './activity-stage.js'\nimport { guideLines } from './activity-guide.js'\n\n/**\n * 업무 하나 — **그 업무에 관한 일을 여기서 끝낸다.**\n *\n * ── 왜 이 화면이 생겼나 (2026-09-23) ───────────────────────────────────────\n * 결재선 하나를 세워서 문이 서는지 보려면 화면을 셋 열어야 했고, 역할에 사람이 없으면 넷에서\n * 다섯이었다 [확인함]. 카탈로그는 카드에 「결재선 없음」이라고 적어 놓고 **어디로 가야 하는지는\n * 말하지 않았다** — 그 파일 전체에 `navigate()` 도 `<a href>` 도 없었다. 사람은 메뉴로 돌아가\n * 이름으로 찾아야 했다.\n *\n * 그래서 카탈로그는 고르는 자리로 두고, 고른 뒤의 일은 이 화면 안에서 끝낸다.\n *\n * ── 돌아갈 길을 화면이 갖는다 ─────────────────────────────────────────────\n * 탭 줄에 카탈로그가 남아 있으니 됐다고 볼 수 없다. 탭 줄은 **없을 수 있다** — 페이지가\n * `mdibar: false` 를 적으면 셸이 걷고(`apptool-ui/client/layout/mdibar-visibility.ts`), 무엇보다\n * **주소를 받아서 바로 여는 사람에게는 이전 화면이 아예 없다.** 「이 업무 결재선 좀 봐 주세요」로\n * 링크를 받은 사람이 그 경우다. 그래서 머리에 돌아갈 자리를 직접 둔다.\n *\n * ── 못 하는 일은 까닭을 말한다 ────────────────────────────────────────────\n * 눌리지 않는 단추만 남기지 않는다. 무엇을 할 수 있는지와 못 하면 왜인지는\n * `activity-detail-actions.ts` 가 값으로 답하고, 이 화면은 그 값을 문장으로 바꾼다. 원인을 여기서\n * 지어내지 않는다.\n */\nconst DETAIL = gql`\n query ($name: String!) {\n responses: installableActivities {\n items {\n name\n label\n labelTKey\n description\n guide\n guideTKeys\n approvalSteps\n activity {\n id\n }\n readiness {\n stage\n }\n }\n }\n activityByName(name: $name) {\n id\n name\n description\n approvalLine {\n type\n value\n participation\n notifyAfter\n approver {\n id\n name\n description\n controlNo\n }\n }\n }\n }\n`\n\n/**\n * 결재선에서 **서명하는 단계만** 센다. 참조는 알기만 하고 막지 않는다.\n *\n * 손으로 `'reference'` 와 비교하지 않는다 — API 는 `Reference` 로 보내서, 참조 한 줄이 결재 한 단계로\n * 세어졌다. 목록의 수(`installableActivities.approvalSteps`)와 같은 규칙을 쓴다.\n */\nfunction approvalSteps(line?: any[]): number {\n return (line || []).filter(isApprovalStep).length\n}\n\n@customElement('activity-detail-page')\nexport class ActivityDetailPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n DocumentPageStyles,\n ButtonStyles,\n css`\n /*\n * ── On the document frame (ADR-0117) ─────────────────────────────────────\n * The screen imported the frame but drew outside its .page and styled its own section heads (small\n * capitals) and buttons (pills). None of the frame's gutter, sections or text ground reached it, and\n * long guide lines ran off the right edge. The parts are now page sections, the buttons sit in their\n * section heads, and the name line (drawn here, see context) takes the title bar's size.\n */\n\n /*\n * A section or panel the screen hides must stay hidden: .page-section sets display, which beat the\n * browser's own [hidden] rule and left the empty \"more settings\" head standing alone.\n */\n [hidden] {\n display: none;\n }\n\n /* Back to the catalog: above everything, read before the rest. */\n a.back {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n align-self: flex-start;\n }\n\n a.back md-icon {\n --md-icon-size: 16px;\n }\n\n /*\n * ── Say what the screen is for, then the one thing people come here to do ──\n * The screen read as a list of parts (a stage badge, an in-use badge, \"this activity is\", \"use here\",\n * \"approval line\", \"approval 2 steps\") and left the reader to work out what to do. Now: the name, one\n * sentence on what the activity is and what this screen decides, then who approves, with each step's\n * role and what that role is, then whether this site uses it, then the notes.\n */\n .head .name {\n margin: 0;\n font-size: var(--ui-t-page, 18px);\n font-weight: 700;\n text-wrap: balance;\n }\n\n\n .lead {\n margin: var(--spacing-small, 4px) 0 0;\n }\n\n .use {\n margin-left: var(--spacing-small, 4px);\n color: var(--ui-muted);\n font-size: var(--ui-t-small, 11.5px);\n font-weight: 400;\n }\n\n /* Why something cannot be done, or what the current state is: sentences, not badges. */\n .why {\n margin: 0;\n }\n\n .why {\n color: var(--ui-muted);\n }\n\n /* One approval step per row: the step and the name. */\n ol.steps {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n column-gap: var(--spacing-large, 12px);\n margin: 0 0 var(--spacing-medium, 8px);\n padding: 0;\n list-style: none;\n }\n\n ol.steps li {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n align-items: baseline;\n padding: var(--spacing-medium, 8px) 0;\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n ol.steps li:first-child {\n border-top: none;\n }\n\n .step {\n color: var(--ui-muted);\n font-size: var(--ui-t-small, 11.5px);\n font-variant-numeric: tabular-nums;\n }\n\n .who {\n font-weight: 600;\n }\n\n ul.notes {\n margin: 0;\n padding-left: var(--spacing-huge, 24px);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n `\n ]\n\n @state() private name = ''\n /** 구획이 「이 업무에는 보일 것 없음」을 알렸나. 이름으로 센다. */\n @state() private emptyPanels: Record<string, boolean> = {}\n\n /* The catalog entry and the activity for the name the address carries (ADR-0190). */\n private detail = new QueryController(this, DETAIL, {\n variables: () => (this.name ? { name: this.name } : undefined)\n })\n\n /*\n * 목록에 필터가 없어서 전부 받아 하나를 고른다. 업무는 설치된 모듈이 선언하는 것이라 수가\n * 닫혀 있다 [확인함 2026-09-23: 마흔 안쪽]. 그 전제가 깨지면 서버에 이름으로 찾는 갈래를\n * 두는 것이 맞다 — 여기서 자르지 않는다.\n *\n * The entry is picked by the name shown now, so the tab never carries the previous activity's name\n * [확인함 2026-09-24 :4000: 「교대 편성 변경 승인」 on the tab over 「계획 정비 연기 승인」].\n */\n private get entry(): any {\n return (this.detail.data?.responses?.items ?? []).find((one: any) => one.name === this.name) || null\n }\n\n private get activity(): any {\n return this.detail.data?.activityByName || null\n }\n\n private get loaded(): boolean {\n return !this.detail.loading && (this.detail.data !== undefined || this.detail.error !== undefined)\n }\n\n /** 왜 못 읽었나 — ox-page-state 가 그것을 말하고 다시 시도를 준다. */\n private get loadError(): unknown {\n return this.detail.error ?? null\n }\n\n get context() {\n return {\n frame: 'document',\n title: this.entry ? this.shownName(this.entry) : i18next.t('title.activity-detail'),\n /*\n * 이름은 **이 화면이 그린다.** 제목 줄은 끈다.\n *\n * 이름 옆에 단계 띠와 「사용 중」이 함께 서야 한다 — 그 셋이 한 줄에 있어야 이 업무를 지금\n * 믿고 쓸 수 있는지가 한눈에 읽힌다. 제목 줄은 그것들을 못 받는다.\n *\n * 끄지 않으면 같은 이름이 화면에 두 번 뜬다(실측 2026-09-24: 제목 줄 「부적합 처분 승인」,\n * 바로 아래 또 「부적합 처분 승인」). `title` 은 그대로 두므로 **탭 이름은 살아 있다** —\n * `heading: false` 가 그리는 자리마다 켜고 끄라고 둔 문이다.\n */\n heading: false,\n /* The menu has no row for one activity; it lights the catalog, where the back link goes. */\n menu: 'activity-catalog',\n help: 'worklist/activity-catalog-page',\n actions: this.useActions()\n }\n }\n\n /**\n * 이름이 주소로 온다. 같은 라우트 안에서 이름만 바뀌어도 이 콜백이 다시 오므로, **이름이 실제로\n * 바뀌었을 때만** 이름을 옮긴다. 읽기는 그 이름을 따른다.\n */\n async pageUpdated(changes: any, lifecycle: any) {\n this.readName(lifecycle)\n }\n\n /**\n * 처음 그린 뒤에도 한 번 읽는다 — **첫 방문이 통째로 비는 것을 봤다.**\n *\n * [확인함 2026-09-24 :4000] 카드에서 처음 들어가면 주소는 맞고(`?name=…`) `lifecycle.params.name`\n * 도 들어 있는데 화면에 돌아갈 링크만 남았다. 같은 자리로 두 번째 들어가면 멀쩡했고, 그 상태에서\n * 콜백을 손으로 한 번 부르면 바로 채워졌다.\n *\n * 이 화면은 주소로 처음 닿을 때 **모듈이 그때 실려 온다**(route.ts 의 동적 import). 셸은 화면을\n * 처음 세울 때 이 콜백을 다음 animationFrame 으로 미루는데(page-view 가 「엘리먼트가 아직 안\n * 만들어졌을 수 있다」고 적어 둔 그 갈래), 그 사이에 요소가 아직 이 클래스로 올라오지 않았으면\n * **아무 일도 안 하는 기반 클래스의 콜백**이 불린다. 그 뒤로는 생애주기가 더 안 바뀌므로 이름을\n * 받을 기회가 다시 오지 않는다.\n *\n * 그래서 이름을 받는 자리를 둘로 둔다. 둘 다 같은 판단을 지나므로 두 번 읽지 않는다.\n */\n firstUpdated() {\n this.readName()\n }\n\n private readName(lifecycle?: any) {\n const name = String((lifecycle ?? this.lifecycle)?.params?.name || '')\n\n if (name && name !== this.name) {\n this.name = name\n /* 구획이 알린 것은 그 업무의 것이다. 다른 업무로 옮기면 다시 듣는다. */\n this.emptyPanels = {}\n }\n }\n\n private shownName(one: any): string {\n if (!one?.label) return String(one?.name ?? '')\n return one.labelTKey ? String(i18next.t(one.labelTKey, { defaultValue: one.label })) : String(one.label)\n }\n\n render() {\n return html`<div class=\"page\">\n <a\n class=\"back page-nav-link\"\n href=\"activity-catalog\"\n @click=${(e: Event) => (e.preventDefault(), navigate('activity-catalog'))}\n >\n <md-icon>chevron_left</md-icon>${i18next.t('button.back-to-activity-catalog')}\n </a>\n\n <ox-page-state .loading=${!this.loaded} .error=${this.loadError} @retry=${() => this.detail.refetch()}\n >${this.loaded && !this.loadError ? this.renderDetail() : ''}</ox-page-state\n >\n </div>`\n }\n\n private renderDetail() {\n if (!this.entry) {\n /* 없는 이름으로 들어온 주소. 빈 화면으로 두지 않는다 — 무엇을 못 찾았는지 이름을 댄다. */\n return html`<div class=\"why\">${i18next.t('text.activity-not-found', { name: this.name })}</div>`\n }\n\n const actions = detailActions(this.entry)\n const lines = guideLines(this.entry, (key, options) => i18next.t(key, options)).filter(Boolean)\n /* The first guide line says what the activity is; with no guide, the description does. */\n const [what, ...notes] = lines.length ? lines : [this.entry.description].filter(Boolean)\n\n return html`\n <div class=\"head\">\n <h2 class=\"name\">${this.shownName(this.entry)} ${this.renderUse(actions)}</h2>\n ${what ? html`<p class=\"lead\">${what}</p>` : ''}\n </div>\n\n ${this.renderApprovalLine(actions)} ${this.renderNotes(notes)} ${this.renderPanels()}\n `\n }\n\n /** 알아 둘 것 — 첫 줄(무엇인가)을 뺀 안내문. 없으면 구획을 세우지 않는다. */\n private renderNotes(notes: string[]) {\n if (!notes.length) return html``\n\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-what-is-it')}</h3></div>\n <ul class=\"notes page-prose\">\n ${notes.map(line => html`<li>${line}</li>`)}\n </ul>\n </section>\n `\n }\n\n /**\n * 이 업무를 쓸지 말지 — 화면 전체의 결정이라 하단 동작 줄에 둔다(page-standard §8).\n * 아직 만들어지지 않은 업무는 쓸 수 없으므로 단추가 없다.\n */\n private useActions() {\n if (!this.entry) return []\n const actions = detailActions(this.entry)\n if (!actions.registered) return []\n\n return actions.inUse\n ? [{ title: i18next.t('button.activity-stop-using'), action: () => this.setUse(false) }]\n : [{ title: i18next.t('button.activity-start-using'), action: () => this.setUse(true), emphasis: { raised: true } }]\n }\n\n /** 이름 옆의 상태 한 마디. */\n private renderUse(actions: ReturnType<typeof detailActions>) {\n if (!actions.registered) {\n return html`<span class=\"use\">${i18next.t('text.activity-line-not-built')}</span>`\n }\n\n return html`<span class=\"use\"\n >${actions.inUse ? i18next.t('text.activity-in-use-here') : i18next.t('text.activity-not-in-use-here')}</span\n >`\n }\n\n /**\n * 누가 승인하나 — 결재·배정 현황에서 이름을 누르고 온 사람이 보러 온 것. 그래서 맨 위다.\n *\n * 단계와 이름만 적는다.\n */\n private renderApprovalLine(actions: ReturnType<typeof detailActions>) {\n const line = this.activity?.approvalLine || []\n const steps = approvalSteps(line)\n\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\">\n <h3>${i18next.t('label.activity-approval-line')}</h3>\n <div class=\"page-section-actions\">\n <button\n ?raised=${!!actions.canSetApprovalLine && !steps}\n ?disabled=${!actions.canSetApprovalLine}\n @click=${() => this.openApprovalLine(line)}\n >\n ${i18next.t('button.activity-set-approval-line')}\n </button>\n </div>\n </div>\n\n ${steps\n ? html`<ol class=\"steps\">\n ${line.map(\n (one: any, at: number) =>\n html`<li>\n <span class=\"step\">${i18next.t('text.activity-step', { n: at + 1 })}</span>\n <span class=\"who\">${entity360Name(one.approver, one.approver?.name || one.value || '')}</span>\n </li>`\n )}\n </ol>`\n : ''}\n\n ${actions.approvalLineBlock\n ? html`<p class=\"why\">${i18next.t('text.activity-line-' + actions.approvalLineBlock)}</p>`\n : steps\n ? ''\n : html`<p class=\"why\">${i18next.t('text.activity-line-none')}</p>`}\n </section>\n `\n }\n\n /**\n * 다른 패키지가 건 구획.\n *\n * **하나도 안 걸렸으면 그 사실을 말한다.** 빈자리로 두면 「이 앱에는 그 구획이 없다」와\n * 「정할 것이 없다」가 같은 화면이 된다.\n */\n private renderPanels() {\n const context = { activityName: this.entry.name, activityId: this.activity?.id }\n const panels = activityPanels(context)\n const shape = panelSection(\n panels.map(one => one.name),\n this.emptyPanels\n )\n\n if (shape.kind === 'none-registered') {\n return html`\n <section class=\"page-section\">\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-panels')}</h3></div>\n <p class=\"why\">${i18next.t('text.activity-no-panels')}</p>\n </section>\n `\n }\n\n /*\n * 비었다고 알린 구획도 **그리기는 계속한다** — 숨길 뿐이다. 지우면 그 구획이 다시 읽고\n * 「있다」고 알릴 자리가 없어진다.\n */\n const hidden = shape.kind === 'all-empty' ? panels.map(one => one.name) : shape.hidden\n\n return html`\n <section class=\"page-section\" ?hidden=${shape.kind === 'all-empty'}>\n <div class=\"page-section-header\"><h3>${i18next.t('label.activity-panels')}</h3></div>\n ${panels.map(\n panel =>\n html`<div\n ?hidden=${hidden.includes(panel.name)}\n @activity-panel-content=${(event: CustomEvent) => this.panelReported(panel.name, event)}\n >\n ${panel.render(context)}\n </div>`\n )}\n </section>\n `\n }\n\n private panelReported(name: string, event: CustomEvent) {\n event.stopPropagation()\n this.emptyPanels = { ...this.emptyPanels, [name]: event.detail?.empty === true }\n }\n\n private async setUse(on: boolean) {\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: on\n ? gql`\n mutation ($name: String!) {\n activateInstallableActivity(name: $name) {\n name\n }\n }\n `\n : gql`\n mutation ($name: String!) {\n deactivateInstallableActivity(name: $name) {\n name\n }\n }\n `,\n variables: { name: this.entry.name }\n })\n )\n\n if (!outcome.ok) return\n\n await this.detail.refetch()\n }\n\n /**\n * 결재선 편집기는 **organization 것을 그대로 부른다.** 이 화면이 자기 편집기를 따로 지으면 같은\n * 결재선이 두 화면에서 다르게 편집된다.\n */\n private openApprovalLine(line: any[]) {\n const popup = openPopup(\n html`<approval-line-items-editor-popup\n .value=${line}\n .confirmCallback=${(after?: any[] | null) => this.saveApprovalLine(after || [])}\n ></approval-line-items-editor-popup>`,\n { backdrop: true, size: 'large', title: i18next.t('title.approval-line editor') }\n )\n\n return popup\n }\n\n private async saveApprovalLine(after: any[]) {\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($patches: [ActivityPatch!]!) {\n updateMultipleActivity(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches: [{ id: this.activity.id, approvalLine: after, cuFlag: 'M' }] }\n })\n )\n\n if (!outcome.ok) return\n\n await this.detail.refetch()\n }\n}\n"]}
@@ -262,8 +262,8 @@ let ActivityInstanceListPage = class ActivityInstanceListPage extends p13n(local
262
262
  });
263
263
  if (!answer?.value)
264
264
  return;
265
- const response = await client.query({
266
- query: gql `
265
+ const response = await client.mutate({
266
+ mutation: gql `
267
267
  mutation ($ids: [String!]!) {
268
268
  abortActivityInstances(ids: $ids)
269
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-list-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-list-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,2CAA2C,CAAA;AAElD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAe,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAS,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,MAAM,GAAG,GAAG,EAAE,CAAA;AACd,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAA;AACrB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;AAErB,SAAS,yBAAyB;IAChC,OAAO;QACL,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,KAAK,EAAE;QACzF,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,MAAM,EAAE;QAC3F,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,UAAU,EAAE;QACnG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,QAAQ,EAAE;QAC/F,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,OAAO,EAAE;QAC7F,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,OAAO,EAAE;QAC7F,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,KAAK,EAAE;QACzF,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,OAAO,EAAE;KAC9F,CAAA;AACH,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,KAA6B,EAAE,EAAE;IAClD,OAAO,CACL,KAAK,KAAK,sBAAsB,CAAC,MAAM;QACvC,KAAK,KAAK,sBAAsB,CAAC,QAAQ;QACzC,KAAK,KAAK,sBAAsB,CAAC,OAAO;QACxC,KAAK,KAAK,sBAAsB,CAAC,OAAO,CACzC,CAAA;AACH,CAAC,CAAA;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAxE;;QAqBuB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QAE9E,eAAU,GAAa,KAAK,CAAA;IA0O/C,CAAC;aAhQQ,WAAM,GAAG;QACd,qEAAqE;QACrE,qBAAqB;QACrB,eAAe;QACf,iBAAiB;QACjB,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;KAUF;KACF,AAjBY,CAiBZ;IASD,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;YAChD,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAChC,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE;aACpC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAA;gBAC7B,CAAC;aACF;YACD,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAChH,CAAA;IACH,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,OAAO,IAAI,CAAA;;;gBAGC,IAAI;kBACF,IAAI,CAAC,WAAW;kCACA,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAE;wBACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;yBAK3B,IAAI,CAAC,UAAU;wBAChB,CAAC,CAAc,EAAE,EAAE;YAC3B,IAAI,CAAC,UAAU,GAAI,CAAC,CAAC,aAAqB,EAAE,OAAO,CAAA;YACnD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;;cAED,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;;;;;;;;KAQxC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAS;QAC7B,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;YACzF,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACnC,MAAM,EAAE;wBACN,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,QAAQ;wBACf,QAAQ,EAAE,YAAY,EAAE;qBACzB;oBACD,KAAK,EAAE,EAAE;iBACV;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBAChC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE;oBACjE,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,EAAE;iBACV;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,MAAM,EAAE;wBACN,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;4BACnD,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gCAC5B,OAAO,IAAI,CAAA,UAAU,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAA;4BACvF,CAAC;wBACH,CAAC;qBACF;oBACD,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;oBACpC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,cAAc;oBACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;oBACxC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;oBACpC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,MAAM,EAAE,IAAI;iBACb;aACF;YACD,IAAI,EAAE;gBACJ,+FAA+F;gBAE/F,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC/B;YACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SAC5C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QAC1E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;6GAC6F,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;OAoB3K;YACD,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE;SAC9D,CAAC,CAAA;QAEF,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE,CAAA;IACpG,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACxD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;gBAC/B,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;gBAChC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBACpC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE;gBAClD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE;aACnD,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,EAAE,KAAK;gBAAE,OAAM;YAE1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAA;;;;SAIT;gBACD,SAAS,EAAE,EAAE,GAAG,EAAE;aACnB,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;gBAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAA;QACjH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAO;QACf,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5E,CAAC;;AA5O2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6DAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAAoE;AAE9E;IAAhB,KAAK,EAAE;;4DAAqC;AAE1B;IAAlB,KAAK,CAAC,UAAU,CAAC;8BAAS,SAAS;uDAAA;AAzBzB,wBAAwB;IADpC,aAAa,CAAC,6BAA6B,CAAC;GAChC,wBAAwB,CAiQpC","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 { FetchOption, DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CustomAlert, PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice, sleep } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\nimport { dueTimer } from '../../due.js'\n\nimport { ActivityInstanceStatus } from '../../types/activity-instance.js'\n\nimport { priorityCell } from '../../activity-cells.js'\n\nconst MIN = 60\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\n\nfunction getActivityInstanceStatus() {\n return [\n { display: '', value: '' },\n { display: i18next.t('label.activity-state-draft'), value: ActivityInstanceStatus.Draft },\n { display: i18next.t('label.activity-state-issued'), value: ActivityInstanceStatus.Issued },\n { display: i18next.t('label.activity-state-unassigned'), value: ActivityInstanceStatus.Unassigned },\n { display: i18next.t('label.activity-state-assigned'), value: ActivityInstanceStatus.Assigned },\n { display: i18next.t('label.activity-state-started'), value: ActivityInstanceStatus.Started },\n { display: i18next.t('label.activity-state-pending'), value: ActivityInstanceStatus.Pending },\n { display: i18next.t('label.activity-state-ended'), value: ActivityInstanceStatus.Ended },\n { display: i18next.t('label.activity-state-aborted'), value: ActivityInstanceStatus.Aborted }\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 p13n(localize(i18next)(PageView)) {\n static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host {\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n --grid-header-padding: 2px 0 2px 9px;\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: [{ title: i18next.t('button.abort'), action: this.abortActivityInstances.bind(this), icon: 'cancel' }]\n }\n }\n\n render() {\n const mode = this.mode\n\n return html`\n <ox-grist\n class=\"page-fill\"\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 </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: { thumbnail: 'thumbnail', fields: ['name', 'description'], details: ['updatedAt'] },\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: { editable: false },\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: { editable: false },\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 align: 'center',\n renderer: priorityCell()\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: { editable: false, options: getActivityInstanceStatus() },\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(dueTimer(record.dueAt, () => this.active))}</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: { editable: false },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'issuedAt',\n header: i18next.t('field.issued-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.due-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'startedAt',\n header: i18next.t('field.started-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'terminatedAt',\n header: i18next.t('field.terminated-at'),\n record: { editable: false },\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 /* Read only here - a new one is made elsewhere, so the blank row at the end offers nothing. */\n\n appendable: false,\n selectable: { multiple: true }\n },\n sorters: [{ name: 'issuedAt', desc: true }]\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!]) { responses: ${this.issuedByMe ? 'activityInstancesIssuedByMe' : 'activityInstances'}(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n priority\n state\n thumbnail\n issuer { id\n name\n }\n updater { id\n name\n }\n issuedAt\n dueAt\n startedAt\n terminatedAt\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings }\n })\n\n return { total: response.data.responses.total || 0, records: response.data.responses.items || [] }\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: { ids }\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({ title: i18next.t('text.nothing_selected'), text: i18next.t('text.there_is_nothing_to_process') })\n }\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\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 { FetchOption, DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CustomAlert, PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice, sleep } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\nimport { dueTimer } from '../../due.js'\n\nimport { ActivityInstanceStatus } from '../../types/activity-instance.js'\n\nimport { priorityCell } from '../../activity-cells.js'\n\nconst MIN = 60\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\n\nfunction getActivityInstanceStatus() {\n return [\n { display: '', value: '' },\n { display: i18next.t('label.activity-state-draft'), value: ActivityInstanceStatus.Draft },\n { display: i18next.t('label.activity-state-issued'), value: ActivityInstanceStatus.Issued },\n { display: i18next.t('label.activity-state-unassigned'), value: ActivityInstanceStatus.Unassigned },\n { display: i18next.t('label.activity-state-assigned'), value: ActivityInstanceStatus.Assigned },\n { display: i18next.t('label.activity-state-started'), value: ActivityInstanceStatus.Started },\n { display: i18next.t('label.activity-state-pending'), value: ActivityInstanceStatus.Pending },\n { display: i18next.t('label.activity-state-ended'), value: ActivityInstanceStatus.Ended },\n { display: i18next.t('label.activity-state-aborted'), value: ActivityInstanceStatus.Aborted }\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 p13n(localize(i18next)(PageView)) {\n static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host {\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n --grid-header-padding: 2px 0 2px 9px;\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: [{ title: i18next.t('button.abort'), action: this.abortActivityInstances.bind(this), icon: 'cancel' }]\n }\n }\n\n render() {\n const mode = this.mode\n\n return html`\n <ox-grist\n class=\"page-fill\"\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 </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: { thumbnail: 'thumbnail', fields: ['name', 'description'], details: ['updatedAt'] },\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: { editable: false },\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: { editable: false },\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 align: 'center',\n renderer: priorityCell()\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: { editable: false, options: getActivityInstanceStatus() },\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(dueTimer(record.dueAt, () => this.active))}</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: { editable: false },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'issuedAt',\n header: i18next.t('field.issued-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.due-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'startedAt',\n header: i18next.t('field.started-at'),\n record: { editable: false },\n sortable: true,\n width: 180\n },\n {\n type: 'datetime',\n name: 'terminatedAt',\n header: i18next.t('field.terminated-at'),\n record: { editable: false },\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 /* Read only here - a new one is made elsewhere, so the blank row at the end offers nothing. */\n\n appendable: false,\n selectable: { multiple: true }\n },\n sorters: [{ name: 'issuedAt', desc: true }]\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!]) { responses: ${this.issuedByMe ? 'activityInstancesIssuedByMe' : 'activityInstances'}(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n priority\n state\n thumbnail\n issuer { id\n name\n }\n updater { id\n name\n }\n issuedAt\n dueAt\n startedAt\n terminatedAt\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings }\n })\n\n return { total: response.data.responses.total || 0, records: response.data.responses.items || [] }\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.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n abortActivityInstances(ids: $ids)\n }\n `,\n variables: { ids }\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({ title: i18next.t('text.nothing_selected'), text: i18next.t('text.there_is_nothing_to_process') })\n }\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\n }\n}\n"]}
@@ -7,8 +7,11 @@ declare const ActivityInstanceSearchPage_base: (new (...args: any[]) => import("
7
7
  export declare class ActivityInstanceSearchPage extends ActivityInstanceSearchPage_base {
8
8
  static styles: import("lit").CSSResult[];
9
9
  activityId?: string;
10
- activity: any;
11
- searchKeys: ActivitySearchKeyItem[];
10
+ private activityRead;
11
+ get activity(): any;
12
+ get searchKeys(): ActivitySearchKeyItem[];
13
+ /** The answer the grid's columns were laid for. */
14
+ private configuredFor?;
12
15
  gristConfig: any;
13
16
  mode: 'CARD' | 'GRID' | 'LIST';
14
17
  private grist;
@@ -38,7 +41,7 @@ export declare class ActivityInstanceSearchPage extends ActivityInstanceSearchPa
38
41
  };
39
42
  render(): import("lit-html").TemplateResult<1>;
40
43
  pageUpdated(changes: any, lifecycle: any): void;
41
- updated(changes: any): Promise<void>;
44
+ willUpdate(): void;
42
45
  getSearchKeyColumns(): {
43
46
  type: string;
44
47
  name: string;
@@ -5,7 +5,7 @@ import gql from 'graphql-tag';
5
5
  import { css, html } from 'lit';
6
6
  import { customElement, query, state } from 'lit/decorators.js';
7
7
  import { DataGrist } from '@operato/data-grist';
8
- import { client } from '@operato/graphql';
8
+ import { client, QueryController } from '@operato/graphql';
9
9
  import { i18next, localize } from '@operato/i18n';
10
10
  import { openPopup } from '@operato/layout';
11
11
  import { PageView } from '@operato/shell';
@@ -15,7 +15,22 @@ import { declaredLabel } from '../../components/activity-fields.js';
15
15
  let ActivityInstanceSearchPage = class ActivityInstanceSearchPage extends localize(i18next)(PageView) {
16
16
  constructor() {
17
17
  super(...arguments);
18
- this.searchKeys = [];
18
+ /* The activity searched, and its search keys - the grid's key columns (ADR-0190). */
19
+ this.activityRead = new QueryController(this, gql `
20
+ query ($id: String!) {
21
+ activity(id: $id) {
22
+ id
23
+ name
24
+ description
25
+ searchKeys {
26
+ name
27
+ description
28
+ inputKey
29
+ tKey
30
+ }
31
+ }
32
+ }
33
+ `, { variables: () => (this.activityId ? { id: this.activityId } : undefined) });
19
34
  this.mode = isMobileDevice() ? 'CARD' : 'GRID';
20
35
  }
21
36
  static { this.styles = [
@@ -33,6 +48,12 @@ let ActivityInstanceSearchPage = class ActivityInstanceSearchPage extends locali
33
48
  }
34
49
  `
35
50
  ]; }
51
+ get activity() {
52
+ return this.activityRead.data?.activity;
53
+ }
54
+ get searchKeys() {
55
+ return this.activity?.searchKeys;
56
+ }
36
57
  get context() {
37
58
  return { title: i18next.t('title.activity instance search'),
38
59
  search: { handler: (search) => {
@@ -67,25 +88,10 @@ let ActivityInstanceSearchPage = class ActivityInstanceSearchPage extends locali
67
88
  return;
68
89
  }
69
90
  }
70
- async updated(changes) {
71
- if (changes.has('activityId')) {
72
- const response = await client.query({ query: gql `
73
- query ($id: String!) { activity(id: $id) { id
74
- name
75
- description
76
- searchKeys { name
77
- description
78
- inputKey
79
- tKey
80
- }
81
- }
82
- }
83
- `,
84
- variables: { id: this.activityId
85
- }
86
- });
87
- this.activity = response.data.activity;
88
- this.searchKeys = this.activity?.searchKeys;
91
+ willUpdate() {
92
+ const answer = this.activityRead.data;
93
+ if (answer && answer !== this.configuredFor) {
94
+ this.configuredFor = answer;
89
95
  this.refreshGristConfig();
90
96
  }
91
97
  }
@@ -282,14 +288,6 @@ __decorate([
282
288
  state(),
283
289
  __metadata("design:type", String)
284
290
  ], ActivityInstanceSearchPage.prototype, "activityId", void 0);
285
- __decorate([
286
- state(),
287
- __metadata("design:type", Object)
288
- ], ActivityInstanceSearchPage.prototype, "activity", void 0);
289
- __decorate([
290
- state(),
291
- __metadata("design:type", Array)
292
- ], ActivityInstanceSearchPage.prototype, "searchKeys", void 0);
293
291
  __decorate([
294
292
  state(),
295
293
  __metadata("design:type", Object)
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-search-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-search-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport './activity-instance-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { DataGrist, FetchOption, GristRecord } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { OxPopup } from '@operato/popup'\nimport { declaredLabel } from '../../components/activity-fields.js'\nimport { ActivitySearchKeyItem } from '../../types/activity-search-key-item-type.js'\n\n@customElement('activity-instance-search-page')\nexport class ActivityInstanceSearchPage extends localize(i18next)(PageView) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @state() activityId?: string\n @state() activity: any\n @state() searchKeys: ActivitySearchKeyItem[] = []\n\n @state() gristConfig: any\n @state() mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.activity instance search'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n help: 'dataset/activity-instance-search-page',\n actions: [],\n exportable: { name: i18next.t('title.activity instance search'),\n data: this._exportableData.bind(this)\n }\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')\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 pageUpdated(changes, lifecycle) { if (this.active) { this.activityId = lifecycle.resourceId\n return\n }\n }\n\n async updated(changes) { if (changes.has('activityId')) { const response = await client.query({ query: gql`\n query ($id: String!) { activity(id: $id) { id\n name\n description\n searchKeys { name\n description\n inputKey\n tKey\n }\n }\n }\n `,\n variables: { id: this.activityId\n }\n })\n\n this.activity = response.data.activity\n this.searchKeys = this.activity?.searchKeys\n this.refreshGristConfig()\n }\n }\n\n getSearchKeyColumns() { return (\n this.searchKeys?.map((item, index) => { return { type: 'string',\n name: `key0${index + 1}`,\n header: declaredLabel(item) || `key0${index + 1}`,\n record: { editable: false\n },\n sortable: true,\n filter: 'i_like',\n width: 120,\n imex: true\n }\n }) || []\n )\n }\n\n refreshGristConfig() { this.gristConfig = { pagination: { pages: [50, 100, 200] },\n list: { fields: ['name', 'description'],\n details: ['updatedAt', 'updater']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n icon: 'assignment',\n iconOnly: false,\n title: i18next.t('button.view'),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { openPopup(\n html`\n <activity-instance-view\n activity-instance-id=${record.id}\n style=\"background-color: white;\"\n ></activity-instance-view>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.activity instance view')\n }\n )\n }\n }\n },\n { type: 'string',\n name: 'name',\n label: true,\n header: i18next.t('field.name'),\n record: { editable: false\n },\n filter: 'search',\n sortable: true,\n width: 250,\n imex: true\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: false\n },\n filter: 'search',\n width: 300,\n imex: true\n },\n { type: 'string',\n name: 'state',\n header: i18next.t('label.status'),\n record: { editable: false\n },\n width: 80,\n imex: true\n },\n ...this.getSearchKeyColumns(),\n { type: 'json5',\n name: 'input',\n header: i18next.t('field.input'),\n record: { editable: false\n },\n hidden: true,\n imex: true\n },\n { type: 'json5',\n name: 'output',\n header: i18next.t('field.artifact'),\n record: { editable: false\n },\n hidden: true,\n imex: true\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n label: true,\n width: 90,\n imex: true\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n label: true,\n width: 180,\n imex: true\n }\n ],\n rows: { appendable: false,\n selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'createdAt',\n desc: true\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { if (!this.activity) { return { records: [], total: 0 }\n }\n\n const response = await client.query({ query: gql`\n query ($activityId: String!, $filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: activityInstancesByActivity(\n activityId: $activityId\n filters: $filters\n pagination: $pagination\n sortings: $sortings\n ) { items { id\n name\n description\n state\n key01\n key02\n key03\n key04\n key05\n input\n output\n updater { id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { activityId: this.activityId,\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n _exportableData() { let records = [] as GristRecord[]\n if (this.grist.selected && this.grist.selected.length > 0) { records = this.grist.selected\n } else { records = this.grist.data.records\n }\n\n var headerSetting = this.grist.compiledConfig.columns\n .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)\n .map(column => { return column.imex === true\n ? { header: column.header.renderer(column),\n key: column.name,\n width: column.width,\n type: column.type\n }\n : column.imex\n })\n\n var data = records.map(item => { return { id: item.id,\n ...this.gristConfig.columns\n .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)\n .reduce((record, column) => { const key = column.imex === true ? column.name : column.imex.key\n record[key] = key\n .split('.')\n .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)\n return record\n }, {})\n }\n })\n\n return { header: headerSetting, data: data }\n }\n}\n"]}
1
+ {"version":3,"file":"activity-instance-search-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-search-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,6BAA6B,CAAA;AAEpC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAA4B,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAI5D,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IAApE;;QAkBL,qFAAqF;QAC7E,iBAAY,GAAG,IAAI,eAAe,CACxC,IAAI,EACJ,GAAG,CAAA;;;;;;;;;;;;;;KAcF,EACD,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAC7E,CAAA;QAcQ,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IA0O9E,CAAC;aA7RsF,WAAM,GAAG;QAC5F,qEAAqE;QACrE,qBAAqB;QACrB,eAAe;QACf,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;KAQF;KACF,AAd0F,CAc1F;IAyBD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAA;IACzC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAA;IAClC,CAAC;IAUD,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;YACjF,MAAM,EAAE,EAAU,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAAa,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAC9F,CAAC;gBACM,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EACzC;YACI,MAAM,EAAE,EAAU,OAAO,EAAE,GAAG,EAAE;oBAAa,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAA;gBAC7E,CAAC;aACA;YACI,IAAI,EAAE,uCAAuC;YAC7C,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAU,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;gBACrE,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;aAC3C,EACA,CAAA;IACD,CAAC;IAEA,MAAM;QAAS,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE3E,OAAO,IAAI,CAAA;wBACS,IAAI,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;KAOjG,CAAA;IACJ,CAAC;IAEA,WAAW,CAAC,OAAO,EAAE,SAAS;QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAO,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAA;YACjG,OAAM;QACX,CAAC;IACD,CAAC;IAEA,UAAU;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAA;QACrC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;YAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,mBAAmB;QAAS,OAAO,CAC/B,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAAW,OAAO,EAAY,IAAI,EAAE,QAAQ;gBAC7E,IAAI,EAAE,OAAO,KAAK,GAAG,CAAC,EAAE;gBACxB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC,EAAE;gBACjD,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;iBAC7C;gBACQ,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,IAAI;aAClB,CAAA;QACD,CAAC,CAAC,IAAI,EAAE,CACJ,CAAA;IACJ,CAAC;IAEA,kBAAkB;QAAS,IAAI,CAAC,WAAW,GAAG,EAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;YACvF,IAAI,EAAE,EAAU,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;gBAC7C,OAAO,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;aACvC;YACI,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,EAAY,IAAI,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/B,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAc,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;4BAAiB,SAAS,CAC/F,IAAI,CAAA;;2CAEuB,MAAM,CAAC,EAAE;;;iBAGnC,EACD,EAAoB,QAAQ,EAAE,IAAI;gCAChC,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;6BAChE,CACa,CAAA;wBACd,CAAC;qBACA;iBACA;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;oBACV,IAAI,EAAE,IAAI;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;oBACV,IAAI,EAAE,IAAI;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,KAAK,EAAE,EAAE;oBACT,IAAI,EAAE,IAAI;iBAClB;gBACM,GAAG,IAAI,CAAC,mBAAmB,EAAE;gBAC7B,EAAY,IAAI,EAAE,OAAO;oBACvB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;iBAClB;gBACM,EAAY,IAAI,EAAE,OAAO;oBACvB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACnC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAClC,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,EAAE;oBACT,IAAI,EAAE,IAAI;iBAClB;gBACM,EAAY,IAAI,EAAE,UAAU;oBAC1B,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,GAAG;oBACV,IAAI,EAAE,IAAI;iBAClB;aACK;YACD,IAAI,EAAE,EAAU,UAAU,EAAE,KAAK;gBAC/B,UAAU,EAAE,EAAY,QAAQ,EAAE,IAAI;iBAC5C;aACA;YACI,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,WAAW;oBAC3B,IAAI,EAAE,IAAI;iBAClB;aACK;SACL,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAO,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;QACjJ,CAAC;QAEE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAQ,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;OAyBnD;YACD,SAAS,EAAE,EAAU,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC9C,OAAO;gBACP,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC3B,QAAQ;aACd;SACA,CAAC,CAAA;QAEC,OAAO,EAAQ,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;YACtD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;SAChD,CAAA;IACD,CAAC;IAEA,eAAe;QAAS,IAAI,OAAO,GAAG,EAAmB,CAAA;QACvD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAO,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;QACnG,CAAC;aAAM,CAAC;YAAO,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAA;QAChD,CAAC;QAEE,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO;aAClD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;aACtG,GAAG,CAAC,MAAM,CAAC,EAAE;YAAW,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI;gBAChD,CAAC,CAAC,EAAgB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACpD,GAAG,EAAE,MAAM,CAAC,IAAI;oBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;iBAC7B;gBACQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QACtB,CAAC,CAAC,CAAA;QAEC,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAAS,OAAO,EAAU,EAAE,EAAE,IAAI,CAAC,EAAE;gBAC/D,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO;qBACxB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;qBACtG,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;oBAAe,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAA;oBACxG,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG;yBACd,KAAK,CAAC,GAAG,CAAC;yBACV,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;oBACvF,OAAO,MAAM,CAAA;gBACxB,CAAC,EAAE,EAAE,CAAC;aACL,CAAA;QACD,CAAC,CAAC,CAAA;QAEC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAC/C,CAAC;;AA5QS;IAAR,KAAK,EAAE;;8DAAoB;AAkCnB;IAAR,KAAK,EAAE;;+DAAiB;AAChB;IAAR,KAAK,EAAE;;wDAAoE;AAEjD;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;yDAAA;AArDjC,0BAA0B;IADtC,aAAa,CAAC,+BAA+B,CAAC;GAClC,0BAA0B,CA6RtC","sourcesContent":["import '@operato/data-grist'\nimport './activity-instance-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { DataGrist, FetchOption, GristRecord } from '@operato/data-grist'\nimport { client, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { OxPopup } from '@operato/popup'\nimport { declaredLabel } from '../../components/activity-fields.js'\nimport { ActivitySearchKeyItem } from '../../types/activity-search-key-item-type.js'\n\n@customElement('activity-instance-search-page')\nexport class ActivityInstanceSearchPage extends localize(i18next)(PageView) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @state() activityId?: string\n\n /* The activity searched, and its search keys - the grid's key columns (ADR-0190). */\n private activityRead = new QueryController(\n this,\n gql`\n query ($id: String!) {\n activity(id: $id) {\n id\n name\n description\n searchKeys {\n name\n description\n inputKey\n tKey\n }\n }\n }\n `,\n { variables: () => (this.activityId ? { id: this.activityId } : undefined) }\n )\n\n get activity(): any {\n return this.activityRead.data?.activity\n }\n\n get searchKeys(): ActivitySearchKeyItem[] {\n return this.activity?.searchKeys\n }\n\n /** The answer the grid's columns were laid for. */\n private configuredFor?: any\n\n @state() gristConfig: any\n @state() mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.activity instance search'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n help: 'dataset/activity-instance-search-page',\n actions: [],\n exportable: { name: i18next.t('title.activity instance search'),\n data: this._exportableData.bind(this)\n }\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')\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 pageUpdated(changes, lifecycle) { if (this.active) { this.activityId = lifecycle.resourceId\n return\n }\n }\n\n willUpdate() {\n const answer = this.activityRead.data\n if (answer && answer !== this.configuredFor) {\n this.configuredFor = answer\n this.refreshGristConfig()\n }\n }\n\n getSearchKeyColumns() { return (\n this.searchKeys?.map((item, index) => { return { type: 'string',\n name: `key0${index + 1}`,\n header: declaredLabel(item) || `key0${index + 1}`,\n record: { editable: false\n },\n sortable: true,\n filter: 'i_like',\n width: 120,\n imex: true\n }\n }) || []\n )\n }\n\n refreshGristConfig() { this.gristConfig = { pagination: { pages: [50, 100, 200] },\n list: { fields: ['name', 'description'],\n details: ['updatedAt', 'updater']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n icon: 'assignment',\n iconOnly: false,\n title: i18next.t('button.view'),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { openPopup(\n html`\n <activity-instance-view\n activity-instance-id=${record.id}\n style=\"background-color: white;\"\n ></activity-instance-view>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.activity instance view')\n }\n )\n }\n }\n },\n { type: 'string',\n name: 'name',\n label: true,\n header: i18next.t('field.name'),\n record: { editable: false\n },\n filter: 'search',\n sortable: true,\n width: 250,\n imex: true\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: false\n },\n filter: 'search',\n width: 300,\n imex: true\n },\n { type: 'string',\n name: 'state',\n header: i18next.t('label.status'),\n record: { editable: false\n },\n width: 80,\n imex: true\n },\n ...this.getSearchKeyColumns(),\n { type: 'json5',\n name: 'input',\n header: i18next.t('field.input'),\n record: { editable: false\n },\n hidden: true,\n imex: true\n },\n { type: 'json5',\n name: 'output',\n header: i18next.t('field.artifact'),\n record: { editable: false\n },\n hidden: true,\n imex: true\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n label: true,\n width: 90,\n imex: true\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n label: true,\n width: 180,\n imex: true\n }\n ],\n rows: { appendable: false,\n selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'createdAt',\n desc: true\n }\n ]\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { if (!this.activity) { return { records: [], total: 0 }\n }\n\n const response = await client.query({ query: gql`\n query ($activityId: String!, $filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: activityInstancesByActivity(\n activityId: $activityId\n filters: $filters\n pagination: $pagination\n sortings: $sortings\n ) { items { id\n name\n description\n state\n key01\n key02\n key03\n key04\n key05\n input\n output\n updater { id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { activityId: this.activityId,\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n _exportableData() { let records = [] as GristRecord[]\n if (this.grist.selected && this.grist.selected.length > 0) { records = this.grist.selected\n } else { records = this.grist.data.records\n }\n\n var headerSetting = this.grist.compiledConfig.columns\n .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)\n .map(column => { return column.imex === true\n ? { header: column.header.renderer(column),\n key: column.name,\n width: column.width,\n type: column.type\n }\n : column.imex\n })\n\n var data = records.map(item => { return { id: item.id,\n ...this.gristConfig.columns\n .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)\n .reduce((record, column) => { const key = column.imex === true ? column.name : column.imex.key\n record[key] = key\n .split('.')\n .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)\n return record\n }, {})\n }\n })\n\n return { header: headerSetting, data: data }\n }\n}\n"]}