@things-factory/worklist 10.1.36 → 10.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist-client/components/activity-instance-preview.js +2 -13
  2. package/dist-client/components/activity-instance-preview.js.map +1 -1
  3. package/dist-client/components/activity-thread-timeline.d.ts +2 -2
  4. package/dist-client/components/can-pick.d.ts +15 -0
  5. package/dist-client/components/can-pick.js +16 -0
  6. package/dist-client/components/can-pick.js.map +1 -0
  7. package/dist-client/index.d.ts +1 -0
  8. package/dist-client/index.js +1 -0
  9. package/dist-client/index.js.map +1 -1
  10. package/dist-client/pages/activity-catalog/activity-catalog-page.js +50 -40
  11. package/dist-client/pages/activity-catalog/activity-catalog-page.js.map +1 -1
  12. package/dist-client/pages/activity-catalog/activity-detail-actions.d.ts +34 -0
  13. package/dist-client/pages/activity-catalog/activity-detail-actions.js +18 -0
  14. package/dist-client/pages/activity-catalog/activity-detail-actions.js.map +1 -0
  15. package/dist-client/pages/activity-catalog/activity-detail-page.d.ts +68 -0
  16. package/dist-client/pages/activity-catalog/activity-detail-page.js +489 -0
  17. package/dist-client/pages/activity-catalog/activity-detail-page.js.map +1 -0
  18. package/dist-client/pages/activity-catalog/activity-guide.d.ts +16 -0
  19. package/dist-client/pages/activity-catalog/activity-guide.js +5 -0
  20. package/dist-client/pages/activity-catalog/activity-guide.js.map +1 -0
  21. package/dist-client/pages/activity-catalog/activity-panels.d.ts +80 -0
  22. package/dist-client/pages/activity-catalog/activity-panels.js +53 -0
  23. package/dist-client/pages/activity-catalog/activity-panels.js.map +1 -0
  24. package/dist-client/pages/activity-catalog/activity-stage.d.ts +31 -0
  25. package/dist-client/pages/activity-catalog/activity-stage.js +44 -0
  26. package/dist-client/pages/activity-catalog/activity-stage.js.map +1 -0
  27. package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +1 -0
  28. package/dist-client/pages/activity-instance/activity-instance-start-page.js +33 -1
  29. package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
  30. package/dist-client/pages/activity-instance/discard-offer.d.ts +11 -0
  31. package/dist-client/pages/activity-instance/discard-offer.js +11 -0
  32. package/dist-client/pages/activity-instance/discard-offer.js.map +1 -0
  33. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +1 -1
  34. package/dist-client/pages/todo/approval-done-list-page.d.ts +5 -1
  35. package/dist-client/pages/todo/approval-done-list-page.js +8 -1
  36. package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
  37. package/dist-client/pages/todo/approval-pending-list-page.d.ts +5 -1
  38. package/dist-client/pages/todo/approval-pending-list-page.js +8 -1
  39. package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
  40. package/dist-client/pages/todo/done-list-page.d.ts +5 -1
  41. package/dist-client/pages/todo/done-list-page.js +8 -1
  42. package/dist-client/pages/todo/done-list-page.js.map +1 -1
  43. package/dist-client/pages/todo/draft-list-page.d.ts +5 -1
  44. package/dist-client/pages/todo/draft-list-page.js +18 -12
  45. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  46. package/dist-client/pages/todo/list-thumbnail.d.ts +25 -0
  47. package/dist-client/pages/todo/list-thumbnail.js +25 -0
  48. package/dist-client/pages/todo/list-thumbnail.js.map +1 -0
  49. package/dist-client/pages/todo/todo-list-page.d.ts +5 -1
  50. package/dist-client/pages/todo/todo-list-page.js +8 -1
  51. package/dist-client/pages/todo/todo-list-page.js.map +1 -1
  52. package/dist-client/pages/work-door/door-links.d.ts +30 -0
  53. package/dist-client/pages/work-door/door-links.js +30 -0
  54. package/dist-client/pages/work-door/door-links.js.map +1 -0
  55. package/dist-client/pages/work-door/work-doors-page.js +15 -5
  56. package/dist-client/pages/work-door/work-doors-page.js.map +1 -1
  57. package/dist-client/route.d.ts +1 -1
  58. package/dist-client/route.js +3 -0
  59. package/dist-client/route.js.map +1 -1
  60. package/dist-client/tsconfig.tsbuildinfo +1 -1
  61. package/dist-server/controllers/activity-approval/delegate.js +27 -2
  62. package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
  63. package/dist-server/controllers/activity-approval/delegation.d.ts +31 -0
  64. package/dist-server/controllers/activity-approval/delegation.js +31 -0
  65. package/dist-server/controllers/activity-approval/delegation.js.map +1 -0
  66. package/dist-server/controllers/activity-instance/discard-draft.d.ts +22 -0
  67. package/dist-server/controllers/activity-instance/discard-draft.js +54 -0
  68. package/dist-server/controllers/activity-instance/discard-draft.js.map +1 -0
  69. package/dist-server/controllers/activity-read/assert-may-read.d.ts +15 -0
  70. package/dist-server/controllers/activity-read/assert-may-read.js +99 -0
  71. package/dist-server/controllers/activity-read/assert-may-read.js.map +1 -0
  72. package/dist-server/controllers/activity-read/participates.d.ts +41 -0
  73. package/dist-server/controllers/activity-read/participates.js +42 -0
  74. package/dist-server/controllers/activity-read/participates.js.map +1 -0
  75. package/dist-server/controllers/activity-thread/delegate.js +23 -1
  76. package/dist-server/controllers/activity-thread/delegate.js.map +1 -1
  77. package/dist-server/service/activity/activity-mutation.js +1 -0
  78. package/dist-server/service/activity/activity-mutation.js.map +1 -1
  79. package/dist-server/service/activity-approval/activity-approval-query.js +7 -1
  80. package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
  81. package/dist-server/service/activity-approval/activity-approval-subscription.js +2 -11
  82. package/dist-server/service/activity-approval/activity-approval-subscription.js.map +1 -1
  83. package/dist-server/service/activity-instance/activity-instance-mutation.js +12 -20
  84. package/dist-server/service/activity-instance/activity-instance-mutation.js.map +1 -1
  85. package/dist-server/service/activity-instance/activity-instance-query.js +30 -9
  86. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  87. package/dist-server/service/activity-instance/activity-instance-subscription.js +4 -12
  88. package/dist-server/service/activity-instance/activity-instance-subscription.js.map +1 -1
  89. package/dist-server/service/activity-instance/draft-list-states.d.ts +39 -0
  90. package/dist-server/service/activity-instance/draft-list-states.js +51 -0
  91. package/dist-server/service/activity-instance/draft-list-states.js.map +1 -0
  92. package/dist-server/service/activity-instance/index.d.ts +1 -2
  93. package/dist-server/service/activity-instance/index.js +1 -2
  94. package/dist-server/service/activity-instance/index.js.map +1 -1
  95. package/dist-server/service/activity-template/activity-template-mutation.js +6 -0
  96. package/dist-server/service/activity-template/activity-template-mutation.js.map +1 -1
  97. package/dist-server/service/activity-thread/activity-thread-mutation.d.ts +0 -3
  98. package/dist-server/service/activity-thread/activity-thread-mutation.js +0 -19
  99. package/dist-server/service/activity-thread/activity-thread-mutation.js.map +1 -1
  100. package/dist-server/service/activity-thread/activity-thread-query.js +7 -1
  101. package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
  102. package/dist-server/service/activity-thread/activity-thread-subscription.js +2 -8
  103. package/dist-server/service/activity-thread/activity-thread-subscription.js.map +1 -1
  104. package/dist-server/service/index.d.ts +2 -2
  105. package/dist-server/service/subscription/subscription-filters.d.ts +36 -0
  106. package/dist-server/service/subscription/subscription-filters.js +41 -0
  107. package/dist-server/service/subscription/subscription-filters.js.map +1 -0
  108. package/dist-server/service/work-door/work-door-declaration.d.ts +15 -0
  109. package/dist-server/service/work-door/work-door-declaration.js +18 -0
  110. package/dist-server/service/work-door/work-door-declaration.js.map +1 -1
  111. package/dist-server/service/work-door/work-door-resolver.d.ts +3 -0
  112. package/dist-server/service/work-door/work-door-resolver.js +21 -1
  113. package/dist-server/service/work-door/work-door-resolver.js.map +1 -1
  114. package/dist-server/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +10 -10
  116. package/tests/delegate-approval.test.ts +112 -0
  117. package/tests/discard-draft.test.ts +145 -0
  118. package/tests/may-read-case.test.ts +166 -0
  119. package/tests/open-doors.test.ts +274 -0
  120. package/tests/published-shape.test.ts +85 -0
  121. package/tests/work-door-not-used-refuse.test.ts +110 -0
  122. package/things-factory.config.js +1 -0
  123. package/translations/en.json +32 -3
  124. package/translations/ja.json +33 -4
  125. package/translations/ko.json +33 -4
  126. package/translations/ms.json +32 -3
  127. package/translations/zh.json +33 -4
  128. package/dist-server/service/activity-instance/activity-instance-history-query.d.ts +0 -12
  129. package/dist-server/service/activity-instance/activity-instance-history-query.js +0 -79
  130. package/dist-server/service/activity-instance/activity-instance-history-query.js.map +0 -1
  131. package/dist-server/service/activity-instance/activity-instance-history-type.d.ts +0 -5
  132. package/dist-server/service/activity-instance/activity-instance-history-type.js +0 -21
  133. package/dist-server/service/activity-instance/activity-instance-history-type.js.map +0 -1
