@things-factory/worklist 10.1.198 → 10.1.203

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 (124) hide show
  1. package/dist-client/components/activity-thread-timeline.d.ts +2 -2
  2. package/dist-client/pages/activity/activity-list-page.d.ts +3 -0
  3. package/dist-client/pages/activity/activity-list-page.js +25 -13
  4. package/dist-client/pages/activity/activity-list-page.js.map +1 -1
  5. package/dist-client/pages/activity/activity-partial-view.js +1 -1
  6. package/dist-client/pages/activity/activity-partial-view.js.map +1 -1
  7. package/dist-client/pages/activity/assignee-roles-cell.d.ts +32 -0
  8. package/dist-client/pages/activity/assignee-roles-cell.js +26 -0
  9. package/dist-client/pages/activity/assignee-roles-cell.js.map +1 -0
  10. package/dist-client/pages/activity-catalog/activity-catalog-page.js +1 -1
  11. package/dist-client/pages/activity-catalog/activity-catalog-page.js.map +1 -1
  12. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +1 -1
  13. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +1 -1
  14. package/dist-client/pages/work-door/door-sentence.d.ts +1 -1
  15. package/dist-client/pages/work-door/door-sentence.js +2 -2
  16. package/dist-client/pages/work-door/door-sentence.js.map +1 -1
  17. package/dist-client/route.d.ts +1 -1
  18. package/dist-client/tsconfig.tsbuildinfo +1 -1
  19. package/dist-client/types/activity-instance-type.d.ts +2 -2
  20. package/dist-client/types/activity-instance-type.js.map +1 -1
  21. package/dist-client/types/activity-instance.d.ts +1 -1
  22. package/dist-client/types/activity-instance.js.map +1 -1
  23. package/dist-client/types/activity.d.ts +1 -1
  24. package/dist-client/types/activity.js.map +1 -1
  25. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.d.ts +2 -2
  26. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js +2 -2
  27. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js.map +1 -1
  28. package/dist-server/controllers/activity-instance/abort.js +1 -1
  29. package/dist-server/controllers/activity-instance/abort.js.map +1 -1
  30. package/dist-server/controllers/activity-instance/assign.d.ts +2 -1
  31. package/dist-server/controllers/activity-instance/assign.js +104 -2
  32. package/dist-server/controllers/activity-instance/assign.js.map +1 -1
  33. package/dist-server/controllers/activity-instance/assignee-input.d.ts +25 -0
  34. package/dist-server/controllers/activity-instance/assignee-input.js +28 -0
  35. package/dist-server/controllers/activity-instance/assignee-input.js.map +1 -0
  36. package/dist-server/controllers/activity-instance/draft.js +7 -2
  37. package/dist-server/controllers/activity-instance/draft.js.map +1 -1
  38. package/dist-server/controllers/activity-instance/end.js +1 -1
  39. package/dist-server/controllers/activity-instance/end.js.map +1 -1
  40. package/dist-server/controllers/activity-instance/entitlement.d.ts +1 -1
  41. package/dist-server/controllers/activity-instance/entitlement.js +7 -5
  42. package/dist-server/controllers/activity-instance/entitlement.js.map +1 -1
  43. package/dist-server/controllers/activity-instance/issue.js +28 -7
  44. package/dist-server/controllers/activity-instance/issue.js.map +1 -1
  45. package/dist-server/controllers/activity-instance/pick.js +22 -3
  46. package/dist-server/controllers/activity-instance/pick.js.map +1 -1
  47. package/dist-server/controllers/activity-read/assert-may-read.js +2 -1
  48. package/dist-server/controllers/activity-read/assert-may-read.js.map +1 -1
  49. package/dist-server/controllers/activity-read/participates.d.ts +2 -2
  50. package/dist-server/controllers/activity-read/participates.js +2 -2
  51. package/dist-server/controllers/activity-read/participates.js.map +1 -1
  52. package/dist-server/controllers/activity-thread/check-authority.js +22 -4
  53. package/dist-server/controllers/activity-thread/check-authority.js.map +1 -1
  54. package/dist-server/controllers/common.js +17 -12
  55. package/dist-server/controllers/common.js.map +1 -1
  56. package/dist-server/service/activity/activity-history.d.ts +1 -2
  57. package/dist-server/service/activity/activity-history.js +4 -8
  58. package/dist-server/service/activity/activity-history.js.map +1 -1
  59. package/dist-server/service/activity/activity-mutation.js +39 -8
  60. package/dist-server/service/activity/activity-mutation.js.map +1 -1
  61. package/dist-server/service/activity/activity-query.d.ts +1 -1
  62. package/dist-server/service/activity/activity-query.js +9 -9
  63. package/dist-server/service/activity/activity-query.js.map +1 -1
  64. package/dist-server/service/activity/activity-type.d.ts +2 -2
  65. package/dist-server/service/activity/activity-type.js +12 -6
  66. package/dist-server/service/activity/activity-type.js.map +1 -1
  67. package/dist-server/service/activity/activity.d.ts +2 -2
  68. package/dist-server/service/activity/activity.js +15 -7
  69. package/dist-server/service/activity/activity.js.map +1 -1
  70. package/dist-server/service/activity/event-subscriber.js.map +1 -1
  71. package/dist-server/service/activity-instance/activity-instance-history.d.ts +1 -2
  72. package/dist-server/service/activity-instance/activity-instance-history.js +4 -8
  73. package/dist-server/service/activity-instance/activity-instance-history.js.map +1 -1
  74. package/dist-server/service/activity-instance/activity-instance-mutation.d.ts +1 -1
  75. package/dist-server/service/activity-instance/activity-instance-mutation.js +10 -5
  76. package/dist-server/service/activity-instance/activity-instance-mutation.js.map +1 -1
  77. package/dist-server/service/activity-instance/activity-instance-query.d.ts +1 -2
  78. package/dist-server/service/activity-instance/activity-instance-query.js +16 -25
  79. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  80. package/dist-server/service/activity-instance/activity-instance-type.d.ts +2 -2
  81. package/dist-server/service/activity-instance/activity-instance-type.js +12 -6
  82. package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
  83. package/dist-server/service/activity-instance/activity-instance.d.ts +2 -2
  84. package/dist-server/service/activity-instance/activity-instance.js +15 -7
  85. package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
  86. package/dist-server/service/activity-instance/assignee-pool.d.ts +59 -0
  87. package/dist-server/service/activity-instance/assignee-pool.js +99 -0
  88. package/dist-server/service/activity-instance/assignee-pool.js.map +1 -0
  89. package/dist-server/service/activity-instance/event-subscriber.d.ts +9 -1
  90. package/dist-server/service/activity-instance/event-subscriber.js +20 -4
  91. package/dist-server/service/activity-instance/event-subscriber.js.map +1 -1
  92. package/dist-server/service/activity-summary/activity-summary-query.js +3 -3
  93. package/dist-server/service/activity-summary/activity-summary-query.js.map +1 -1
  94. package/dist-server/service/activity-thread/my-open-threads.d.ts +1 -1
  95. package/dist-server/service/activity-thread/my-open-threads.js +4 -3
  96. package/dist-server/service/activity-thread/my-open-threads.js.map +1 -1
  97. package/dist-server/service/index.d.ts +1 -1
  98. package/dist-server/service/subscription/subscription-filters.d.ts +3 -2
  99. package/dist-server/service/subscription/subscription-filters.js +6 -3
  100. package/dist-server/service/subscription/subscription-filters.js.map +1 -1
  101. package/dist-server/service/work-door/work-door-service.js +9 -6
  102. package/dist-server/service/work-door/work-door-service.js.map +1 -1
  103. package/dist-server/service/work-door/work-door-type.d.ts +1 -1
  104. package/dist-server/service/work-door/work-door-type.js +4 -4
  105. package/dist-server/service/work-door/work-door-type.js.map +1 -1
  106. package/dist-server/service/work-door/work-door.d.ts +3 -3
  107. package/dist-server/service/work-door/work-door.js +2 -2
  108. package/dist-server/service/work-door/work-door.js.map +1 -1
  109. package/dist-server/tsconfig.tsbuildinfo +1 -1
  110. package/package.json +9 -9
  111. package/tests/assign-role-pool.test.ts +508 -0
  112. package/tests/assignee-pool-history.test.ts +81 -0
  113. package/tests/may-read-case.test.ts +3 -2
  114. package/tests/org-member-domain.test.ts +10 -4
  115. package/tests/pick-race.pg.test.ts +2 -2
  116. package/tests/published-shape.test.ts +2 -2
  117. package/tests/role-pool-race.pg.test.ts +182 -0
  118. package/tests/work-door.test.ts +3 -3
  119. package/translations/en.json +5 -0
  120. package/translations/es.json +5 -0
  121. package/translations/ja.json +5 -0
  122. package/translations/ko.json +5 -0
  123. package/translations/ms.json +5 -0
  124. package/translations/zh.json +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"door-sentence.js","sourceRoot":"","sources":["../../../client/pages/work-door/door-sentence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a row of the activity catalog says, **composed here from facts and translations.**\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ── Why the screen writes them ────────────────────────────────────────────\n * The server used to send each row's sentence and the summary already written, in Korean. An English,\n * Japanese, Chinese or Malay reader got Korean, and the screen had no way to draw a row differently\n * without reading the sentence back apart. The server now sends facts (`WorkDoorType`) and every\n * phrase is a translation key here.\n *\n * ── The line is drawn, not described ──────────────────────────────────────\n * A filled line used to read 「…은 결재자 2명을 지납니다」. The row now draws the line itself (organization's\n * approval-line-brief, steps and names), so the words here are only for what a drawing cannot say: there\n * is no line, nobody holds the role, the form follows another one, it never installed.\n *\n * ── The empty line is the door's declaration ──────────────────────────────\n * What an empty approval line does is declared per door (ADR-0077 decision 1). `run` lets the raiser\n * approve their own; `refuse` refuses the raise; `as-established` turns on how the row stood. A door\n * with no declaration says nothing about the consequence rather than guessing one.\n *\n * Pure: `t` is passed in, so a test can load the real translation files and read the phrases.\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/** The row as this screen holds it, after `door-words` has moved the wire spellings. */\nexport type DoorFacts = {\n name: string\n labelKey: string\n kind: string\n standing: string\n reason: string\n approvers: number\n whenNoLine?: string\n whenNoLineBecause?: string\n followsLabelKey?: string\n assigneeRole?: string\n notUsedBecause?: string\n}\n\nexport type DoorCounts = { on: number; off: number; missing: number; notUsed: number; todo: number }\n\ntype T = (key: string, options?: Record<string, unknown>) => string\n\n/*\n * Values reach the phrase through lit, which escapes them. i18next escaping on top would print\n * `&amp;` in a role name.\n */\nconst RAW = { interpolation: { escapeValue: false } }\n\n/**\n * A door's name. A label key without a translation falls back to the form name - a name a person can\n * search for - rather than printing the key.\n */\nexport function doorLabel(t: T, door: { labelKey: string; name: string }): string {\n return String(t(door.labelKey, { defaultValue: door.name }))\n}\n\n/** Why an approval door will not run on an empty line, as a short phrase. Empty when not declared. */\nexport function whyItRefuses(t: T, door: Pick<DoorFacts, 'whenNoLineBecause'>): string {\n return door.whenNoLineBecause ? String(t(`text.door-refuses-because-${door.whenNoLineBecause}`)) : ''\n}\n\n/**\n * What the line slot says, beside or instead of the drawn line.\n *\n * `drawsLine` is whether the row draws approval steps - the page counts them with organization's rule,\n * which this pure file does not load. A not-used row shows what the plant wrote, as written.\n */\nexport function lineNote(t: T, door: DoorFacts, drawsLine: boolean): string {\n if (door.standing === 'not-used') {\n return door.notUsedBecause ?? ''\n }\n\n if (door.standing === 'missing') {\n return String(t('text.activity-catalog-missing'))\n }\n\n if (door.kind === 'assignment') {\n return door.assigneeRole\n ? String(t('text.activity-catalog-assignee', { ...RAW, role: door.assigneeRole }))\n : String(t('text.activity-catalog-no-assignee'))\n }\n\n if (door.reason === 'role-empty' || door.reason === 'person-absent') {\n return String(t(`text.activity-catalog-${door.reason}`))\n }\n\n return drawsLine ? '' : String(t('text.activity-catalog-no-line'))\n}\n\n/** The door whose line this one uses, by name - the line is set there. */\nexport function followsNote(t: T, door: DoorFacts): string {\n if (!door.followsLabelKey || door.standing === 'not-used' || door.standing === 'missing') {\n return ''\n }\n\n return String(t('text.activity-catalog-follows', { ...RAW, label: doorLabel(t, { labelKey: door.followsLabelKey, name: '' }) }))\n}\n\n/**\n * What the door does when its line is empty (ADR-0077 decision 3), as one quiet line under the line.\n * Only approval doors that stand go through a line at all.\n */\nexport function whenNoLineTag(t: T, door: DoorFacts): string {\n if (door.kind !== 'approval' || !door.whenNoLine) {\n return ''\n }\n\n if (door.standing !== 'on' && door.standing !== 'off') {\n return ''\n }\n\n const why = whyItRefuses(t, door)\n const tag = String(t(`text.door-when-no-line-${door.whenNoLine}`))\n\n return door.whenNoLine === 'refuse' && why ? `${tag} (${why})` : tag\n}\n\n/**\n * The whole catalog in one line, counts only: how many, and how many stand each way. The words are the\n * row marks' own, so the line and the rows read alike. A count of zero is left out.\n */\nexport function doorsSummary(t: T, counts: DoorCounts): string {\n const total = counts.on + counts.off + counts.missing + counts.notUsed\n\n if (!total) {\n return String(t('text.activity-catalog-summary-none'))\n }\n\n const parts: [string, number][] = [\n ['on', counts.on],\n ['off', counts.off],\n ['missing', counts.missing],\n ['not-used', counts.notUsed]\n ]\n\n return [\n String(t('text.activity-catalog-summary-total', { count: total })),\n ...parts\n .filter(([, count]) => count)\n .map(([standing, count]) => String(t('text.activity-catalog-summary-part', { ...RAW, standing: t(`text.door-standing-${standing}`), count })))\n ].join(' · ')\n}\n"]}
