diff --git a/packages/client/src/v2-events/features/events/actions/quick-actions/useQuickActionModal.tsx b/packages/client/src/v2-events/features/events/actions/quick-actions/useQuickActionModal.tsx index 7c776998a1d..e9fa8a579f2 100644 --- a/packages/client/src/v2-events/features/events/actions/quick-actions/useQuickActionModal.tsx +++ b/packages/client/src/v2-events/features/events/actions/quick-actions/useQuickActionModal.tsx @@ -19,6 +19,7 @@ import { TertiaryButton } from '@opencrvs/components/lib/buttons' import { Icon, IconProps } from '@opencrvs/components/src/Icon' +import { Stack } from '@opencrvs/components/lib/Stack' import { ActionType, CustomActionConfig, @@ -157,15 +158,17 @@ function QuickActionModal({ width={898} onClose={() => close({ result: false })} > - - - {config.description ? intl.formatMessage(config.description) : null} - + + + {config.description ? intl.formatMessage(config.description) : null} + + + ) } diff --git a/packages/client/src/v2-events/utils.ts b/packages/client/src/v2-events/utils.ts index 178d0914379..13bf05c87b3 100644 --- a/packages/client/src/v2-events/utils.ts +++ b/packages/client/src/v2-events/utils.ts @@ -23,6 +23,8 @@ import { SystemVariables, Scope, ActionScopes, + ConfigurableActionScopes, + parseConfigurableScope, WorkqueueConfigWithoutQuery, joinValues, UUID, @@ -232,7 +234,14 @@ export enum CoreWorkqueues { } export function hasOutboxWorkqueue(scopes: Scope[]) { - return scopes.some((scope) => ActionScopes.safeParse(scope).success) + const hasLiteralActionScopes = scopes.some( + (scope) => ActionScopes.safeParse(scope).success + ) + const parsedScopes = scopes.map(parseConfigurableScope) + const hasConfigurableActionScopes = parsedScopes.some( + (scope) => ConfigurableActionScopes.safeParse(scope).success + ) + return hasLiteralActionScopes || hasConfigurableActionScopes } export function hasDraftWorkqueue(scopes: Scope[]) { diff --git a/packages/commons/src/conditionals/conditionals.test.ts b/packages/commons/src/conditionals/conditionals.test.ts index cfd70d0612a..2cd388dc562 100644 --- a/packages/commons/src/conditionals/conditionals.test.ts +++ b/packages/commons/src/conditionals/conditionals.test.ts @@ -1048,6 +1048,9 @@ describe('"flag" conditionals', () => { expect(validate(flag(InherentFlags.CORRECTION_REQUESTED), params)).toBe( false ) + expect( + validate(not(flag(InherentFlags.CORRECTION_REQUESTED)), params) + ).toBe(true) }) it('validation fails if params dont include flags', () => { diff --git a/packages/commons/src/events/EventConfig.ts b/packages/commons/src/events/EventConfig.ts index bed2710b42d..f5d2aafb70e 100644 --- a/packages/commons/src/events/EventConfig.ts +++ b/packages/commons/src/events/EventConfig.ts @@ -18,7 +18,7 @@ import { DeclarationFormConfig } from './FormConfig' import { FieldType } from './FieldType' import { FieldReference } from './FieldConfig' -import { FlagConfig } from './Flag' +import { FlagConfig, InherentFlags } from './Flag' /** * Description of event features defined by the country. Includes configuration for process steps and forms involved. @@ -134,6 +134,9 @@ export const EventConfig = z } } + const isInherentFlag = (value: unknown): value is InherentFlags => + Object.values(InherentFlags).includes(value as InherentFlags) + // Validate that all referenced action flags are configured in the event flags array. const configuredFlagIds = event.flags.map((flag) => flag.id) const actionFlagIds = event.actions.flatMap((action) => @@ -141,10 +144,13 @@ export const EventConfig = z ) for (const actionFlagId of actionFlagIds) { - if (!configuredFlagIds.includes(actionFlagId)) { + const isConfigured = configuredFlagIds.includes(actionFlagId) + const isInherent = isInherentFlag(actionFlagId) + + if (!isConfigured && !isInherent) { ctx.addIssue({ code: 'custom', - message: `Action flag id must match a configured flag in the flags array. Invalid action flag ID for event '${event.id}': '${actionFlagId}'`, + message: `Action flag id must match an inherent flag or a configured flag in the flags array. Invalid action flag ID for event '${event.id}': '${actionFlagId}'`, path: ['actions'] }) } diff --git a/packages/commons/src/events/Flag.ts b/packages/commons/src/events/Flag.ts index 010291de413..8b526afa207 100644 --- a/packages/commons/src/events/Flag.ts +++ b/packages/commons/src/events/Flag.ts @@ -79,7 +79,7 @@ export type FlagConfig = z.infer * Configuration for a flag action, which is executed when the action is performed. */ export const ActionFlagConfig = z.object({ - id: CustomFlag, + id: Flag, operation: z .enum(['add', 'remove']) .describe('Operation to perform on the flag.'), diff --git a/packages/commons/src/events/state/utils.ts b/packages/commons/src/events/state/utils.ts index 45c4aae03ca..8f5c82bd1d9 100644 --- a/packages/commons/src/events/state/utils.ts +++ b/packages/commons/src/events/state/utils.ts @@ -93,7 +93,8 @@ const updateActions = ActionTypes.extract([ ActionType.REJECT, ActionType.ARCHIVE, ActionType.PRINT_CERTIFICATE, - ActionType.REQUEST_CORRECTION + ActionType.REQUEST_CORRECTION, + ActionType.CUSTOM ]) /** diff --git a/packages/commons/src/icons.ts b/packages/commons/src/icons.ts index ddb7392a31e..b15d9384ab5 100644 --- a/packages/commons/src/icons.ts +++ b/packages/commons/src/icons.ts @@ -83,6 +83,7 @@ export const AvailableIcons = z.enum([ 'Plus', 'Printer', 'SignOut', + 'Stamp', 'Star', 'Target', 'TextT', diff --git a/packages/commons/src/scopes.ts b/packages/commons/src/scopes.ts index ae6b613f94a..0746b0fabbe 100644 --- a/packages/commons/src/scopes.ts +++ b/packages/commons/src/scopes.ts @@ -327,6 +327,12 @@ const ConfigurableRawScopes = z.discriminatedUnion('type', [ CustomActionScope ]) +export const ConfigurableActionScopes = z.discriminatedUnion('type', [ + // @TODO - Record scope holds non-action scopes as well e.g., `record.read` + RecordScope, + CustomActionScope +]) + type ConfigurableRawScopes = z.infer export type ConfigurableScopeType = ConfigurableRawScopes['type'] diff --git a/packages/components/src/Icon/all-icons.ts b/packages/components/src/Icon/all-icons.ts index 4f8dd67eb5e..11ff11811a9 100644 --- a/packages/components/src/Icon/all-icons.ts +++ b/packages/components/src/Icon/all-icons.ts @@ -91,6 +91,7 @@ export { Users, WarningCircle, Webcam, - X + X, + Stamp } from 'phosphor-react' export * from './custom-icons'