@@ -0,0 +1,80 @@
1
+ import type { TemplateResult } from 'lit';
2
+ /**
3
+ * 업무 상세에 다른 꾸러미가 구획을 거는 문.
4
+ *
5
+ * ── 왜 문이 필요한가 ───────────────────────────────────────────────────────
6
+ * 업무 상세는 「이 업무가 어떻게 처리되나」를 한 자리에서 끝내는 화면이다. 그런데 그 답의 일부를
7
+ * worklist 가 모른다 — 기준정보 변경 정책은 `@things-factory/ops-master` 가 알고, 그 둘은 서로를
8
+ * 의존하지 않는다 [확인함 2026-09-23: worklist 의존에 ops-master 0건, 그 반대도 0건].
9
+ *
10
+ * 그래서 **worklist 가 문을 열고, 앱이 건다.** ops-master 는 구획 컴포넌트만 내놓고 worklist 를
11
+ * 모른다. 둘을 잇는 값을 아는 것은 둘 다 물고 있는 앱뿐이다(아키텍트 판정 2026-09-23). 서버 쪽
12
+ * 같은 이음새가 먼저 이 모양으로 섰다 — `registerApprovalRouteInspector` 는 ops-master 가 열고
13
+ * plant 가 자기 짝을 건다.
14
+ *
15
+ * ── 안 걸린 것이 오류보고없이 지나가면 안 된다 ────────────────────────────
16
+ * 구획이 하나도 안 걸린 화면과 「정할 것이 없는」 화면은 **같은 빈자리로 보인다.** 그래서 이 문은
17
+ * 걸린 것의 이름을 남기고, 화면은 그 목록이 비었을 때 비었다고 말한다. 판정의 조건 1 이다.
18
+ *
19
+ * ── 구획은 자기 자료를 자기가 읽는다 ──────────────────────────────────────
20
+ * 이 문은 **자리와 이름만** 넘긴다. 구획이 그릴 값을 worklist 가 받아다 넘기지 않는다 — 그러면 두
21
+ * 꾸러미가 같은 사실을 두 벌로 세고, 한쪽이 낡아도 알 수 없다. 판정의 조건 2 다.
22
+ */
23
+ export type ActivityPanelContext = {
24
+ /** 업무의 이름. 콜백을 찾는 키이므로 번역하지 않는다. */
25
+ activityName: string;
26
+ /** 설치된 업무만 갖는다. 없으면 이 업무는 이 도메인에 아직 설치되지 않았다. */
27
+ activityId?: string;
28
+ };
29
+ export type ActivityPanel = {
30
+ /** 이 구획의 이름. 목록에 남고 중복을 가린다. 사람에게 보이는 글자가 아니다. */
31
+ name: string;
32
+ /** 사람에게 보이는 이름은 **열쇠로 받는다.** 값으로 받으면 언어를 바꿔도 안 바뀐다. */
33
+ labelKey: string;
34
+ /** 이 업무에 이 구획이 해당하나. 없으면 늘 해당한다. */
35
+ appliesTo?: (context: ActivityPanelContext) => boolean;
36
+ render: (context: ActivityPanelContext) => TemplateResult;
37
+ };
38
+ export type PanelRejection = 'duplicate-name' | 'no-name' | 'no-label-key' | 'no-render';
39
+ /**
40
+ * 구획을 건다. 같은 이름이 두 번 오면 **먼저 온 것이 선다** — 뒤에 온 것이 앞의 것을 조용히 덮으면
41
+ * 어느 꾸러미가 그리고 있는지 알 수 없다.
42
+ */
43
+ export declare function registerActivityPanel(panel: ActivityPanel): void;
44
+ /** 걸린 구획. 건 차례 그대로다 — 앱이 적은 순서가 화면의 순서다. */
45
+ export declare function activityPanels(context?: ActivityPanelContext): ActivityPanel[];
46
+ /**
47
+ * 구획이 읽은 뒤 「이 업무에는 보일 것이 없다」를 알리는 사건의 이름.
48
+ *
49
+ * `appliesTo` 는 그리기 전에 답해야 해서, **자기 자료를 읽어 봐야 아는** 구획은 거기서 답하지 못한다.
50
+ * 기준정보 변경 정책이 그렇다 — 모든 업무에 걸리고, 읽고 나서야 이 업무를 부르는 축이 0 인 줄 안다.
51
+ * 그 칸이 휴무 승인 같은 업무에 서서 「없다」고 말하면 아무도 기대하지 않은 자리의 잡음이다.
52
+ *
53
+ * 구획은 `new CustomEvent(ACTIVITY_PANEL_CONTENT, { detail: { empty }, bubbles: true, composed: true })`
54
+ * 를 보낸다. `empty: false` 를 다시 보내면 칸이 돌아온다. **안 보낸 구획은 보인다** — 아직 못 읽은
55
+ * 것과 없는 것은 다르고, 못 읽었으면 구획이 스스로 그렇다고 말한다.
56
+ */
57
+ export declare const ACTIVITY_PANEL_CONTENT = "activity-panel-content";
58
+ export type PanelSection =
59
+ /** 걸린 구획이 없다. 화면이 그 사실을 말한다. */
60
+ {
61
+ kind: 'none-registered';
62
+ }
63
+ /** 걸린 구획이 모두 비었다고 알렸다. 칸째로 접는다. */
64
+ | {
65
+ kind: 'all-empty';
66
+ }
67
+ /** 보일 것이 있다. `hidden` 에 든 구획만 접는다. */
68
+ | {
69
+ kind: 'shown';
70
+ hidden: string[];
71
+ };
72
+ /** 걸린 구획 이름과 각 구획이 알린 것으로 칸의 모양을 정한다. */
73
+ export declare function panelSection(names: string[], emptyByName: Record<string, boolean>): PanelSection;
74
+ /** 거절된 등록. 화면이 아니라 개발 중에 읽는 값이고, 빈 배열이 정상이다. */
75
+ export declare function rejectedActivityPanels(): {
76
+ name: string;
77
+ reason: PanelRejection;
78
+ }[];
79
+ /** 시험을 위한 자리. 제품 코드는 부르지 않는다. */
80
+ export declare function forgetActivityPanels(): void;
@@ -0,0 +1,53 @@
1
+ const panels = [];
2
+ const rejected = [];
3
+ /**
4
+ * 구획을 건다. 같은 이름이 두 번 오면 **먼저 온 것이 선다** — 뒤에 온 것이 앞의 것을 조용히 덮으면
5
+ * 어느 꾸러미가 그리고 있는지 알 수 없다.
6
+ */
7
+ export function registerActivityPanel(panel) {
8
+ const name = String(panel?.name ?? '').trim();
9
+ if (!name)
10
+ return void rejected.push({ name: '(no name)', reason: 'no-name' });
11
+ if (panels.some(one => one.name === name))
12
+ return void rejected.push({ name, reason: 'duplicate-name' });
13
+ if (!String(panel.labelKey ?? '').trim())
14
+ return void rejected.push({ name, reason: 'no-label-key' });
15
+ if (typeof panel.render !== 'function')
16
+ return void rejected.push({ name, reason: 'no-render' });
17
+ panels.push({ ...panel, name });
18
+ }
19
+ /** 걸린 구획. 건 차례 그대로다 — 앱이 적은 순서가 화면의 순서다. */
20
+ export function activityPanels(context) {
21
+ if (!context)
22
+ return [...panels];
23
+ return panels.filter(one => (one.appliesTo ? one.appliesTo(context) : true));
24
+ }
25
+ /**
26
+ * 구획이 읽은 뒤 「이 업무에는 보일 것이 없다」를 알리는 사건의 이름.
27
+ *
28
+ * `appliesTo` 는 그리기 전에 답해야 해서, **자기 자료를 읽어 봐야 아는** 구획은 거기서 답하지 못한다.
29
+ * 기준정보 변경 정책이 그렇다 — 모든 업무에 걸리고, 읽고 나서야 이 업무를 부르는 축이 0 인 줄 안다.
30
+ * 그 칸이 휴무 승인 같은 업무에 서서 「없다」고 말하면 아무도 기대하지 않은 자리의 잡음이다.
31
+ *
32
+ * 구획은 `new CustomEvent(ACTIVITY_PANEL_CONTENT, { detail: { empty }, bubbles: true, composed: true })`
33
+ * 를 보낸다. `empty: false` 를 다시 보내면 칸이 돌아온다. **안 보낸 구획은 보인다** — 아직 못 읽은
34
+ * 것과 없는 것은 다르고, 못 읽었으면 구획이 스스로 그렇다고 말한다.
35
+ */
36
+ export const ACTIVITY_PANEL_CONTENT = 'activity-panel-content';
37
+ /** 걸린 구획 이름과 각 구획이 알린 것으로 칸의 모양을 정한다. */
38
+ export function panelSection(names, emptyByName) {
39
+ if (!names.length)
40
+ return { kind: 'none-registered' };
41
+ const hidden = names.filter(name => emptyByName[name] === true);
42
+ return hidden.length === names.length ? { kind: 'all-empty' } : { kind: 'shown', hidden };
43
+ }
44
+ /** 거절된 등록. 화면이 아니라 개발 중에 읽는 값이고, 빈 배열이 정상이다. */
45
+ export function rejectedActivityPanels() {
46
+ return [...rejected];
47
+ }
48
+ /** 시험을 위한 자리. 제품 코드는 부르지 않는다. */
49
+ export function forgetActivityPanels() {
50
+ panels.length = 0;
51
+ rejected.length = 0;
52
+ }
53
+ //# sourceMappingURL=activity-panels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-panels.js","sourceRoot":"","sources":["../../../client/pages/activity-catalog/activity-panels.ts"],"names":[],"mappings":"AA0CA,MAAM,MAAM,GAAoB,EAAE,CAAA;AAClC,MAAM,QAAQ,GAA+C,EAAE,CAAA;AAE/D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAE7C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IAC9E,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACxG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAA;IACrG,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAEhG,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,MAAM,CAAC,CAAA;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAA;AAU9D,yCAAyC;AACzC,MAAM,UAAU,YAAY,CAAC,KAAe,EAAE,WAAoC;IAChF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAA;IAErD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;IAE/D,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AAC3F,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;AACtB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACjB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACrB,CAAC","sourcesContent":["import type { TemplateResult } from 'lit'\n\n/**\n * 업무 상세에 다른 꾸러미가 구획을 거는 문.\n *\n * ── 왜 문이 필요한가 ───────────────────────────────────────────────────────\n * 업무 상세는 「이 업무가 어떻게 처리되나」를 한 자리에서 끝내는 화면이다. 그런데 그 답의 일부를\n * worklist 가 모른다 — 기준정보 변경 정책은 `@things-factory/ops-master` 가 알고, 그 둘은 서로를\n * 의존하지 않는다 [확인함 2026-09-23: worklist 의존에 ops-master 0건, 그 반대도 0건].\n *\n * 그래서 **worklist 가 문을 열고, 앱이 건다.** ops-master 는 구획 컴포넌트만 내놓고 worklist 를\n * 모른다. 둘을 잇는 값을 아는 것은 둘 다 물고 있는 앱뿐이다(아키텍트 판정 2026-09-23). 서버 쪽\n * 같은 이음새가 먼저 이 모양으로 섰다 — `registerApprovalRouteInspector` 는 ops-master 가 열고\n * plant 가 자기 짝을 건다.\n *\n * ── 안 걸린 것이 오류보고없이 지나가면 안 된다 ────────────────────────────\n * 구획이 하나도 안 걸린 화면과 「정할 것이 없는」 화면은 **같은 빈자리로 보인다.** 그래서 이 문은\n * 걸린 것의 이름을 남기고, 화면은 그 목록이 비었을 때 비었다고 말한다. 판정의 조건 1 이다.\n *\n * ── 구획은 자기 자료를 자기가 읽는다 ──────────────────────────────────────\n * 이 문은 **자리와 이름만** 넘긴다. 구획이 그릴 값을 worklist 가 받아다 넘기지 않는다 — 그러면 두\n * 꾸러미가 같은 사실을 두 벌로 세고, 한쪽이 낡아도 알 수 없다. 판정의 조건 2 다.\n */\nexport type ActivityPanelContext = {\n /** 업무의 이름. 콜백을 찾는 키이므로 번역하지 않는다. */\n activityName: string\n /** 설치된 업무만 갖는다. 없으면 이 업무는 이 도메인에 아직 설치되지 않았다. */\n activityId?: string\n}\n\nexport type ActivityPanel = {\n /** 이 구획의 이름. 목록에 남고 중복을 가린다. 사람에게 보이는 글자가 아니다. */\n name: string\n /** 사람에게 보이는 이름은 **열쇠로 받는다.** 값으로 받으면 언어를 바꿔도 안 바뀐다. */\n labelKey: string\n /** 이 업무에 이 구획이 해당하나. 없으면 늘 해당한다. */\n appliesTo?: (context: ActivityPanelContext) => boolean\n render: (context: ActivityPanelContext) => TemplateResult\n}\n\nexport type PanelRejection = 'duplicate-name' | 'no-name' | 'no-label-key' | 'no-render'\n\nconst panels: ActivityPanel[] = []\nconst rejected: { name: string; reason: PanelRejection }[] = []\n\n/**\n * 구획을 건다. 같은 이름이 두 번 오면 **먼저 온 것이 선다** — 뒤에 온 것이 앞의 것을 조용히 덮으면\n * 어느 꾸러미가 그리고 있는지 알 수 없다.\n */\nexport function registerActivityPanel(panel: ActivityPanel): void {\n const name = String(panel?.name ?? '').trim()\n\n if (!name) return void rejected.push({ name: '(no name)', reason: 'no-name' })\n if (panels.some(one => one.name === name)) return void rejected.push({ name, reason: 'duplicate-name' })\n if (!String(panel.labelKey ?? '').trim()) return void rejected.push({ name, reason: 'no-label-key' })\n if (typeof panel.render !== 'function') return void rejected.push({ name, reason: 'no-render' })\n\n panels.push({ ...panel, name })\n}\n\n/** 걸린 구획. 건 차례 그대로다 — 앱이 적은 순서가 화면의 순서다. */\nexport function activityPanels(context?: ActivityPanelContext): ActivityPanel[] {\n if (!context) return [...panels]\n return panels.filter(one => (one.appliesTo ? one.appliesTo(context) : true))\n}\n\n/**\n * 구획이 읽은 뒤 「이 업무에는 보일 것이 없다」를 알리는 사건의 이름.\n *\n * `appliesTo` 는 그리기 전에 답해야 해서, **자기 자료를 읽어 봐야 아는** 구획은 거기서 답하지 못한다.\n * 기준정보 변경 정책이 그렇다 — 모든 업무에 걸리고, 읽고 나서야 이 업무를 부르는 축이 0 인 줄 안다.\n * 그 칸이 휴무 승인 같은 업무에 서서 「없다」고 말하면 아무도 기대하지 않은 자리의 잡음이다.\n *\n * 구획은 `new CustomEvent(ACTIVITY_PANEL_CONTENT, { detail: { empty }, bubbles: true, composed: true })`\n * 를 보낸다. `empty: false` 를 다시 보내면 칸이 돌아온다. **안 보낸 구획은 보인다** — 아직 못 읽은\n * 것과 없는 것은 다르고, 못 읽었으면 구획이 스스로 그렇다고 말한다.\n */\nexport const ACTIVITY_PANEL_CONTENT = 'activity-panel-content'\n\nexport type PanelSection =\n /** 걸린 구획이 없다. 화면이 그 사실을 말한다. */\n | { kind: 'none-registered' }\n /** 걸린 구획이 모두 비었다고 알렸다. 칸째로 접는다. */\n | { kind: 'all-empty' }\n /** 보일 것이 있다. `hidden` 에 든 구획만 접는다. */\n | { kind: 'shown'; hidden: string[] }\n\n/** 걸린 구획 이름과 각 구획이 알린 것으로 칸의 모양을 정한다. */\nexport function panelSection(names: string[], emptyByName: Record<string, boolean>): PanelSection {\n if (!names.length) return { kind: 'none-registered' }\n\n const hidden = names.filter(name => emptyByName[name] === true)\n\n return hidden.length === names.length ? { kind: 'all-empty' } : { kind: 'shown', hidden }\n}\n\n/** 거절된 등록. 화면이 아니라 개발 중에 읽는 값이고, 빈 배열이 정상이다. */\nexport function rejectedActivityPanels(): { name: string; reason: PanelRejection }[] {\n return [...rejected]\n}\n\n/** 시험을 위한 자리. 제품 코드는 부르지 않는다. */\nexport function forgetActivityPanels(): void {\n panels.length = 0\n rejected.length = 0\n}\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 업무의 단계 — 선언된 값을 읽고, 차례를 정한다.
3
+ *
4
+ * 카탈로그 목록과 업무 상세가 같은 답을 내야 해서 여기 한 벌만 둔다. 두 벌이 되면 한쪽만 고쳐도
5
+ * 오류가 안 나고, 같은 업무가 목록과 상세에서 다른 단계로 보인다.
6
+ */
7
+ /**
8
+ * 카드 차례 — **쓸 수 있는 것이 위.**
9
+ *
10
+ * 사용자는 지금 오는 업무를 보러 오고, 우리는 남은 것을 보러 온다. 두 독자를 한 화면에 두면서
11
+ * 순서로 구분한다: 위쪽은 실제로 오는 업무, 아래쪽은 아직 없는 것과 여기 두지 않기로 한 것.
12
+ *
13
+ * **「업무함 아님」은 「예정」과 붙여 두지 않는다.** 섞이면 판단이 약속으로 읽힌다 — 안 만들기로
14
+ * 정한 것이 곧 될 것처럼 보인다.
15
+ */
16
+ export declare const STAGE_ORDER: string[];
17
+ /**
18
+ * 전선에서 온 단계를 **선언된 값으로 되돌린다.**
19
+ *
20
+ * 서버의 enum 철자와 화면의 철자가 판마다 달라진 적이 있어서, 글자만 남기고 맞춘다. 못 맞추면
21
+ * 빈 문자열이다 — 모르는 것을 아무 단계로 채우지 않는다.
22
+ */
23
+ export declare function canonicalStage(raw?: string): string;
24
+ export declare function stageRank(stage?: string): number;
25
+ /**
26
+ * 이 업무가 **설치될 수 있는 것인가.**
27
+ *
28
+ * 아직 만들지 않은 것(예정 · 업무함 아님)과 선언이 없는 것은 설치라는 말이 성립하지 않는다.
29
+ * 그런 카드에 「아직 사용 안 함」을 붙이면 「예정」과 같은 말을 두 번 하는 것이다.
30
+ */
31
+ export declare function isRegistered(stage?: string): boolean;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 업무의 단계 — 선언된 값을 읽고, 차례를 정한다.
3
+ *
4
+ * 카탈로그 목록과 업무 상세가 같은 답을 내야 해서 여기 한 벌만 둔다. 두 벌이 되면 한쪽만 고쳐도
5
+ * 오류가 안 나고, 같은 업무가 목록과 상세에서 다른 단계로 보인다.
6
+ */
7
+ /**
8
+ * 카드 차례 — **쓸 수 있는 것이 위.**
9
+ *
10
+ * 사용자는 지금 오는 업무를 보러 오고, 우리는 남은 것을 보러 온다. 두 독자를 한 화면에 두면서
11
+ * 순서로 구분한다: 위쪽은 실제로 오는 업무, 아래쪽은 아직 없는 것과 여기 두지 않기로 한 것.
12
+ *
13
+ * **「업무함 아님」은 「예정」과 붙여 두지 않는다.** 섞이면 판단이 약속으로 읽힌다 — 안 만들기로
14
+ * 정한 것이 곧 될 것처럼 보인다.
15
+ */
16
+ export const STAGE_ORDER = ['working', 'partial', 'declared', 'planned', 'not-worklist'];
17
+ /**
18
+ * 전선에서 온 단계를 **선언된 값으로 되돌린다.**
19
+ *
20
+ * 서버의 enum 철자와 화면의 철자가 판마다 달라진 적이 있어서, 글자만 남기고 맞춘다. 못 맞추면
21
+ * 빈 문자열이다 — 모르는 것을 아무 단계로 채우지 않는다.
22
+ */
23
+ export function canonicalStage(raw) {
24
+ const flat = String(raw || '')
25
+ .toLowerCase()
26
+ .replace(/[^a-z]/g, '');
27
+ return STAGE_ORDER.find(stage => stage.replace(/[^a-z]/g, '') === flat) || '';
28
+ }
29
+ export function stageRank(stage) {
30
+ const at = STAGE_ORDER.indexOf(canonicalStage(stage));
31
+ /* 선언이 없는 것은 오는 것들 뒤, 예정 앞에 둔다 — 모른다는 것이 「없다」는 아니다. */
32
+ return at < 0 ? STAGE_ORDER.indexOf('declared') : at;
33
+ }
34
+ /**
35
+ * 이 업무가 **설치될 수 있는 것인가.**
36
+ *
37
+ * 아직 만들지 않은 것(예정 · 업무함 아님)과 선언이 없는 것은 설치라는 말이 성립하지 않는다.
38
+ * 그런 카드에 「아직 사용 안 함」을 붙이면 「예정」과 같은 말을 두 번 하는 것이다.
39
+ */
40
+ export function isRegistered(stage) {
41
+ const one = canonicalStage(stage);
42
+ return !!one && one !== 'planned' && one !== 'not-worklist';
43
+ }
44
+ //# sourceMappingURL=activity-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-stage.js","sourceRoot":"","sources":["../../../client/pages/activity-catalog/activity-stage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;AAExF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;SAC3B,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAEzB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAA;AAC/E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAErD,sDAAsD;IACtD,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IAEjC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,cAAc,CAAA;AAC7D,CAAC","sourcesContent":["/**\n * 업무의 단계 — 선언된 값을 읽고, 차례를 정한다.\n *\n * 카탈로그 목록과 업무 상세가 같은 답을 내야 해서 여기 한 벌만 둔다. 두 벌이 되면 한쪽만 고쳐도\n * 오류가 안 나고, 같은 업무가 목록과 상세에서 다른 단계로 보인다.\n */\n\n/**\n * 카드 차례 — **쓸 수 있는 것이 위.**\n *\n * 사용자는 지금 오는 업무를 보러 오고, 우리는 남은 것을 보러 온다. 두 독자를 한 화면에 두면서\n * 순서로 구분한다: 위쪽은 실제로 오는 업무, 아래쪽은 아직 없는 것과 여기 두지 않기로 한 것.\n *\n * **「업무함 아님」은 「예정」과 붙여 두지 않는다.** 섞이면 판단이 약속으로 읽힌다 — 안 만들기로\n * 정한 것이 곧 될 것처럼 보인다.\n */\nexport const STAGE_ORDER = ['working', 'partial', 'declared', 'planned', 'not-worklist']\n\n/**\n * 전선에서 온 단계를 **선언된 값으로 되돌린다.**\n *\n * 서버의 enum 철자와 화면의 철자가 판마다 달라진 적이 있어서, 글자만 남기고 맞춘다. 못 맞추면\n * 빈 문자열이다 — 모르는 것을 아무 단계로 채우지 않는다.\n */\nexport function canonicalStage(raw?: string): string {\n const flat = String(raw || '')\n .toLowerCase()\n .replace(/[^a-z]/g, '')\n\n return STAGE_ORDER.find(stage => stage.replace(/[^a-z]/g, '') === flat) || ''\n}\n\nexport function stageRank(stage?: string): number {\n const at = STAGE_ORDER.indexOf(canonicalStage(stage))\n\n /* 선언이 없는 것은 오는 것들 뒤, 예정 앞에 둔다 — 모른다는 것이 「없다」는 아니다. */\n return at < 0 ? STAGE_ORDER.indexOf('declared') : at\n}\n\n/**\n * 이 업무가 **설치될 수 있는 것인가.**\n *\n * 아직 만들지 않은 것(예정 · 업무함 아님)과 선언이 없는 것은 설치라는 말이 성립하지 않는다.\n * 그런 카드에 「아직 사용 안 함」을 붙이면 「예정」과 같은 말을 두 번 하는 것이다.\n */\nexport function isRegistered(stage?: string): boolean {\n const one = canonicalStage(stage)\n\n return !!one && one !== 'planned' && one !== 'not-worklist'\n}\n"]}
@@ -47,6 +47,7 @@ export declare class ActivityInstanceStartPage extends ActivityInstanceStartPage
47
47
  updated(changes: any): void;