1
+ {"version":3,"file":"door-sentence.js","sourceRoot":"","sources":["../../../client/pages/work-door/door-sentence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a row of the activity catalog says, **composed here from facts and translations.**\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ── Why the screen writes them ────────────────────────────────────────────\n * The server used to send each row's sentence and the summary already written, in Korean. An English,\n * Japanese, Chinese or Malay reader got Korean, and the screen had no way to draw a row differently\n * without reading the sentence back apart. The server now sends facts (`WorkDoorType`) and every\n * phrase is a translation key here.\n *\n * ── The line is drawn, not described ──────────────────────────────────────\n * A filled line used to read 「…은 결재자 2명을 지납니다」. The row now draws the line itself (organization's\n * approval-line-brief, steps and names), so the words here are only for what a drawing cannot say: there\n * is no line, nobody holds the role, the form follows another one, it never installed.\n *\n * ── The empty line is the door's declaration ──────────────────────────────\n * What an empty approval line does is declared per door (ADR-0077 decision 1). `run` lets the raiser\n * approve their own; `refuse` refuses the raise; `as-established` turns on how the row stood. A door\n * with no declaration says nothing about the consequence rather than guessing one.\n *\n * Pure: `t` is passed in, so a test can load the real translation files and read the phrases.\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/** The row as this screen holds it, after `door-words` has moved the wire spellings. */\nexport type DoorFacts = {\n name: string\n labelKey: string\n kind: string\n standing: string\n reason: string\n approvers: number\n whenNoLine?: string\n whenNoLineBecause?: string\n followsLabelKey?: string\n assigneeRoles?: string[]\n notUsedBecause?: string\n}\n\nexport type DoorCounts = { on: number; off: number; missing: number; notUsed: number; todo: number }\n\ntype T = (key: string, options?: Record<string, unknown>) => string\n\n/*\n * Values reach the phrase through lit, which escapes them. i18next escaping on top would print\n * `&amp;` in a role name.\n */\nconst RAW = { interpolation: { escapeValue: false } }\n\n/**\n * A door's name. A label key without a translation falls back to the form name - a name a person can\n * search for - rather than printing the key.\n */\nexport function doorLabel(t: T, door: { labelKey: string; name: string }): string {\n return String(t(door.labelKey, { defaultValue: door.name }))\n}\n\n/** Why an approval door will not run on an empty line, as a short phrase. Empty when not declared. */\nexport function whyItRefuses(t: T, door: Pick<DoorFacts, 'whenNoLineBecause'>): string {\n return door.whenNoLineBecause ? String(t(`text.door-refuses-because-${door.whenNoLineBecause}`)) : ''\n}\n\n/**\n * What the line slot says, beside or instead of the drawn line.\n *\n * `drawsLine` is whether the row draws approval steps - the page counts them with organization's rule,\n * which this pure file does not load. A not-used row shows what the plant wrote, as written.\n */\nexport function lineNote(t: T, door: DoorFacts, drawsLine: boolean): string {\n if (door.standing === 'not-used') {\n return door.notUsedBecause ?? ''\n }\n\n if (door.standing === 'missing') {\n return String(t('text.activity-catalog-missing'))\n }\n\n if (door.kind === 'assignment') {\n return door.assigneeRoles?.length\n ? String(t('text.activity-catalog-assignee', { ...RAW, role: door.assigneeRoles.join(', ') }))\n : String(t('text.activity-catalog-no-assignee'))\n }\n\n if (door.reason === 'role-empty' || door.reason === 'person-absent') {\n return String(t(`text.activity-catalog-${door.reason}`))\n }\n\n return drawsLine ? '' : String(t('text.activity-catalog-no-line'))\n}\n\n/** The door whose line this one uses, by name - the line is set there. */\nexport function followsNote(t: T, door: DoorFacts): string {\n if (!door.followsLabelKey || door.standing === 'not-used' || door.standing === 'missing') {\n return ''\n }\n\n return String(t('text.activity-catalog-follows', { ...RAW, label: doorLabel(t, { labelKey: door.followsLabelKey, name: '' }) }))\n}\n\n/**\n * What the door does when its line is empty (ADR-0077 decision 3), as one quiet line under the line.\n * Only approval doors that stand go through a line at all.\n */\nexport function whenNoLineTag(t: T, door: DoorFacts): string {\n if (door.kind !== 'approval' || !door.whenNoLine) {\n return ''\n }\n\n if (door.standing !== 'on' && door.standing !== 'off') {\n return ''\n }\n\n const why = whyItRefuses(t, door)\n const tag = String(t(`text.door-when-no-line-${door.whenNoLine}`))\n\n return door.whenNoLine === 'refuse' && why ? `${tag} (${why})` : tag\n}\n\n/**\n * The whole catalog in one line, counts only: how many, and how many stand each way. The words are the\n * row marks' own, so the line and the rows read alike. A count of zero is left out.\n */\nexport function doorsSummary(t: T, counts: DoorCounts): string {\n const total = counts.on + counts.off + counts.missing + counts.notUsed\n\n if (!total) {\n return String(t('text.activity-catalog-summary-none'))\n }\n\n const parts: [string, number][] = [\n ['on', counts.on],\n ['off', counts.off],\n ['missing', counts.missing],\n ['not-used', counts.notUsed]\n ]\n\n return [\n String(t('text.activity-catalog-summary-total', { count: total })),\n ...parts\n .filter(([, count]) => count)\n .map(([standing, count]) => String(t('text.activity-catalog-summary-part', { ...RAW, standing: t(`text.door-standing-${standing}`), count })))\n ].join(' · ')\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "activity-catalog" | "activity" | "activity-thread-view" | "activity-thread" | "draft-list" | "todo-list" | "approval-pending-list" | "done-list-calendar" | "activity-detail" | "approval-done-list" | "pickable-list" | "starter-list" | "reporter-list" | "activity-list" | "activity-instance-start" | "activity-approval" | "activity-instance-list" | "activity-instance-search" | "activity-template-list" | "activity-store" | "activity-thread-list" | "activity-approval-list" | "installable-activity-list" | "activity-stats-list" | undefined;
1
+ export default function route(page: string): "activity" | "todo-list" | "approval-pending-list" | "draft-list" | "approval-done-list" | "done-list-calendar" | "pickable-list" | "starter-list" | "reporter-list" | "activity-instance-list" | "activity-catalog" | "activity-thread" | "activity-thread-view" | "activity-approval" | "activity-detail" | "activity-list" | "activity-instance-start" | "activity-instance-search" | "activity-template-list" | "activity-store" | "activity-thread-list" | "activity-approval-list" | "installable-activity-list" | "activity-stats-list" | undefined;