48
48
  pageUpdated(changes: any, lifecycle: any, changedBefore: any): Promise<void>;
49
49
  fetchActivityInstance(id: any): Promise<void>;
50
+ discardDraft(): Promise<void>;
50
51
  draftActivityInstance(): Promise<void>;
51
52
  issueActivityInstance(): Promise<void>;
52
53
  }
@@ -12,7 +12,9 @@ import { keyed } from 'lit/directives/keyed.js';
12
12
  import { client } from '@operato/graphql';
13
13
  import { i18next, localize } from '@operato/i18n';
14
14
  import { ranMutation } from '../../components/say-outcome.js';
15
- import { PageView } from '@operato/shell';
15
+ import { offersDiscard } from './discard-offer.js';
16
+ import { navigate, PageView } from '@operato/shell';
17
+ import { OxPrompt } from '@operato/popup';
16
18
  import { CommonButtonStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
17
19
  import { provider } from '@operato/board/board-provider.js';
18
20
  import { notify } from '@operato/layout';
@@ -58,6 +60,11 @@ let ActivityInstanceStartPage = class ActivityInstanceStartPage extends localize
58
60
  */
59
61
  menu: 'draft-list',
60
62
  actions: [
63
+ offersDiscard(this.activityInstance) && {
64
+ title: i18next.t('button.discard-draft'),
65
+ action: this.discardDraft.bind(this),
66
+ ...CommonButtonStyles.delete
67
+ },
61
68
  issuable && {
62
69
  title: i18next.t('button.draft'),
63
70
  action: this.draftActivityInstance.bind(this),
@@ -306,6 +313,31 @@ let ActivityInstanceStartPage = class ActivityInstanceStartPage extends localize
306
313
  this.loadError = error;
307
314
  }
308
315
  }
316
+ /* Asked once, since a discarded draft cannot come back; then back to the list it was opened from. */
317
+ async discardDraft() {
318
+ const { id } = this.activityInstance || {};
319
+ const sure = await OxPrompt.open({
320
+ type: 'warning',
321
+ title: i18next.t('text.discard-draft-confirm'),
322
+ text: i18next.t('text.discard-draft-for-good'),
323
+ confirmButton: { text: i18next.t('button.discard-draft'), destructive: true },
324
+ cancelButton: { text: i18next.t('button.cancel') }
325
+ });
326
+ if (!sure)
327
+ return;
328
+ const outcome = await ranMutation(() => client.mutate({
329
+ mutation: gql `
330
+ mutation ($id: String!) {
331
+ deleteDraftActivityInstance(id: $id)
332
+ }
333
+ `,
334
+ variables: { id }
335
+ }));
336
+ if (outcome.ok) {
337
+ notify({ message: i18next.t('text.draft-discarded') });
338
+ navigate('draft-list');
339
+ }
340
+ }
309
341
  async draftActivityInstance() {
310
342
  var { id: activityId } = this.activity;
311
343
  var { id, name, description, priority, threadsMin, threadsMax, dueAt, input, output, reason, uiType, assignees, approvalLine } = this.activityInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-start-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-start-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '@operato/property-editor/ox-properties-dynamic-view.js'\nimport '@operato/board/ox-board-viewer.js'\nimport '@things-factory/organization'\nimport '../../components/activity-instance-ribon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, TemplateResult } from 'lit'\nimport { DirectiveResult } from 'lit-html/directive.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { ranMutation } from '../../components/say-outcome.js'\nimport { PageView } from '@operato/shell'\nimport { CommonButtonStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { provider } from '@operato/board/board-provider.js'\nimport { notify } from '@operato/layout'\n\n@customElement('activity-instance-start-page')\nexport class ActivityInstanceStartPage extends localize(i18next)(PageView) {\n static styles = [\n /*\n * The frame owns the page shell; what the task draws is the content it sizes (ADR-0060\n * decision 8). `ox-board-viewer` asks for `height: 100%`, which needs a settled box around it.\n */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n css`\n\n ox-board-viewer {\n width: 100%;\n height: 100%;\n }\n\n #custom-content {\n flex: 1;\n }\n `\n ]\n\n @state() activity: any = {}\n @state() activityInstance: any = {}\n @state() board: any\n @state() customHtmlElement: any\n @state() loaded = false\n @state() loadError: unknown = null\n\n /** The id this screen last read, so retry asks for the same task. */\n private lastId?: string\n\n @query('ox-board-viewer') viewer: any\n\n get context() {\n const { startingType } = this.activity\n const { state } = this.activityInstance\n\n const issuable = state === 'draft'\n\n return {\n title: this.lifecycle?.params?.['title'] || i18next.t('title.activity'),\n help: 'worklist/activity-instance-start-page',\n /*\n * 이 화면은 메뉴에 없다 — 「작성 중」에서 줄을 눌러 들어온다. 그래서 왼쪽 메뉴가 가리킬\n * 항목이 없고, 표시가 사라져 들어온 사람이 자기가 어디에 있는지 잃는다.\n *\n * 어느 목록에서 열리는지는 이 화면이 안다. 그것을 적어 둔다.\n */\n menu: 'draft-list',\n actions: [\n issuable && {\n title: i18next.t('button.draft'),\n action: this.draftActivityInstance.bind(this),\n ...CommonButtonStyles.save\n },\n issuable && {\n title: i18next.t(startingType == 'issue' ? 'button.issue' : 'button.post'),\n action: this.issueActivityInstance.bind(this),\n ...CommonButtonStyles.submit\n }\n ].filter(Boolean /* truthy only */)\n // activityInstance: this.activityInstance\n }\n }\n\n render() {\n /*\n * Reading and failing both drew the same empty ribbon, so a task that could not be read looked\n * like a task with nothing in it (ADR-0060 decision 8).\n */\n return html`<ox-page-state\n .loading=${!this.loaded && !this.loadError}\n .error=${this.loadError}\n @retry=${() => this.lastId && this.fetchActivityInstance(this.lastId)}\n >${this.renderActivity()}</ox-page-state\n >`\n }\n\n renderActivity() {\n return html`\n <activity-instance-ribon .activityInstance=${this.activityInstance}></activity-instance-ribon>\n\n <div class=\"page-fill\">${this.activityContent()}</div>\n `\n }\n\n activityContent(): DirectiveResult {\n switch (this.activityInstance?.uiType) {\n case 'template':\n return this.templateContent()\n case 'generated':\n return this.generatedContent()\n case 'board':\n return this.boardContent()\n case 'custom-element':\n return this.customElementContent()\n case 'page':\n case 'external':\n default:\n return html``\n }\n }\n\n templateContent() {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: template } = this.activityInstance\n return unsafeHTML(template)\n }\n\n getInputSpec() {\n const model = this.activity?.model\n\n return (model || [])\n .filter(item => item.inout === 'in' || item.inout === 'inout')\n .map(item => {\n return { ...item, name: item.tag, label: item.tKey || item.name, property: item.options }\n })\n }\n\n getOutputSpec() {\n const model = this.activity?.model\n\n return (model || [])\n .filter(item => item.inout === 'inout' || item.inout === 'out')\n .map(item => {\n return { ...item, name: item.tag, label: item.tKey || item.name, property: item.options }\n })\n }\n\n generatedContent(): DirectiveResult {\n if (!this.activityInstance) {\n return html``\n }\n\n var { input, output } = this.activityInstance || {}\n\n const inputSpec = this.getInputSpec()\n const outputSpec = this.getOutputSpec()\n\n if (!output) {\n output = inputSpec\n .filter(item => item.inout === 'inout')\n .reduce((inout, item) => {\n inout[item.name] = input?.[item.name]\n return inout\n }, {})\n }\n\n return keyed(\n this.activityInstance.id,\n html`\n <fieldset>\n <legend>Input</legend>\n <ox-properties-dynamic-view\n data-name=\"input\"\n .props=${inputSpec}\n .value=${input}\n @property-change=${e => (this.activityInstance.input = e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </fieldset>\n\n <fieldset>\n <legend>Output</legend>\n <ox-properties-dynamic-view\n data-name=\"output\"\n .props=${outputSpec}\n .value=${output}\n @property-change=${e => (this.activityInstance.output = e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </fieldset>\n `\n )\n }\n\n boardContent(): DirectiveResult {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: boardId, input, output } = this.activityInstance\n\n if (!this.board || this.board.id !== boardId) {\n this.board = { id: boardId }\n }\n\n /* \n ox-board-viewer에서 provider에 의해 공급되는 board가 각 id별로 instance를 하나씩 밖에 가지지 않으므로,\n 동일한 id의 보드를 다른 page에 뺏기는 경우가 있다.\n 따라서, Page가 active될 때마다 타임스탬프를 refresh key로 설정하였다.\n */\n return keyed(\n this.activityInstance.id,\n html`\n <ox-board-viewer\n style=\"background-color: white;\"\n .board=${this.board}\n .provider=${provider}\n .values=${{ ...input, ...output }}\n hide-fullscreen\n hide-navigation\n ></ox-board-viewer>\n `\n )\n }\n\n customElementContent() {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: tagName, input, output } = this.activityInstance\n\n if (!this.customHtmlElement) {\n const element = document.createElement(tagName)\n element.id = 'custom-content'\n element.activityId = this.activityInstance.activity.id\n element.input = input\n element.output = output\n\n element.addEventListener('change-input', (e: CustomEvent) => {\n this.activityInstance.input = e.detail\n })\n element.addEventListener('change-output', (e: CustomEvent) => {\n this.activityInstance.output = e.detail\n })\n\n /* DEPRECATED 일반적으로 output만 수정될 가능성이 높기때문에, change 이벤트는 output을 수정하는 것으로 한다. */\n element.addEventListener('change', (e: CustomEvent) => {\n this.activityInstance.output = e.detail\n })\n\n this.customHtmlElement = element\n }\n\n return this.customHtmlElement\n }\n\n getInOutFromBoard() {\n const inputSpec = this.getInputSpec()\n const outputSpec = this.getOutputSpec()\n const data = this.viewer?.getSceneValues() || {}\n\n const input = inputSpec.reduce((input, spec) => {\n input[spec.name] = data[spec.name]\n return input\n }, {})\n\n const output = outputSpec.reduce((output, spec) => {\n output[spec.name] = data[spec.name]\n return output\n }, {})\n\n return [input, output]\n }\n\n updated(changes) {\n if (changes.has('activityInstance')) {\n this.updateContext()\n }\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) {\n if (this.active && lifecycle.resourceId) {\n this.fetchActivityInstance(lifecycle.resourceId)\n } else {\n this.customHtmlElement = undefined\n }\n }\n\n async fetchActivityInstance(id) {\n this.lastId = id\n this.loadError = null\n\n try {\n const response = await client.query({\n query: gql`\n query activityInstance($id: String!) {\n activityInstance(id: $id) {\n id\n name\n description\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n thumbnail\n input\n output\n uiType\n uiSource\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n dueAt\n createdAt\n }\n }\n `,\n variables: { id }\n })\n\n if (response.errors?.length || !response.data?.activityInstance) {\n throw (\n response.errors?.[0] || new Error(i18next.t('error.activity-instance not found', { activityInstance: id }))\n )\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = response.data.activityInstance\n this.activity = this.activityInstance.activity\n this.loaded = true\n } catch (error) {\n this.loadError = error\n }\n }\n\n async draftActivityInstance() {\n var { id: activityId } = this.activity\n var {\n id,\n name,\n description,\n priority,\n threadsMin,\n threadsMax,\n dueAt,\n input,\n output,\n reason,\n uiType,\n assignees,\n approvalLine\n } = this.activityInstance\n\n if (uiType === 'board') {\n ;[input, output] = this.getInOutFromBoard()\n }\n\n name ||= this.activity.name\n description ||= this.activity.description\n assignees ||= this.activity.assignees\n approvalLine ||= this.activity.approvalLine\n\n var activityInstance = {\n id,\n activityId,\n name,\n description,\n priority,\n threadsMax,\n threadsMin,\n dueAt,\n input,\n output,\n reason,\n assignees,\n approvalLine\n }\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($activityInstance: ActivityInstanceDraft!) {\n draftActivityInstance(activityInstance: $activityInstance) {\n id\n name\n description\n input\n output\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n assignees {\n type\n value\n assignee {\n id\n name\n description\n controlNo\n }\n }\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n uiType\n uiSource\n threadsMin\n threadsMax\n }\n }\n `,\n variables: { activityInstance }\n })\n )\n\n if (!outcome.ok) {\n return\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = outcome.data.draftActivityInstance\n this.activity = this.activityInstance.activity\n\n notify({\n message: i18next.t('text.info_x_successfully', {\n x: `${i18next.t('label.activity-instance')} ${i18next.t('text.draft')}`\n })\n })\n }\n\n async issueActivityInstance() {\n var {\n id,\n name,\n description,\n input,\n output,\n reason,\n uiType,\n threadsMin = 0,\n threadsMax = 0,\n assignees,\n approvalLine\n } = this.activityInstance\n\n if (uiType === 'board') {\n ;[input, output] = this.getInOutFromBoard()\n }\n\n const activityInstance = {\n id,\n name: name || this.activity.name,\n description: description || this.activity.description,\n threadsMin,\n threadsMax,\n input,\n output,\n reason,\n assignees,\n approvalLine\n }\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($activityInstance: ActivityInstanceIssue!) {\n issueActivityInstance(activityInstance: $activityInstance) {\n id\n name\n description\n input\n output\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n assignees {\n type\n value\n assignee {\n id\n name\n description\n controlNo\n }\n }\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n uiType\n uiSource\n threadsMin\n threadsMax\n }\n }\n `,\n variables: { activityInstance }\n })\n )\n\n if (!outcome.ok) {\n return\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = outcome.data.issueActivityInstance\n this.activity = this.activityInstance.activity\n\n notify({\n message: i18next.t('text.info_x_successfully', {\n x: `${i18next.t('label.activity-instance')} ${i18next.t('text.assign')}`\n })\n })\n }\n}\n"]}
1
+ {"version":3,"file":"activity-instance-start-page.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-start-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '@operato/property-editor/ox-properties-dynamic-view.js'\nimport '@operato/board/ox-board-viewer.js'\nimport '@things-factory/organization'\nimport '../../components/activity-instance-ribon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, TemplateResult } from 'lit'\nimport { DirectiveResult } from 'lit-html/directive.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { ranMutation } from '../../components/say-outcome.js'\nimport { offersDiscard } from './discard-offer.js'\nimport { navigate, PageView } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup'\nimport { CommonButtonStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { provider } from '@operato/board/board-provider.js'\nimport { notify } from '@operato/layout'\n\n@customElement('activity-instance-start-page')\nexport class ActivityInstanceStartPage extends localize(i18next)(PageView) {\n static styles = [\n /*\n * The frame owns the page shell; what the task draws is the content it sizes (ADR-0060\n * decision 8). `ox-board-viewer` asks for `height: 100%`, which needs a settled box around it.\n */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n css`\n\n ox-board-viewer {\n width: 100%;\n height: 100%;\n }\n\n #custom-content {\n flex: 1;\n }\n `\n ]\n\n @state() activity: any = {}\n @state() activityInstance: any = {}\n @state() board: any\n @state() customHtmlElement: any\n @state() loaded = false\n @state() loadError: unknown = null\n\n /** The id this screen last read, so retry asks for the same task. */\n private lastId?: string\n\n @query('ox-board-viewer') viewer: any\n\n get context() {\n const { startingType } = this.activity\n const { state } = this.activityInstance\n\n const issuable = state === 'draft'\n\n return {\n title: this.lifecycle?.params?.['title'] || i18next.t('title.activity'),\n help: 'worklist/activity-instance-start-page',\n /*\n * 이 화면은 메뉴에 없다 — 「작성 중」에서 줄을 눌러 들어온다. 그래서 왼쪽 메뉴가 가리킬\n * 항목이 없고, 표시가 사라져 들어온 사람이 자기가 어디에 있는지 잃는다.\n *\n * 어느 목록에서 열리는지는 이 화면이 안다. 그것을 적어 둔다.\n */\n menu: 'draft-list',\n actions: [\n offersDiscard(this.activityInstance) && {\n title: i18next.t('button.discard-draft'),\n action: this.discardDraft.bind(this),\n ...CommonButtonStyles.delete\n },\n issuable && {\n title: i18next.t('button.draft'),\n action: this.draftActivityInstance.bind(this),\n ...CommonButtonStyles.save\n },\n issuable && {\n title: i18next.t(startingType == 'issue' ? 'button.issue' : 'button.post'),\n action: this.issueActivityInstance.bind(this),\n ...CommonButtonStyles.submit\n }\n ].filter(Boolean /* truthy only */)\n // activityInstance: this.activityInstance\n }\n }\n\n render() {\n /*\n * Reading and failing both drew the same empty ribbon, so a task that could not be read looked\n * like a task with nothing in it (ADR-0060 decision 8).\n */\n return html`<ox-page-state\n .loading=${!this.loaded && !this.loadError}\n .error=${this.loadError}\n @retry=${() => this.lastId && this.fetchActivityInstance(this.lastId)}\n >${this.renderActivity()}</ox-page-state\n >`\n }\n\n renderActivity() {\n return html`\n <activity-instance-ribon .activityInstance=${this.activityInstance}></activity-instance-ribon>\n\n <div class=\"page-fill\">${this.activityContent()}</div>\n `\n }\n\n activityContent(): DirectiveResult {\n switch (this.activityInstance?.uiType) {\n case 'template':\n return this.templateContent()\n case 'generated':\n return this.generatedContent()\n case 'board':\n return this.boardContent()\n case 'custom-element':\n return this.customElementContent()\n case 'page':\n case 'external':\n default:\n return html``\n }\n }\n\n templateContent() {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: template } = this.activityInstance\n return unsafeHTML(template)\n }\n\n getInputSpec() {\n const model = this.activity?.model\n\n return (model || [])\n .filter(item => item.inout === 'in' || item.inout === 'inout')\n .map(item => {\n return { ...item, name: item.tag, label: item.tKey || item.name, property: item.options }\n })\n }\n\n getOutputSpec() {\n const model = this.activity?.model\n\n return (model || [])\n .filter(item => item.inout === 'inout' || item.inout === 'out')\n .map(item => {\n return { ...item, name: item.tag, label: item.tKey || item.name, property: item.options }\n })\n }\n\n generatedContent(): DirectiveResult {\n if (!this.activityInstance) {\n return html``\n }\n\n var { input, output } = this.activityInstance || {}\n\n const inputSpec = this.getInputSpec()\n const outputSpec = this.getOutputSpec()\n\n if (!output) {\n output = inputSpec\n .filter(item => item.inout === 'inout')\n .reduce((inout, item) => {\n inout[item.name] = input?.[item.name]\n return inout\n }, {})\n }\n\n return keyed(\n this.activityInstance.id,\n html`\n <fieldset>\n <legend>Input</legend>\n <ox-properties-dynamic-view\n data-name=\"input\"\n .props=${inputSpec}\n .value=${input}\n @property-change=${e => (this.activityInstance.input = e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </fieldset>\n\n <fieldset>\n <legend>Output</legend>\n <ox-properties-dynamic-view\n data-name=\"output\"\n .props=${outputSpec}\n .value=${output}\n @property-change=${e => (this.activityInstance.output = e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </fieldset>\n `\n )\n }\n\n boardContent(): DirectiveResult {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: boardId, input, output } = this.activityInstance\n\n if (!this.board || this.board.id !== boardId) {\n this.board = { id: boardId }\n }\n\n /* \n ox-board-viewer에서 provider에 의해 공급되는 board가 각 id별로 instance를 하나씩 밖에 가지지 않으므로,\n 동일한 id의 보드를 다른 page에 뺏기는 경우가 있다.\n 따라서, Page가 active될 때마다 타임스탬프를 refresh key로 설정하였다.\n */\n return keyed(\n this.activityInstance.id,\n html`\n <ox-board-viewer\n style=\"background-color: white;\"\n .board=${this.board}\n .provider=${provider}\n .values=${{ ...input, ...output }}\n hide-fullscreen\n hide-navigation\n ></ox-board-viewer>\n `\n )\n }\n\n customElementContent() {\n if (!this.activityInstance) {\n return html``\n }\n\n const { uiSource: tagName, input, output } = this.activityInstance\n\n if (!this.customHtmlElement) {\n const element = document.createElement(tagName)\n element.id = 'custom-content'\n element.activityId = this.activityInstance.activity.id\n element.input = input\n element.output = output\n\n element.addEventListener('change-input', (e: CustomEvent) => {\n this.activityInstance.input = e.detail\n })\n element.addEventListener('change-output', (e: CustomEvent) => {\n this.activityInstance.output = e.detail\n })\n\n /* DEPRECATED 일반적으로 output만 수정될 가능성이 높기때문에, change 이벤트는 output을 수정하는 것으로 한다. */\n element.addEventListener('change', (e: CustomEvent) => {\n this.activityInstance.output = e.detail\n })\n\n this.customHtmlElement = element\n }\n\n return this.customHtmlElement\n }\n\n getInOutFromBoard() {\n const inputSpec = this.getInputSpec()\n const outputSpec = this.getOutputSpec()\n const data = this.viewer?.getSceneValues() || {}\n\n const input = inputSpec.reduce((input, spec) => {\n input[spec.name] = data[spec.name]\n return input\n }, {})\n\n const output = outputSpec.reduce((output, spec) => {\n output[spec.name] = data[spec.name]\n return output\n }, {})\n\n return [input, output]\n }\n\n updated(changes) {\n if (changes.has('activityInstance')) {\n this.updateContext()\n }\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) {\n if (this.active && lifecycle.resourceId) {\n this.fetchActivityInstance(lifecycle.resourceId)\n } else {\n this.customHtmlElement = undefined\n }\n }\n\n async fetchActivityInstance(id) {\n this.lastId = id\n this.loadError = null\n\n try {\n const response = await client.query({\n query: gql`\n query activityInstance($id: String!) {\n activityInstance(id: $id) {\n id\n name\n description\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n thumbnail\n input\n output\n uiType\n uiSource\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n dueAt\n createdAt\n }\n }\n `,\n variables: { id }\n })\n\n if (response.errors?.length || !response.data?.activityInstance) {\n throw (\n response.errors?.[0] || new Error(i18next.t('error.activity-instance not found', { activityInstance: id }))\n )\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = response.data.activityInstance\n this.activity = this.activityInstance.activity\n this.loaded = true\n } catch (error) {\n this.loadError = error\n }\n }\n\n /* Asked once, since a discarded draft cannot come back; then back to the list it was opened from. */\n async discardDraft() {\n const { id } = this.activityInstance || {}\n\n const sure = await OxPrompt.open({\n type: 'warning',\n title: i18next.t('text.discard-draft-confirm'),\n text: i18next.t('text.discard-draft-for-good'),\n confirmButton: { text: i18next.t('button.discard-draft'), destructive: true },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n\n if (!sure) return\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteDraftActivityInstance(id: $id)\n }\n `,\n variables: { id }\n })\n )\n\n if (outcome.ok) {\n notify({ message: i18next.t('text.draft-discarded') })\n navigate('draft-list')\n }\n }\n\n async draftActivityInstance() {\n var { id: activityId } = this.activity\n var {\n id,\n name,\n description,\n priority,\n threadsMin,\n threadsMax,\n dueAt,\n input,\n output,\n reason,\n uiType,\n assignees,\n approvalLine\n } = this.activityInstance\n\n if (uiType === 'board') {\n ;[input, output] = this.getInOutFromBoard()\n }\n\n name ||= this.activity.name\n description ||= this.activity.description\n assignees ||= this.activity.assignees\n approvalLine ||= this.activity.approvalLine\n\n var activityInstance = {\n id,\n activityId,\n name,\n description,\n priority,\n threadsMax,\n threadsMin,\n dueAt,\n input,\n output,\n reason,\n assignees,\n approvalLine\n }\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($activityInstance: ActivityInstanceDraft!) {\n draftActivityInstance(activityInstance: $activityInstance) {\n id\n name\n description\n input\n output\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n assignees {\n type\n value\n assignee {\n id\n name\n description\n controlNo\n }\n }\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n uiType\n uiSource\n threadsMin\n threadsMax\n }\n }\n `,\n variables: { activityInstance }\n })\n )\n\n if (!outcome.ok) {\n return\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = outcome.data.draftActivityInstance\n this.activity = this.activityInstance.activity\n\n notify({\n message: i18next.t('text.info_x_successfully', {\n x: `${i18next.t('label.activity-instance')} ${i18next.t('text.draft')}`\n })\n })\n }\n\n async issueActivityInstance() {\n var {\n id,\n name,\n description,\n input,\n output,\n reason,\n uiType,\n threadsMin = 0,\n threadsMax = 0,\n assignees,\n approvalLine\n } = this.activityInstance\n\n if (uiType === 'board') {\n ;[input, output] = this.getInOutFromBoard()\n }\n\n const activityInstance = {\n id,\n name: name || this.activity.name,\n description: description || this.activity.description,\n threadsMin,\n threadsMax,\n input,\n output,\n reason,\n assignees,\n approvalLine\n }\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($activityInstance: ActivityInstanceIssue!) {\n issueActivityInstance(activityInstance: $activityInstance) {\n id\n name\n description\n input\n output\n state\n activity {\n id\n startingType\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n }\n }\n assignees {\n type\n value\n assignee {\n id\n name\n description\n controlNo\n }\n }\n approvalLine {\n type\n value\n participation\n approver {\n id\n name\n description\n controlNo\n }\n }\n uiType\n uiSource\n threadsMin\n threadsMax\n }\n }\n `,\n variables: { activityInstance }\n })\n )\n\n if (!outcome.ok) {\n return\n }\n\n this.customHtmlElement = undefined\n this.activityInstance = outcome.data.issueActivityInstance\n this.activity = this.activityInstance.activity\n\n notify({\n message: i18next.t('text.info_x_successfully', {\n x: `${i18next.t('label.activity-instance')} ${i18next.t('text.assign')}`\n })\n })\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Whether the draft screen offers "discard draft".
3
+ *
4
+ * Only a draft that has been saved: an unsaved one has nothing on the server to throw away, and one
5
+ * that has gone out is no longer the writer's alone (discard-draft.ts on the server refuses it by
6
+ * name). Who may discard is the server's to decide; the screen does not repeat it.
7
+ */
8
+ export declare function offersDiscard(instance: {
9
+ id?: string;
10
+ state?: string;
11
+ } | null | undefined): boolean;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Whether the draft screen offers "discard draft".
3
+ *
4
+ * Only a draft that has been saved: an unsaved one has nothing on the server to throw away, and one
5
+ * that has gone out is no longer the writer's alone (discard-draft.ts on the server refuses it by
6
+ * name). Who may discard is the server's to decide; the screen does not repeat it.
7
+ */
8
+ export function offersDiscard(instance) {
9
+ return !!instance?.id && instance.state === 'draft';
10
+ }
11
+ //# sourceMappingURL=discard-offer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discard-offer.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/discard-offer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAA4D;IACxF,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,CAAA;AACrD,CAAC","sourcesContent":["/**\n * Whether the draft screen offers \"discard draft\".\n *\n * Only a draft that has been saved: an unsaved one has nothing on the server to throw away, and one\n * that has gone out is no longer the writer's alone (discard-draft.ts on the server refuses it by\n * name). Who may discard is the server's to decide; the screen does not repeat it.\n */\nexport function offersDiscard(instance: { id?: string; state?: string } | null | undefined): boolean {\n return !!instance?.id && instance.state === 'draft'\n}\n"]}
@@ -26,6 +26,6 @@ declare const ActivityThreadView_base: (new (...args: any[]) => LitElement) & ty
26
26
  export declare class ActivityThreadView extends ActivityThreadView_base {
27
27
  static styles: import("lit").CSSResult[];
28
28
  activityThread?: ActivityThread;
29
- render(): import("lit-html").TemplateResult<1> | typeof nothing;
29
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
30
30
  }
31
31
  export {};
@@ -25,7 +25,11 @@ export declare class ApprovalDoneListPage extends ApprovalDoneListPage_base {
25
25
  render(): import("lit-html").TemplateResult<1>;
26
26
  pageInitialized(lifecycle: any): Promise<void>;
27
27
  pageUpdated(changes: any, lifecycle: any, changedBefore: any): Promise<void>;
28
- fetchHandler({ page, limit, sortings, filters }: FetchOption): Promise<{
28
+ fetchHandler(options: FetchOption): Promise<{
29
+ total: any;
30
+ records: any;
31
+ }>;
32
+ fetchRows({ page, limit, sortings, filters }: FetchOption): Promise<{
29
33
  total: any;
30
34
  records: any;
31
35
  }>;
@@ -10,6 +10,7 @@ import { client } from '@operato/graphql';
10
10
  import { importantChip, importantFilters } from '../../chip-filters.js';
11
11
  import { i18next, localize } from '@operato/i18n';
12
12
  import { navigate, PageView } from '@operato/shell';
13
+ import { listWithThumbnail } from './list-thumbnail.js';
13
14
  import { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
14
15
  import { adjustFilters, isMobileDevice } from '@operato/utils';
15
16
  import { priorityCell, subjectCell } from '../../activity-cells.js';
@@ -261,7 +262,13 @@ let ApprovalDoneListPage = class ApprovalDoneListPage extends localize(i18next)(
261
262
  this.grist?.fetch();
262
263
  }
263
264
  }
264
- async fetchHandler({ page, limit, sortings = [], filters = [] }) {
265
+ /* 읽은 것에 그림이 하나도 없으면 카드마다 빈 그림 칸을 세우지 않는다(§ list-thumbnail.ts). */
266
+ async fetchHandler(options) {
267
+ const fetched = await this.fetchRows(options);
268
+ this.gristConfig = listWithThumbnail(this.gristConfig, fetched?.records || []);
269
+ return fetched;
270
+ }
271
+ async fetchRows({ page, limit, sortings = [], filters = [] }) {
265
272
  if (this.filters?.includes('important')) {
266
273
  filters = adjustFilters(filters, importantFilters());
267
274
  }