@planningcenter/core-automations 1.16.0 → 1.17.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"core-automations.js","sources":["../../src/assets/svg_automations.tsx","../../src/contexts/organization_context.tsx","../../src/utils/alerts.ts","../../src/utils/utils.ts","../../src/history.tsx","../../src/history_modal.tsx","../../src/utils/logos.ts","../../src/utils/response-labelers/people-form.ts","../../src/utils/resolve-response-details.ts","../../src/automation.tsx","../../src/utils/fetch-automations.ts","../../src/incoming_automations.tsx","../../src/definition.tsx","../../src/field.tsx","../../src/fields.tsx","../../src/new_automation.tsx","../../src/new_automation_modal.tsx","../../src/utils/theme.ts","../../src/automations.tsx"],"sourcesContent":["import React from \"react\"\n\nconst SvgAutomations = () => (\n <svg\n id=\"automations_blank\"\n data-name=\"Automations Blank\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 111.112 84.832\"\n className=\"symbol\"\n >\n <title>Automations</title>\n <g opacity=\"0.6\">\n <path\n d=\"M107.784,46.051A57.416,57.416,0,0,1,85.26,75.058c-9.7,6.247-20.045,7.792-31.912,5.185-11.74-2.638-23.339-8-32.92-13.088-9.51-5.342-17-10.236-18.863-17.925C-.26,41.753,3.737,31.4,13.347,21.194,22.85,11.162,37.968,1.853,55.948.321,73.8-1.476,90.2,4.478,99.608,13.164,109.257,21.9,111.921,33.784,107.784,46.051Z\"\n fill=\"#e1f0f9\"\n className=\"svg-background-blob\"\n />\n </g>\n <path\n d=\"M81,27.269v31.8a2.685,2.685,0,0,1-2.685,2.685H44.564a2.685,2.685,0,0,1-2.685-2.685V15.425a2.685,2.685,0,0,1,2.685-2.685h21.91a2.681,2.681,0,0,1,1.9.786L80.217,25.371A2.685,2.685,0,0,1,81,27.269Z\"\n fill=\"#fff\"\n />\n <path\n d=\"M68.479,13.633v9.8a2.035,2.035,0,0,0,2.035,2.034h9.877Z\"\n fill=\"#c9d8e2\"\n />\n <rect\n x=\"51.214\"\n y=\"41.285\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"51.214\"\n y=\"48.434\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"51.214\"\n y=\"34.136\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"11.771\"\n y=\"44.005\"\n width=\"50.915\"\n height=\"6.664\"\n transform=\"translate(-22.93 44.557) rotate(-49.171)\"\n fill=\"#454942\"\n />\n <path\n d=\"M56.283,30.38l-7.557,8.745a5.968,5.968,0,0,0-2.005-2.734,6.292,6.292,0,0,0-3.036-1.624l7.555-8.743a6.275,6.275,0,0,1,3.038,1.624A5.959,5.959,0,0,1,56.283,30.38Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M58.088,28.29l-7.556,8.745a5.968,5.968,0,0,0-2-2.734,6.3,6.3,0,0,0-3.036-1.624l7.555-8.743a6.274,6.274,0,0,1,3.037,1.624A5.959,5.959,0,0,1,58.088,28.29Z\"\n fill=\"#48a5e5\"\n />\n <path\n d=\"M58.724,10.432l1.17,2.7a2.129,2.129,0,0,0,1.4,1.207l2.843.765a.73.73,0,0,1,.1,1.375l-2.7,1.17a2.125,2.125,0,0,0-1.207,1.4L59.56,21.89a.73.73,0,0,1-1.374.1l-1.17-2.7a2.125,2.125,0,0,0-1.4-1.206l-2.843-.766a.73.73,0,0,1-.1-1.374l2.7-1.17a2.121,2.121,0,0,0,1.206-1.4l.766-2.844A.73.73,0,0,1,58.724,10.432Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M44.544,19.294l1.024.868a.968.968,0,0,0,.814.21l1.316-.261a.333.333,0,0,1,.319.541l-.868,1.024a.968.968,0,0,0-.21.814l.261,1.316a.333.333,0,0,1-.541.319l-1.024-.868a.968.968,0,0,0-.814-.21l-1.316.261a.333.333,0,0,1-.319-.541l.868-1.024a.967.967,0,0,0,.21-.814L44,19.613A.333.333,0,0,1,44.544,19.294Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M64.223,25.729l.869,2.005a1.575,1.575,0,0,0,1.036.895l2.109.568a.542.542,0,0,1,.075,1.02l-2,.868a1.576,1.576,0,0,0-.9,1.036l-.568,2.11a.541.541,0,0,1-1.019.074L62.955,32.3a1.572,1.572,0,0,0-1.036-.895l-2.109-.568a.542.542,0,0,1-.075-1.02l2.005-.868a1.572,1.572,0,0,0,.895-1.036L63.2,25.8A.541.541,0,0,1,64.223,25.729Z\"\n fill=\"#fcc846\"\n />\n </svg>\n)\n\nexport default SvgAutomations\n","import { createContext } from \"react\"\n\nexport const OrganizationContext = createContext({\n dateFormat: null,\n olsonTimeZone: null,\n twentyFourHourTime: null,\n})\n","import {\n createConfirmOptions,\n destroyConfirmOptions,\n errorAlertOptions,\n standardAlertOptions,\n standardConfirmOptions,\n successAlertOptions,\n} from \"@planningcenter/sweetalert2\"\nimport Swal from \"sweetalert2/dist/sweetalert2\"\n\nexport const alert = Swal.mixin(standardAlertOptions)\nexport const alertSuccess = Swal.mixin(successAlertOptions)\nexport const alertError = Swal.mixin(errorAlertOptions)\nexport const confirm = Swal.mixin(standardConfirmOptions)\nexport const confirmDestroy = Swal.mixin(destroyConfirmOptions)\nexport const confirmCreate = Swal.mixin(createConfirmOptions)\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { cloneDeep, isBoolean, set } from \"lodash\"\nimport moment from \"moment\"\n\nexport async function deobfuscateDescriptions(\n subscriptions: AutomationInstance[]\n) {\n return Promise.all(\n subscriptions.map(async (subscription) => {\n if (isDeobfuscatable(subscription)) {\n const result = await deobfuscatedDescription(subscription)\n subscription.description = result.description\n subscription.actionResourceUrl = result.actionResourceUrl\n subscription.actionResourceName = result.actionResourceName\n }\n return subscription\n })\n )\n}\n\nfunction isDeobfuscatable(subscription: AutomationInstance) {\n const DEOBFUSCATABLE_OPERATION_DEFINITION_CLASS_NAMES = [\n \"AddToWorkflowOperationDefinition\",\n \"CustomFieldBooleanOperationDefinition\",\n \"CustomFieldCheckboxesOperationDefinition\",\n \"CustomFieldDateOperationDefinition\",\n \"CustomFieldNumberOperationDefinition\",\n \"CustomFieldSelectOperationDefinition\",\n \"CustomFieldStringOperationDefinition\",\n \"CustomFieldTextOperationDefinition\",\n ]\n \n return DEOBFUSCATABLE_OPERATION_DEFINITION_CLASS_NAMES.includes(\n subscription.operationDefinitionClassName\n )\n}\n\nasync function deobfuscatedDescription(subscription: AutomationInstance) {\n let description = \"\"\n if (\n subscription.operationDefinitionClassName ===\n \"AddToWorkflowOperationDefinition\"\n ) {\n const data = await fetchWorkflow(subscription.operationParams.workflowId!)\n const workflow = data[0]\n\n if (workflow?.name) {\n const workflowName = workflow.archivedAt\n ? `[archived] ${workflow.name}`\n : workflow.name\n\n description = subscription.description.replace(\n \"[Hidden Workflow]\",\n workflowName\n )\n return {\n description,\n actionResourceUrl: workflow.links.html,\n actionResourceName: workflowName,\n }\n }\n } else {\n // custom field\n const fieldDefinitionId =\n subscription.operationParams.definitionIdentifier.match(\n /(\\d+)_field_definition/\n )![1]\n const fieldDefinition = await fetchFieldDefinition(fieldDefinitionId)\n if (fieldDefinition.name) {\n description = subscription.description.replace(\n \"[Hidden Custom Field]\",\n fieldDefinition.name\n )\n description +=\n subscription.operationParams.values ||\n fieldDefinition.dataType !== \"checkboxes\"\n ? ` (${customFieldOptionDescription(subscription, fieldDefinition)})`\n : \"\"\n }\n }\n return { description: description || subscription.description }\n}\n\nfunction customFieldOptionDescription(\n subscription: AutomationInstance,\n fieldDefinition: {\n dataType: string\n fieldOptions: { id: number; value: string }[]\n }\n) {\n switch (fieldDefinition.dataType) {\n case \"checkboxes\":\n return Object.entries(subscription.operationParams.values ?? {})\n .map(([id, action]) => {\n const value =\n fieldDefinition.fieldOptions.find(\n (fieldOption) => fieldOption.id === parseInt(id, 10)\n )?.value || \"[Hidden value]\"\n return `${capitalize(action)} ${value}`\n })\n .join(\", \")\n case \"select\": {\n const value = subscription.operationParams.value\n return value\n ? fieldDefinition.fieldOptions.find(\n (fieldOption) => fieldOption.id === parseInt(value, 10)\n )?.value || \"[Hidden value]\"\n : \"Unanswered\"\n }\n case \"boolean\":\n switch (subscription.operationParams.value) {\n case \"true\":\n return \"Yes\"\n case \"false\":\n return \"No\"\n default:\n return \"Unanswered\"\n }\n default:\n return subscription.operationParams.value ?? \"Unanswered\"\n }\n}\n\nfunction capitalize(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2025-03-20\",\n})\n\nasync function fetchWorkflow(workflowId: number) {\n const { data } = await peopleClient\n .get({\n data: {\n fields: { Workflow: \"name,archived_at\" },\n where: { id: workflowId },\n },\n url: `workflows`,\n })\n .catch(() => [{ data: { name: \"\" } }])\n\n return data\n}\n\nasync function fetchFieldDefinition(fieldDefinitionId: string) {\n const { data } = await peopleClient\n .get({\n data: {\n fields: {\n FieldDefinition: \"name,data_type,field_options\",\n FieldOption: \"value\",\n },\n include: \"field_options\",\n },\n url: `field_definitions/${fieldDefinitionId}`,\n })\n .catch(() => ({ data: { name: \"\" } }))\n\n return data\n}\n\nexport function fieldListIdentifier(field: DefinitionField) {\n if (field.listClass) {\n return `${field.id}_${field.listClass}`\n } else if (field.kind === \"PersonSearch\") {\n return `${field.id}_PersonSearch`\n } else {\n return null\n }\n}\n\nexport function buildDescription({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n}: {\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n return {\n description: describeSelectedFields({\n loadedLists: loadedLists || {},\n selectedDefinition,\n selectedFieldOptions,\n }),\n name: buildDescriptionName(selectedDefinition),\n }\n}\n\nfunction obfuscateDescriptionName(definition: OperationDefinition) {\n if (definition.definitionClass.match(/^CustomField\\w+OperationDefinition$/)) {\n return \"Update [Hidden Custom Field]\"\n }\n}\n\nfunction buildDescriptionName(definition: OperationDefinition) {\n return obfuscateDescriptionName(definition) || definition.description\n}\n\nfunction hasOwnProperty(object: object, key: PropertyKey) {\n return Object.prototype.hasOwnProperty.call(object, key)\n}\n\nfunction getListForField({\n field,\n loadedLists,\n}: {\n field: DefinitionField\n loadedLists: { [k: string]: LoadedList[] }\n}) {\n if (field.list) {\n return field.list\n } else if (fieldListIdentifier(field)) {\n const identifier = fieldListIdentifier(field) as string\n const list = loadedLists[identifier]\n\n return list\n } else {\n throw new Error(`Don't know how to get list for ${JSON.stringify(field)}`)\n }\n}\n\nexport function buildTriggerConditions({\n baseConditions,\n dynamicConditions,\n dynamicTriggerConditions,\n}: {\n baseConditions: object\n dynamicConditions: DefinitionField[] | undefined\n dynamicTriggerConditions: SelectedFieldOptions\n}) {\n const triggerConditions = cloneDeep(baseConditions)\n const fields = dynamicConditions ?? []\n const writableFields = fields.filter((field) => {\n if (field.renderOnly) return false\n return renderIfChainSatisfied(field, fields, dynamicTriggerConditions)\n })\n\n for (const field of writableFields) {\n if (\n Object.prototype.hasOwnProperty.call(dynamicTriggerConditions, field.id)\n ) {\n set(triggerConditions, field.id, dynamicTriggerConditions[field.id])\n }\n }\n\n return triggerConditions\n}\n\nfunction shouldRender(\n field: DefinitionField,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (!Object.prototype.hasOwnProperty.call(field, \"renderIf\")) return true\n\n const renderIf = field.renderIf!\n if (isBoolean(renderIf)) return renderIf\n\n const conditionKey = Object.keys(renderIf)[0]\n return renderIf[conditionKey] === selectedFieldOptions[conditionKey]\n}\n\nfunction renderIfChainSatisfied(\n field: DefinitionField,\n allFields: DefinitionField[],\n selectedFieldOptions: SelectedFieldOptions\n): boolean {\n if (!shouldRender(field, selectedFieldOptions)) return false\n\n const renderIf = field.renderIf\n if (renderIf == null || renderIf === true) return true\n\n const upstreamId = Object.keys(renderIf)[0]\n const upstream = allFields.find((f) => f.id === upstreamId)\n if (!upstream) return true\n return renderIfChainSatisfied(upstream, allFields, selectedFieldOptions)\n}\n\nexport function getRenderedFields(\n definitionFields: DefinitionField[],\n selectedFieldOptions: SelectedFieldOptions\n) {\n return definitionFields.filter(\n (field) =>\n field.kind !== \"Hidden\" &&\n renderIfChainSatisfied(field, definitionFields, selectedFieldOptions)\n )\n}\n\nfunction describeSelectedFields({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n}: {\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n const description = selectedDefinition.definitionFields\n .map((field) => {\n if (!hasOwnProperty(selectedFieldOptions, field.id)) return null\n\n const value = selectedFieldOptions[field.id]\n let list\n\n switch (field.kind) {\n case \"Select\":\n case \"SelectSearch\":\n case \"PersonSearch\":\n case \"RadioButtons\":\n list = getListForField({ field, loadedLists })\n\n return (\n list && list.find((o) => o.value.toString() === value)?.description\n )\n case \"Checkbox\":\n return value && field.label\n case \"Checkboxes\":\n list = getListForField({ field, loadedLists })\n\n return list\n .filter((e) => hasOwnProperty(value as object, e.value))\n .map(\n (e) =>\n `${capitalize((value as Record<string, string>)[e.value])} ${\n e.description\n }`\n )\n .join(\", \")\n case \"NumberField\":\n case \"TextField\":\n case \"TextArea\":\n case \"DateField\":\n return value\n default:\n throw new Error(\n `Don't know how to build value for field with kind ${field.kind}`\n )\n }\n })\n .filter((x) => x)\n .join(\", \")\n\n return obfuscateSelectedFieldDescriptions({\n description,\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n })\n}\n\nfunction obfuscateSelectedFieldDescriptions({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n description,\n}: {\n description: string\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n if (\n selectedDefinition.definitionClass === \"AddToWorkflowOperationDefinition\"\n ) {\n const list = loadedLists.workflow_id_WorkflowsList\n const sensitiveString =\n list &&\n list.find((o) => o.value.toString() === selectedFieldOptions.workflow_id)\n ?.description\n\n return sensitiveString\n ? description.replace(sensitiveString, \"[Hidden Workflow]\")\n : description\n } else if (\n selectedDefinition.definitionClass.match(\n /^CustomField\\w+OperationDefinition$/\n )\n ) {\n return \"\"\n } else {\n return description\n }\n}\n\nexport function dateFNSFormat(format: string) {\n return format\n .replace(/%m/, \"M\")\n .replace(/%d/, \"d\")\n .replace(/%Y/, \"y\")\n .replace(/%y/, \"yy\")\n}\n\nexport function momentDateFormat(format: string) {\n return format\n .replace(/%m/, \"MM\")\n .replace(/%d/, \"DD\")\n .replace(/%Y/, \"YYYY\")\n .replace(/%y/, \"YY\")\n}\n\nexport function momentDateTimeFormat({\n dateFormat,\n twentyFourHourTime,\n}: {\n dateFormat: string\n twentyFourHourTime: boolean\n}) {\n return `${momentDateFormat(dateFormat)} ${\n twentyFourHourTime ? \"HH:mm\" : \"h:mm A\"\n }`\n}\n\nexport function dateLocalized(date: string, dateFormat: string) {\n const momentDate = moment(date, \"YYYY-MM-DD\")\n if (!momentDate.isValid()) {\n return \"\"\n }\n\n const format = momentDateFormat(dateFormat)\n return momentDate.format(format)\n}\n\nexport function numDaysSince(date: string) {\n const momentDate = moment(date, \"YYYY-MM-DD\")\n return moment().diff(momentDate, \"days\")\n}\n\nexport function pluralize(count: number, word: string) {\n if (count === 1) {\n return `1 ${word}`\n } else {\n return `${count} ${word}s`\n }\n}\n\nexport function singularize(string: string) {\n return string.replace(/s$/, \"\")\n}\n\nexport function upperFirst(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nexport function triggerResourceParts(triggerResource: string) {\n const triggerParts = triggerResource.split(\"/\")\n\n return {\n appName: triggerParts[0],\n resourceId: triggerParts[triggerParts.length - 1],\n resourcePath: triggerParts.slice(2, -1).join(\"/\"),\n resourceType: triggerParts[triggerParts.length - 2],\n }\n}\n\nexport function forbiddenText(error: any, action?: string) {\n if (error.errors?.[0]?.status === \"403\") {\n return `You don't have permission to ${action || \"modify\"} this automation.`\n }\n return null\n}\n\nexport function parseDescription(description: string) {\n const match = /^(.+?)\\((.+)\\)$/.exec(description)\n\n if (match) {\n return { description: match[\"2\"], name: match[\"1\"].trim() }\n } else {\n return { name: description }\n }\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Badge,\n Box,\n Button,\n DataTable,\n Heading,\n Icon,\n Input,\n Link,\n Select,\n StackView,\n Text,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport moment from \"moment-timezone\"\nimport React, { useCallback, useContext, useEffect, useState } from \"react\"\n\nimport SvgAutomations from \"./assets/svg_automations\"\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n dateLocalized,\n momentDateTimeFormat,\n numDaysSince,\n parseDescription,\n} from \"./utils/utils\"\n\ndeclare global {\n interface Window {\n openHelpdesk: () => void\n }\n}\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2022-07-14\",\n})\n\n// values should match the webhooks Event `status` enum entries\nconst STATUS = {\n delivered: {\n label: \"Success\",\n value: [\"delivered\"],\n },\n failed: {\n label: \"Failed\",\n value: [\"failed\", \"duplicated\"],\n },\n ignored: {\n label: \"Ignored\",\n value: [\"ignored_duplicated\", \"ignored_failed\", \"ignored_skipped\"],\n },\n pending: {\n label: \"Pending\",\n value: [\"pending\"],\n },\n skipped: {\n label: \"Paused\",\n value: [\"skipped\"],\n },\n}\n\nasync function fetchEvents(\n triggerResource: EncryptedTriggerResource,\n automationId: number,\n params: {\n offset: number\n per_page: number\n where?: { status: string } | null\n }\n) {\n const response = await webhooksClient.get({\n data: {\n _e: triggerResource,\n fields: {\n Delivery: \"status,response_body,created_at\",\n Event: \"id,created_at,last_delivery,payload,status,uuid,person\",\n },\n include: \"last_delivery\",\n order: \"-created_at\",\n ...params,\n },\n url: `automation_subscriptions/${automationId}/events`,\n })\n\n return response\n}\n\nasync function fetchPeople(personIds) {\n const { data } = await peopleClient.get({\n data: {\n fields: {\n Person: \"id,name\",\n },\n where: { id: personIds.join(\",\") },\n },\n url: `people`,\n })\n\n return data\n}\n\nasync function fetchPeopleWhoTriggeredEvents(events) {\n const personIds = events.data.map((e) => eventPersonId(e))\n try {\n const people = await fetchPeople(personIds)\n return { events, people }\n } catch (error) {\n return { events, people: [] }\n }\n}\n\nfunction mergePeopleAndEvents({ events, people }) {\n const mergedData = events.data.reduce((result, e) => {\n const personId = eventPersonId(e)\n const foundPerson = people.find(\n (p) => personId.toString() === p.id.toString()\n )\n if (foundPerson) {\n result.push({\n ...e,\n person: { id: foundPerson.id, name: foundPerson.name },\n })\n } else {\n result.push({\n ...e,\n person: { id: personId, name: \"[Hidden]\" },\n })\n }\n return result\n }, [])\n\n return { ...events, data: mergedData }\n}\n\nfunction eventPersonId(event) {\n return event.personId\n}\n\nfunction useEvents(\n automationId: number,\n triggerResource: EncryptedTriggerResource,\n filterWhere?: string\n) {\n const perPage = 50\n const [_, setError] = useState()\n const [loading, setLoading] = useState(false)\n const [eventPages, setEventPages] = useState<{ [k: number]: EventPage[] }>({})\n const [params, setParams] = useState<{ where?: { status: string } | null }>(\n filterWhere ? { where: { status: filterWhere } } : {}\n )\n const [meta, setMeta] = useState<{ totalCount: number | any }>()\n const { offset, paginationProps, resetOffset } = usePagination(\n perPage,\n meta?.totalCount\n )\n useEffect(() => {\n if (loading || eventPages[offset]) return\n\n setLoading(true)\n\n fetchEvents(triggerResource, automationId, {\n offset,\n per_page: perPage,\n ...params,\n })\n .then(fetchPeopleWhoTriggeredEvents)\n .then(mergePeopleAndEvents)\n .then((events) => {\n setEventPages((pages) => ({ ...pages, [offset]: events.data }))\n setMeta(events.meta)\n setLoading(false)\n })\n .catch(bubbleErrorToBoundary)\n }, [automationId, triggerResource, loading, params, offset, eventPages])\n\n const refresh = useCallback(() => {\n setEventPages({})\n setMeta(undefined)\n resetOffset()\n }, [resetOffset])\n\n useEffect(() => {\n refresh()\n }, [refresh, params])\n\n function bubbleErrorToBoundary(error) {\n setError(() => {\n throw error\n })\n }\n\n return {\n events: eventPages[offset] || [],\n loading,\n paginationProps,\n params,\n refresh,\n setParams,\n }\n}\n\nfunction usePagination(perPage: number, totalCount: number) {\n const [offset, setOffset] = useState(0)\n\n const currentPage = Math.floor(offset / perPage) + 1\n const totalPages = Math.ceil(totalCount / perPage)\n const paginationProps = { currentPage, onPageChange, totalPages }\n\n function onPageChange(pageNum: number) {\n setOffset((pageNum - 1) * perPage)\n }\n\n const resetOffset = useCallback(() => {\n setOffset(0)\n }, [])\n\n return { offset, paginationProps, resetOffset }\n}\n\ntype HistoryProps = {\n automation: AutomationInstance\n filterWhere?: string\n onEventsStatusChange: Function\n onRequestClose?: () => void\n triggerResource: EncryptedTriggerResource\n}\n\nfunction History({\n automation,\n triggerResource,\n filterWhere,\n onEventsStatusChange,\n}: HistoryProps) {\n const { events, loading, paginationProps, refresh, params, setParams } =\n useEvents(automation.id, triggerResource, filterWhere)\n const { dateFormat, olsonTimeZone, twentyFourHourTime } = useContext<{\n dateFormat: any\n olsonTimeZone: any\n twentyFourHourTime: any\n }>(OrganizationContext)\n\n const filteringEvents = params.where && Object.keys(params.where).length > 0\n const automationCreatedRecently = numDaysSince(automation.createdAt) <= 32\n const automationBeganOn = dateLocalized(automation.createdAt, dateFormat)\n const historyPreservationAlert = automationCreatedRecently\n ? `Automation history started on ${automationBeganOn}`\n : \"Automation history is saved for 32 days\"\n\n const showTzLabel =\n Intl.DateTimeFormat().resolvedOptions().timeZone !== olsonTimeZone\n\n const { name, description } = parseDescription(automation.description)\n const { actionResourceUrl, actionResourceName } = automation\n let before = \"\"\n let after = \"\"\n if (description && actionResourceName) {\n const nameIndex = description.indexOf(actionResourceName)\n if (nameIndex !== -1) {\n before = description.slice(0, nameIndex)\n after = description.slice(nameIndex + actionResourceName.length)\n }\n }\n\n const columns = [\n {\n cell: (event: EventPage) => <EventStatusBadge status={event.status} />,\n css: {\n padding: \"8px 12px\",\n },\n header: \"Status\",\n },\n {\n cell: (event: EventPage) => {\n const baseFormat = momentDateTimeFormat({ dateFormat, twentyFourHourTime })\n const format = showTzLabel ? `${baseFormat} z` : baseFormat\n return moment.tz(event.createdAt, olsonTimeZone).format(format)\n },\n header: \"Date and time\",\n },\n {\n cell: (event: EventPage) => (\n <Link to={`/people/AC${event.person.id}`}>{event.person.name}</Link>\n ),\n css: {\n maxWidth: \"33%\",\n },\n header: \"Profile\",\n },\n {\n cell: (event: EventPage) => <EventStatusMessage event={event} />,\n css: {\n flex: 1,\n },\n header: \"Message\",\n },\n {\n cell: (event: EventPage) =>\n ![...STATUS.delivered.value, ...STATUS.pending.value].includes(\n event.status\n ) && (\n <>\n <RetryEventButton\n automationId={automation.id}\n event={event}\n triggerResource={triggerResource}\n onEventsStatusChange={onEventsStatusChange}\n />\n {![...STATUS.ignored.value].includes(event.status) && (\n <IgnoreEventButton\n automationId={automation.id}\n event={event}\n triggerResource={triggerResource}\n refreshHistory={refresh}\n onEventsStatusChange={onEventsStatusChange}\n />\n )}\n </>\n ),\n css: {\n textAlign: \"right\",\n },\n header: \"\",\n minWidth: \"84px\",\n },\n ]\n\n return (\n <StackView spacing={token(\"--t-spacing-4\")}>\n <StackView spacing={token(\"--t-spacing-half\")}>\n <Heading\n level={3}\n size=\"16px\"\n color={token(\"--t-text-color-secondary\")}\n weight={token(\"--t-font-weight-medium\")}\n >\n {name}{description && (\n <>\n {\" \"}({actionResourceUrl && actionResourceName\n ? <>{before}<Link to={actionResourceUrl}>{actionResourceName}</Link>{after}</>\n : description\n })\n </>\n )}\n </Heading>\n <Text\n color={token(\"--t-text-color-secondary\")}\n size={token(\"--t-font-size-xs\")}\n italic\n >\n {historyPreservationAlert}\n </Text>\n </StackView>\n <StackView spacing={token(\"--t-spacing-2\")}>\n <Box minHeight={7}>\n {!loading && (events.length || filteringEvents) && (\n <StackView\n alignItems=\"end\"\n axis=\"horizontal\"\n distribution=\"space-between\"\n spacing={token(\"--t-spacing-1\")}\n >\n <StackView width=\"max-content\">\n <Input.InputLabel\n fontWeight={token(\"--t-font-weight-medium\")}\n color={token(\"--t-text-color\")}\n controls=\"select-status\"\n >\n Filter by status\n </Input.InputLabel>\n <Select\n id=\"select-status\"\n emptyValue={null}\n onChange={({ selectedValue }) => {\n const newWhere = selectedValue\n ? { status: selectedValue }\n : null\n setParams({ where: newWhere })\n }}\n title=\"Status\"\n value={params.where?.status}\n >\n <Select.Option value={null}>All</Select.Option>\n {Object.values(STATUS).map((status) => (\n <Select.Option\n key={status.value}\n value={status.value.join(\",\")}\n >\n {status.label}\n </Select.Option>\n ))}\n </Select>\n </StackView>\n <Button\n iconLeft={{ name: \"general.refresh\" }}\n onClick={refresh}\n theme=\"primary\"\n variant=\"outline\"\n width={12}\n >\n Refresh\n </Button>\n </StackView>\n )}\n </Box>\n <Box maxHeight=\"70vh\" minHeight={36} overflow=\"auto\">\n <DataTable\n columns={columns}\n data={events}\n empty={\n <StackView\n alignment=\"center\"\n distribution=\"center\"\n minHeight={20}\n maxWidth={45}\n spacing={token(\"--t-spacing-1\")}\n marginTop={!filteringEvents ? -8 : -4}\n marginBottom={!filteringEvents ? undefined : 4}\n >\n <Box\n css={{\n svg: {\n height: 15,\n width: 20,\n },\n }}\n >\n <SvgAutomations />\n </Box>\n <Heading\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n level={4}\n size={token(\"--t-font-size-lg\")}\n >\n No history found\n </Heading>\n <Text fontSize={token(\"--t-font-size-md\")} textAlign=\"center\">\n No events {filteringEvents && \"matching your filters\"} were\n triggered for this automation{\" \"}\n {automationCreatedRecently\n ? `since ${automationBeganOn}.`\n : \"in the last 32 days.\"}\n </Text>\n {filteringEvents && (\n <Button\n marginTop={token(\"--t-spacing-1\")}\n onClick={() => setParams({})}\n theme=\"primary\"\n title=\"Clear filters\"\n variant=\"outline\"\n />\n )}\n </StackView>\n }\n loading={loading}\n loadingTitle=\"Loading automation history...\"\n variant={{\n bodyCell: {\n alignItems: \"start\",\n fontSize: token(\"--t-font-size-sm\"),\n lineHeight: \"20px\",\n padding: \"10px 12px\",\n },\n bodyRow: ({ rowData }) => {\n return {\n backgroundColor: [...STATUS.ignored.value].includes(\n rowData.status\n )\n ? token(\"--t-fill-color-neutral-090\")\n : undefined,\n minHeight: \"36px\",\n }\n },\n headerCell: {\n padding: \"8px 12px\",\n },\n headerRow: {\n minHeight: \"36px\",\n },\n }}\n {...paginationProps}\n />\n </Box>\n </StackView>\n </StackView>\n )\n}\n\nfunction RetryEventButton({\n automationId,\n event,\n triggerResource,\n onEventsStatusChange,\n}: {\n automationId: number\n event: EventPage\n onEventsStatusChange: Function\n triggerResource: EncryptedTriggerResource\n}) {\n const [status, setStatus] = useState(event.status)\n\n function handleRetry() {\n setStatus(STATUS.pending.value.join(\",\"))\n webhooksClient\n .post({\n data: {\n _e: triggerResource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automationId}/events/${event.id}/redeliver`,\n })\n .then((response) => {\n setStatus(STATUS.delivered.value.join(\",\"))\n onEventsStatusChange(response.meta.eventsStatus)\n })\n .catch(() => {\n setStatus(STATUS.failed.value.join(\",\"))\n alerts.alertError.fire({\n text: \"There was a problem retrying this automation. Please try again in a few moments.\",\n title: \"Uh oh!\",\n })\n })\n }\n\n const retryTitleFromStatus = STATUS.pending.value.includes(status)\n ? \"Sending\"\n : STATUS.delivered.value.includes(status)\n ? \"Sent\"\n : STATUS.skipped.value.includes(status)\n ? \"Run now\"\n : \"Retry\"\n\n const statusIcon = STATUS.delivered.value.includes(status)\n ? { color: token(\"--t-text-color-status-success\"), name: \"general.check\" }\n : undefined\n\n return (\n <Button\n title={retryTitleFromStatus}\n onClick={handleRetry}\n iconLeft={statusIcon}\n disabled={status !== event.status}\n variant=\"naked\"\n color={\n STATUS.delivered.value.includes(status)\n ? token(\"--t-text-color-status-success\")\n : STATUS.pending.value.includes(status)\n ? token(\"--t-text-color-placeholder\")\n : token(\"--t-text-color-interaction\")\n }\n theme=\"primary\"\n size=\"xs\"\n />\n )\n}\n\nfunction IgnoreEventButton({\n automationId,\n event,\n triggerResource,\n refreshHistory,\n onEventsStatusChange,\n}: {\n automationId: number\n event: EventPage\n onEventsStatusChange: Function\n refreshHistory: Function\n triggerResource: EncryptedTriggerResource\n}) {\n function handleIgnore() {\n webhooksClient\n .post({\n data: {\n _e: triggerResource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automationId}/events/${event.id}/ignore`,\n })\n .then((response) => {\n onEventsStatusChange(response.meta.eventsStatus)\n })\n .then(() => refreshHistory())\n .catch(() => {\n alerts.alertError.fire({\n text: \"There was a problem ignoring this event. Please try again in a few moments.\",\n title: \"Uh oh!\",\n })\n })\n }\n\n return (\n <Button\n title={\"Ignore\"}\n onClick={handleIgnore}\n variant=\"naked\"\n color={\"linkForeground\"}\n theme=\"primary\"\n size=\"xs\"\n />\n )\n}\n\nfunction EventStatusBadge({ status }: { status: string }) {\n const badgeColors = STATUS.pending.value.includes(status)\n ? {\n border: token(\"--t-border-color-dark\"),\n text: token(\"--t-text-color\"),\n }\n : STATUS.delivered.value.includes(status)\n ? {\n border: token(\"--t-border-color-status-success\"),\n text: token(\"--t-text-color-status-success\"),\n }\n : STATUS.skipped.value.includes(status)\n ? {\n border: token(\"--t-border-color-status-warning\"),\n text: token(\"--t-text-color-status-warning\"),\n }\n : STATUS.ignored.value.includes(status)\n ? {\n border: token(\"--t-border-color-dark\"),\n text: token(\"--t-text-color-secondary\"),\n }\n : {\n border: token(\"--t-border-color-status-error\"),\n text: token(\"--t-text-color-status-error\"),\n }\n\n const badgeIcon = STATUS.pending.value.includes(status)\n ? \"general.clock\"\n : STATUS.skipped.value.includes(status)\n ? \"services.pause\"\n : STATUS.delivered.value.includes(status)\n ? \"general.checkCircle\"\n : STATUS.ignored.value.includes(status)\n ? \"general.inactive\"\n : \"general.exclamationTriangle\"\n\n const badgeTitle = STATUS.failed.value.includes(status)\n ? STATUS.failed.label\n : STATUS.ignored.value.includes(status)\n ? STATUS.ignored.label\n : STATUS[status].label\n\n return (\n <Badge\n color={{ background: \"transparent\", foreground: badgeColors.text }}\n css={{ paddingLeft: 3.5, paddingRight: 1.5 }}\n fontSize={token(\"--t-font-size-xs\")}\n radius=\"pill\"\n renderLeft={\n <Icon\n name={badgeIcon}\n color={badgeColors.border}\n marginLeft={token(\"--t-spacing-1\")}\n />\n }\n size=\"sm\"\n stroke={badgeColors.border}\n strokeAlign=\"inside\"\n strokeWeight={1}\n title={badgeTitle}\n />\n )\n}\n\nfunction EventStatusMessage({ event }: { event: EventPage }) {\n const { status, lastDelivery } = event\n\n function statusMessage(status: string, lastDelivery: Delivery) {\n let message: string | JSX.Element | null = null\n\n switch (status) {\n case \"skipped\":\n case \"ignored_skipped\":\n message = \"Automation was paused and did not run on this profile\"\n break\n case \"failed\":\n case \"duplicated\":\n case \"ignored_failed\":\n case \"ignored_duplicated\":\n message = deliveryFailureReason(lastDelivery, status)\n }\n\n return message\n }\n\n function deliveryFailureReason(delivery: Delivery, status: string) {\n const ERRORS = {\n 403: \"Owner doesn't have permission to perform this action.\",\n 404: \"Owner lacks access to target product or resource doesn't exist.\",\n 422: \"The automation action failed to run\",\n default: \"An error occurred\",\n duplicated_event:\n \"Didn't run because the same action had already been performed less than 60 seconds ago\",\n failed_without_deliveries:\n \"Didn't run because the owner doesn't have permissions in this product.\",\n }\n\n function responseErrors(delivery: Delivery) {\n if (!delivery?.responseBody) return null\n let response\n\n try {\n response = JSON.parse(delivery.responseBody)\n } catch {\n response = { errors: [\"Server Error\"] }\n }\n\n return parsedErrors(response).join(\", \") || response?.message\n }\n\n function parsedErrors(response) {\n if (response?.errors) {\n return response.errors.map((error) =>\n typeof error === \"string\" && error.match(/Archived profiles/)\n ? error.replace(/Archived profiles/, \"Archived profiles.\")\n : error\n )\n } else {\n return []\n }\n }\n\n return (\n <StackView flex={1} whiteSpace=\"normal\">\n {!delivery ? (\n [\"duplicated\", \"ignored_duplicated\"].includes(status) ? (\n ERRORS.duplicated_event\n ) : (\n ERRORS.failed_without_deliveries\n )\n ) : (\n <ToggleableDetails\n details={responseErrors(delivery)}\n status={delivery.status}\n >\n {ERRORS[delivery.status] || ERRORS.default}\n </ToggleableDetails>\n )}\n </StackView>\n )\n }\n\n const message = statusMessage(status, lastDelivery)\n\n return message ? (\n <Box\n fontSize={token(\"--t-font-size-sm\")}\n fontStyle=\"italic\"\n lineHeight=\"16px\"\n maxWidth=\"100%\"\n paddingTop=\"1px\"\n whiteSpace=\"normal\"\n >\n {message}\n </Box>\n ) : null\n}\n\nfunction ToggleableDetails({\n children,\n details,\n status,\n}: {\n children: React.ReactNode\n details: string\n status: string\n}) {\n const [open, setOpen] = useState(false)\n\n function toggleOpen() {\n setOpen((was) => !was)\n }\n\n return (\n <StackView spacing={token(\"--t-spacing-1\")}>\n <Box>\n {children}{\" \"}\n {details && (\n <Button\n inline\n onClick={toggleOpen}\n size=\"xs\"\n theme=\"primary\"\n variant=\"naked\"\n fontStyle=\"normal\"\n >\n Details\n </Button>\n )}\n </Box>\n {open ? (\n <Box padding={1} background={token(\"--t-fill-color-neutral-090\")}>\n <Text\n fontFamily=\"monospace\"\n fontSize={token(\"--t-font-size-xs\")}\n lineHeight=\"1.2\"\n >\n {status && `${status}: `}\n {details}\n </Text>\n </Box>\n ) : null}\n </StackView>\n )\n}\n\ntype ErrorBoundaryProps = {\n children: React.ReactNode\n onRequestClose?: () => void\n}\n\ntype ErrorBoundaryState = {\n hasError: boolean\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n handleContactSupport = () => {\n if (this.props.onRequestClose) {\n this.props.onRequestClose()\n }\n window.openHelpdesk()\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <Alert\n type=\"error\"\n marginVertical={1}\n padding={1.5}\n css={{ boxShadow: \"none\" }}\n >\n <Text lineHeight=\"1.35\">\n The application hit an unexpected error. If this persists after a\n few minutes, please let us know so we can get it fixed for you.{\" \"}\n <button\n style={{\n color: token(\"--t-text-color-interaction\"),\n whiteSpace: \"nowrap\",\n }}\n onClick={this.handleContactSupport}\n >\n Contact support\n </button>\n .\n </Text>\n </Alert>\n )\n }\n\n return this.props.children\n }\n}\n\n// eslint-disable-next-line react/display-name\nexport default (props: HistoryProps) => (\n <ErrorBoundary onRequestClose={props.onRequestClose}>\n <History {...props}></History>\n </ErrorBoundary>\n)\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Button,\n Heading,\n Modal,\n StackView,\n ThemeProvider,\n} from \"@planningcenter/tapestry-react\"\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\n\nfunction CloseModalIcon({ onClick }: { onClick: React.MouseEventHandler }) {\n return (\n <Button\n as=\"button\"\n height={token(\"--t-element-size-md\")}\n icon={{\n color: token(\"--t-icon-color-dim\"),\n name: \"general.x\",\n }}\n onClick={onClick}\n size=\"sm\"\n title=\"Close\"\n variant=\"naked\"\n />\n )\n}\n\nfunction HistoryModal({\n children,\n onRequestClose,\n open,\n theme,\n}: {\n children: React.ReactNode\n onRequestClose: () => void\n open: boolean\n theme: object\n}): React.ReactPortal | JSX.Element {\n return createPortal(\n <ThemeProvider theme={theme}>\n <Modal\n open={open}\n onRequestClose={onRequestClose}\n maxWidth={120}\n boxShadow=\"0 0 20px rgba(0, 0, 0, 0.15)\"\n padding={token(\"--t-spacing-4\")}\n paddingBottom={token(\"--t-spacing-3\")}\n radius={token(\"--t-border-radius-lg\")}\n >\n <StackView\n axis=\"horizontal\"\n distribution=\"space-between\"\n alignment=\"center\"\n >\n <Heading\n level={2}\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n fontSize={token(\"--t-font-size-2xl\")}\n lineHeight=\"1.4\"\n >\n Automation history\n </Heading>\n <CloseModalIcon onClick={onRequestClose} />\n </StackView>\n {children}\n </Modal>\n </ThemeProvider>,\n document.body\n )\n}\n\nexport default HistoryModal\n","import { Logo } from \"@planningcenter/tapestry-react\"\nimport { kebabCase } from \"lodash\"\nimport type { ComponentProps } from \"react\"\n\n// Extract valid logo names from the Logo component's props\ntype ValidLogoName = NonNullable<ComponentProps<typeof Logo>[\"name\"]>\n\n// List of valid logo names from @planningcenter/tapestry-react Logo component\n// Update this list when support for new products are added to tapestry-react\nconst VALID_LOGO_NAMES: ValidLogoName[] = [\n \"api\",\n \"calendar\",\n \"check-ins\",\n \"church-center\",\n \"giving\",\n \"groups\",\n \"headcounts\",\n \"home\",\n \"login\",\n \"music-stand\",\n \"people\",\n \"planning-center\",\n \"publishing\",\n \"registrations\",\n \"services\",\n]\n\nexport const isValidLogoName = (name: string): name is ValidLogoName => {\n return VALID_LOGO_NAMES.includes(name as ValidLogoName)\n}\n\nexport const getValidLogoName = (name: string): ValidLogoName => {\n const kebabName = kebabCase(name)\n return isValidLogoName(kebabName) ? kebabName : \"planning-center\"\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { uniq } from \"lodash\"\n\nimport type { ResponseLabeler } from \"./types\"\n\nconst HIDDEN_FIELD = \"[Hidden Field]\"\nconst HIDDEN_RESPONSE = \"[Hidden Response]\"\nconst FIELD_KEY_RE = /^field_(\\d+)$/\nconst SENTINEL_VALUES = new Set([\"no-option\"])\n\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2025-03-20\",\n})\n\ntype FormFieldRecord = {\n fieldType: string\n fieldableId: number | null\n fieldableType: string | null\n id: number\n label: string | null\n options?: { id: number; label: string | null }[]\n}\n\ntype FieldDefinitionRecord = {\n dataType: string\n fieldOptions?: { id: number; value: string | null }[]\n id: number\n name: string | null\n}\n\ntype CampusRecord = {\n id: number\n name: string | null\n}\n\ntype ExtractedIds = {\n fieldId: string\n formId: string\n optionId: string | null\n}\n\nasync function resolve(\n subscriptions: AutomationInstance[]\n): Promise<AutomationInstance[]> {\n const extracted = subscriptions.map((sub) => ({\n ids: extractIds(sub),\n sub,\n }))\n const targets = extracted.filter(\n (entry): entry is { ids: ExtractedIds; sub: AutomationInstance } =>\n entry.ids !== null\n )\n if (targets.length === 0) return subscriptions\n\n const fieldsByForm = await fetchFormFields(\n uniq(targets.map((t) => t.ids.formId))\n )\n\n const fieldDefIds = new Set<string>()\n const campusIds = new Set<string>()\n for (const { ids } of targets) {\n const field = fieldsByForm.get(ids.formId)?.get(ids.fieldId)\n if (field?.fieldType === \"custom_field\" && field.fieldableId != null) {\n fieldDefIds.add(String(field.fieldableId))\n } else if (field?.fieldType === \"primary_campus\" && ids.optionId != null) {\n campusIds.add(ids.optionId)\n }\n }\n const [fieldDefs, campuses] = await Promise.all([\n fetchFieldDefinitions([...fieldDefIds]),\n fetchCampuses([...campusIds]),\n ])\n\n return extracted.map(({ ids, sub }) => {\n if (!ids) return sub\n return {\n ...sub,\n responseDetails: buildResponseDetails(\n ids,\n fieldsByForm,\n fieldDefs,\n campuses\n ),\n }\n })\n}\n\nfunction extractIds(subscription: AutomationInstance): ExtractedIds | null {\n const conds = subscription.triggerConditions\n const formId = conds?.data?.relationships?.form?.data?.id\n const selectedOptionsByField = conds?.data?.attributes?.selectedOptionsByField\n if (\n formId == null ||\n !selectedOptionsByField ||\n typeof selectedOptionsByField !== \"object\"\n ) {\n return null\n }\n\n for (const [key, value] of Object.entries(selectedOptionsByField)) {\n const match = FIELD_KEY_RE.exec(key)\n if (!match) continue\n const raw = (value as { $in?: unknown })?.$in\n const optionIds = (Array.isArray(raw) ? raw : raw == null ? [] : [raw])\n .map((id) => (id == null ? null : String(id)))\n .filter((id): id is string => id != null && !SENTINEL_VALUES.has(id))\n return {\n fieldId: match[1],\n formId: String(formId),\n optionId: optionIds[0] ?? null,\n }\n }\n return null\n}\n\nasync function fetchFormFields(\n formIds: string[]\n): Promise<Map<string, Map<string, FormFieldRecord>>> {\n const result = new Map<string, Map<string, FormFieldRecord>>()\n await Promise.all(\n formIds.map(async (formId) => {\n try {\n const { data } = await peopleClient.get<{ data: FormFieldRecord[] }>({\n data: {\n fields: {\n FormField: \"label,field_type,fieldable,options\",\n FormFieldOption: \"label\",\n },\n include: \"options\",\n walk: true,\n },\n url: `forms/${formId}/fields`,\n })\n const byId = new Map<string, FormFieldRecord>()\n for (const field of data) {\n byId.set(String(field.id), field)\n }\n result.set(formId, byId)\n } catch {\n result.set(formId, new Map())\n }\n })\n )\n return result\n}\n\nasync function fetchFieldDefinitions(\n ids: string[]\n): Promise<Map<string, FieldDefinitionRecord>> {\n const result = new Map<string, FieldDefinitionRecord>()\n if (ids.length === 0) return result\n\n try {\n const { data } = await peopleClient.get<{ data: FieldDefinitionRecord[] }>({\n data: {\n fields: {\n FieldDefinition: \"name,data_type,field_options\",\n FieldOption: \"value\",\n },\n include: \"field_options\",\n walk: true,\n where: { id: ids.join(\",\") },\n },\n url: \"field_definitions\",\n })\n for (const fd of data) {\n result.set(String(fd.id), fd)\n }\n } catch {\n // permission-denied or other failure: leave entries absent so the\n // resolver falls back to [Hidden response].\n }\n return result\n}\n\nasync function fetchCampuses(\n ids: string[]\n): Promise<Map<string, CampusRecord>> {\n const result = new Map<string, CampusRecord>()\n if (ids.length === 0) return result\n\n try {\n const { data } = await peopleClient.get<{ data: CampusRecord[] }>({\n data: {\n fields: { Campus: \"name\" },\n walk: true,\n where: { id: ids.join(\",\") },\n },\n url: \"campuses\",\n })\n for (const campus of data) {\n result.set(String(campus.id), campus)\n }\n } catch {\n // permission-denied or other failure: leave entries absent so the\n // resolver falls back to [Hidden response].\n }\n return result\n}\n\nfunction buildResponseDetails(\n ids: ExtractedIds,\n fieldsByForm: Map<string, Map<string, FormFieldRecord>>,\n fieldDefs: Map<string, FieldDefinitionRecord>,\n campuses: Map<string, CampusRecord>\n): ResponseDetails {\n const field = fieldsByForm.get(ids.formId)?.get(ids.fieldId)\n if (!field) return { fieldLabel: HIDDEN_FIELD, valueLabel: HIDDEN_RESPONSE }\n\n const fieldLabel = field.label || HIDDEN_FIELD\n\n if (field.fieldType === \"boolean\") {\n return { fieldLabel, valueLabel: null }\n }\n\n if (field.fieldType === \"custom_field\" && field.fieldableId != null) {\n const fd = fieldDefs.get(String(field.fieldableId))\n if (!fd) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n if (fd.dataType === \"boolean\") return { fieldLabel, valueLabel: null }\n if (ids.optionId == null) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n const match = (fd.fieldOptions || []).find(\n (o) => String(o.id) === ids.optionId\n )\n return { fieldLabel, valueLabel: match?.value || HIDDEN_RESPONSE }\n }\n\n if (field.fieldType === \"primary_campus\") {\n if (ids.optionId == null) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n const campus = campuses.get(ids.optionId)\n return { fieldLabel, valueLabel: campus?.name || HIDDEN_RESPONSE }\n }\n\n if (ids.optionId == null) {\n return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n }\n const match = (field.options || []).find((o) => String(o.id) === ids.optionId)\n return { fieldLabel, valueLabel: match?.label || HIDDEN_RESPONSE }\n}\n\nconst peopleFormLabeler: ResponseLabeler = { resolve }\n\nexport { peopleFormLabeler }\n","import { peopleFormLabeler } from \"./response-labelers/people-form\"\nimport type { ResponseLabeler } from \"./response-labelers/types\"\n\nconst labelers: Record<string, ResponseLabeler> = {\n \"people.v2.events.form_submission.created\": peopleFormLabeler,\n}\n\nasync function resolveResponseDetails(\n subscriptions: AutomationInstance[]\n): Promise<AutomationInstance[]> {\n const groups = new Map<string, AutomationInstance[]>()\n for (const sub of subscriptions) {\n if (!labelers[sub.name]) continue\n const group = groups.get(sub.name) ?? []\n group.push(sub)\n groups.set(sub.name, group)\n }\n if (groups.size === 0) return subscriptions\n\n const resolvedById = new Map<number, AutomationInstance>()\n await Promise.all(\n [...groups.entries()].map(async ([name, subs]) => {\n const resolved = await labelers[name].resolve(subs)\n for (const sub of resolved) resolvedById.set(sub.id, sub)\n })\n )\n\n return subscriptions.map((sub) => resolvedById.get(sub.id) ?? sub)\n}\n\nfunction formatResponseDetails(\n responseDetails: ResponseDetails | null | undefined\n): string {\n if (!responseDetails) return \"\"\n const { fieldLabel, valueLabel } = responseDetails\n if (valueLabel == null) return ` with \"${fieldLabel}\" selected`\n return ` with \"${fieldLabel}\" selected as \"${valueLabel}\"`\n}\n\nexport { formatResponseDetails, resolveResponseDetails }\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Avatar,\n Box,\n Button,\n Card,\n Divider,\n Dropdown,\n Heading,\n Icon,\n Logo,\n StackView,\n Text,\n ToggleSwitch,\n Tooltip,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { lowerFirst, truncate } from \"lodash\"\nimport React, { createContext, useContext, useState } from \"react\"\n\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport History from \"./history\"\nimport HistoryModal from \"./history_modal\"\nimport * as alerts from \"./utils/alerts\"\nimport { getValidLogoName } from \"./utils/logos\"\nimport { formatResponseDetails } from \"./utils/resolve-response-details\"\nimport { dateLocalized, forbiddenText, parseDescription } from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n})\n\ntype AutomationProps = {\n automation: AutomationInstance\n currentPersonCanCreate: boolean\n currentPersonId: number\n disabled?: boolean\n disabledReason?: string\n trigger: {\n event: AutomationTriggerEvent\n resource: EncryptedTriggerResource\n }\n updateAutomation: React.Dispatch<React.SetStateAction<AutomationInstance>>\n}\n\ntype IncomingAutomationProps = {\n automation: IncomingAutomationInstance\n}\n\ntype EditableAutomationContextType = {\n automation: AutomationInstance\n currentPersonCanCreate?: boolean\n currentPersonId?: number\n theme: object\n trigger?: {\n event: AutomationTriggerEvent\n resource: EncryptedTriggerResource\n }\n updateAutomation?: React.Dispatch<React.SetStateAction<AutomationInstance>>\n}\n\ntype IncomingAutomationContextType = {\n automation: IncomingAutomationInstance\n}\n\nconst AutomationContext = createContext<\n EditableAutomationContextType | IncomingAutomationContextType\n>(null)\n\nfunction EditableAutomation({\n updateAutomation,\n onDelete,\n theme,\n openHistoryNow = false,\n disabled,\n disabledReason,\n ...props\n}: AutomationProps & {\n disabled: boolean\n disabledReason: string\n onDelete: (id: number) => void\n openHistoryNow: boolean\n theme?: object\n}) {\n return (\n <AutomationWrapper\n theme={theme}\n updateAutomation={updateAutomation}\n {...props}\n >\n <Header>\n <Icons />\n <Manage\n onDelete={onDelete}\n openHistoryNow={openHistoryNow}\n disabled={disabled}\n disabledReason={disabledReason}\n />\n </Header>\n <Description />\n <EditableFooter />\n </AutomationWrapper>\n )\n}\n\nfunction IncomingAutomation(props: IncomingAutomationProps) {\n return (\n <AutomationWrapper automation={props.automation}>\n <Header>\n <Icons />\n <LinkToAutomation />\n </Header>\n <IncomingDescription />\n <Footer />\n </AutomationWrapper>\n )\n}\n\nfunction IncomingDescription() {\n const { automation } = useContext(\n AutomationContext\n ) as IncomingAutomationContextType\n\n const triggerEventDescription = automation.triggerEventDescription\n const { name, description } = parseDescription(automation.description)\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <StackView\n paddingVertical={token(\"--t-spacing-2\")}\n flex={1}\n opacity={cardOpacity}\n >\n <Heading\n level={3}\n size={token(\"--t-font-size-xl\")}\n weight={token(\"--t-font-weight-medium\")}\n marginBottom={token(\"--t-spacing-half\")}\n truncate\n >\n {name}\n </Heading>\n <StackView spacing={0.75}>\n <Text\n size={token(\"--t-font-size-sm\")}\n color={token(\"--t-text-color\")}\n lineHeight=\"1.2\"\n >\n {triggerEventDescription}\n {formatResponseDetails(automation.responseDetails)}, then{\" \"}\n {lowerFirst(name)} {conditionalSuffix(automation)}\n </Text>\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-secondary\")}\n lineHeight=\"1.2\"\n >\n {truncate(optionallyPrettifyArchivedPrefix(description), {\n length: 160,\n separator: \" \",\n })}\n </Text>\n </StackView>\n </StackView>\n )\n}\n\nfunction LinkToAutomation() {\n const { automation } = useContext(\n AutomationContext\n ) as IncomingAutomationContextType\n\n return (\n <Button\n external\n iconLeft={{ name: \"general.newWindow\" }}\n variant=\"naked\"\n size=\"sm\"\n to={automation.triggerAdminUrl}\n disabled={!automation.canManage}\n tooltip={\n !automation.canManage\n ? \"You do not have access to this resource\"\n : undefined\n }\n color={token(\"--t-text-color-secondary\")}\n hover={{\n backgroundColor: \"highlight\",\n color: token(\"--t-text-color-secondary\"),\n }}\n >\n Manage\n </Button>\n )\n}\n\nfunction AutomationWrapper({\n automation,\n updateAutomation,\n children,\n theme,\n ...rest\n}: (AutomationProps | IncomingAutomationProps) & {\n children: React.ReactNode\n theme?: object\n updateAutomation?: (automation: AutomationInstance) => void\n}) {\n return (\n <AutomationContext.Provider\n value={{\n automation,\n theme,\n updateAutomation,\n ...rest,\n }}\n >\n <Card radius={4} padding={2}>\n {children}\n </Card>\n </AutomationContext.Provider>\n )\n}\n\nfunction Header({ children }: { children: React.ReactNode }) {\n const { automation } = useContext(AutomationContext)\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n padding={0}\n distribution=\"space-between\"\n opacity={cardOpacity}\n >\n {children}\n </StackView>\n )\n}\n\nfunction Manage({\n onDelete,\n openHistoryNow = false,\n disabled,\n disabledReason,\n}: {\n disabled: boolean\n disabledReason: string\n onDelete: (id: number) => void\n openHistoryNow: boolean\n}) {\n const {\n automation,\n currentPersonCanCreate,\n currentPersonId,\n trigger,\n theme,\n updateAutomation,\n } = useContext(AutomationContext) as EditableAutomationContextType\n const [historyVisible, setHistoryVisible] = useState(openHistoryNow)\n const isActive = automation.active\n const { name } = parseDescription(automation.description)\n\n function showHistory() {\n setHistoryVisible(true)\n }\n\n function updateEventsStatus(newStatus: AutomationInstance[\"eventsStatus\"]) {\n updateAutomation((prev) => ({ ...prev, eventsStatus: newStatus }))\n }\n\n function handleToggleActive() {\n webhooksClient\n .patch({\n data: {\n _e: trigger.resource,\n data: {\n attributes: {\n active: !isActive,\n },\n },\n },\n url: `/automation_subscriptions/${automation.id}`,\n })\n .then((data: { data: { active: boolean } }) => {\n updateAutomation((prev) => ({ ...prev, active: data.data.active }))\n })\n .catch((error) => {\n const text =\n forbiddenText(error, \"pause\") ||\n `There was a problem ${\n isActive ? \"pausing\" : \"unpausing\"\n } this automation. Please try again in a few moments.`\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n\n function handleReassign() {\n alerts.confirm\n .fire({\n text: \"This automation will run with your permission levels. Other administrators who can see this automation can grant it their permissions by reassigning it to themselves.\",\n title: \"Reassign automation?\",\n })\n .then(({ isConfirmed }) => {\n if (isConfirmed) {\n webhooksClient\n .post({\n data: {\n _e: trigger.resource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automation.id}/self_assign`,\n })\n .then(({ data }) => fetchCurrentPersonAvatar(data))\n .then(({ subscription, avatar }) => {\n updateAutomation((prev) => ({\n ...prev,\n createdBy: { ...prev.createdBy, avatarUrl: avatar },\n createdById: subscription.createdById,\n createdByName: subscription.createdByName,\n }))\n })\n .catch((error) => {\n const text =\n forbiddenText(error, \"update\") ||\n \"There was a problem updating this automation. Please try again in a few moments.\"\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n })\n }\n\n function handleDelete() {\n alerts.confirmDestroy\n .fire({\n confirmButtonText: \"Yes, delete automation\",\n text: `Are you sure you want to delete the \"${name}\" automation? This cannot be undone.`,\n title: \"Delete this automation?\",\n })\n .then(({ isConfirmed }) => {\n if (isConfirmed) onDelete(automation.id)\n })\n }\n\n return (\n <>\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.75}>\n <Dropdown\n icon={{\n color: token(\"--t-icon-color\"),\n name: \"churchCenter.threeDots\",\n }}\n iconRight={false}\n title=\"Actions\"\n variant=\"naked\"\n size=\"md\"\n disabled={disabled}\n >\n <Dropdown.Item onSelect={() => showHistory()}>History</Dropdown.Item>\n {currentPersonCanCreate &&\n (automation.createdById === currentPersonId ? (\n <Dropdown.Item disabled={true}>\n <Tooltip\n placement=\"left\"\n openDelay={250}\n title=\"This automation is already assigned to you.\"\n >\n <Text>Reassign to me...</Text>\n </Tooltip>\n </Dropdown.Item>\n ) : (\n <Dropdown.Item onSelect={handleReassign}>\n Reassign to me...\n </Dropdown.Item>\n ))}\n <Dropdown.Item onSelect={handleDelete}>Delete...</Dropdown.Item>\n </Dropdown>\n <ToggleSwitch\n isChecked={isActive}\n size=\"sm\"\n onClick={handleToggleActive}\n tooltip={\n disabled\n ? disabledReason\n : isActive\n ? \"Pause automation\"\n : \"Enable automation\"\n }\n disabled={disabled}\n />\n </StackView>\n\n <HistoryModal\n open={historyVisible}\n onRequestClose={() => setHistoryVisible(false)}\n theme={theme}\n >\n <History\n automation={automation}\n triggerResource={trigger.resource}\n onEventsStatusChange={updateEventsStatus}\n onRequestClose={() => setHistoryVisible(false)}\n />\n </HistoryModal>\n </>\n )\n}\n\nfunction Icons() {\n const { automation } = useContext(AutomationContext)\n const triggerProductName = automation.name.split(\".\")[0]\n\n return (\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.5}>\n <Logo\n markOnly={true}\n name={getValidLogoName(triggerProductName)}\n size=\"sm\"\n theme=\"color\"\n />\n <Icon name=\"general.rightArrow\" size={1.5} />\n <Logo\n markOnly={true}\n name={getValidLogoName(automation.operationAppName)}\n size=\"sm\"\n theme=\"color\"\n />\n </StackView>\n )\n}\nfunction Footer() {\n const { automation } = useContext(AutomationContext)\n const { dateFormat } = useContext(OrganizationContext)\n const createdBySuffix = !automation.createdBy?.id ? \"(deleted profile)\" : \"\"\n const createdByName = `${automation.createdByName} ${createdBySuffix}`\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <>\n <Divider marginHorizontal={-2} />\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"space-between\"\n paddingTop={1.75}\n spacing={token(\"--t-spacing-1\")}\n opacity={cardOpacity}\n >\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-placeholder\")}\n whiteSpace=\"nowrap\"\n >\n Updated {dateLocalized(automation.createdAt, dateFormat)}\n </Text>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-half\")}\n maxWidth=\"calc(100% - 136px)\"\n >\n {automation.createdBy?.avatarUrl && (\n <Avatar\n width={2}\n height={2}\n basis={2}\n key={createdByName}\n source={automation.createdBy.avatarUrl}\n />\n )}\n <Text size={5} truncate>\n {createdByName}\n </Text>\n </StackView>\n </StackView>\n </>\n )\n}\n\nfunction EditableFooter() {\n const { dateFormat } = useContext(OrganizationContext)\n const { automation, trigger, theme, updateAutomation } = useContext(\n AutomationContext\n ) as EditableAutomationContextType\n\n const createdBySuffix = !automation.createdBy?.id ? \"(deleted profile)\" : \"\"\n const createdByName = `${automation.createdByName} ${createdBySuffix}`\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n const buttonProps = {\n color: token(\"--t-text-color-secondary\"),\n fontSize: token(\"--t-font-size-xs\"),\n fontWeight: token(\"--t-font-weight-normal\"),\n paddingHorizontal: token(\"--t-spacing-1\"),\n radius: \"pill\",\n size: \"xs\",\n variant: \"naked\",\n }\n const [historyProps, setHistoryProps] = useState({\n filter: null,\n historyVisible: false,\n })\n\n function renderSkippedHistory() {\n setHistoryProps({ filter: \"skipped\", historyVisible: true })\n }\n\n function renderFailedOrDuplicatedHistory() {\n setHistoryProps({ filter: \"failed,duplicated\", historyVisible: true })\n }\n\n function handleEventsStatusChange(\n newStatus: AutomationInstance[\"eventsStatus\"]\n ) {\n updateAutomation((prev) => ({ ...prev, eventsStatus: newStatus }))\n }\n\n return (\n <>\n <Divider marginHorizontal={-2} />\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"space-between\"\n paddingTop={1.75}\n spacing={token(\"--t-spacing-1\")}\n opacity={cardOpacity}\n >\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-placeholder\")}\n whiteSpace=\"nowrap\"\n >\n Updated {dateLocalized(automation.createdAt, dateFormat)}\n </Text>\n\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-fourth\")}\n >\n {!!automation.eventsStatus?.skipped && (\n <Button\n {...buttonProps}\n aria-label={`${automation.eventsStatus.skipped} skipped`}\n onClick={renderSkippedHistory}\n tooltip={`${automation.eventsStatus.skipped?.toLocaleString()} skipped events`}\n >\n <Box\n backgroundColor={token(\"--t-fill-color-status-warning\")}\n marginRight={token(\"--t-spacing-half\")}\n radius=\"circle\"\n height=\"10px\"\n width=\"10px\"\n padding={token(\"--t-spacing-fourth\")}\n >\n <Icon\n name={\"services.pause\"}\n size={\"6px\"}\n title={\"Skipped\"}\n color=\"white\"\n />\n </Box>\n {`${automation.eventsStatus.skipped?.toLocaleString()}`}\n </Button>\n )}\n {!!automation.eventsStatus?.failed && (\n <Button\n {...buttonProps}\n aria-label={`${automation.eventsStatus.failed} failed`}\n iconLeft={{\n color: token(\"--t-icon-color-status-error\"),\n marginRight: token(\"--t-spacing-half\"),\n name: \"general.exclamationTriangle\",\n size: \"10px\",\n title: \"Failed\",\n }}\n onClick={renderFailedOrDuplicatedHistory}\n title={`${automation.eventsStatus.failed?.toLocaleString()}`}\n tooltip={`${automation.eventsStatus.failed?.toLocaleString()} failed events`}\n />\n )}\n </StackView>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"end\"\n flex={1}\n spacing={token(\"--t-spacing-half\")}\n marginLeft=\"auto\"\n >\n {automation.createdBy?.avatarUrl && (\n <Avatar\n width={token(\"--t-element-size-md\")}\n height={token(\"--t-element-size-md\")}\n basis={token(\"--t-element-size-md\")}\n key={createdByName}\n source={automation.createdBy.avatarUrl}\n />\n )}\n <Text size={token(\"--t-font-size-sm\")} truncate>\n {createdByName}\n </Text>\n </StackView>\n </StackView>\n\n <HistoryModal\n open={historyProps.historyVisible}\n onRequestClose={() =>\n setHistoryProps({ filter: null, historyVisible: false })\n }\n theme={theme}\n >\n <History\n automation={automation}\n triggerResource={trigger.resource}\n filterWhere={historyProps.filter}\n onEventsStatusChange={handleEventsStatusChange}\n onRequestClose={() =>\n setHistoryProps({ filter: null, historyVisible: false })\n }\n />\n </HistoryModal>\n </>\n )\n}\n\nfunction Description() {\n const { automation, trigger } = useContext(\n AutomationContext\n ) as EditableAutomationContextType\n\n const { name, description } = parseDescription(automation.description)\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n const triggerEventDescription = [\n \"When a person\",\n lowerFirst(trigger.event.description) +\n formatResponseDetails(automation.responseDetails) +\n \",\",\n \"then\",\n lowerFirst(name),\n conditionalSuffix(automation),\n ].join(\" \")\n\n return (\n <StackView\n paddingVertical={token(\"--t-spacing-2\")}\n flex={1}\n opacity={cardOpacity}\n >\n <Heading\n level={3}\n size={token(\"--t-font-size-xl\")}\n weight={token(\"--t-font-weight-bold\")}\n marginBottom={token(\"--t-spacing-half\")}\n truncate\n >\n {name}\n </Heading>\n <StackView spacing={0.75}>\n <Text\n size={token(\"--t-font-size-sm\")}\n color={token(\"--t-text-color\")}\n lineHeight=\"1.2\"\n >\n {triggerEventDescription}\n </Text>\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-secondary\")}\n lineHeight=\"1.2\"\n >\n {truncate(optionallyPrettifyArchivedPrefix(description), {\n length: 160,\n separator: \" \",\n })}\n </Text>\n </StackView>\n </StackView>\n )\n}\n\nfunction conditionalSuffix(automation: AutomationInstance) {\n return automation?.triggerParams?.useTriggerPersonOverride\n ? \"(also applies to joint donor)\"\n : \"\"\n}\n\nfunction optionallyPrettifyArchivedPrefix(description: string) {\n if (description?.startsWith(\"[archived]\")) {\n return description.replace(\"[archived]\", \"[Archived]\")\n } else {\n return description\n }\n}\n\nasync function fetchCurrentPersonAvatar(subscription: AutomationInstance) {\n const {\n data: { avatar },\n } = await peopleClient.get({\n data: {\n fields: { Person: \"avatar\" },\n },\n url: \"me\",\n })\n\n return { avatar, subscription }\n}\n\nexport { EditableAutomation, IncomingAutomation }\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { compact, uniq } from \"lodash\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n})\n\nasync function fetchAutomations(triggerResource: EncryptedTriggerResource) {\n const { data } = await webhooksClient.get({\n data: {\n _e: triggerResource,\n fields: {\n AutomationSubscription:\n \"id,description,created_at,created_by,operation_app_name,operation_definition_class_name,operation_params,active,created_by_name,name,trigger_admin_url,events_status,trigger_conditions,trigger_params\",\n Person: \"name\",\n },\n include: \"created_by\",\n },\n url: \"automation_subscriptions\",\n })\n\n return data\n}\n\nasync function fetchCreatorProfiles(subscriptions: AutomationInstance[]) {\n const personIds = compact(\n uniq(subscriptions.map((subscription) => subscription.createdById))\n )\n\n try {\n const { data: profiles } = await peopleClient.get({\n data: {\n fields: { Person: \"avatar\" },\n where: { id: personIds.join(\",\") },\n },\n url: \"people\",\n })\n return { profiles, subscriptions }\n } catch (error) {\n return { profiles: [], subscriptions }\n }\n}\n\nfunction mergeProfilesAndSubscriptions({\n profiles,\n subscriptions,\n}: {\n profiles: { avatar: string; id: number }[]\n subscriptions: AutomationInstance[]\n}) {\n const subscriptionsWithAvatars = subscriptions.map((subscription) => {\n const avatar = profiles.find(\n (profile) => profile.id === subscription.createdById\n )\n return {\n ...subscription,\n createdBy: { ...subscription.createdBy, avatarUrl: avatar?.avatar },\n }\n })\n\n return subscriptionsWithAvatars\n}\n\nasync function fetchPersonApps() {\n return peopleClient\n .get({\n data: {\n fields: { App: [\"name\"], PersonApp: [\"app\", \"allow_pco_login\"] },\n include: [\"app\"],\n },\n url: `/me/person_apps`,\n })\n .then(({ data }) => {\n return data\n .filter((personApp: PersonApp) => personApp.allowPcoLogin)\n .map((personApp: PersonApp) => personApp.app.name.toLowerCase())\n })\n}\n\nexport {\n fetchAutomations,\n fetchCreatorProfiles,\n fetchPersonApps,\n mergeProfilesAndSubscriptions,\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Box,\n Heading,\n Spinner,\n Summary,\n Text,\n TileView,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { truncate, upperFirst } from \"lodash\"\nimport React, { useEffect, useState } from \"react\"\n\nimport { IncomingAutomation } from \"./automation\"\nimport {\n fetchCreatorProfiles,\n fetchPersonApps,\n mergeProfilesAndSubscriptions,\n} from \"./utils/fetch-automations\"\nimport { resolveResponseDetails } from \"./utils/resolve-response-details\"\nimport {\n deobfuscateDescriptions,\n pluralize,\n singularize,\n triggerResourceParts,\n} from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\n\nasync function fetchIncomingAutomations(encryptedParam) {\n const { data } = await webhooksClient.get({\n data: {\n _e: encryptedParam,\n fields: {\n AutomationSubscription:\n \"id,description,created_at,created_by,operation_app_name,operation_definition_class_name,operation_params,active,created_by_name,name,trigger_admin_url,trigger_conditions,trigger_resource,trigger_params\",\n Person: \"name\",\n },\n include: \"created_by\",\n },\n url: \"incoming_automation_subscriptions\",\n })\n\n return data\n}\n\nasync function fetchTriggerResources(automations) {\n // We can optimize the query by fetching all the resources at once if we know\n // that the endpoint supports querying by multiple ids. Otherwise, we'll have\n // to fetch each resource individually.\n const QUERYABLE_BY_MULTIPLE_IDS = {\n people: [\"forms\", \"lists\"],\n registrations: [\"events\"],\n services: [\"teams\"],\n }\n const NOT_QUERYABLE = [\"giving\"]\n\n const automationsByModel = automations.reduce((accumulator, automation) => {\n // registrations has a weird case of signup vs event\n const automationTriggerResource = automation.triggerResource.replace(\n /signup/,\n \"event\"\n )\n const { appName, resourceType, resourcePath, resourceId } =\n triggerResourceParts(automationTriggerResource)\n\n if (!accumulator[appName]) accumulator[appName] = {}\n if (!accumulator[appName][resourceType])\n accumulator[appName][resourceType] = {}\n if (!accumulator[appName][resourceType][\"resoucePath\"])\n accumulator[appName][resourceType][\"resourcePath\"] = resourcePath\n\n if (!accumulator[appName][resourceType][\"ids\"])\n accumulator[appName][resourceType][\"ids\"] = []\n\n accumulator[appName][resourceType][\"ids\"].push(resourceId)\n\n return accumulator\n }, {})\n\n const promises = Object.keys(automationsByModel).flatMap((appName) => {\n const automationsByResourceType = automationsByModel[appName]\n\n return Object.entries(automationsByResourceType).flatMap(\n ([resourceType, resourceParts]) => {\n const fetchFn = NOT_QUERYABLE.includes(appName)\n ? fetchNothing\n : QUERYABLE_BY_MULTIPLE_IDS[appName]?.includes(resourceType)\n ? fetchAllAtOnce\n : fetchOneAtATime\n\n return fetchFn({\n appName,\n ids: resourceParts[\"ids\"],\n resourcePath: resourceParts[\"resourcePath\"],\n resourceType,\n })\n }\n )\n })\n\n const results = await Promise.allSettled(promises)\n\n return {\n automations,\n triggerResources: collectSuccessfulResults(results),\n }\n}\n\nfunction collectSuccessfulResults(settledPromises) {\n return settledPromises\n .reduce((acc, result) => {\n if (result.status === \"fulfilled\") acc = acc.concat(result.value)\n\n return acc\n }, [])\n .flatMap((d) => d.data)\n}\n\nfunction fetchAllAtOnce({ appName, resourcePath, resourceType, ids }) {\n return fetchResourceName({\n appName,\n params: {\n where: { id: ids.join(\",\") },\n },\n path: resourcePath,\n resourceType,\n })\n}\n\nfunction fetchOneAtATime({ appName, resourcePath, resourceType, ids }) {\n return ids.map((id) =>\n fetchResourceName({\n appName,\n path: `${resourcePath}/${id}`,\n resourceType,\n })\n )\n}\n\nfunction fetchNothing(_props: object) {\n return new Promise((_, reject) => {\n reject()\n })\n}\n\n// TODO (maybe): move these to webhooks, return the verb in the API response,\n// so new events don't need a code change in both places\nfunction mapNameToVerb(messageName) {\n // e.g. \"groups.v2.events.membership.created\" => \"groups.membership.created\"\n const appResourceAction = messageName.replace(\"v2.events.\", \"\")\n\n switch (appResourceAction) {\n case \"groups.membership.created\":\n return \"joins\"\n case \"groups.membership.destroyed\":\n return \"leaves\"\n case \"people.list_result.created\":\n case \"services.team_person.created\":\n return \"is added to\"\n case \"people.list_result.destroyed\":\n case \"services.team_person.destroyed\":\n return \"is removed from\"\n case \"people.form_submission.created\":\n return \"submits\"\n case \"registrations.attendee.created\":\n return \"is registered as a new attendee for\"\n case \"registrations.attendee.cancelled\":\n return \"is canceled as an attendee for\"\n case \"registrations.registration.created\":\n return \"is the registration contact on a new registration for\"\n case \"registrations.registration.cancelled\":\n return \"is the registration contact on a canceled registration for\"\n default:\n return null\n }\n}\n\nfunction buildGivingDescription(automation: AutomationInstance) {\n const action = automation.name.replace(\"giving.v2.events.\", \"\")\n\n switch (action) {\n case \"donation.payment_successful\":\n return \"When a person gives\"\n case \"profile.first_donated_automation\":\n return \"When a person gives for the first time\"\n case \"recurring_donation.setup_successful\":\n return \"When a person sets up a recurring donation\"\n default:\n return null\n }\n}\n\nfunction buildDescription(automation, triggerResourceName) {\n const verb = mapNameToVerb(automation.name)\n\n const { resourceType } = triggerResourceParts(automation.triggerResource)\n\n if (!verb) {\n // No verb mapping for this message name, so just show something generic\n const resourceName = truncate(triggerResourceName, {\n length: 160,\n separator: \" \",\n })\n\n return `When the automation is triggered from ${singularize(\n resourceType\n )} \"${resourceName}\"`\n }\n\n return `When a person ${verb} ${singularize(\n resourceType\n )} \"${triggerResourceName}\"`\n}\n\nfunction fetchResourceName({\n appName,\n path,\n resourceType,\n params = {},\n}): Promise<any> {\n const client = new Client({ root: pcoApiUrl(appName, { squiggly: false }) })\n const model = upperFirst(singularize(resourceType))\n\n return client.get({\n data: {\n fields: {\n [model]: [\"name\", \"name_or_description\"],\n },\n ...params,\n },\n url: path,\n })\n}\n\nfunction mergeTriggerResourceEventDescriptions({\n automations,\n triggerResources,\n operationApps,\n}) {\n return automations.map((automation) => {\n const { appName, resourceType, resourceId } = triggerResourceParts(\n automation.triggerResource\n )\n\n if (appName === \"giving\") {\n automation.triggerEventDescription = buildGivingDescription(automation)\n automation.canManage = operationApps.find((app) => app === \"giving\")\n\n return automation\n }\n\n // find the result that matches this automation\n const result = triggerResources.find(\n (tr) => tr.id.toString() == resourceId.toString()\n )\n\n const resourceName = result\n ? result.name || result.nameOrDescription\n : `[Hidden ${upperFirst(singularize(resourceType))}]`\n\n automation.triggerEventDescription = buildDescription(\n automation,\n resourceName\n )\n\n automation.canManage = !!result\n\n return automation\n })\n}\n\nfunction IncomingAutomations({\n encryptedParam,\n trigger,\n}: {\n encryptedParam: string\n trigger?: AutomationTrigger\n}) {\n const [loading, setLoading] = useState(true)\n const [automations, setAutomations] = useState<IncomingAutomationInstance[]>()\n\n useEffect(() => {\n fetchPersonApps().then((operationApps) => {\n fetchIncomingAutomations(encryptedParam)\n .then(fetchCreatorProfiles)\n .then(mergeProfilesAndSubscriptions)\n .then(deobfuscateDescriptions)\n .then(resolveResponseDetails)\n .then(fetchTriggerResources)\n .then(({ automations, triggerResources }) =>\n mergeTriggerResourceEventDescriptions({\n automations,\n operationApps,\n triggerResources,\n })\n )\n .then(setAutomations)\n .then(() => setLoading(false))\n })\n }, [encryptedParam])\n\n const noResults = !loading && automations.length === 0\n\n return (\n <>\n <Box\n borderBottom={`1px solid ${token(\"--t-border-color\")}`}\n marginBottom={token(\"--t-spacing-2\")}\n marginHorizontal={-3}\n marginTop={trigger ? 12 : 0}\n paddingHorizontal={token(\"--t-spacing-3\")}\n paddingVertical={token(\"--t-spacing-2\")}\n >\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n {loading\n ? \"Incoming automations\"\n : pluralize(automations.length, \"incoming automation\")}\n </Heading>\n </Box>\n {noResults ? (\n <Text\n color={token(\"--t-text-color-secondary\")}\n marginVertical={token(\"--t-spacing-3\")}\n >\n Automations that perform actions on this resource will be listed here.\n </Text>\n ) : loading ? (\n <Summary\n image={<Spinner size=\"xl\" />}\n paddingVertical={10}\n title={\"Loading incoming automations...\"}\n />\n ) : (\n <TileView\n spacing={token(\"--t-spacing-3\")}\n marginVertical={token(\"--t-spacing-3\")}\n minCellWidth={45}\n >\n {automations.map((automation) => (\n <IncomingAutomation key={automation.id} automation={automation} />\n ))}\n </TileView>\n )}\n </>\n )\n}\n\nexport default IncomingAutomations\n","import { token } from \"@planningcenter/tapestry\"\nimport { Select, StackView } from \"@planningcenter/tapestry-react\"\nimport { groupBy, uniqBy } from \"lodash\"\nimport React from \"react\"\n\nfunction operationDefinitionId(od: OperationDefinition) {\n return `OPERATION_${od.definitionClass}${od.definitionIdentifier || \"\"}`\n}\n\nfunction sectionId(section: string) {\n return `SECTION_${section}`\n}\n\nfunction idType(value: string) {\n if (value.startsWith(\"SECTION\")) {\n return \"section\"\n } else if (value.startsWith(\"OPERATION\")) {\n return \"operation\"\n } else if (!value) {\n return null\n } else {\n throw new Error(`Unexpected value: ${value}`)\n }\n}\n\nfunction renderOptionsWithoutConsideringGroup(\n options: { label: string; value: string | number }[]\n) {\n return options.map(({ label, value }) => (\n <Select.Option key={value} value={value}>\n {label}\n </Select.Option>\n ))\n}\n\nfunction renderOptions(\n options: { group?: string | null; label: string; value: string | number }[]\n) {\n const groupedOptions = groupBy(options, \"group\")\n const groupTypes = Object.keys(groupedOptions).sort()\n return groupTypes.map((gt) =>\n gt === \"null\" ? (\n renderOptionsWithoutConsideringGroup(groupedOptions[gt])\n ) : (\n <Select.OptionGroup key={gt} title={gt}>\n {renderOptionsWithoutConsideringGroup(groupedOptions[gt])}\n </Select.OptionGroup>\n )\n )\n}\n\nconst Definition = ({\n selectedOperation,\n onOperationDefinitionChange,\n operationDefinitions,\n}: {\n onOperationDefinitionChange: Function\n operationDefinitions: OperationDefinition[]\n selectedOperation: OperationDefinition\n}) => {\n const selectedSection = selectedOperation?.section\n\n const operationDefinitionsWithUniqueIds = operationDefinitions.map((od) => ({\n ...od,\n id: operationDefinitionId(od),\n }))\n\n const primaryOperations = operationDefinitionsWithUniqueIds.filter(\n (od) => !od.section\n )\n\n const primarySectionOptions = uniqBy(operationDefinitions, \"section\")\n .filter((od) => !!od.section)\n .map((od) => ({\n group: od.sectionGroup,\n label: od.section,\n value: sectionId(od.section),\n }))\n\n const secondaryOperations = selectedSection\n ? operationDefinitionsWithUniqueIds.filter(\n (od) => od.section === selectedSection\n )\n : []\n\n function handleAnySelectChange({ selectedValue }) {\n switch (idType(selectedValue)) {\n case \"section\":\n onOperationDefinitionChange(\n operationDefinitions.find(\n (od) => sectionId(od.section) === selectedValue\n )\n )\n break\n case \"operation\":\n onOperationDefinitionChange(\n operationDefinitions.find(\n (od) => operationDefinitionId(od) === selectedValue\n )\n )\n break\n case null:\n onOperationDefinitionChange(null)\n break\n }\n }\n\n function renderOperations(operations: OperationDefinition[]) {\n const operationsAsOptions = operations.map((o) => ({\n group: o.group,\n label: o.description,\n value: o.id,\n }))\n\n return renderOptions(operationsAsOptions)\n }\n\n const primarySelectedValue = selectedOperation\n ? !selectedOperation.section\n ? operationDefinitionId(selectedOperation)\n : sectionId(selectedOperation.section)\n : undefined\n\n return (\n <StackView spacing={token(\"--t-spacing-1\")}>\n <Select\n emptyValue=\"Select an action\"\n id=\"select-action\"\n onChange={handleAnySelectChange}\n size=\"lg\"\n value={primarySelectedValue}\n data-testid=\"operation-select\"\n >\n {renderOperations(primaryOperations)}\n {renderOptions(primarySectionOptions)}\n </Select>\n {secondaryOperations.length > 0 && (\n <Select\n value={operationDefinitionId(selectedOperation)}\n onChange={handleAnySelectChange}\n size=\"lg\"\n >\n {renderOperations(secondaryOperations)}\n </Select>\n )}\n </StackView>\n )\n}\n\nexport default Definition\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Avatar,\n Badge,\n Box,\n Checkbox as TapestryCheckbox,\n Combobox as TapestryCombobox,\n DateField as TapestryDateField,\n HelperDrawer,\n Highlight,\n Icon,\n Input,\n Menu,\n NumberField as TapestryNumberField,\n Radio,\n Select as TapestrySelect,\n Spinner,\n StackView,\n Text,\n TextArea as TapestryTextArea,\n} from \"@planningcenter/tapestry-react\"\nimport { camelCase, debounce, groupBy, isEqual, sortBy, uniqBy } from \"lodash\"\nimport moment from \"moment\"\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\n\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport {\n dateFNSFormat,\n dateLocalized,\n fieldListIdentifier,\n} from \"./utils/utils\"\n\nfunction fieldDependencies({\n field,\n selectedFieldOptions,\n}: {\n field: DefinitionField\n selectedFieldOptions: { [k: string]: any }\n}) {\n const dependsOn = field.dependsOn || []\n return dependsOn.reduce((acc, depKey) => {\n if (Object.prototype.hasOwnProperty.call(selectedFieldOptions, depKey)) {\n acc[camelCase(depKey)] = selectedFieldOptions[depKey]\n }\n return acc\n }, {})\n}\n\nfunction useMemoizedObject(generator) {\n const [memoizedObject, setMemoizedObject] = useState(generator)\n\n useEffect(() => {\n const newObject = generator()\n\n if (!isEqual(newObject, memoizedObject)) {\n setMemoizedObject(newObject)\n }\n }, [generator, memoizedObject])\n\n return memoizedObject\n}\n\nconst Field = ({\n canAccessPeople,\n field,\n onChange,\n value,\n selectedFieldOptions,\n loadListForField,\n loadedLists,\n loadingLists,\n}: {\n canAccessPeople: boolean\n field: DefinitionField\n loadListForField: LoadListForField\n loadedLists: { [k: string]: LoadedList[] }\n loadingLists: { [k: string]: boolean }\n onChange: Function\n selectedFieldOptions: { [k: string]: any }\n value: any\n}) => {\n const dependencies = useMemoizedObject(() =>\n fieldDependencies({ field, selectedFieldOptions })\n )\n\n useEffect(() => {\n if (field.listClass) {\n loadListForField({ dependencies, field })\n }\n }, [field, dependencies, loadListForField])\n\n if (field.kind === \"Hidden\") return null\n\n const listOptions =\n field.list || loadedLists[fieldListIdentifier(field)] || []\n\n const actionAllowedOptions = listOptions.filter(\n (op) => !op.automationNotAllowed\n )\n\n const loading = field.listClass && loadingLists[fieldListIdentifier(field)]\n\n function renderField() {\n switch (field.kind) {\n case \"Select\":\n return (\n <Select\n fieldId={field.id}\n listOptions={actionAllowedOptions}\n onChange={onChange}\n value={value}\n description={field.description}\n disabled={field.disabled}\n />\n )\n case \"SelectSearch\":\n return (\n <SelectSearch\n fieldId={field.id}\n listOptions={actionAllowedOptions}\n onChange={onChange}\n value={value}\n />\n )\n case \"Checkbox\":\n return <Checkbox field={field} value={value} onChange={onChange} />\n case \"TextArea\":\n return <TextArea field={field} onChange={onChange} value={value} />\n\n case \"DateField\":\n return <DateField field={field} onChange={onChange} value={value} />\n case \"Checkboxes\":\n return (\n <Checkboxes\n fieldId={field.id}\n options={actionAllowedOptions}\n onChange={onChange}\n />\n )\n case \"NumberField\":\n return <NumberField field={field} onChange={onChange} value={value} />\n case \"PersonSearch\":\n return (\n <PersonSearch\n canAccessPeople={canAccessPeople}\n field={field}\n onChange={onChange}\n listOptions={listOptions}\n isLoading={loadingLists[fieldListIdentifier(field)]}\n loadListForField={loadListForField}\n value={value}\n />\n )\n case \"TextField\":\n return <TextField field={field} onChange={onChange} value={value} />\n case \"RadioButtons\":\n return (\n <RadioButtons\n field={field}\n options={listOptions}\n onChange={onChange}\n value={value}\n />\n )\n case \"StaticText\":\n return <Text dangerouslySetInnerHTML={{ __html: field.content }} />\n default:\n console.warn(`Unknown field kind \"${field.kind}\"`)\n return null\n }\n }\n\n return (\n <StackView marginBottom={2} spacing={0.5}>\n <Input.InputLabel\n color={token(\"--t-text-color-headline\")}\n fontSize={token(\"--t-font-size-sm\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n controls={field.id}\n >\n {field.description}\n {field.description && field.info && (\n <HelperDrawer.Toggle drawerId={`${field.id}_help`} marginLeft={1} />\n )}\n </Input.InputLabel>\n <Box>\n {loading ? <Loading /> : renderField()}\n {!field.description && field.info && (\n <HelperDrawer.Toggle drawerId={`${field.id}_help`} marginLeft={1} />\n )}\n </Box>\n {field.info && (\n <HelperDrawer\n id={`${field.id}_help`}\n marginTop={token(\"--t-spacing-half\")}\n >\n <Box dangerouslySetInnerHTML={{ __html: field.info }} />\n </HelperDrawer>\n )}\n </StackView>\n )\n}\n\nconst Select = ({\n fieldId,\n listOptions,\n onChange,\n value,\n description,\n disabled,\n}: {\n description?: string\n disabled?: boolean\n fieldId: string\n listOptions: LoadedList[]\n onChange: Function\n value: any\n}) => {\n const overridenEmptyValue = listOptions?.find(\n (option) => option.value === \"no-option\"\n )\n const groupedOptions = groupBy(listOptions, \"group\")\n const groupTypes = Object.keys(groupedOptions).sort()\n const renderOptions = () => {\n return groupTypes.map((gt) =>\n gt === \"null\" || gt === \"undefined\" ? (\n renderOptionsWithoutConsideringGroup(groupedOptions[gt])\n ) : (\n <TapestrySelect.OptionGroup key={gt} title={gt}>\n {renderOptionsWithoutConsideringGroup(groupedOptions[gt])}\n </TapestrySelect.OptionGroup>\n )\n )\n }\n\n const renderOptionsWithoutConsideringGroup = (\n items: { description: string; disabled?: boolean; value: string | number }[]\n ) => {\n return items.map((item) => (\n <TapestrySelect.Option\n key={item.value}\n value={item.value.toString()}\n disabled={item.disabled}\n >\n {item.description}\n </TapestrySelect.Option>\n ))\n }\n\n const handleSelectedValueChange = ({ selectedValue }) => {\n onChange({ fieldId, value: selectedValue })\n }\n\n const generatePrompt = (word: string) => {\n let prompt = `Select `\n if (!word) {\n prompt += \"a value\"\n } else if ([\"a\", \"e\", \"i\", \"o\", \"u\"].includes(word.charAt(0))) {\n prompt += `an ${word}`\n } else {\n prompt += `a ${word}`\n }\n return prompt\n }\n\n const renderEmptyValue = () => {\n if (renderOptions().length === 0) return \"No options available\"\n return (\n overridenEmptyValue?.description ||\n generatePrompt(description?.toLowerCase())\n )\n }\n\n return (\n <TapestrySelect\n id={fieldId}\n onChange={handleSelectedValueChange}\n disabled={renderOptions().length < 1 || !!disabled}\n emptyValue={renderEmptyValue()}\n size=\"lg\"\n value={value || overridenEmptyValue?.value || null}\n placement=\"bottom-start\"\n >\n {renderOptions()}\n </TapestrySelect>\n )\n}\n\nconst SelectSearch = ({\n fieldId,\n listOptions,\n onChange,\n value,\n}: {\n fieldId: string\n listOptions: LoadedList[]\n onChange: Function\n value?: string\n}) => {\n const selectedOption: LoadedList = listOptions.find(\n (option) => option.value?.toString() === value\n )\n const selectedLabel = selectedOption?.description || \"\"\n const [prevSelectedLabel, setPrevSelectedLabel] = useState(\"\")\n const [query, setQuery] = useState(selectedLabel)\n const [showFilteredOptions, setShowFilteredOptions] = useState(false)\n const [showClearButton, setShowClearButton] = useState(false)\n\n if (selectedLabel !== prevSelectedLabel) {\n setPrevSelectedLabel(selectedLabel)\n setQuery(selectedLabel)\n setShowFilteredOptions(false)\n }\n\n let filteredOptions = sortBy(uniqBy(listOptions, \"value\"), \"group\")\n\n if (showFilteredOptions) {\n const formattedQuery = query.toLowerCase()\n filteredOptions = filteredOptions.filter((option) => {\n const optionText = `${option.description} ${option.group}`.toLowerCase()\n return optionText.includes(formattedQuery)\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ fieldId, value })\n }\n\n return (\n <TapestryCombobox.Popover\n closeOnSelect\n closeButton={{ icon: { size: \"md\" } }}\n css={{\n \"[role='combobox']\": {\n cursor: listOptions.length > 0 ? \"pointer\" : \"not-allowed\",\n },\n }}\n cursor=\"pointer\"\n disabled={listOptions.length === 0}\n onBlur={() => {\n setShowClearButton(false)\n setQuery(selectedLabel)\n }}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(e.target.value)\n setShowFilteredOptions(true)\n setShowClearButton(true)\n }}\n onClear={\n showClearButton\n ? () => {\n setQuery(\"\")\n setShowFilteredOptions(false)\n }\n : undefined\n }\n onFocus={(e: React.ChangeEvent<HTMLInputElement>) => e.target.select()} // select all text on focus\n onSelect={(option: { description: string; value: string }) => {\n handleValueChange(option.value)\n setQuery(option.description)\n setShowFilteredOptions(false)\n setShowClearButton(false)\n }}\n openOnFocus\n paddingLeft={4.5}\n placeholder={\n listOptions.length > 0 ? \"Select an option\" : \"No options available\"\n }\n placement=\"bottom-start\"\n popoverProps={{\n matchWidths: \"minimum\",\n }}\n renderLeft={<Icon name=\"general.search\" size=\"md\" />}\n renderRight={<Icon name=\"general.downCaret\" />}\n size=\"lg\"\n value={query}\n >\n {listOptions.length > 0 && (\n <>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option: LoadedList, index: number) => {\n const isCurrent = option.value.toString() === value\n return (\n <TapestryCombobox.Item\n aria-label={option.description}\n disabled={option.disabled}\n index={index}\n key={option.value}\n paddingLeft={4.25}\n renderLeft={\n <Icon\n marginLeft={-0.5}\n name={isCurrent ? \"general.check\" : \"\"}\n size=\"sm\"\n />\n }\n role=\"option\"\n spacing={token(\"--t-spacing-1\")}\n value={{\n description: option.description,\n value: option.value.toString(),\n }}\n >\n <Text truncate>\n <Highlight text={option.description} query={query} />\n </Text>\n {option.group && (\n <Badge\n title={<Highlight text={option.group} query={query} />}\n size=\"sm\"\n marginLeft=\"auto\"\n />\n )}\n </TapestryCombobox.Item>\n )\n })\n ) : (\n <Menu.Item>\n <Text>No results for &quot;{query}&quot;</Text>\n </Menu.Item>\n )}\n </>\n )}\n </TapestryCombobox.Popover>\n )\n}\n\nconst PersonSearch = ({\n canAccessPeople,\n field,\n isLoading,\n listOptions,\n loadListForField,\n onChange,\n value,\n}: {\n canAccessPeople: boolean\n field: DefinitionField\n isLoading: boolean\n listOptions: LoadedList[]\n loadListForField: LoadListForField\n onChange: Function\n value?: string\n}) => {\n const immediateSearch = useCallback(\n (query: string) => {\n loadListForField({ dependencies: { query }, field })\n },\n [loadListForField]\n )\n\n const debouncedSearch = useMemo(\n () => debounce(immediateSearch, 300),\n [immediateSearch]\n )\n\n const search = useCallback(\n (query: string) => {\n if (!canAccessPeople) {\n return\n } else if (query.trim().length > 0) {\n debouncedSearch(query)\n } else {\n debouncedSearch.cancel()\n }\n },\n [debouncedSearch]\n )\n\n const myself: LoadedList = useMemo(\n () => ({ description: \"Myself\", value: \"self\" }),\n []\n )\n const allListOptions = useMemo(() => {\n if (!canAccessPeople) {\n return [myself]\n } else {\n return listOptions\n }\n }, [myself, listOptions])\n\n const selectedOption = allListOptions.find((option) => option.value === value)\n const selectedLabel = selectedOption?.description || \"\"\n const [query, _setQuery] = useState(selectedLabel)\n const [showClearButton, setShowClearButton] = useState(false)\n\n function setQuery(value: string) {\n _setQuery(value)\n search(value)\n if (value.trim().length === 0) {\n handleValueChange(null)\n }\n }\n\n const handleValueChange = (value: string) => {\n onChange({ fieldId: field.id, value })\n }\n\n return (\n <TapestryCombobox.Popover\n closeOnSelect\n closeButton={{ icon: { size: \"md\" } }}\n cursor=\"pointer\"\n onBlur={() => {\n setShowClearButton(false)\n setQuery(selectedLabel)\n }}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(e.target.value)\n setShowClearButton(true)\n }}\n onClear={\n showClearButton\n ? () => {\n setQuery(\"\")\n }\n : undefined\n }\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => e.target.select()} // select all text on focus\n onSelect={(option: { description: string; value: string }) => {\n handleValueChange(option.value)\n setQuery(option.description)\n setShowClearButton(false)\n }}\n openOnFocus\n paddingLeft={4.5}\n placeholder=\"Search\"\n placement=\"bottom-start\"\n popoverProps={{\n matchWidths: \"minimum\",\n }}\n renderLeft={\n selectedOption && selectedOption.meta?.avatar ? (\n <Avatar size=\"sm\" source={selectedOption.meta.avatar} />\n ) : (\n <Icon name=\"general.search\" size=\"md\" />\n )\n }\n renderRight={<Icon name=\"general.downCaret\" />}\n size=\"lg\"\n value={query}\n >\n {canAccessPeople ? (\n query.trim().length > 0 ? (\n listOptions.length > 0 ? (\n listOptions.map((option, index) => {\n return (\n <TapestryCombobox.Item\n aria-label={option.description}\n index={index}\n key={option.value}\n paddingLeft={4.25}\n renderLeft={\n <Avatar\n marginLeft={-0.5}\n source={option.meta.avatar}\n size=\"sm\"\n />\n }\n role=\"option\"\n spacing={token(\"--t-spacing-1\")}\n value={option}\n >\n <Text truncate>\n <Highlight text={option.description} query={query} />\n </Text>\n </TapestryCombobox.Item>\n )\n })\n ) : isLoading ? (\n <TapestryCombobox.Item>\n <Text>Loading...</Text>\n </TapestryCombobox.Item>\n ) : (\n <TapestryCombobox.Item>\n <Text>No results</Text>\n </TapestryCombobox.Item>\n )\n ) : (\n <TapestryCombobox.Item>\n <Text>Type to search</Text>\n </TapestryCombobox.Item>\n )\n ) : (\n <TapestryCombobox.Item value={myself} index={0} role=\"option\">\n <Text>{myself.description}</Text>\n </TapestryCombobox.Item>\n )}\n </TapestryCombobox.Popover>\n )\n}\n\nconst Checkbox = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleCheckedValueChange = (e) => {\n const value = e.target.checked\n onChange({ fieldId: field.id, value })\n }\n\n return (\n <TapestryCheckbox\n disabled={field.disabled}\n label={field.label}\n checked={value || false}\n onChange={handleCheckedValueChange}\n />\n )\n}\n\nconst TextArea = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleTextChange = (e) => {\n const val = e.target.value\n onChange({ fieldId: field.id, value: val })\n }\n return (\n <Box>\n <TapestryTextArea\n value={value}\n placeholder={field.placeholder}\n onChange={handleTextChange}\n size=\"lg\"\n />\n </Box>\n )\n}\n\nconst DateField = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const { dateFormat } = useContext(OrganizationContext)\n const [specificDate, setSpecificDate] = useState(false)\n const todaysValue = field.customValue || \"Day automation runs\"\n const dateBeforeValue = \"Day before automation runs\"\n const orgFormat = dateFNSFormat(dateFormat)\n const [dateFieldValue, setDateFieldValue] = useState(moment(value).toDate())\n const allowUnansweredOption = field.allowUnansweredOption ?? false\n\n const handleSelectChange = ({ selectedValue }) => {\n if (selectedValue === todaysValue || selectedValue === dateBeforeValue) {\n setSpecificDate(false)\n onChange({ fieldId: field.id, value: selectedValue })\n } else if (selectedValue === \"specific-date\") {\n onChange({ fieldId: field.id, value: null })\n setSpecificDate(true)\n } else {\n setSpecificDate(false)\n onChange({ fieldId: field.id, value: null })\n }\n }\n\n const handleValueChanged = (date: Date) => {\n onChange({ fieldId: field.id, value: dateLocalized(date, dateFormat) })\n setDateFieldValue(date)\n }\n\n return (\n <StackView axis=\"horizontal\">\n <TapestrySelect\n onChange={handleSelectChange}\n size=\"lg\"\n placement=\"bottom-start\"\n >\n <TapestrySelect.Option value={todaysValue}>\n {todaysValue}\n </TapestrySelect.Option>\n {!field.customValue && (\n <TapestrySelect.Option value={dateBeforeValue}>\n {dateBeforeValue}\n </TapestrySelect.Option>\n )}\n <TapestrySelect.Option value=\"specific-date\">\n A specific date\n </TapestrySelect.Option>\n {allowUnansweredOption && (\n <TapestrySelect.Option value=\"unanswered\">\n Unanswered\n </TapestrySelect.Option>\n )}\n </TapestrySelect>\n {specificDate && (\n <Box>\n <TapestryDateField\n defaultOpen\n formatValue={orgFormat}\n marginLeft={1}\n onChange={handleValueChanged}\n size=\"lg\"\n value={dateFieldValue}\n />\n </Box>\n )}\n </StackView>\n )\n}\n\nconst Checkboxes = ({\n fieldId,\n options,\n onChange,\n}: {\n fieldId: string\n onChange: Function\n options: { description: string; value: string | number }[]\n}) => {\n const [selectedValues, setSelectedValues] = useState({})\n\n const handleCheckboxesChange = (selectedValue, value) => {\n const newSelectedValues = { ...selectedValues }\n newSelectedValues[value] = selectedValue\n setSelectedValues(newSelectedValues)\n onChange({ fieldId, value: newSelectedValues })\n }\n\n return (\n <StackView spacing={1}>\n {options.map((item) => (\n <Box key={item.value}>\n <Input.InputLabel controls={`checkboxes_${fieldId}_${item.value}`}>\n {item.description || item.value}\n </Input.InputLabel>\n <TapestrySelect\n id={`checkboxes_${fieldId}_${item.value}`}\n onChange={({ selectedValue }) =>\n handleCheckboxesChange(selectedValue, item.value)\n }\n size=\"lg\"\n emptyValue={\"Don't change\"}\n >\n <TapestrySelect.Option value=\"check\">Check</TapestrySelect.Option>\n <TapestrySelect.Option value=\"uncheck\">\n Uncheck\n </TapestrySelect.Option>\n </TapestrySelect>\n </Box>\n ))}\n </StackView>\n )\n}\n\nconst NumberField = ({\n field,\n onChange,\n value,\n}: {\n field: DefinitionField\n onChange: Function\n value: string\n}) => {\n const minimumValue = field.minValue >= 0 ? field.minValue : 1\n const maximumValue =\n field.maxValue >= 1 && field.maxValue <= 365 ? field.maxValue : 365\n\n const [inputValue, setInputValue] = useState(Number(field.defaultValue) || 1)\n\n useEffect(() => {\n onChange({ fieldId: field.id, value: field.defaultValue || 1 })\n }, [field])\n\n return (\n <StackView>\n <Input.InputBox>\n <TapestryNumberField\n onChange={(value: string) => {\n const newNumberValue = Number(value) || 0\n setInputValue(newNumberValue)\n\n onChange({\n fieldId: field.id,\n value: Math.min(\n Math.max(newNumberValue, minimumValue),\n maximumValue\n ),\n })\n }}\n placeholder={field.placeholder}\n size=\"lg\"\n value={value}\n min={minimumValue}\n max={maximumValue}\n hasControls={true}\n />\n </Input.InputBox>\n {inputValue > maximumValue && (\n <Alert\n type=\"error\"\n paddingHorizontal={token(\"--t-spacing-1\")}\n paddingVertical={token(\"--t-spacing-half\")}\n display=\"inline-block\"\n marginTop={1.5}\n >\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.75}>\n <Icon\n name=\"general.exclamationTriangle\"\n size=\"sm\"\n color=\"delete45\"\n />\n <Text size={token(\"--t-font-size-md\")}>\n Value cannot exceed {maximumValue}.\n </Text>\n </StackView>\n </Alert>\n )}\n </StackView>\n )\n}\n\nconst TextField = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleTextChange = (e) => {\n const val = e.target.value\n onChange({ fieldId: field.id, value: val })\n }\n return (\n <Box>\n <Input\n size=\"lg\"\n value={value ?? \"\"}\n id={field.id}\n placeholder={field.placeholder}\n onChange={handleTextChange}\n />\n </Box>\n )\n}\n\nconst RadioButtons = ({\n field,\n options,\n onChange,\n value,\n}: {\n field: DefinitionField\n onChange: Function\n options: LoadedList[]\n value: any\n}) => {\n const handleCheckedChange = (e) => {\n onChange({ fieldId: field.id, value: e.target.value })\n }\n\n return (\n <StackView marginTop={1} spacing={0.5}>\n {options.map((option) => (\n <Radio\n checked={value === option.value}\n key={option.value}\n label={option.description || option.value}\n onChange={handleCheckedChange}\n size=\"md\"\n value={option.value}\n />\n ))}\n </StackView>\n )\n}\n\nconst Loading = () => (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={token(\"--t-border-radius-md\")}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n)\n\nexport default Field\n","import React, { useEffect } from \"react\"\n\nimport Field from \"./field\"\nimport { getRenderedFields } from \"./utils/utils\"\n\ninterface FieldsProps {\n canAccessPeople: boolean\n definitionFields: DefinitionField[]\n loadListForField: LoadListForField\n loadedLists: { [k: string]: LoadedList[] }\n loadingLists: { [k: string]: boolean }\n onChange: Function\n selectedFieldOptions: SelectedFieldOptions\n}\n\nconst Fields = ({\n canAccessPeople,\n definitionFields,\n onChange,\n selectedFieldOptions,\n loadListForField,\n loadedLists,\n loadingLists,\n}: FieldsProps): JSX.Element => {\n useEffect(() => {\n const newSelections = definitionFields.reduce((acc, field) => {\n if (Object.prototype.hasOwnProperty.call(field, \"defaultValue\")) {\n acc[field.id] = field.defaultValue\n } else if (field.kind === \"DateField\") {\n acc[field.id] = field.customValue || \"Date automation runs\"\n }\n\n return acc\n }, {})\n // Merge: existing values (e.g. pre-populated from an existing automation)\n // take precedence over field defaults.\n onChange((prev: SelectedFieldOptions) => ({ ...newSelections, ...prev }))\n }, [definitionFields, onChange])\n\n const renderableFields = getRenderedFields(\n definitionFields,\n selectedFieldOptions\n )\n\n const handleSelectedFieldOptionsChange = ({ fieldId, value }) => {\n const newSelections = { ...selectedFieldOptions }\n const dependents = definitionFields.filter((field) => field.dependsOn)\n dependents.map((dependent) => {\n if (dependent.dependsOn.includes(fieldId)) {\n const deeper = dependents.find((d) =>\n d.dependsOn.includes(dependent.id)\n )\n if (deeper) {\n delete newSelections[deeper.id]\n }\n delete newSelections[dependent.id]\n\n if (\n dependent.defaultValue !== undefined &&\n newSelections[dependent.id] === undefined\n ) {\n newSelections[dependent.id] = dependent.defaultValue\n }\n }\n })\n\n if (value === \"no-option\") {\n delete newSelections[fieldId]\n } else {\n newSelections[fieldId] = value\n }\n\n onChange({ ...newSelections })\n }\n\n if (definitionFields.length) {\n return (\n <div>\n {renderableFields.map((field) => {\n return (\n <Field\n canAccessPeople={canAccessPeople}\n field={field}\n key={field.id}\n onChange={handleSelectedFieldOptionsChange}\n value={selectedFieldOptions[field.id]}\n selectedFieldOptions={selectedFieldOptions}\n loadListForField={loadListForField}\n loadedLists={loadedLists}\n loadingLists={loadingLists}\n />\n )\n })}\n </div>\n )\n } else {\n return null\n }\n}\n\nexport default Fields\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Icon,\n Input,\n Link,\n Select,\n Spinner,\n StackView,\n Text,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport Definition from \"./definition\"\nimport Fields from \"./fields\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n buildDescription,\n buildTriggerConditions,\n fieldListIdentifier,\n getRenderedFields,\n} from \"./utils/utils\"\n\nconst client = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"LATEST\",\n})\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"LATEST\",\n})\nconst errorAlertProps = {\n css: { borderRadius: token(\"--t-border-radius-md\") },\n paddingHorizontal: 1.75,\n paddingVertical: 1.25,\n type: \"error\",\n}\n\ntype TopbarResponse = {\n data: {\n apps: Array<{ name: string }>\n type: \"Topbar\"\n }\n}\n\nasync function getVisibleApps() {\n return client\n .get<TopbarResponse>({\n data: {\n fields: { Topbar: \"apps\" },\n },\n url: \"/me/topbar\",\n })\n .then(({ data }) => data.apps.map((a) => a.name))\n}\n\nasync function getWebhooksApps() {\n return webhooksClient\n .get<{ data: Array<{ name: string; type: \"OperationApp\" }> }>({\n data: { fields: { OperationApp: \"name\" } },\n url: \"/operation_apps\",\n })\n .then(({ data }) => data.map((a) => a.name))\n}\n\nasync function getOperationApps() {\n const [visibleApps, webhooksApps] = await Promise.all([\n getVisibleApps(),\n getWebhooksApps(),\n ])\n\n return visibleApps\n .filter((app) => webhooksApps.includes(app))\n .sort()\n .map((app: string) => ({ id: app.toLowerCase(), name: app }))\n}\n\nasync function getOperationDefinitions(app: string) {\n return webhooksClient\n .get({\n data: {\n fields: {\n OperationDefinition:\n \"definition_class,definition_fields,definition_identifier,description,group,section,section_group,footer_message\",\n },\n filter: \"automation_allowed\",\n walk: true,\n },\n url: `/operation_apps/${app}/operation_definitions`,\n })\n .then(({ data }) => data)\n}\n\nasync function getListOptions({\n app,\n field,\n definitionIdentifier,\n dependencies,\n}: {\n app: string\n definitionIdentifier: string\n dependencies: { [k: string]: string }\n field: DefinitionField\n}): Promise<LoadedList[]> {\n if (field.kind === \"PersonSearch\") {\n const { data: people } = await client.get<{\n data: { avatar: string; id: number; name: string }[]\n }>({\n data: {\n fields: { Person: \"avatar,name\" },\n where: { search_name_or_email: dependencies.query, status: \"active\" },\n },\n url: \"/people\",\n })\n\n return people.map((p) => ({\n description: p.name,\n meta: { avatar: p.avatar },\n value: p.id.toString(),\n }))\n } else {\n const { data } = await webhooksClient.get({\n data: {\n ...dependencies,\n definitionIdentifier,\n fields: {\n OperationDefinitionList: \"values\",\n },\n },\n url: `/operation_apps/${app}/operation_definition_lists/${field.listClass}`,\n })\n return data.values\n }\n}\n\nconst NewAutomation = ({\n afterCreateOptions,\n blankStateLink,\n debugMode = false,\n defaultApp,\n description,\n onRequestClose,\n trigger,\n}: {\n afterCreateOptions?: AfterCreateOptions\n blankStateLink: string\n debugMode?: boolean\n defaultApp: string\n description: string\n onRequestClose: () => void\n trigger: AutomationTrigger\n}) => {\n const [selectedTriggerEvent, setSelectedTriggerEvent] = useState(\n trigger.events[0]\n )\n const [dynamicTriggerConditions, setDynamicTriggerConditions] =\n useState<SelectedFieldOptions>({})\n const [selectedApp, setSelectedApp] = useState(defaultApp)\n const [operationApps, setOperationApps] = useState<\n { id: string; name: string }[]\n >([])\n const [operationDefinitions, setOperationDefinitions] = useState<\n OperationDefinition[]\n >([])\n const [loadingOperationDefinitions, setLoadingOperationDefinitions] =\n useState(true)\n const [selectedDefinition, setSelectedDefinition] =\n useState<OperationDefinition>()\n const [selectedFieldOptions, setSelectedFieldOptions] =\n useState<SelectedFieldOptions>({})\n const [loadedLists, setLoadedLists] = useState<{ [k: string]: LoadedList[] }>(\n {}\n )\n const [loadingLists, setLoadingLists] = useState<{ [k: string]: boolean }>({})\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<{\n automation?: string | string[]\n definitions?: string | string[]\n selected_definition?: string | string[]\n }>({})\n const [callAfterCreate, setCallAfterCreate] = useState(false)\n const [triggerParams, setTriggerParams] = useState<{ [k: string]: string }>(\n {}\n )\n const activeAppRef = useRef(null)\n\n const canAccessPeople = useMemo(\n () => operationApps.map((a) => a.id).includes(\"people\"),\n [operationApps]\n )\n\n const definitionIdentifier = selectedDefinition?.definitionIdentifier\n const dangerAlertPresent =\n selectedDefinition?.footerMessage?.kind === \"danger\"\n\n const loadListForField = useCallback<LoadListForField>(\n ({ field, dependencies }) => {\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: true,\n }))\n getListOptions({\n app: selectedApp,\n definitionIdentifier,\n dependencies,\n field,\n })\n .then((ret) => {\n setLoadedLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: ret,\n }))\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: false,\n }))\n })\n .catch((error) => setError({ selected_definition: error }))\n },\n [selectedApp, definitionIdentifier]\n )\n\n const handleChangeSelectedApp = (app: string) => {\n setSelectedApp(app)\n setLoadingOperationDefinitions(true)\n setOperationDefinitions([])\n activeAppRef.current = app\n setSelectedDefinition(null)\n setSelectedFieldOptions({})\n setError({})\n getOperationDefinitions(app)\n .then(setOperationDefinitions)\n .then(() => setLoadingOperationDefinitions(false))\n .catch((error) => setError({ definitions: error }))\n }\n\n const handleChangeTriggerEvent = (\n selectedValue: typeof selectedTriggerEvent\n ) => {\n setSelectedTriggerEvent(selectedValue)\n setDynamicTriggerConditions({})\n }\n\n useEffect(() => {\n setError({})\n getOperationApps().then((apps) => {\n setOperationApps(apps)\n const defaultSelection = apps.find((app) => app.id === defaultApp)\n ? defaultApp\n : apps[0].id\n setSelectedApp(defaultSelection)\n getOperationDefinitions(defaultSelection)\n .then((definitions) => {\n if (!activeAppRef.current) {\n setOperationDefinitions(definitions)\n setLoadingOperationDefinitions(false)\n }\n })\n .catch((error) => setError({ definitions: error }))\n })\n }, [defaultApp])\n\n useEffect(() => {\n setError({})\n }, [selectedFieldOptions])\n\n const dynamicConditions =\n \"dynamicConditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.dynamicConditions\n : trigger.dynamicConditions\n const triggerConditions = buildTriggerConditions({\n baseConditions:\n \"conditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.conditions\n : trigger.conditions,\n dynamicConditions,\n dynamicTriggerConditions,\n })\n\n const handleSelectedDefinitionChange = (\n newDefinition: OperationDefinition\n ) => {\n setSelectedDefinition(newDefinition)\n setError({})\n setSelectedFieldOptions({})\n }\n\n function getDescription(): string {\n const descriptionParts = buildDescription({\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n })\n\n let description = descriptionParts.name\n\n if (descriptionParts.description) {\n description += ` (${descriptionParts.description})`\n }\n\n return description\n }\n\n function handleSubmit() {\n if (submitting) {\n return\n }\n const operation_params = { ...selectedFieldOptions }\n\n if (selectedDefinition.definitionIdentifier) {\n operation_params.definition_identifier =\n selectedDefinition.definitionIdentifier\n }\n\n const data = {\n _e: trigger.resource,\n data: {\n attributes: {\n description: getDescription(),\n name: selectedTriggerEvent.name,\n operation_app_name: selectedApp,\n operation_definition_class_name: selectedDefinition.definitionClass,\n operation_params,\n trigger_conditions: triggerConditions,\n trigger_params: triggerParams,\n },\n type: \"AutomationSubscription\",\n },\n }\n if (callAfterCreate) {\n alerts.confirmCreate\n .fire({\n cancelButtonText: \"Cancel\",\n confirmButtonText: \"Yes, perform action\",\n text: \"This will happen immediately after creating your new automation. Are you sure?\",\n title: `${afterCreateOptions.label}?`,\n })\n .then((result: { value: any }) => {\n if (result.value) {\n submitCreate(data)\n } else {\n setSubmitting(false)\n setCallAfterCreate(false)\n }\n })\n } else {\n submitCreate(data)\n }\n }\n\n function submitCreate(data) {\n setSubmitting(true)\n webhooksClient\n .post({\n data,\n url: \"/me/automation_subscriptions\",\n })\n .then(() => {\n if (afterCreateOptions?.onConfirm && callAfterCreate) {\n onRequestClose()\n afterCreateOptions.onConfirm({ ...data })\n } else {\n window.location.reload()\n }\n })\n .catch((error) => {\n setSubmitting(false)\n if (error.errors) {\n setError({ automation: error.errors })\n } else {\n alert(\"something even worse happened!\")\n }\n })\n }\n\n return (\n <StackView paddingTop={4} spacing={2}>\n {description && (\n <Box>\n <Text\n style={{\n color: token(\"--t-text-color\"),\n fontSize: token(\"--t-font-size-md\"),\n lineHeight: 1.65,\n marginBottom: token(\"--t-spacing-2\"),\n }}\n >\n {description}{\" \"}\n <Link external to={blankStateLink}>\n Learn more\n </Link>\n </Text>\n </Box>\n )}\n {error.automation && (\n <Alert {...errorAlertProps}>\n <Text>\n There was an error creating your automation. Please change your\n selections and try again or contact support if the problem persists.\n </Text>\n </Alert>\n )}\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color\")}\n controls=\"select-trigger-event\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n When a person...\n </Input.InputLabel>\n <Select\n id=\"select-trigger-event\"\n onChange={({ selectedValue }) =>\n handleChangeTriggerEvent(selectedValue)\n }\n size=\"lg\"\n value={selectedTriggerEvent}\n >\n {trigger.events.map((triggerEvent, idx) => (\n <Select.Option\n key={`${triggerEvent.name}_${idx}`}\n value={triggerEvent}\n >\n {triggerEvent.description}\n </Select.Option>\n ))}\n </Select>\n\n {dynamicConditions?.length > 0 && (\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={dynamicConditions}\n selectedFieldOptions={dynamicTriggerConditions}\n onChange={setDynamicTriggerConditions}\n loadedLists={{}}\n loadingLists={{}}\n loadListForField={() => null}\n />\n )}\n </StackView>\n\n <StackView spacing={1}>\n {operationApps.length > 0 ? (\n <Application\n selectedApp={selectedApp}\n operationApps={operationApps}\n onOperationAppChange={handleChangeSelectedApp}\n />\n ) : (\n <StackView spacing={1}>\n <Text\n color={token(\"--t-text-color-headline\")}\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Text>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={4}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n </StackView>\n )}\n {error.definitions ? (\n <Alert marginTop={token(\"--t-spacing-1\")} {...errorAlertProps}>\n <Text>\n There was a problem looking up automations. Please contact support\n if the problem persists.\n </Text>\n </Alert>\n ) : loadingOperationDefinitions ? (\n <LoadingOperationDefinitions />\n ) : (\n <Definition\n selectedOperation={selectedDefinition}\n operationDefinitions={operationDefinitions}\n onOperationDefinitionChange={handleSelectedDefinitionChange}\n />\n )}\n </StackView>\n\n {selectedDefinition &&\n (error.selected_definition ? (\n <Alert {...errorAlertProps}>\n <Text>\n There was a problem looking up automation options. Please contact\n support if the problem persists.\n </Text>\n </Alert>\n ) : (\n <>\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={selectedDefinition.definitionFields || []}\n onChange={setSelectedFieldOptions}\n selectedFieldOptions={selectedFieldOptions}\n loadedLists={loadedLists}\n loadListForField={loadListForField}\n loadingLists={loadingLists}\n />\n {afterCreateOptions?.label && (\n <Checkbox\n disabled={\n submitting ||\n disableSubmit(selectedDefinition, selectedFieldOptions)\n }\n label={afterCreateOptions.label}\n checked={callAfterCreate}\n onChange={() => setCallAfterCreate(!callAfterCreate)}\n />\n )}\n {selectedTriggerEvent?.triggerParams?.map((param, idx) => (\n <Checkbox\n key={`${param.key}_${idx}`}\n label={param.description}\n checked={\n (triggerParams && triggerParams[param.key]) ||\n param.defaultValue\n }\n onChange={(e) => {\n setTriggerParams((prev) => ({\n ...prev,\n [`${param.key}`]: e.target.checked,\n }))\n }}\n />\n ))}\n {dangerAlertPresent && (\n <Alert {...errorAlertProps}>\n <StackView axis=\"horizontal\" spacing={1.5}>\n <Icon\n size={token(\"--t-element-size-lg\")}\n name=\"general.exclamationTriangle\"\n color={token(\"--t-icon-color-status-error\")}\n />\n <Text\n dangerouslySetInnerHTML={{\n __html: selectedDefinition.footerMessage?.html,\n }}\n />\n </StackView>\n </Alert>\n )}\n </>\n ))}\n\n {debugMode && (\n <pre>\n {JSON.stringify(\n {\n description: selectedDefinition && getDescription(),\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n triggerConditions,\n },\n null,\n 4\n )}\n </pre>\n )}\n\n <StackView\n alignment=\"center\"\n axis=\"horizontal\"\n borderTop={`1px solid ${token(\"--t-border-color\")}`}\n distribution=\"end\"\n marginTop={2}\n marginHorizontal={-4}\n paddingHorizontal={4}\n paddingTop={3}\n spacing={2}\n >\n <Button\n color={token(\"--t-text-color-headline\")}\n // for temporary backwards compatibility\n data-modal-close\n fontWeight={token(\"--t-font-weight-normal\")}\n onClick={onRequestClose}\n size=\"md\"\n title=\"Cancel\"\n variant=\"naked\"\n />\n <Button\n disabled={\n submitting ||\n dangerAlertPresent ||\n disableSubmit(\n selectedDefinition,\n selectedFieldOptions,\n dynamicConditions,\n dynamicTriggerConditions\n )\n }\n onClick={handleSubmit}\n size=\"md\"\n theme=\"primary\"\n title={getButtonText(selectedDefinition, selectedFieldOptions)}\n variant=\"fill\"\n data-testid=\"create-automation\"\n />\n </StackView>\n </StackView>\n )\n}\n\nfunction disableSubmit(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions,\n dynamicConditions?: DefinitionField[],\n dynamicTriggerConditions?: SelectedFieldOptions\n) {\n if (!selectedDefinition) return true\n\n const operationFields = getRenderedFields(\n selectedDefinition.definitionFields,\n selectedFieldOptions\n )\n if (\n !operationFields\n .filter((field) => field.required)\n .every((field) => fieldIsFilled(field, selectedFieldOptions))\n )\n return true\n if (\n !operationFields\n .filter((field) => fieldIsSelect(field))\n .every((field) => fieldIsFilled(field, selectedFieldOptions))\n )\n return true\n\n const triggerFields = getRenderedFields(\n dynamicConditions ?? [],\n dynamicTriggerConditions ?? {}\n )\n if (\n !triggerFields\n .filter((field) => field.required)\n .every((field) => fieldIsFilled(field, dynamicTriggerConditions ?? {}))\n )\n return true\n\n return false\n}\n\nfunction fieldIsSelect(field: DefinitionField) {\n return field.kind === \"Select\" || field.kind === \"SelectSearch\"\n}\n\nfunction fieldIsFilled(\n field: DefinitionField,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (fieldIsSelect(field)) {\n return selectedFieldOptions.hasOwnProperty(field.id)\n } else {\n return (\n selectedFieldOptions.hasOwnProperty(field.id) &&\n selectedFieldOptions[field.id] &&\n selectedFieldOptions[field.id].toString().trim() !== \"\"\n )\n }\n}\n\nfunction getNextRequiredDescription(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (!selectedDefinition?.definitionFields) return\n\n const renderedFields = getRenderedFields(\n selectedDefinition.definitionFields,\n selectedFieldOptions\n )\n\n for (const field of renderedFields) {\n if (field.required && !fieldIsFilled(field, selectedFieldOptions))\n return field.description\n }\n}\n\nfunction getButtonText(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions\n) {\n const nextRequiredDescription = getNextRequiredDescription(\n selectedDefinition,\n selectedFieldOptions\n )\n\n if (!selectedDefinition) {\n return \"Select an action\"\n } else if (nextRequiredDescription) {\n return `Select a${\n nextRequiredDescription.charAt(0).match(/[aeiou]/i) ? \"n\" : \"\"\n } ${nextRequiredDescription.toLowerCase()}`\n } else {\n return \"Create automation\"\n }\n}\n\nconst Application = ({\n onOperationAppChange,\n operationApps,\n selectedApp,\n}: {\n onOperationAppChange: (selectedValue: string) => void\n operationApps: Array<{ id: string; name: string }>\n selectedApp: string\n}) => {\n const handleChange = ({ selectedValue }) => {\n onOperationAppChange(selectedValue)\n }\n\n return (\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color-headline\")}\n controls=\"select-product\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Input.InputLabel>\n <Select\n autoFocus\n id=\"select-product\"\n onChange={handleChange}\n size=\"lg\"\n value={selectedApp}\n >\n {operationApps.map((app) => (\n <Select.Option key={app.id} value={app.id}>\n {app.name}\n </Select.Option>\n ))}\n </Select>\n </StackView>\n )\n}\n\nconst LoadingOperationDefinitions = () => (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={token(\"--t-border-radius-md\")}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n)\n\nexport default NewAutomation\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Button,\n Heading,\n Modal,\n StackView,\n ThemeProvider,\n} from \"@planningcenter/tapestry-react\"\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\n\nfunction CloseModalIcon({\n onClick,\n}: {\n onClick: React.MouseEventHandler\n}): JSX.Element {\n return (\n <Button\n as=\"button\"\n height={token(\"--t-element-size-md\")}\n icon={{ color: token(\"--t-icon-color-dim\"), name: \"general.x\" }}\n onClick={onClick}\n size={\"sm\"}\n title=\"Close\"\n variant=\"naked\"\n />\n )\n}\n\nfunction NewAutomationModal({\n children,\n onRequestClose,\n open,\n theme,\n}: {\n children: React.ReactNode\n onRequestClose: () => void\n open: boolean\n theme: object\n}): React.ReactPortal | JSX.Element {\n return createPortal(\n <ThemeProvider theme={theme}>\n <Modal\n open={open}\n onRequestClose={onRequestClose}\n maxWidth={75}\n boxShadow=\"0 0 20px rgba(0, 0, 0, 0.15)\"\n padding={token(\"--t-spacing-4\")}\n paddingBottom={token(\"--t-spacing-3\")}\n radius={token(\"--t-border-radius-lg\")}\n zIndex={10009}\n >\n <StackView\n axis=\"horizontal\"\n distribution=\"space-between\"\n alignment=\"center\"\n >\n <Heading\n level={2}\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n fontSize={token(\"--t-font-size-2xl\")}\n lineHeight=\"1.4\"\n >\n Create automation\n </Heading>\n <CloseModalIcon onClick={onRequestClose} />\n </StackView>\n {children}\n </Modal>\n <style>{`\n .swal2-container.swal2-backdrop-show { z-index: 10001 }\n `}</style>\n </ThemeProvider>,\n document.body\n )\n}\n\nexport default NewAutomationModal\n","import * as churchCenter from \"@planningcenter/icons/paths/church-center\"\nimport * as logomark from \"@planningcenter/icons/paths/logomark\"\nimport * as services from \"@planningcenter/icons/paths/services\"\n\nexport const icons = {\n churchCenter,\n logomark,\n services,\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Box,\n Button,\n Heading,\n Icon,\n Spinner,\n StackView,\n Summary,\n Text,\n ThemeProvider,\n TileView,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport sortBy from \"lodash/sortBy\"\nimport React, { useEffect, useState } from \"react\"\n\nimport SvgAutomations from \"./assets/svg_automations\"\nimport { EditableAutomation } from \"./automation\"\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport IncomingAutomations from \"./incoming_automations\"\nimport NewAutomation from \"./new_automation\"\nimport NewAutomationModal from \"./new_automation_modal\"\nimport styles from \"./styles.scss\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n fetchAutomations,\n fetchCreatorProfiles,\n mergeProfilesAndSubscriptions,\n} from \"./utils/fetch-automations\"\nimport { resolveResponseDetails } from \"./utils/resolve-response-details\"\nimport { icons } from \"./utils/theme\"\nimport {\n deobfuscateDescriptions,\n forbiddenText,\n pluralize,\n} from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\n\nfunction Header({\n afterCreateOptions,\n automations,\n blankStateLink,\n canCreate,\n defaultApp,\n description,\n hasActiveAutomations,\n loading,\n onPauseAutomations,\n theme,\n trigger,\n}: {\n afterCreateOptions?: AfterCreateOptions\n automations: AutomationInstance[]\n blankStateLink: string\n canCreate: boolean\n defaultApp: string\n description: string\n hasActiveAutomations: boolean\n loading: boolean\n onPauseAutomations: Function\n theme: object\n trigger: AutomationTrigger\n}) {\n const [newModalVisible, setNewModalVisible] = useState(false)\n const isPaused = canCreate && !hasActiveAutomations\n\n const activeCount = automations.filter(\n (automation) => automation.active\n ).length\n const pausedCount = automations.filter(\n (automation) => !automation.active\n ).length\n\n return (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n backgroundColor={\n isPaused ? token(\"--t-fill-color-status-warning-ghost\") : undefined\n }\n borderBottom={\n isPaused ? undefined : `1px solid ${token(\"--t-border-color\")}`\n }\n data-testid=\"automations-header\"\n distribution=\"space-between\"\n marginHorizontal={-3}\n marginBottom={token(\"--t-spacing-2\")}\n marginTop={-3}\n paddingHorizontal={token(\"--t-spacing-3\")}\n paddingVertical={token(\"--t-spacing-2\")}\n spacing={token(\"--t-spacing-2\")}\n wrap\n zIndex={2}\n >\n {canCreate && !hasActiveAutomations ? (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n marginHorizontal={1}\n spacing={1}\n >\n <Icon\n size={2}\n color={token(\"--t-icon-color-status-warning\")}\n name=\"general.exclamationTriangle\"\n />\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n Automations are currently paused\n </Heading>\n </StackView>\n ) : (\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n {loading\n ? \"Active automations\"\n : pluralize(activeCount, \"active automation\")}\n {pausedCount > 0 ? ` (${pausedCount} paused)` : \"\"}\n </Heading>\n )}\n {canCreate &&\n (hasActiveAutomations ? (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n >\n {automations.length > 0 && (\n <Button onClick={onPauseAutomations} variant=\"outline\">\n Pause automations\n </Button>\n )}\n <Button\n theme=\"primary\"\n variant=\"fill\"\n onClick={() => setNewModalVisible(true)}\n >\n Create automation\n </Button>\n <NewAutomationModal\n open={newModalVisible}\n onRequestClose={() => setNewModalVisible(false)}\n theme={theme}\n >\n <NewAutomation\n description={description}\n blankStateLink={blankStateLink}\n defaultApp={defaultApp}\n trigger={trigger}\n onRequestClose={() => setNewModalVisible(false)}\n afterCreateOptions={afterCreateOptions}\n />\n </NewAutomationModal>\n </StackView>\n ) : (\n <Box>\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={1}>\n <Button\n onClick={onPauseAutomations}\n theme=\"primary\"\n variant=\"outline\"\n >\n Enable automations\n </Button>\n <Button\n theme=\"primary\"\n disabled\n tooltip={{\n title: \"Automations must be enabled to create new ones\",\n }}\n >\n Create automation\n </Button>\n </StackView>\n </Box>\n ))}\n </StackView>\n )\n}\n\nexport default function Automations({\n afterCreateOptions,\n blankStateDescription,\n blankStateLink = \"https://pcopeople.zendesk.com/hc/en-us/articles/217582148-Automations\",\n currentPersonId,\n currentPersonCanCreate,\n defaultApp,\n incomingAutomationsParam,\n theme,\n trigger,\n currentOrganization,\n permissionDeniedReason = \"You need permissions of Editor or above to add an automation.\",\n disabled = false,\n disabledReason = \"Not allowed\",\n}: {\n afterCreateOptions?: AfterCreateOptions\n blankStateDescription: string\n blankStateLink?: string\n currentOrganization: {\n dateFormat: string\n olsonTimeZone: string\n twentyFourHourTime: boolean\n }\n currentPersonCanCreate: boolean\n currentPersonId: number\n defaultApp: string\n disabled?: boolean\n disabledReason?: string\n incomingAutomationsParam?: string\n permissionDeniedReason?: string\n theme?: object\n trigger?: AutomationTrigger\n}) {\n useEffect(() => {\n if (!trigger) return setLoading(false)\n fetchAutomations(trigger.resource)\n .then(fetchCreatorProfiles)\n .then(mergeProfilesAndSubscriptions)\n .then(deobfuscateDescriptions)\n .then(resolveResponseDetails)\n .then(setAutomations)\n .then(() => setLoading(false))\n }, [trigger?.resource])\n\n const [automations, setAutomations] = useState([])\n const [loading, setLoading] = useState(true)\n const [newModalVisible, setNewModalVisible] = useState(false)\n\n const { dateFormat, twentyFourHourTime, olsonTimeZone } = currentOrganization\n\n const params = new URLSearchParams(window.location.search)\n\n const automationId = params.get(\"automation_id\")\n\n // make sure necessary icons are added to theme\n const customTheme = { ...theme, ...{ icons: { ...icons } } }\n\n useEffect(() => {\n document.body.toggleAttribute(\"data-loading-automations\", loading)\n }, [loading])\n\n const hasActiveAutomations = automations.length\n ? automations.some((a) => a.active)\n : true\n\n function handleDelete(id: number) {\n webhooksClient\n .delete({\n data: { _e: trigger.resource },\n url: `/automation_subscriptions/${id}`,\n })\n .then(() =>\n setAutomations(automations.filter((automation) => automation.id !== id))\n )\n .catch((error) => {\n const text =\n forbiddenText(error, \"delete\") ||\n \"There was a problem deleting this automation. Please try again in a few moments.\"\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n\n function handlePauseAutomations() {\n webhooksClient\n .post({\n data: {\n data: {\n attributes: {\n _e: trigger.resource,\n active: !hasActiveAutomations,\n },\n },\n },\n url: \"/pause_automations\",\n })\n .then(() => {\n window.location.reload()\n })\n }\n\n const BlankStateHeadingProps = {\n color: token(\"--t-text-color\"),\n level: 2,\n size: token(\"--t-font-size-2xl\"),\n weight: token(\"--t-font-weight-bold\"),\n }\n\n const BlankStateTextProps = {\n color: token(\"--t-text-color-secondary\"),\n lineHeight: 3,\n size: token(\"--t-font-size-md\"),\n }\n\n function automationTriggerEvent(automation: AutomationInstance) {\n return trigger.events.find((event) => event.name === automation.name)\n }\n\n const handleUpdateAutomation =\n (originalAutomation: AutomationInstance) =>\n (newState: React.SetStateAction<AutomationInstance>) => {\n const updated =\n typeof newState == \"function\" ? newState(originalAutomation) : newState\n const newAutomations = [\n ...automations.filter((automation) => automation.id !== updated.id),\n updated,\n ]\n\n setAutomations(newAutomations)\n }\n\n return (\n <ThemeProvider theme={customTheme}>\n <OrganizationContext.Provider\n value={{ dateFormat, olsonTimeZone, twentyFourHourTime }}\n >\n {trigger && (\n <Header\n automations={automations}\n blankStateLink={blankStateLink}\n canCreate={currentPersonCanCreate && !disabled}\n loading={loading}\n defaultApp={defaultApp}\n description={blankStateDescription}\n theme={customTheme}\n trigger={trigger}\n hasActiveAutomations={hasActiveAutomations}\n onPauseAutomations={handlePauseAutomations}\n afterCreateOptions={afterCreateOptions}\n />\n )}\n {loading ? (\n <Summary\n image={<Spinner size=\"xl\" />}\n paddingVertical={10}\n title={\"Loading automations...\"}\n />\n ) : !trigger ? (\n <></>\n ) : (\n <Box data-testid=\"automations-section\">\n {automations?.length > 0 ? (\n <TileView spacing={3} marginVertical={3} minCellWidth={45}>\n {sortBy(automations, \"id\").map((a) => (\n <EditableAutomation\n key={a.id}\n automation={a}\n updateAutomation={handleUpdateAutomation(a)}\n onDelete={handleDelete}\n theme={customTheme}\n openHistoryNow={a.id === Number(automationId)}\n trigger={{\n event: automationTriggerEvent(a),\n resource: trigger.resource,\n }}\n currentPersonId={currentPersonId}\n currentPersonCanCreate={currentPersonCanCreate}\n disabled={disabled}\n disabledReason={disabledReason}\n />\n ))}\n </TileView>\n ) : (\n <StackView\n margin={token(\"--t-spacing-6\")}\n spacing={token(\"--t-spacing-2\")}\n alignment=\"center\"\n mediaQueries={{\n lg: {\n axis: \"horizontal\",\n distribution: \"center\",\n spacing: token(\"--t-spacing-6\"),\n },\n }}\n >\n <Box\n css={{\n \".symbol\": {\n height: \"100%\",\n width: \"100%\",\n },\n }}\n maxWidth={24}\n mediaQueries={{\n lg: {\n maxWidth: 40,\n },\n }}\n >\n <SvgAutomations />\n </Box>\n <StackView\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n maxWidth={45}\n mediaQueries={{\n lg: {\n alignment: \"start\",\n textAlign: \"left\",\n },\n }}\n textAlign=\"center\"\n >\n {currentPersonCanCreate ? (\n <>\n <Heading {...BlankStateHeadingProps}>\n Add an automation\n </Heading>\n <StackView\n alignment=\"center\"\n marginBottom={token(\"--t-spacing-1\")}\n mediaQueries={{\n lg: {\n alignment: \"start\",\n },\n }}\n spacing={1}\n >\n <Text {...BlankStateTextProps}>\n {blankStateDescription}\n </Text>\n </StackView>\n <StackView\n axis=\"horizontal\"\n spacing={token(\"--t-spacing-1\")}\n >\n <Button\n variant=\"outline\"\n to={blankStateLink}\n color={`${token(\n \"--t-text-color-status-neutral\"\n )} !important`}\n >\n Learn more\n </Button>\n <Button\n as=\"button\"\n theme=\"primary\"\n variant=\"fill\"\n onClick={() => setNewModalVisible(true)}\n >\n Create automation\n </Button>\n </StackView>\n <NewAutomationModal\n open={newModalVisible}\n onRequestClose={() => setNewModalVisible(false)}\n theme={customTheme}\n >\n <NewAutomation\n defaultApp={defaultApp}\n description={blankStateDescription}\n blankStateLink={blankStateLink}\n onRequestClose={() => setNewModalVisible(false)}\n trigger={trigger}\n afterCreateOptions={afterCreateOptions}\n />\n </NewAutomationModal>\n </>\n ) : (\n <>\n <Heading {...BlankStateHeadingProps}>Automations</Heading>\n <Text {...BlankStateTextProps}>\n {permissionDeniedReason}\n </Text>\n </>\n )}\n </StackView>\n </StackView>\n )}\n </Box>\n )}\n {incomingAutomationsParam && (\n <IncomingAutomations\n encryptedParam={incomingAutomationsParam}\n trigger={trigger}\n />\n )}\n </OrganizationContext.Provider>\n <style>{styles}</style>\n </ThemeProvider>\n )\n}\n"],"names":["SvgAutomations","React","createElement","id","xmlns","viewBox","className","opacity","d","fill","x","y","width","height","rx","ry","transform","OrganizationContext","createContext","dateFormat","olsonTimeZone","twentyFourHourTime","Swal","mixin","standardAlertOptions","successAlertOptions","alertError","errorAlertOptions","confirm","standardConfirmOptions","confirmDestroy","destroyConfirmOptions","confirmCreate","createConfirmOptions","deobfuscateDescriptions","subscriptions","Promise","all","map","subscription","_temp","includes","operationDefinitionClassName","isDeobfuscatable","resolve","_exit","_temp3","_result","description","_temp2","workflowId","peopleClient","get","data","fields","Workflow","where","url","catch","name","then","e","reject","fetchWorkflow","operationParams","workflow","workflowName","archivedAt","replace","actionResourceUrl","links","html","actionResourceName","fieldDefinitionId","definitionIdentifier","match","fetchFieldDefinition","FieldDefinition","FieldOption","include","fieldDefinition","values","dataType","Object","entries","action","value","fieldOptions","find","fieldOption","parseInt","capitalize","join","customFieldOptionDescription","deobfuscatedDescription","result","string","charAt","toUpperCase","slice","Client","root","pcoApiUrl","squiggly","version","fieldListIdentifier","field","listClass","kind","obfuscateDescriptionName","definition","definitionClass","hasOwnProperty","object","key","prototype","call","getListForField","loadedLists","list","Error","JSON","stringify","renderIfChainSatisfied","allFields","selectedFieldOptions","renderIf","isBoolean","conditionKey","keys","shouldRender","upstreamId","upstream","f","getRenderedFields","definitionFields","filter","describeSelectedFields","selectedDefinition","workflow_id_WorkflowsList","sensitiveString","o","toString","workflow_id","obfuscateSelectedFieldDescriptions","label","momentDateFormat","format","dateLocalized","date","momentDate","moment","isValid","pluralize","count","word","singularize","triggerResourceParts","triggerResource","triggerParts","split","appName","resourceId","length","resourcePath","resourceType","forbiddenText","error","errors","status","parseDescription","exec","trim","fetchPeopleWhoTriggeredEvents","events","personIds","eventPersonId","body","recover","fetchPeople","people","_catch","Person","fetchEvents","automationId","params","webhooksClient","_e","Delivery","Event","order","STATUS","delivered","failed","ignored","pending","skipped","mergePeopleAndEvents","mergedData","reduce","personId","foundPerson","p","push","person","event","History","automation","filterWhere","onEventsStatusChange","loading","paginationProps","refresh","setParams","_","setError","useState","setLoading","eventPages","setEventPages","meta","setMeta","offset","resetOffset","perPage","totalCount","setOffset","currentPage","Math","floor","onPageChange","pageNum","totalPages","ceil","useCallback","usePagination","useEffect","per_page","pages","bubbleErrorToBoundary","undefined","useEvents","useContext","filteringEvents","automationCreatedRecently","diff","numDaysSince","createdAt","automationBeganOn","historyPreservationAlert","showTzLabel","Intl","DateTimeFormat","resolvedOptions","timeZone","before","after","nameIndex","indexOf","columns","cell","EventStatusBadge","css","padding","header","baseFormat","momentDateTimeFormat","tz","Link","to","maxWidth","EventStatusMessage","flex","Fragment","RetryEventButton","IgnoreEventButton","refreshHistory","textAlign","minWidth","StackView","spacing","token","Heading","level","size","color","weight","Text","italic","Box","minHeight","alignItems","axis","distribution","Input","InputLabel","fontWeight","controls","Select","emptyValue","onChange","selectedValue","title","Option","Button","iconLeft","onClick","theme","variant","maxHeight","overflow","DataTable","_extends","empty","alignment","marginTop","marginBottom","svg","fontSize","loadingTitle","bodyCell","lineHeight","bodyRow","rowData","backgroundColor","headerCell","headerRow","setStatus","retryTitleFromStatus","statusIcon","post","attributes","response","eventsStatus","alerts","fire","text","disabled","badgeColors","border","badgeIcon","badgeTitle","Badge","background","foreground","paddingLeft","paddingRight","radius","renderLeft","Icon","marginLeft","stroke","strokeAlign","strokeWeight","lastDelivery","message","delivery","ERRORS","default","duplicated_event","failed_without_deliveries","whiteSpace","ToggleableDetails","details","responseBody","parse","parsedErrors","responseErrors","deliveryFailureReason","statusMessage","fontStyle","paddingTop","children","open","setOpen","inline","was","fontFamily","ErrorBoundary","Component","constructor","props","super","this","handleContactSupport","onRequestClose","window","openHelpdesk","state","hasError","static","render","Alert","type","marginVertical","boxShadow","style","CloseModalIcon","as","icon","HistoryModal","createPortal","ThemeProvider","Modal","paddingBottom","document","VALID_LOGO_NAMES","getValidLogoName","kebabName","kebabCase","isValidLogoName","fetchCampuses","ids","Map","Campus","walk","campus","set","String","fetchFieldDefinitions","fd","HIDDEN_FIELD","HIDDEN_RESPONSE","FIELD_KEY_RE","SENTINEL_VALUES","Set","extractIds","conds","triggerConditions","formId","relationships","form","selectedOptionsByField","raw","$in","optionIds","Array","isArray","has","fieldId","optionId","buildResponseDetails","fieldsByForm","fieldDefs","campuses","fieldLabel","valueLabel","fieldType","fieldableId","options","resolveResponseDetails","groups","sub","labelers","group","resolvedById","subs","resolved","extracted","targets","entry","fetchFormFields","formIds","FormField","FormFieldOption","byId","uniq","t","fieldDefIds","campusIds","add","responseDetails","formatResponseDetails","fetchCurrentPersonAvatar","avatar","AutomationContext","EditableAutomation","updateAutomation","onDelete","openHistoryNow","disabledReason","AutomationWrapper","Header","Icons","Manage","Description","EditableFooter","IncomingAutomation","LinkToAutomation","IncomingDescription","Footer","triggerEventDescription","cardOpacity","active","paddingVertical","truncate","lowerFirst","conditionalSuffix","optionallyPrettifyArchivedPrefix","separator","external","triggerAdminUrl","canManage","tooltip","hover","rest","Provider","Card","currentPersonCanCreate","currentPersonId","trigger","historyVisible","setHistoryVisible","isActive","Dropdown","iconRight","Item","onSelect","createdById","Tooltip","placement","openDelay","isConfirmed","resource","prev","createdBy","avatarUrl","createdByName","confirmButtonText","ToggleSwitch","isChecked","patch","newStatus","triggerProductName","Logo","markOnly","operationAppName","Divider","marginHorizontal","Avatar","basis","source","buttonProps","paddingHorizontal","historyProps","setHistoryProps","toLocaleString","marginRight","triggerParams","useTriggerPersonOverride","startsWith","fetchPersonApps","App","PersonApp","personApp","allowPcoLogin","app","toLowerCase","fetchCreatorProfiles","compact","profiles","mergeProfilesAndSubscriptions","profile","fetchTriggerResources","automations","QUERYABLE_BY_MULTIPLE_IDS","registrations","services","NOT_QUERYABLE","automationsByModel","accumulator","automationTriggerResource","promises","flatMap","resourceParts","fetchNothing","fetchAllAtOnce","fetchOneAtATime","allSettled","results","triggerResources","settledPromises","acc","concat","fetchIncomingAutomations","encryptedParam","AutomationSubscription","fetchResourceName","path","_props","client","model","upperFirst","IncomingAutomations","setAutomations","operationApps","buildGivingDescription","tr","resourceName","nameOrDescription","triggerResourceName","verb","messageName","mapNameToVerb","buildDescription","mergeTriggerResourceEventDescriptions","noResults","borderBottom","Summary","image","Spinner","TileView","minCellWidth","operationDefinitionId","od","sectionId","section","renderOptionsWithoutConsideringGroup","renderOptions","groupedOptions","groupBy","sort","gt","OptionGroup","Definition","selectedOperation","onOperationDefinitionChange","operationDefinitions","selectedSection","operationDefinitionsWithUniqueIds","primaryOperations","primarySectionOptions","uniqBy","sectionGroup","secondaryOperations","handleAnySelectChange","idType","renderOperations","operations","primarySelectedValue","Field","canAccessPeople","loadListForField","loadingLists","dependencies","generator","memoizedObject","setMemoizedObject","newObject","isEqual","useMemoizedObject","dependsOn","depKey","camelCase","fieldDependencies","listOptions","actionAllowedOptions","op","automationNotAllowed","info","HelperDrawer","Toggle","drawerId","Loading","SelectSearch","Checkbox","TextArea","DateField","Checkboxes","NumberField","PersonSearch","isLoading","TextField","RadioButtons","dangerouslySetInnerHTML","__html","content","console","warn","renderField","overridenEmptyValue","option","groupTypes","TapestrySelect","items","item","handleSelectedValueChange","prompt","generatePrompt","selectedOption","selectedLabel","prevSelectedLabel","setPrevSelectedLabel","query","setQuery","showFilteredOptions","setShowFilteredOptions","showClearButton","setShowClearButton","filteredOptions","sortBy","formattedQuery","TapestryCombobox","Popover","closeOnSelect","closeButton","cursor","onBlur","target","onClear","onFocus","select","handleValueChange","openOnFocus","placeholder","popoverProps","matchWidths","renderRight","index","isCurrent","role","Highlight","Menu","immediateSearch","debouncedSearch","useMemo","debounce","search","cancel","myself","_setQuery","Combobox","TapestryCheckbox","checked","TapestryTextArea","specificDate","setSpecificDate","todaysValue","customValue","dateBeforeValue","orgFormat","dateFieldValue","setDateFieldValue","toDate","allowUnansweredOption","handleSelectChange","TapestryDateField","defaultOpen","formatValue","selectedValues","setSelectedValues","handleCheckboxesChange","newSelectedValues","minimumValue","minValue","maximumValue","maxValue","inputValue","setInputValue","Number","defaultValue","InputBox","TapestryNumberField","newNumberValue","min","max","hasControls","display","handleCheckedChange","Radio","Fields","newSelections","renderableFields","handleSelectedFieldOptionsChange","dependents","dependent","deeper","getOperationDefinitions","OperationDefinition","getWebhooksApps","OperationApp","a","getVisibleApps","Topbar","apps","errorAlertProps","borderRadius","NewAutomation","afterCreateOptions","blankStateLink","debugMode","defaultApp","selectedTriggerEvent","setSelectedTriggerEvent","dynamicTriggerConditions","setDynamicTriggerConditions","selectedApp","setSelectedApp","setOperationApps","setOperationDefinitions","loadingOperationDefinitions","setLoadingOperationDefinitions","setSelectedDefinition","setSelectedFieldOptions","setLoadedLists","setLoadingLists","submitting","setSubmitting","callAfterCreate","setCallAfterCreate","setTriggerParams","activeAppRef","useRef","dangerAlertPresent","footerMessage","search_name_or_email","OperationDefinitionList","getListOptions","ret","selected_definition","visibleApps","webhooksApps","getOperationApps","defaultSelection","definitions","current","dynamicConditions","baseConditions","cloneDeep","writableFields","renderOnly","buildTriggerConditions","conditions","getDescription","descriptionParts","submitCreate","onConfirm","location","reload","alert","handleChangeTriggerEvent","triggerEvent","idx","Application","onOperationAppChange","LoadingOperationDefinitions","newDefinition","disableSubmit","param","borderTop","operation_params","definition_identifier","operation_app_name","operation_definition_class_name","trigger_conditions","trigger_params","cancelButtonText","getButtonText","operationFields","required","every","fieldIsFilled","fieldIsSelect","nextRequiredDescription","renderedFields","getNextRequiredDescription","autoFocus","handleChange","NewAutomationModal","zIndex","icons","churchCenter","logomark","canCreate","hasActiveAutomations","onPauseAutomations","newModalVisible","setNewModalVisible","isPaused","activeCount","pausedCount","wrap","blankStateDescription","incomingAutomationsParam","currentOrganization","permissionDeniedReason","fetchAutomations","URLSearchParams","customTheme","toggleAttribute","some","handleDelete","delete","BlankStateHeadingProps","BlankStateTextProps","originalAutomation","newState","updated","newAutomations","margin","mediaQueries","lg","styles"],"mappings":"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"}
1
+ {"version":3,"file":"core-automations.js","sources":["../../src/assets/svg_automations.tsx","../../src/contexts/organization_context.tsx","../../src/utils/alerts.ts","../../src/utils/utils.ts","../../src/history.tsx","../../src/history_modal.tsx","../../src/utils/logos.ts","../../src/utils/response-labelers/people-form.ts","../../src/utils/resolve-response-details.ts","../../src/automation.tsx","../../src/utils/fetch-automations.ts","../../src/incoming_automations.tsx","../../src/definition.tsx","../../src/field.tsx","../../src/fields.tsx","../../src/new_automation.tsx","../../src/new_automation_modal.tsx","../../src/utils/theme.ts","../../src/automations.tsx","../../src/single_action_inline.tsx"],"sourcesContent":["import React from \"react\"\n\nconst SvgAutomations = () => (\n <svg\n id=\"automations_blank\"\n data-name=\"Automations Blank\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 111.112 84.832\"\n className=\"symbol\"\n >\n <title>Automations</title>\n <g opacity=\"0.6\">\n <path\n d=\"M107.784,46.051A57.416,57.416,0,0,1,85.26,75.058c-9.7,6.247-20.045,7.792-31.912,5.185-11.74-2.638-23.339-8-32.92-13.088-9.51-5.342-17-10.236-18.863-17.925C-.26,41.753,3.737,31.4,13.347,21.194,22.85,11.162,37.968,1.853,55.948.321,73.8-1.476,90.2,4.478,99.608,13.164,109.257,21.9,111.921,33.784,107.784,46.051Z\"\n fill=\"#e1f0f9\"\n className=\"svg-background-blob\"\n />\n </g>\n <path\n d=\"M81,27.269v31.8a2.685,2.685,0,0,1-2.685,2.685H44.564a2.685,2.685,0,0,1-2.685-2.685V15.425a2.685,2.685,0,0,1,2.685-2.685h21.91a2.681,2.681,0,0,1,1.9.786L80.217,25.371A2.685,2.685,0,0,1,81,27.269Z\"\n fill=\"#fff\"\n />\n <path\n d=\"M68.479,13.633v9.8a2.035,2.035,0,0,0,2.035,2.034h9.877Z\"\n fill=\"#c9d8e2\"\n />\n <rect\n x=\"51.214\"\n y=\"41.285\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"51.214\"\n y=\"48.434\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"51.214\"\n y=\"34.136\"\n width=\"20.221\"\n height=\"2.791\"\n rx=\"1.395\"\n ry=\"1.395\"\n fill=\"#dae5ed\"\n />\n <rect\n x=\"11.771\"\n y=\"44.005\"\n width=\"50.915\"\n height=\"6.664\"\n transform=\"translate(-22.93 44.557) rotate(-49.171)\"\n fill=\"#454942\"\n />\n <path\n d=\"M56.283,30.38l-7.557,8.745a5.968,5.968,0,0,0-2.005-2.734,6.292,6.292,0,0,0-3.036-1.624l7.555-8.743a6.275,6.275,0,0,1,3.038,1.624A5.959,5.959,0,0,1,56.283,30.38Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M58.088,28.29l-7.556,8.745a5.968,5.968,0,0,0-2-2.734,6.3,6.3,0,0,0-3.036-1.624l7.555-8.743a6.274,6.274,0,0,1,3.037,1.624A5.959,5.959,0,0,1,58.088,28.29Z\"\n fill=\"#48a5e5\"\n />\n <path\n d=\"M58.724,10.432l1.17,2.7a2.129,2.129,0,0,0,1.4,1.207l2.843.765a.73.73,0,0,1,.1,1.375l-2.7,1.17a2.125,2.125,0,0,0-1.207,1.4L59.56,21.89a.73.73,0,0,1-1.374.1l-1.17-2.7a2.125,2.125,0,0,0-1.4-1.206l-2.843-.766a.73.73,0,0,1-.1-1.374l2.7-1.17a2.121,2.121,0,0,0,1.206-1.4l.766-2.844A.73.73,0,0,1,58.724,10.432Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M44.544,19.294l1.024.868a.968.968,0,0,0,.814.21l1.316-.261a.333.333,0,0,1,.319.541l-.868,1.024a.968.968,0,0,0-.21.814l.261,1.316a.333.333,0,0,1-.541.319l-1.024-.868a.968.968,0,0,0-.814-.21l-1.316.261a.333.333,0,0,1-.319-.541l.868-1.024a.967.967,0,0,0,.21-.814L44,19.613A.333.333,0,0,1,44.544,19.294Z\"\n fill=\"#fcc846\"\n />\n <path\n d=\"M64.223,25.729l.869,2.005a1.575,1.575,0,0,0,1.036.895l2.109.568a.542.542,0,0,1,.075,1.02l-2,.868a1.576,1.576,0,0,0-.9,1.036l-.568,2.11a.541.541,0,0,1-1.019.074L62.955,32.3a1.572,1.572,0,0,0-1.036-.895l-2.109-.568a.542.542,0,0,1-.075-1.02l2.005-.868a1.572,1.572,0,0,0,.895-1.036L63.2,25.8A.541.541,0,0,1,64.223,25.729Z\"\n fill=\"#fcc846\"\n />\n </svg>\n)\n\nexport default SvgAutomations\n","import { createContext } from \"react\"\n\nexport const OrganizationContext = createContext({\n dateFormat: null,\n olsonTimeZone: null,\n twentyFourHourTime: null,\n})\n","import {\n createConfirmOptions,\n destroyConfirmOptions,\n errorAlertOptions,\n standardAlertOptions,\n standardConfirmOptions,\n successAlertOptions,\n} from \"@planningcenter/sweetalert2\"\nimport Swal from \"sweetalert2/dist/sweetalert2\"\n\nexport const alert = Swal.mixin(standardAlertOptions)\nexport const alertSuccess = Swal.mixin(successAlertOptions)\nexport const alertError = Swal.mixin(errorAlertOptions)\nexport const confirm = Swal.mixin(standardConfirmOptions)\nexport const confirmDestroy = Swal.mixin(destroyConfirmOptions)\nexport const confirmCreate = Swal.mixin(createConfirmOptions)\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { cloneDeep, isBoolean, set } from \"lodash\"\nimport moment from \"moment\"\n\nexport async function deobfuscateDescriptions(\n subscriptions: AutomationInstance[]\n) {\n return Promise.all(\n subscriptions.map(async (subscription) => {\n if (isDeobfuscatable(subscription)) {\n const result = await deobfuscatedDescription(subscription)\n subscription.description = result.description\n subscription.actionResourceUrl = result.actionResourceUrl\n subscription.actionResourceName = result.actionResourceName\n }\n return subscription\n })\n )\n}\n\nfunction isDeobfuscatable(subscription: AutomationInstance) {\n const DEOBFUSCATABLE_OPERATION_DEFINITION_CLASS_NAMES = [\n \"AddToWorkflowOperationDefinition\",\n \"CustomFieldBooleanOperationDefinition\",\n \"CustomFieldCheckboxesOperationDefinition\",\n \"CustomFieldDateOperationDefinition\",\n \"CustomFieldNumberOperationDefinition\",\n \"CustomFieldSelectOperationDefinition\",\n \"CustomFieldStringOperationDefinition\",\n \"CustomFieldTextOperationDefinition\",\n ]\n \n return DEOBFUSCATABLE_OPERATION_DEFINITION_CLASS_NAMES.includes(\n subscription.operationDefinitionClassName\n )\n}\n\nasync function deobfuscatedDescription(subscription: AutomationInstance) {\n let description = \"\"\n if (\n subscription.operationDefinitionClassName ===\n \"AddToWorkflowOperationDefinition\"\n ) {\n const data = await fetchWorkflow(subscription.operationParams.workflowId!)\n const workflow = data[0]\n\n if (workflow?.name) {\n const workflowName = workflow.archivedAt\n ? `[archived] ${workflow.name}`\n : workflow.name\n\n description = subscription.description.replace(\n \"[Hidden Workflow]\",\n workflowName\n )\n return {\n description,\n actionResourceUrl: workflow.links.html,\n actionResourceName: workflowName,\n }\n }\n } else {\n // custom field\n const fieldDefinitionId =\n subscription.operationParams.definitionIdentifier.match(\n /(\\d+)_field_definition/\n )![1]\n const fieldDefinition = await fetchFieldDefinition(fieldDefinitionId)\n if (fieldDefinition.name) {\n description = subscription.description.replace(\n \"[Hidden Custom Field]\",\n fieldDefinition.name\n )\n description +=\n subscription.operationParams.values ||\n fieldDefinition.dataType !== \"checkboxes\"\n ? ` (${customFieldOptionDescription(subscription, fieldDefinition)})`\n : \"\"\n }\n }\n return { description: description || subscription.description }\n}\n\nfunction customFieldOptionDescription(\n subscription: AutomationInstance,\n fieldDefinition: {\n dataType: string\n fieldOptions: { id: number; value: string }[]\n }\n) {\n switch (fieldDefinition.dataType) {\n case \"checkboxes\":\n return Object.entries(subscription.operationParams.values ?? {})\n .map(([id, action]) => {\n const value =\n fieldDefinition.fieldOptions.find(\n (fieldOption) => fieldOption.id === parseInt(id, 10)\n )?.value || \"[Hidden value]\"\n return `${capitalize(action)} ${value}`\n })\n .join(\", \")\n case \"select\": {\n const value = subscription.operationParams.value\n return value\n ? fieldDefinition.fieldOptions.find(\n (fieldOption) => fieldOption.id === parseInt(value, 10)\n )?.value || \"[Hidden value]\"\n : \"Unanswered\"\n }\n case \"boolean\":\n switch (subscription.operationParams.value) {\n case \"true\":\n return \"Yes\"\n case \"false\":\n return \"No\"\n default:\n return \"Unanswered\"\n }\n default:\n return subscription.operationParams.value ?? \"Unanswered\"\n }\n}\n\nfunction capitalize(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2025-03-20\",\n})\n\nasync function fetchWorkflow(workflowId: number) {\n const { data } = await peopleClient\n .get({\n data: {\n fields: { Workflow: \"name,archived_at\" },\n where: { id: workflowId },\n },\n url: `workflows`,\n })\n .catch(() => [{ data: { name: \"\" } }])\n\n return data\n}\n\nasync function fetchFieldDefinition(fieldDefinitionId: string) {\n const { data } = await peopleClient\n .get({\n data: {\n fields: {\n FieldDefinition: \"name,data_type,field_options\",\n FieldOption: \"value\",\n },\n include: \"field_options\",\n },\n url: `field_definitions/${fieldDefinitionId}`,\n })\n .catch(() => ({ data: { name: \"\" } }))\n\n return data\n}\n\nexport function fieldListIdentifier(field: DefinitionField) {\n if (field.listClass) {\n return `${field.id}_${field.listClass}`\n } else if (field.kind === \"PersonSearch\") {\n return `${field.id}_PersonSearch`\n } else {\n return null\n }\n}\n\nexport function buildDescription({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n}: {\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n return {\n description: describeSelectedFields({\n loadedLists: loadedLists || {},\n selectedDefinition,\n selectedFieldOptions,\n }),\n name: buildDescriptionName(selectedDefinition),\n }\n}\n\nfunction obfuscateDescriptionName(definition: OperationDefinition) {\n if (definition.definitionClass.match(/^CustomField\\w+OperationDefinition$/)) {\n return \"Update [Hidden Custom Field]\"\n }\n}\n\nfunction buildDescriptionName(definition: OperationDefinition) {\n return obfuscateDescriptionName(definition) || definition.description\n}\n\nfunction hasOwnProperty(object: object, key: PropertyKey) {\n return Object.prototype.hasOwnProperty.call(object, key)\n}\n\nfunction getListForField({\n field,\n loadedLists,\n}: {\n field: DefinitionField\n loadedLists: { [k: string]: LoadedList[] }\n}) {\n if (field.list) {\n return field.list\n } else if (fieldListIdentifier(field)) {\n const identifier = fieldListIdentifier(field) as string\n const list = loadedLists[identifier]\n\n return list\n } else {\n throw new Error(`Don't know how to get list for ${JSON.stringify(field)}`)\n }\n}\n\nexport function buildTriggerConditions({\n baseConditions,\n dynamicConditions,\n dynamicTriggerConditions,\n}: {\n baseConditions: object\n dynamicConditions: DefinitionField[] | undefined\n dynamicTriggerConditions: SelectedFieldOptions\n}) {\n const triggerConditions = cloneDeep(baseConditions)\n const fields = dynamicConditions ?? []\n const writableFields = fields.filter((field) => {\n if (field.renderOnly) return false\n return renderIfChainSatisfied(field, fields, dynamicTriggerConditions)\n })\n\n for (const field of writableFields) {\n if (\n Object.prototype.hasOwnProperty.call(dynamicTriggerConditions, field.id)\n ) {\n set(triggerConditions, field.id, dynamicTriggerConditions[field.id])\n }\n }\n\n return triggerConditions\n}\n\nfunction shouldRender(\n field: DefinitionField,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (!Object.prototype.hasOwnProperty.call(field, \"renderIf\")) return true\n\n const renderIf = field.renderIf!\n if (isBoolean(renderIf)) return renderIf\n\n const conditionKey = Object.keys(renderIf)[0]\n return renderIf[conditionKey] === selectedFieldOptions[conditionKey]\n}\n\nfunction renderIfChainSatisfied(\n field: DefinitionField,\n allFields: DefinitionField[],\n selectedFieldOptions: SelectedFieldOptions\n): boolean {\n if (!shouldRender(field, selectedFieldOptions)) return false\n\n const renderIf = field.renderIf\n if (renderIf == null || renderIf === true) return true\n\n const upstreamId = Object.keys(renderIf)[0]\n const upstream = allFields.find((f) => f.id === upstreamId)\n if (!upstream) return true\n return renderIfChainSatisfied(upstream, allFields, selectedFieldOptions)\n}\n\nexport function getRenderedFields(\n definitionFields: DefinitionField[],\n selectedFieldOptions: SelectedFieldOptions\n) {\n return definitionFields.filter(\n (field) =>\n field.kind !== \"Hidden\" &&\n renderIfChainSatisfied(field, definitionFields, selectedFieldOptions)\n )\n}\n\nfunction describeSelectedFields({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n}: {\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n const description = selectedDefinition.definitionFields\n .map((field) => {\n if (!hasOwnProperty(selectedFieldOptions, field.id)) return null\n\n const value = selectedFieldOptions[field.id]\n let list\n\n switch (field.kind) {\n case \"Select\":\n case \"SelectSearch\":\n case \"PersonSearch\":\n case \"RadioButtons\":\n list = getListForField({ field, loadedLists })\n\n return (\n list && list.find((o) => o.value.toString() === value)?.description\n )\n case \"Checkbox\":\n return value && field.label\n case \"Checkboxes\":\n list = getListForField({ field, loadedLists })\n\n return list\n .filter((e) => hasOwnProperty(value as object, e.value))\n .map(\n (e) =>\n `${capitalize((value as Record<string, string>)[e.value])} ${\n e.description\n }`\n )\n .join(\", \")\n case \"NumberField\":\n case \"TextField\":\n case \"TextArea\":\n case \"DateField\":\n return value\n default:\n throw new Error(\n `Don't know how to build value for field with kind ${field.kind}`\n )\n }\n })\n .filter((x) => x)\n .join(\", \")\n\n return obfuscateSelectedFieldDescriptions({\n description,\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n })\n}\n\nfunction obfuscateSelectedFieldDescriptions({\n selectedDefinition,\n selectedFieldOptions,\n loadedLists,\n description,\n}: {\n description: string\n loadedLists: { [k: string]: LoadedList[] }\n selectedDefinition: OperationDefinition\n selectedFieldOptions: SelectedFieldOptions\n}) {\n if (\n selectedDefinition.definitionClass === \"AddToWorkflowOperationDefinition\"\n ) {\n const list = loadedLists.workflow_id_WorkflowsList\n const sensitiveString =\n list &&\n list.find((o) => o.value.toString() === selectedFieldOptions.workflow_id)\n ?.description\n\n return sensitiveString\n ? description.replace(sensitiveString, \"[Hidden Workflow]\")\n : description\n } else if (\n selectedDefinition.definitionClass.match(\n /^CustomField\\w+OperationDefinition$/\n )\n ) {\n return \"\"\n } else {\n return description\n }\n}\n\nexport function dateFNSFormat(format: string) {\n return format\n .replace(/%m/, \"M\")\n .replace(/%d/, \"d\")\n .replace(/%Y/, \"y\")\n .replace(/%y/, \"yy\")\n}\n\nexport function momentDateFormat(format: string) {\n return format\n .replace(/%m/, \"MM\")\n .replace(/%d/, \"DD\")\n .replace(/%Y/, \"YYYY\")\n .replace(/%y/, \"YY\")\n}\n\nexport function momentDateTimeFormat({\n dateFormat,\n twentyFourHourTime,\n}: {\n dateFormat: string\n twentyFourHourTime: boolean\n}) {\n return `${momentDateFormat(dateFormat)} ${\n twentyFourHourTime ? \"HH:mm\" : \"h:mm A\"\n }`\n}\n\nexport function dateLocalized(date: string, dateFormat: string) {\n const momentDate = moment(date, \"YYYY-MM-DD\")\n if (!momentDate.isValid()) {\n return \"\"\n }\n\n const format = momentDateFormat(dateFormat)\n return momentDate.format(format)\n}\n\nexport function numDaysSince(date: string) {\n const momentDate = moment(date, \"YYYY-MM-DD\")\n return moment().diff(momentDate, \"days\")\n}\n\nexport function pluralize(count: number, word: string) {\n if (count === 1) {\n return `1 ${word}`\n } else {\n return `${count} ${word}s`\n }\n}\n\nexport function singularize(string: string) {\n return string.replace(/s$/, \"\")\n}\n\nexport function upperFirst(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nexport function triggerResourceParts(triggerResource: string) {\n const triggerParts = triggerResource.split(\"/\")\n\n return {\n appName: triggerParts[0],\n resourceId: triggerParts[triggerParts.length - 1],\n resourcePath: triggerParts.slice(2, -1).join(\"/\"),\n resourceType: triggerParts[triggerParts.length - 2],\n }\n}\n\nexport function forbiddenText(error: any, action?: string) {\n if (error.errors?.[0]?.status === \"403\") {\n return `You don't have permission to ${action || \"modify\"} this automation.`\n }\n return null\n}\n\nexport function parseDescription(description: string) {\n const match = /^(.+?)\\((.+)\\)$/.exec(description)\n\n if (match) {\n return { description: match[\"2\"], name: match[\"1\"].trim() }\n } else {\n return { name: description }\n }\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Badge,\n Box,\n Button,\n DataTable,\n Heading,\n Icon,\n Input,\n Link,\n Select,\n StackView,\n Text,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport moment from \"moment-timezone\"\nimport React, { useCallback, useContext, useEffect, useState } from \"react\"\n\nimport SvgAutomations from \"./assets/svg_automations\"\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n dateLocalized,\n momentDateTimeFormat,\n numDaysSince,\n parseDescription,\n} from \"./utils/utils\"\n\ndeclare global {\n interface Window {\n openHelpdesk: () => void\n }\n}\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2022-07-14\",\n})\n\n// values should match the webhooks Event `status` enum entries\nconst STATUS = {\n delivered: {\n label: \"Success\",\n value: [\"delivered\"],\n },\n failed: {\n label: \"Failed\",\n value: [\"failed\", \"duplicated\"],\n },\n ignored: {\n label: \"Ignored\",\n value: [\"ignored_duplicated\", \"ignored_failed\", \"ignored_skipped\"],\n },\n pending: {\n label: \"Pending\",\n value: [\"pending\"],\n },\n skipped: {\n label: \"Paused\",\n value: [\"skipped\"],\n },\n}\n\nasync function fetchEvents(\n triggerResource: EncryptedTriggerResource,\n automationId: number,\n params: {\n offset: number\n per_page: number\n where?: { status: string } | null\n }\n) {\n const response = await webhooksClient.get({\n data: {\n _e: triggerResource,\n fields: {\n Delivery: \"status,response_body,created_at\",\n Event: \"id,created_at,last_delivery,payload,status,uuid,person\",\n },\n include: \"last_delivery\",\n order: \"-created_at\",\n ...params,\n },\n url: `automation_subscriptions/${automationId}/events`,\n })\n\n return response\n}\n\nasync function fetchPeople(personIds) {\n const { data } = await peopleClient.get({\n data: {\n fields: {\n Person: \"id,name\",\n },\n where: { id: personIds.join(\",\") },\n },\n url: `people`,\n })\n\n return data\n}\n\nasync function fetchPeopleWhoTriggeredEvents(events) {\n const personIds = events.data.map((e) => eventPersonId(e))\n try {\n const people = await fetchPeople(personIds)\n return { events, people }\n } catch (error) {\n return { events, people: [] }\n }\n}\n\nfunction mergePeopleAndEvents({ events, people }) {\n const mergedData = events.data.reduce((result, e) => {\n const personId = eventPersonId(e)\n const foundPerson = people.find(\n (p) => personId.toString() === p.id.toString()\n )\n if (foundPerson) {\n result.push({\n ...e,\n person: { id: foundPerson.id, name: foundPerson.name },\n })\n } else {\n result.push({\n ...e,\n person: { id: personId, name: \"[Hidden]\" },\n })\n }\n return result\n }, [])\n\n return { ...events, data: mergedData }\n}\n\nfunction eventPersonId(event) {\n return event.personId\n}\n\nfunction useEvents(\n automationId: number,\n triggerResource: EncryptedTriggerResource,\n filterWhere?: string\n) {\n const perPage = 50\n const [_, setError] = useState()\n const [loading, setLoading] = useState(false)\n const [eventPages, setEventPages] = useState<{ [k: number]: EventPage[] }>({})\n const [params, setParams] = useState<{ where?: { status: string } | null }>(\n filterWhere ? { where: { status: filterWhere } } : {}\n )\n const [meta, setMeta] = useState<{ totalCount: number | any }>()\n const { offset, paginationProps, resetOffset } = usePagination(\n perPage,\n meta?.totalCount\n )\n useEffect(() => {\n if (loading || eventPages[offset]) return\n\n setLoading(true)\n\n fetchEvents(triggerResource, automationId, {\n offset,\n per_page: perPage,\n ...params,\n })\n .then(fetchPeopleWhoTriggeredEvents)\n .then(mergePeopleAndEvents)\n .then((events) => {\n setEventPages((pages) => ({ ...pages, [offset]: events.data }))\n setMeta(events.meta)\n setLoading(false)\n })\n .catch(bubbleErrorToBoundary)\n }, [automationId, triggerResource, loading, params, offset, eventPages])\n\n const refresh = useCallback(() => {\n setEventPages({})\n setMeta(undefined)\n resetOffset()\n }, [resetOffset])\n\n useEffect(() => {\n refresh()\n }, [refresh, params])\n\n function bubbleErrorToBoundary(error) {\n setError(() => {\n throw error\n })\n }\n\n return {\n events: eventPages[offset] || [],\n loading,\n paginationProps,\n params,\n refresh,\n setParams,\n }\n}\n\nfunction usePagination(perPage: number, totalCount: number) {\n const [offset, setOffset] = useState(0)\n\n const currentPage = Math.floor(offset / perPage) + 1\n const totalPages = Math.ceil(totalCount / perPage)\n const paginationProps = { currentPage, onPageChange, totalPages }\n\n function onPageChange(pageNum: number) {\n setOffset((pageNum - 1) * perPage)\n }\n\n const resetOffset = useCallback(() => {\n setOffset(0)\n }, [])\n\n return { offset, paginationProps, resetOffset }\n}\n\ntype HistoryProps = {\n automation: AutomationInstance\n filterWhere?: string\n onEventsStatusChange: Function\n onRequestClose?: () => void\n triggerResource: EncryptedTriggerResource\n}\n\nfunction History({\n automation,\n triggerResource,\n filterWhere,\n onEventsStatusChange,\n}: HistoryProps) {\n const { events, loading, paginationProps, refresh, params, setParams } =\n useEvents(automation.id, triggerResource, filterWhere)\n const { dateFormat, olsonTimeZone, twentyFourHourTime } = useContext<{\n dateFormat: any\n olsonTimeZone: any\n twentyFourHourTime: any\n }>(OrganizationContext)\n\n const filteringEvents = params.where && Object.keys(params.where).length > 0\n const automationCreatedRecently = numDaysSince(automation.createdAt) <= 32\n const automationBeganOn = dateLocalized(automation.createdAt, dateFormat)\n const historyPreservationAlert = automationCreatedRecently\n ? `Automation history started on ${automationBeganOn}`\n : \"Automation history is saved for 32 days\"\n\n const showTzLabel =\n Intl.DateTimeFormat().resolvedOptions().timeZone !== olsonTimeZone\n\n const { name, description } = parseDescription(automation.description)\n const { actionResourceUrl, actionResourceName } = automation\n let before = \"\"\n let after = \"\"\n if (description && actionResourceName) {\n const nameIndex = description.indexOf(actionResourceName)\n if (nameIndex !== -1) {\n before = description.slice(0, nameIndex)\n after = description.slice(nameIndex + actionResourceName.length)\n }\n }\n\n const columns = [\n {\n cell: (event: EventPage) => <EventStatusBadge status={event.status} />,\n css: {\n padding: \"8px 12px\",\n },\n header: \"Status\",\n },\n {\n cell: (event: EventPage) => {\n const baseFormat = momentDateTimeFormat({\n dateFormat,\n twentyFourHourTime,\n })\n const format = showTzLabel ? `${baseFormat} z` : baseFormat\n return moment.tz(event.createdAt, olsonTimeZone).format(format)\n },\n header: \"Date and time\",\n },\n {\n cell: (event: EventPage) => (\n <Link to={`/people/AC${event.person.id}`}>{event.person.name}</Link>\n ),\n css: {\n maxWidth: \"33%\",\n },\n header: \"Profile\",\n },\n {\n cell: (event: EventPage) => <EventStatusMessage event={event} />,\n css: {\n flex: 1,\n },\n header: \"Message\",\n },\n {\n cell: (event: EventPage) =>\n ![...STATUS.delivered.value, ...STATUS.pending.value].includes(\n event.status\n ) && (\n <>\n <RetryEventButton\n automationId={automation.id}\n event={event}\n triggerResource={triggerResource}\n onEventsStatusChange={onEventsStatusChange}\n />\n {![...STATUS.ignored.value].includes(event.status) && (\n <IgnoreEventButton\n automationId={automation.id}\n event={event}\n triggerResource={triggerResource}\n refreshHistory={refresh}\n onEventsStatusChange={onEventsStatusChange}\n />\n )}\n </>\n ),\n css: {\n textAlign: \"right\",\n },\n header: \"\",\n minWidth: \"84px\",\n },\n ]\n\n return (\n <StackView spacing={token(\"--t-spacing-4\")}>\n <StackView spacing={token(\"--t-spacing-half\")}>\n <Heading\n level={3}\n size=\"16px\"\n color={token(\"--t-text-color-secondary\")}\n weight={token(\"--t-font-weight-medium\")}\n >\n {name}{description && (\n <>\n {\" \"}({actionResourceUrl && actionResourceName\n ? <>{before}<Link to={actionResourceUrl}>{actionResourceName}</Link>{after}</>\n : description\n })\n </>\n )}\n </Heading>\n <Text\n color={token(\"--t-text-color-secondary\")}\n size={token(\"--t-font-size-xs\")}\n italic\n >\n {historyPreservationAlert}\n </Text>\n </StackView>\n <StackView spacing={token(\"--t-spacing-2\")}>\n <Box minHeight={7}>\n {!loading && (events.length || filteringEvents) && (\n <StackView\n alignItems=\"end\"\n axis=\"horizontal\"\n distribution=\"space-between\"\n spacing={token(\"--t-spacing-1\")}\n >\n <StackView width=\"max-content\">\n <Input.InputLabel\n fontWeight={token(\"--t-font-weight-medium\")}\n color={token(\"--t-text-color\")}\n controls=\"select-status\"\n >\n Filter by status\n </Input.InputLabel>\n <Select\n id=\"select-status\"\n emptyValue={null}\n onChange={({ selectedValue }) => {\n const newWhere = selectedValue\n ? { status: selectedValue }\n : null\n setParams({ where: newWhere })\n }}\n title=\"Status\"\n value={params.where?.status}\n >\n <Select.Option value={null}>All</Select.Option>\n {Object.values(STATUS).map((status) => (\n <Select.Option\n key={status.value}\n value={status.value.join(\",\")}\n >\n {status.label}\n </Select.Option>\n ))}\n </Select>\n </StackView>\n <Button\n iconLeft={{ name: \"general.refresh\" }}\n onClick={refresh}\n theme=\"primary\"\n variant=\"outline\"\n width={12}\n >\n Refresh\n </Button>\n </StackView>\n )}\n </Box>\n <Box maxHeight=\"70vh\" minHeight={36} overflow=\"auto\">\n <DataTable\n columns={columns}\n data={events}\n empty={\n <StackView\n alignment=\"center\"\n distribution=\"center\"\n minHeight={20}\n maxWidth={45}\n spacing={token(\"--t-spacing-1\")}\n marginTop={!filteringEvents ? -8 : -4}\n marginBottom={!filteringEvents ? undefined : 4}\n >\n <Box\n css={{\n svg: {\n height: 15,\n width: 20,\n },\n }}\n >\n <SvgAutomations />\n </Box>\n <Heading\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n level={4}\n size={token(\"--t-font-size-lg\")}\n >\n No history found\n </Heading>\n <Text fontSize={token(\"--t-font-size-md\")} textAlign=\"center\">\n No events {filteringEvents && \"matching your filters\"} were\n triggered for this automation{\" \"}\n {automationCreatedRecently\n ? `since ${automationBeganOn}.`\n : \"in the last 32 days.\"}\n </Text>\n {filteringEvents && (\n <Button\n marginTop={token(\"--t-spacing-1\")}\n onClick={() => setParams({})}\n theme=\"primary\"\n title=\"Clear filters\"\n variant=\"outline\"\n />\n )}\n </StackView>\n }\n loading={loading}\n loadingTitle=\"Loading automation history...\"\n variant={{\n bodyCell: {\n alignItems: \"start\",\n fontSize: token(\"--t-font-size-sm\"),\n lineHeight: \"20px\",\n padding: \"10px 12px\",\n },\n bodyRow: ({ rowData }) => {\n return {\n backgroundColor: [...STATUS.ignored.value].includes(\n rowData.status\n )\n ? token(\"--t-fill-color-neutral-090\")\n : undefined,\n minHeight: \"36px\",\n }\n },\n headerCell: {\n padding: \"8px 12px\",\n },\n headerRow: {\n minHeight: \"36px\",\n },\n }}\n {...paginationProps}\n />\n </Box>\n </StackView>\n </StackView>\n )\n}\n\nfunction RetryEventButton({\n automationId,\n event,\n triggerResource,\n onEventsStatusChange,\n}: {\n automationId: number\n event: EventPage\n onEventsStatusChange: Function\n triggerResource: EncryptedTriggerResource\n}) {\n const [status, setStatus] = useState(event.status)\n\n function handleRetry() {\n setStatus(STATUS.pending.value.join(\",\"))\n webhooksClient\n .post({\n data: {\n _e: triggerResource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automationId}/events/${event.id}/redeliver`,\n })\n .then((response) => {\n setStatus(STATUS.delivered.value.join(\",\"))\n onEventsStatusChange(response.meta.eventsStatus)\n })\n .catch(() => {\n setStatus(STATUS.failed.value.join(\",\"))\n alerts.alertError.fire({\n text: \"There was a problem retrying this automation. Please try again in a few moments.\",\n title: \"Uh oh!\",\n })\n })\n }\n\n const retryTitleFromStatus = STATUS.pending.value.includes(status)\n ? \"Sending\"\n : STATUS.delivered.value.includes(status)\n ? \"Sent\"\n : STATUS.skipped.value.includes(status)\n ? \"Run now\"\n : \"Retry\"\n\n const statusIcon = STATUS.delivered.value.includes(status)\n ? { color: token(\"--t-text-color-status-success\"), name: \"general.check\" }\n : undefined\n\n return (\n <Button\n title={retryTitleFromStatus}\n onClick={handleRetry}\n iconLeft={statusIcon}\n disabled={status !== event.status}\n variant=\"naked\"\n color={\n STATUS.delivered.value.includes(status)\n ? token(\"--t-text-color-status-success\")\n : STATUS.pending.value.includes(status)\n ? token(\"--t-text-color-placeholder\")\n : token(\"--t-text-color-interaction\")\n }\n theme=\"primary\"\n size=\"xs\"\n />\n )\n}\n\nfunction IgnoreEventButton({\n automationId,\n event,\n triggerResource,\n refreshHistory,\n onEventsStatusChange,\n}: {\n automationId: number\n event: EventPage\n onEventsStatusChange: Function\n refreshHistory: Function\n triggerResource: EncryptedTriggerResource\n}) {\n function handleIgnore() {\n webhooksClient\n .post({\n data: {\n _e: triggerResource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automationId}/events/${event.id}/ignore`,\n })\n .then((response) => {\n onEventsStatusChange(response.meta.eventsStatus)\n })\n .then(() => refreshHistory())\n .catch(() => {\n alerts.alertError.fire({\n text: \"There was a problem ignoring this event. Please try again in a few moments.\",\n title: \"Uh oh!\",\n })\n })\n }\n\n return (\n <Button\n title={\"Ignore\"}\n onClick={handleIgnore}\n variant=\"naked\"\n color={\"linkForeground\"}\n theme=\"primary\"\n size=\"xs\"\n />\n )\n}\n\nfunction EventStatusBadge({ status }: { status: string }) {\n const badgeColors = STATUS.pending.value.includes(status)\n ? {\n border: token(\"--t-border-color-dark\"),\n text: token(\"--t-text-color\"),\n }\n : STATUS.delivered.value.includes(status)\n ? {\n border: token(\"--t-border-color-status-success\"),\n text: token(\"--t-text-color-status-success\"),\n }\n : STATUS.skipped.value.includes(status)\n ? {\n border: token(\"--t-border-color-status-warning\"),\n text: token(\"--t-text-color-status-warning\"),\n }\n : STATUS.ignored.value.includes(status)\n ? {\n border: token(\"--t-border-color-dark\"),\n text: token(\"--t-text-color-secondary\"),\n }\n : {\n border: token(\"--t-border-color-status-error\"),\n text: token(\"--t-text-color-status-error\"),\n }\n\n const badgeIcon = STATUS.pending.value.includes(status)\n ? \"general.clock\"\n : STATUS.skipped.value.includes(status)\n ? \"services.pause\"\n : STATUS.delivered.value.includes(status)\n ? \"general.checkCircle\"\n : STATUS.ignored.value.includes(status)\n ? \"general.inactive\"\n : \"general.exclamationTriangle\"\n\n const badgeTitle = STATUS.failed.value.includes(status)\n ? STATUS.failed.label\n : STATUS.ignored.value.includes(status)\n ? STATUS.ignored.label\n : STATUS[status].label\n\n return (\n <Badge\n color={{ background: \"transparent\", foreground: badgeColors.text }}\n css={{ paddingLeft: 3.5, paddingRight: 1.5 }}\n fontSize={token(\"--t-font-size-xs\")}\n radius=\"pill\"\n renderLeft={\n <Icon\n name={badgeIcon}\n color={badgeColors.border}\n marginLeft={token(\"--t-spacing-1\")}\n />\n }\n size=\"sm\"\n stroke={badgeColors.border}\n strokeAlign=\"inside\"\n strokeWeight={1}\n title={badgeTitle}\n />\n )\n}\n\nfunction EventStatusMessage({ event }: { event: EventPage }) {\n const { status, lastDelivery } = event\n\n function statusMessage(status: string, lastDelivery: Delivery) {\n let message: string | JSX.Element | null = null\n\n switch (status) {\n case \"skipped\":\n case \"ignored_skipped\":\n message = \"Automation was paused and did not run on this profile\"\n break\n case \"failed\":\n case \"duplicated\":\n case \"ignored_failed\":\n case \"ignored_duplicated\":\n message = deliveryFailureReason(lastDelivery, status)\n }\n\n return message\n }\n\n function deliveryFailureReason(delivery: Delivery, status: string) {\n const ERRORS = {\n 403: \"Owner doesn't have permission to perform this action.\",\n 404: \"Owner lacks access to target product or resource doesn't exist.\",\n 422: \"The automation action failed to run\",\n default: \"An error occurred\",\n duplicated_event:\n \"Didn't run because the same action had already been performed less than 60 seconds ago\",\n failed_without_deliveries:\n \"Didn't run because the owner doesn't have permissions in this product.\",\n }\n\n function responseErrors(delivery: Delivery) {\n if (!delivery?.responseBody) return null\n let response\n\n try {\n response = JSON.parse(delivery.responseBody)\n } catch {\n response = { errors: [\"Server Error\"] }\n }\n\n return parsedErrors(response).join(\", \") || response?.message\n }\n\n function parsedErrors(response) {\n if (response?.errors) {\n return response.errors.map((error) =>\n typeof error === \"string\" && error.match(/Archived profiles/)\n ? error.replace(/Archived profiles/, \"Archived profiles.\")\n : error\n )\n } else {\n return []\n }\n }\n\n return (\n <StackView flex={1} whiteSpace=\"normal\">\n {!delivery ? (\n [\"duplicated\", \"ignored_duplicated\"].includes(status) ? (\n ERRORS.duplicated_event\n ) : (\n ERRORS.failed_without_deliveries\n )\n ) : (\n <ToggleableDetails\n details={responseErrors(delivery)}\n status={delivery.status}\n >\n {ERRORS[delivery.status] || ERRORS.default}\n </ToggleableDetails>\n )}\n </StackView>\n )\n }\n\n const message = statusMessage(status, lastDelivery)\n\n return message ? (\n <Box\n fontSize={token(\"--t-font-size-sm\")}\n fontStyle=\"italic\"\n lineHeight=\"16px\"\n maxWidth=\"100%\"\n paddingTop=\"1px\"\n whiteSpace=\"normal\"\n >\n {message}\n </Box>\n ) : null\n}\n\nfunction ToggleableDetails({\n children,\n details,\n status,\n}: {\n children: React.ReactNode\n details: string\n status: string\n}) {\n const [open, setOpen] = useState(false)\n\n function toggleOpen() {\n setOpen((was) => !was)\n }\n\n return (\n <StackView spacing={token(\"--t-spacing-1\")}>\n <Box>\n {children}{\" \"}\n {details && (\n <Button\n inline\n onClick={toggleOpen}\n size=\"xs\"\n theme=\"primary\"\n variant=\"naked\"\n fontStyle=\"normal\"\n >\n Details\n </Button>\n )}\n </Box>\n {open ? (\n <Box padding={1} background={token(\"--t-fill-color-neutral-090\")}>\n <Text\n fontFamily=\"monospace\"\n fontSize={token(\"--t-font-size-xs\")}\n lineHeight=\"1.2\"\n >\n {status && `${status}: `}\n {details}\n </Text>\n </Box>\n ) : null}\n </StackView>\n )\n}\n\ntype ErrorBoundaryProps = {\n children: React.ReactNode\n onRequestClose?: () => void\n}\n\ntype ErrorBoundaryState = {\n hasError: boolean\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n handleContactSupport = () => {\n if (this.props.onRequestClose) {\n this.props.onRequestClose()\n }\n window.openHelpdesk()\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <Alert\n type=\"error\"\n marginVertical={1}\n padding={1.5}\n css={{ boxShadow: \"none\" }}\n >\n <Text lineHeight=\"1.35\">\n The application hit an unexpected error. If this persists after a\n few minutes, please let us know so we can get it fixed for you.{\" \"}\n <button\n style={{\n color: token(\"--t-text-color-interaction\"),\n whiteSpace: \"nowrap\",\n }}\n onClick={this.handleContactSupport}\n >\n Contact support\n </button>\n .\n </Text>\n </Alert>\n )\n }\n\n return this.props.children\n }\n}\n\n// eslint-disable-next-line react/display-name\nexport default (props: HistoryProps) => (\n <ErrorBoundary onRequestClose={props.onRequestClose}>\n <History {...props}></History>\n </ErrorBoundary>\n)\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Button,\n Heading,\n Modal,\n StackView,\n ThemeProvider,\n} from \"@planningcenter/tapestry-react\"\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\n\nfunction CloseModalIcon({ onClick }: { onClick: React.MouseEventHandler }) {\n return (\n <Button\n as=\"button\"\n height={token(\"--t-element-size-md\")}\n icon={{\n color: token(\"--t-icon-color-dim\"),\n name: \"general.x\",\n }}\n onClick={onClick}\n size=\"sm\"\n title=\"Close\"\n variant=\"naked\"\n />\n )\n}\n\nfunction HistoryModal({\n children,\n onRequestClose,\n open,\n theme,\n}: {\n children: React.ReactNode\n onRequestClose: () => void\n open: boolean\n theme: object\n}): React.ReactPortal | JSX.Element {\n return createPortal(\n <ThemeProvider theme={theme}>\n <Modal\n open={open}\n onRequestClose={onRequestClose}\n maxWidth={120}\n boxShadow=\"0 0 20px rgba(0, 0, 0, 0.15)\"\n padding={token(\"--t-spacing-4\")}\n paddingBottom={token(\"--t-spacing-3\")}\n radius={token(\"--t-border-radius-lg\")}\n >\n <StackView\n axis=\"horizontal\"\n distribution=\"space-between\"\n alignment=\"center\"\n >\n <Heading\n level={2}\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n fontSize={token(\"--t-font-size-2xl\")}\n lineHeight=\"1.4\"\n >\n Automation history\n </Heading>\n <CloseModalIcon onClick={onRequestClose} />\n </StackView>\n {children}\n </Modal>\n </ThemeProvider>,\n document.body\n )\n}\n\nexport default HistoryModal\n","import { Logo } from \"@planningcenter/tapestry-react\"\nimport { kebabCase } from \"lodash\"\nimport type { ComponentProps } from \"react\"\n\n// Extract valid logo names from the Logo component's props\ntype ValidLogoName = NonNullable<ComponentProps<typeof Logo>[\"name\"]>\n\n// List of valid logo names from @planningcenter/tapestry-react Logo component\n// Update this list when support for new products are added to tapestry-react\nconst VALID_LOGO_NAMES: ValidLogoName[] = [\n \"api\",\n \"calendar\",\n \"check-ins\",\n \"church-center\",\n \"giving\",\n \"groups\",\n \"headcounts\",\n \"home\",\n \"login\",\n \"music-stand\",\n \"people\",\n \"planning-center\",\n \"publishing\",\n \"registrations\",\n \"services\",\n]\n\nexport const isValidLogoName = (name: string): name is ValidLogoName => {\n return VALID_LOGO_NAMES.includes(name as ValidLogoName)\n}\n\nexport const getValidLogoName = (name: string): ValidLogoName => {\n const kebabName = kebabCase(name)\n return isValidLogoName(kebabName) ? kebabName : \"planning-center\"\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { uniq } from \"lodash\"\n\nimport type { ResponseLabeler } from \"./types\"\n\nconst HIDDEN_FIELD = \"[Hidden Field]\"\nconst HIDDEN_RESPONSE = \"[Hidden Response]\"\nconst FIELD_KEY_RE = /^field_(\\d+)$/\nconst SENTINEL_VALUES = new Set([\"no-option\"])\n\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"2025-03-20\",\n})\n\ntype FormFieldRecord = {\n fieldType: string\n fieldableId: number | null\n fieldableType: string | null\n id: number\n label: string | null\n options?: { id: number; label: string | null }[]\n}\n\ntype FieldDefinitionRecord = {\n dataType: string\n fieldOptions?: { id: number; value: string | null }[]\n id: number\n name: string | null\n}\n\ntype CampusRecord = {\n id: number\n name: string | null\n}\n\ntype ExtractedIds = {\n fieldId: string\n formId: string\n optionId: string | null\n}\n\nasync function resolve(\n subscriptions: AutomationInstance[]\n): Promise<AutomationInstance[]> {\n const extracted = subscriptions.map((sub) => ({\n ids: extractIds(sub),\n sub,\n }))\n const targets = extracted.filter(\n (entry): entry is { ids: ExtractedIds; sub: AutomationInstance } =>\n entry.ids !== null\n )\n if (targets.length === 0) return subscriptions\n\n const fieldsByForm = await fetchFormFields(\n uniq(targets.map((t) => t.ids.formId))\n )\n\n const fieldDefIds = new Set<string>()\n const campusIds = new Set<string>()\n for (const { ids } of targets) {\n const field = fieldsByForm.get(ids.formId)?.get(ids.fieldId)\n if (field?.fieldType === \"custom_field\" && field.fieldableId != null) {\n fieldDefIds.add(String(field.fieldableId))\n } else if (field?.fieldType === \"primary_campus\" && ids.optionId != null) {\n campusIds.add(ids.optionId)\n }\n }\n const [fieldDefs, campuses] = await Promise.all([\n fetchFieldDefinitions([...fieldDefIds]),\n fetchCampuses([...campusIds]),\n ])\n\n return extracted.map(({ ids, sub }) => {\n if (!ids) return sub\n return {\n ...sub,\n responseDetails: buildResponseDetails(\n ids,\n fieldsByForm,\n fieldDefs,\n campuses\n ),\n }\n })\n}\n\nfunction extractIds(subscription: AutomationInstance): ExtractedIds | null {\n const conds = subscription.triggerConditions\n const formId = conds?.data?.relationships?.form?.data?.id\n const selectedOptionsByField = conds?.data?.attributes?.selectedOptionsByField\n if (\n formId == null ||\n !selectedOptionsByField ||\n typeof selectedOptionsByField !== \"object\"\n ) {\n return null\n }\n\n for (const [key, value] of Object.entries(selectedOptionsByField)) {\n const match = FIELD_KEY_RE.exec(key)\n if (!match) continue\n const raw = (value as { $in?: unknown })?.$in\n const optionIds = (Array.isArray(raw) ? raw : raw == null ? [] : [raw])\n .map((id) => (id == null ? null : String(id)))\n .filter((id): id is string => id != null && !SENTINEL_VALUES.has(id))\n return {\n fieldId: match[1],\n formId: String(formId),\n optionId: optionIds[0] ?? null,\n }\n }\n return null\n}\n\nasync function fetchFormFields(\n formIds: string[]\n): Promise<Map<string, Map<string, FormFieldRecord>>> {\n const result = new Map<string, Map<string, FormFieldRecord>>()\n await Promise.all(\n formIds.map(async (formId) => {\n try {\n const { data } = await peopleClient.get<{ data: FormFieldRecord[] }>({\n data: {\n fields: {\n FormField: \"label,field_type,fieldable,options\",\n FormFieldOption: \"label\",\n },\n include: \"options\",\n walk: true,\n },\n url: `forms/${formId}/fields`,\n })\n const byId = new Map<string, FormFieldRecord>()\n for (const field of data) {\n byId.set(String(field.id), field)\n }\n result.set(formId, byId)\n } catch {\n result.set(formId, new Map())\n }\n })\n )\n return result\n}\n\nasync function fetchFieldDefinitions(\n ids: string[]\n): Promise<Map<string, FieldDefinitionRecord>> {\n const result = new Map<string, FieldDefinitionRecord>()\n if (ids.length === 0) return result\n\n try {\n const { data } = await peopleClient.get<{ data: FieldDefinitionRecord[] }>({\n data: {\n fields: {\n FieldDefinition: \"name,data_type,field_options\",\n FieldOption: \"value\",\n },\n include: \"field_options\",\n walk: true,\n where: { id: ids.join(\",\") },\n },\n url: \"field_definitions\",\n })\n for (const fd of data) {\n result.set(String(fd.id), fd)\n }\n } catch {\n // permission-denied or other failure: leave entries absent so the\n // resolver falls back to [Hidden response].\n }\n return result\n}\n\nasync function fetchCampuses(\n ids: string[]\n): Promise<Map<string, CampusRecord>> {\n const result = new Map<string, CampusRecord>()\n if (ids.length === 0) return result\n\n try {\n const { data } = await peopleClient.get<{ data: CampusRecord[] }>({\n data: {\n fields: { Campus: \"name\" },\n walk: true,\n where: { id: ids.join(\",\") },\n },\n url: \"campuses\",\n })\n for (const campus of data) {\n result.set(String(campus.id), campus)\n }\n } catch {\n // permission-denied or other failure: leave entries absent so the\n // resolver falls back to [Hidden response].\n }\n return result\n}\n\nfunction buildResponseDetails(\n ids: ExtractedIds,\n fieldsByForm: Map<string, Map<string, FormFieldRecord>>,\n fieldDefs: Map<string, FieldDefinitionRecord>,\n campuses: Map<string, CampusRecord>\n): ResponseDetails {\n const field = fieldsByForm.get(ids.formId)?.get(ids.fieldId)\n if (!field) return { fieldLabel: HIDDEN_FIELD, valueLabel: HIDDEN_RESPONSE }\n\n const fieldLabel = field.label || HIDDEN_FIELD\n\n if (field.fieldType === \"boolean\") {\n return { fieldLabel, valueLabel: null }\n }\n\n if (field.fieldType === \"custom_field\" && field.fieldableId != null) {\n const fd = fieldDefs.get(String(field.fieldableId))\n if (!fd) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n if (fd.dataType === \"boolean\") return { fieldLabel, valueLabel: null }\n if (ids.optionId == null) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n const match = (fd.fieldOptions || []).find(\n (o) => String(o.id) === ids.optionId\n )\n return { fieldLabel, valueLabel: match?.value || HIDDEN_RESPONSE }\n }\n\n if (field.fieldType === \"primary_campus\") {\n if (ids.optionId == null) return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n const campus = campuses.get(ids.optionId)\n return { fieldLabel, valueLabel: campus?.name || HIDDEN_RESPONSE }\n }\n\n if (ids.optionId == null) {\n return { fieldLabel, valueLabel: HIDDEN_RESPONSE }\n }\n const match = (field.options || []).find((o) => String(o.id) === ids.optionId)\n return { fieldLabel, valueLabel: match?.label || HIDDEN_RESPONSE }\n}\n\nconst peopleFormLabeler: ResponseLabeler = { resolve }\n\nexport { peopleFormLabeler }\n","import { peopleFormLabeler } from \"./response-labelers/people-form\"\nimport type { ResponseLabeler } from \"./response-labelers/types\"\n\nconst labelers: Record<string, ResponseLabeler> = {\n \"people.v2.events.form_submission.created\": peopleFormLabeler,\n}\n\nasync function resolveResponseDetails(\n subscriptions: AutomationInstance[]\n): Promise<AutomationInstance[]> {\n const groups = new Map<string, AutomationInstance[]>()\n for (const sub of subscriptions) {\n if (!labelers[sub.name]) continue\n const group = groups.get(sub.name) ?? []\n group.push(sub)\n groups.set(sub.name, group)\n }\n if (groups.size === 0) return subscriptions\n\n const resolvedById = new Map<number, AutomationInstance>()\n await Promise.all(\n [...groups.entries()].map(async ([name, subs]) => {\n const resolved = await labelers[name].resolve(subs)\n for (const sub of resolved) resolvedById.set(sub.id, sub)\n })\n )\n\n return subscriptions.map((sub) => resolvedById.get(sub.id) ?? sub)\n}\n\nfunction formatResponseDetails(\n responseDetails: ResponseDetails | null | undefined\n): string {\n if (!responseDetails) return \"\"\n const { fieldLabel, valueLabel } = responseDetails\n if (valueLabel == null) return ` with \"${fieldLabel}\" selected`\n return ` with \"${fieldLabel}\" selected as \"${valueLabel}\"`\n}\n\nexport { formatResponseDetails, resolveResponseDetails }\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Avatar,\n Box,\n Button,\n Card,\n Divider,\n Dropdown,\n Heading,\n Icon,\n Logo,\n StackView,\n Text,\n ToggleSwitch,\n Tooltip,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { lowerFirst, truncate } from \"lodash\"\nimport React, { createContext, useContext, useState } from \"react\"\n\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport History from \"./history\"\nimport HistoryModal from \"./history_modal\"\nimport * as alerts from \"./utils/alerts\"\nimport { getValidLogoName } from \"./utils/logos\"\nimport { formatResponseDetails } from \"./utils/resolve-response-details\"\nimport { dateLocalized, forbiddenText, parseDescription } from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n})\n\ntype AutomationProps = {\n automation: AutomationInstance\n currentPersonCanCreate: boolean\n currentPersonId: number\n disabled?: boolean\n disabledReason?: string\n trigger: {\n event: AutomationTriggerEvent\n resource: EncryptedTriggerResource\n }\n updateAutomation: React.Dispatch<React.SetStateAction<AutomationInstance>>\n}\n\ntype IncomingAutomationProps = {\n automation: IncomingAutomationInstance\n}\n\ntype EditableAutomationContextType = {\n automation: AutomationInstance\n currentPersonCanCreate?: boolean\n currentPersonId?: number\n theme: object\n trigger?: {\n event: AutomationTriggerEvent\n resource: EncryptedTriggerResource\n }\n updateAutomation?: React.Dispatch<React.SetStateAction<AutomationInstance>>\n}\n\ntype IncomingAutomationContextType = {\n automation: IncomingAutomationInstance\n}\n\nconst AutomationContext = createContext<\n EditableAutomationContextType | IncomingAutomationContextType\n>(null)\n\nfunction EditableAutomation({\n updateAutomation,\n onDelete,\n theme,\n openHistoryNow = false,\n disabled,\n disabledReason,\n ...props\n}: AutomationProps & {\n disabled: boolean\n disabledReason: string\n onDelete: (id: number) => void\n openHistoryNow: boolean\n theme?: object\n}) {\n return (\n <AutomationWrapper\n theme={theme}\n updateAutomation={updateAutomation}\n {...props}\n >\n <Header>\n <Icons />\n <Manage\n onDelete={onDelete}\n openHistoryNow={openHistoryNow}\n disabled={disabled}\n disabledReason={disabledReason}\n />\n </Header>\n <Description />\n <EditableFooter />\n </AutomationWrapper>\n )\n}\n\nfunction IncomingAutomation(props: IncomingAutomationProps) {\n return (\n <AutomationWrapper automation={props.automation}>\n <Header>\n <Icons />\n <LinkToAutomation />\n </Header>\n <IncomingDescription />\n <Footer />\n </AutomationWrapper>\n )\n}\n\nfunction IncomingDescription() {\n const { automation } = useContext(\n AutomationContext\n ) as IncomingAutomationContextType\n\n const triggerEventDescription = automation.triggerEventDescription\n const { name, description } = parseDescription(automation.description)\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <StackView\n paddingVertical={token(\"--t-spacing-2\")}\n flex={1}\n opacity={cardOpacity}\n >\n <Heading\n level={3}\n size={token(\"--t-font-size-xl\")}\n weight={token(\"--t-font-weight-medium\")}\n marginBottom={token(\"--t-spacing-half\")}\n truncate\n >\n {name}\n </Heading>\n <StackView spacing={0.75}>\n <Text\n size={token(\"--t-font-size-sm\")}\n color={token(\"--t-text-color\")}\n lineHeight=\"1.2\"\n >\n {triggerEventDescription}\n {formatResponseDetails(automation.responseDetails)}, then{\" \"}\n {lowerFirst(name)} {conditionalSuffix(automation)}\n </Text>\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-secondary\")}\n lineHeight=\"1.2\"\n >\n {truncate(optionallyPrettifyArchivedPrefix(description), {\n length: 160,\n separator: \" \",\n })}\n </Text>\n </StackView>\n </StackView>\n )\n}\n\nfunction LinkToAutomation() {\n const { automation } = useContext(\n AutomationContext\n ) as IncomingAutomationContextType\n\n return (\n <Button\n external\n iconLeft={{ name: \"general.newWindow\" }}\n variant=\"naked\"\n size=\"sm\"\n to={automation.triggerAdminUrl}\n disabled={!automation.canManage}\n tooltip={\n !automation.canManage\n ? \"You do not have access to this resource\"\n : undefined\n }\n color={token(\"--t-text-color-secondary\")}\n hover={{\n backgroundColor: \"highlight\",\n color: token(\"--t-text-color-secondary\"),\n }}\n >\n Manage\n </Button>\n )\n}\n\nfunction AutomationWrapper({\n automation,\n updateAutomation,\n children,\n theme,\n ...rest\n}: (AutomationProps | IncomingAutomationProps) & {\n children: React.ReactNode\n theme?: object\n updateAutomation?: (automation: AutomationInstance) => void\n}) {\n return (\n <AutomationContext.Provider\n value={{\n automation,\n theme,\n updateAutomation,\n ...rest,\n }}\n >\n <Card radius={4} padding={2}>\n {children}\n </Card>\n </AutomationContext.Provider>\n )\n}\n\nfunction Header({ children }: { children: React.ReactNode }) {\n const { automation } = useContext(AutomationContext)\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n padding={0}\n distribution=\"space-between\"\n opacity={cardOpacity}\n >\n {children}\n </StackView>\n )\n}\n\nfunction Manage({\n onDelete,\n openHistoryNow = false,\n disabled,\n disabledReason,\n}: {\n disabled: boolean\n disabledReason: string\n onDelete: (id: number) => void\n openHistoryNow: boolean\n}) {\n const {\n automation,\n currentPersonCanCreate,\n currentPersonId,\n trigger,\n theme,\n updateAutomation,\n } = useContext(AutomationContext) as EditableAutomationContextType\n const [historyVisible, setHistoryVisible] = useState(openHistoryNow)\n const isActive = automation.active\n const { name } = parseDescription(automation.description)\n\n function showHistory() {\n setHistoryVisible(true)\n }\n\n function updateEventsStatus(newStatus: AutomationInstance[\"eventsStatus\"]) {\n updateAutomation((prev) => ({ ...prev, eventsStatus: newStatus }))\n }\n\n function handleToggleActive() {\n webhooksClient\n .patch({\n data: {\n _e: trigger.resource,\n data: {\n attributes: {\n active: !isActive,\n },\n },\n },\n url: `/automation_subscriptions/${automation.id}`,\n })\n .then((data: { data: { active: boolean } }) => {\n updateAutomation((prev) => ({ ...prev, active: data.data.active }))\n })\n .catch((error) => {\n const text =\n forbiddenText(error, \"pause\") ||\n `There was a problem ${\n isActive ? \"pausing\" : \"unpausing\"\n } this automation. Please try again in a few moments.`\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n\n function handleReassign() {\n alerts.confirm\n .fire({\n text: \"This automation will run with your permission levels. Other administrators who can see this automation can grant it their permissions by reassigning it to themselves.\",\n title: \"Reassign automation?\",\n })\n .then(({ isConfirmed }) => {\n if (isConfirmed) {\n webhooksClient\n .post({\n data: {\n _e: trigger.resource,\n data: { attributes: {} },\n },\n url: `/automation_subscriptions/${automation.id}/self_assign`,\n })\n .then(({ data }) => fetchCurrentPersonAvatar(data))\n .then(({ subscription, avatar }) => {\n updateAutomation((prev) => ({\n ...prev,\n createdBy: { ...prev.createdBy, avatarUrl: avatar },\n createdById: subscription.createdById,\n createdByName: subscription.createdByName,\n }))\n })\n .catch((error) => {\n const text =\n forbiddenText(error, \"update\") ||\n \"There was a problem updating this automation. Please try again in a few moments.\"\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n })\n }\n\n function handleDelete() {\n alerts.confirmDestroy\n .fire({\n confirmButtonText: \"Yes, delete automation\",\n text: `Are you sure you want to delete the \"${name}\" automation? This cannot be undone.`,\n title: \"Delete this automation?\",\n })\n .then(({ isConfirmed }) => {\n if (isConfirmed) onDelete(automation.id)\n })\n }\n\n return (\n <>\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.75}>\n <Dropdown\n icon={{\n color: token(\"--t-icon-color\"),\n name: \"churchCenter.threeDots\",\n }}\n iconRight={false}\n title=\"Actions\"\n variant=\"naked\"\n size=\"md\"\n disabled={disabled}\n >\n <Dropdown.Item onSelect={() => showHistory()}>History</Dropdown.Item>\n {currentPersonCanCreate &&\n (automation.createdById === currentPersonId ? (\n <Dropdown.Item disabled={true}>\n <Tooltip\n placement=\"left\"\n openDelay={250}\n title=\"This automation is already assigned to you.\"\n >\n <Text>Reassign to me...</Text>\n </Tooltip>\n </Dropdown.Item>\n ) : (\n <Dropdown.Item onSelect={handleReassign}>\n Reassign to me...\n </Dropdown.Item>\n ))}\n <Dropdown.Item onSelect={handleDelete}>Delete...</Dropdown.Item>\n </Dropdown>\n <ToggleSwitch\n isChecked={isActive}\n size=\"sm\"\n onClick={handleToggleActive}\n tooltip={\n disabled\n ? disabledReason\n : isActive\n ? \"Pause automation\"\n : \"Enable automation\"\n }\n disabled={disabled}\n />\n </StackView>\n\n <HistoryModal\n open={historyVisible}\n onRequestClose={() => setHistoryVisible(false)}\n theme={theme}\n >\n <History\n automation={automation}\n triggerResource={trigger.resource}\n onEventsStatusChange={updateEventsStatus}\n onRequestClose={() => setHistoryVisible(false)}\n />\n </HistoryModal>\n </>\n )\n}\n\nfunction Icons() {\n const { automation } = useContext(AutomationContext)\n const triggerProductName = automation.name.split(\".\")[0]\n\n return (\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.5}>\n <Logo\n markOnly={true}\n name={getValidLogoName(triggerProductName)}\n size=\"sm\"\n theme=\"color\"\n />\n <Icon name=\"general.rightArrow\" size={1.5} />\n <Logo\n markOnly={true}\n name={getValidLogoName(automation.operationAppName)}\n size=\"sm\"\n theme=\"color\"\n />\n </StackView>\n )\n}\nfunction Footer() {\n const { automation } = useContext(AutomationContext)\n const { dateFormat } = useContext(OrganizationContext)\n const createdBySuffix = !automation.createdBy?.id ? \"(deleted profile)\" : \"\"\n const createdByName = `${automation.createdByName} ${createdBySuffix}`\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n return (\n <>\n <Divider marginHorizontal={-2} />\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"space-between\"\n paddingTop={1.75}\n spacing={token(\"--t-spacing-1\")}\n opacity={cardOpacity}\n >\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-placeholder\")}\n whiteSpace=\"nowrap\"\n >\n Updated {dateLocalized(automation.createdAt, dateFormat)}\n </Text>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-half\")}\n maxWidth=\"calc(100% - 136px)\"\n >\n {automation.createdBy?.avatarUrl && (\n <Avatar\n width={2}\n height={2}\n basis={2}\n key={createdByName}\n source={automation.createdBy.avatarUrl}\n />\n )}\n <Text size={5} truncate>\n {createdByName}\n </Text>\n </StackView>\n </StackView>\n </>\n )\n}\n\nfunction EditableFooter() {\n const { dateFormat } = useContext(OrganizationContext)\n const { automation, trigger, theme, updateAutomation } = useContext(\n AutomationContext\n ) as EditableAutomationContextType\n\n const createdBySuffix = !automation.createdBy?.id ? \"(deleted profile)\" : \"\"\n const createdByName = `${automation.createdByName} ${createdBySuffix}`\n\n const cardOpacity = !automation.active ? 0.5 : undefined\n const buttonProps = {\n color: token(\"--t-text-color-secondary\"),\n fontSize: token(\"--t-font-size-xs\"),\n fontWeight: token(\"--t-font-weight-normal\"),\n paddingHorizontal: token(\"--t-spacing-1\"),\n radius: \"pill\",\n size: \"xs\",\n variant: \"naked\",\n }\n const [historyProps, setHistoryProps] = useState({\n filter: null,\n historyVisible: false,\n })\n\n function renderSkippedHistory() {\n setHistoryProps({ filter: \"skipped\", historyVisible: true })\n }\n\n function renderFailedOrDuplicatedHistory() {\n setHistoryProps({ filter: \"failed,duplicated\", historyVisible: true })\n }\n\n function handleEventsStatusChange(\n newStatus: AutomationInstance[\"eventsStatus\"]\n ) {\n updateAutomation((prev) => ({ ...prev, eventsStatus: newStatus }))\n }\n\n return (\n <>\n <Divider marginHorizontal={-2} />\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"space-between\"\n paddingTop={1.75}\n spacing={token(\"--t-spacing-1\")}\n opacity={cardOpacity}\n >\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-placeholder\")}\n whiteSpace=\"nowrap\"\n >\n Updated {dateLocalized(automation.createdAt, dateFormat)}\n </Text>\n\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-fourth\")}\n >\n {!!automation.eventsStatus?.skipped && (\n <Button\n {...buttonProps}\n aria-label={`${automation.eventsStatus.skipped} skipped`}\n onClick={renderSkippedHistory}\n tooltip={`${automation.eventsStatus.skipped?.toLocaleString()} skipped events`}\n >\n <Box\n backgroundColor={token(\"--t-fill-color-status-warning\")}\n marginRight={token(\"--t-spacing-half\")}\n radius=\"circle\"\n height=\"10px\"\n width=\"10px\"\n padding={token(\"--t-spacing-fourth\")}\n >\n <Icon\n name={\"services.pause\"}\n size={\"6px\"}\n title={\"Skipped\"}\n color=\"white\"\n />\n </Box>\n {`${automation.eventsStatus.skipped?.toLocaleString()}`}\n </Button>\n )}\n {!!automation.eventsStatus?.failed && (\n <Button\n {...buttonProps}\n aria-label={`${automation.eventsStatus.failed} failed`}\n iconLeft={{\n color: token(\"--t-icon-color-status-error\"),\n marginRight: token(\"--t-spacing-half\"),\n name: \"general.exclamationTriangle\",\n size: \"10px\",\n title: \"Failed\",\n }}\n onClick={renderFailedOrDuplicatedHistory}\n title={`${automation.eventsStatus.failed?.toLocaleString()}`}\n tooltip={`${automation.eventsStatus.failed?.toLocaleString()} failed events`}\n />\n )}\n </StackView>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n distribution=\"end\"\n flex={1}\n spacing={token(\"--t-spacing-half\")}\n marginLeft=\"auto\"\n >\n {automation.createdBy?.avatarUrl && (\n <Avatar\n width={token(\"--t-element-size-md\")}\n height={token(\"--t-element-size-md\")}\n basis={token(\"--t-element-size-md\")}\n key={createdByName}\n source={automation.createdBy.avatarUrl}\n />\n )}\n <Text size={token(\"--t-font-size-sm\")} truncate>\n {createdByName}\n </Text>\n </StackView>\n </StackView>\n\n <HistoryModal\n open={historyProps.historyVisible}\n onRequestClose={() =>\n setHistoryProps({ filter: null, historyVisible: false })\n }\n theme={theme}\n >\n <History\n automation={automation}\n triggerResource={trigger.resource}\n filterWhere={historyProps.filter}\n onEventsStatusChange={handleEventsStatusChange}\n onRequestClose={() =>\n setHistoryProps({ filter: null, historyVisible: false })\n }\n />\n </HistoryModal>\n </>\n )\n}\n\nfunction Description() {\n const { automation, trigger } = useContext(\n AutomationContext\n ) as EditableAutomationContextType\n\n const { name, description } = parseDescription(automation.description)\n const cardOpacity = !automation.active ? 0.5 : undefined\n\n const triggerEventDescription = [\n \"When a person\",\n lowerFirst(trigger.event.description) +\n formatResponseDetails(automation.responseDetails) +\n \",\",\n \"then\",\n lowerFirst(name),\n conditionalSuffix(automation),\n ].join(\" \")\n\n return (\n <StackView\n paddingVertical={token(\"--t-spacing-2\")}\n flex={1}\n opacity={cardOpacity}\n >\n <Heading\n level={3}\n size={token(\"--t-font-size-xl\")}\n weight={token(\"--t-font-weight-bold\")}\n marginBottom={token(\"--t-spacing-half\")}\n truncate\n >\n {name}\n </Heading>\n <StackView spacing={0.75}>\n <Text\n size={token(\"--t-font-size-sm\")}\n color={token(\"--t-text-color\")}\n lineHeight=\"1.2\"\n >\n {triggerEventDescription}\n </Text>\n <Text\n size={token(\"--t-font-size-xs\")}\n color={token(\"--t-text-color-secondary\")}\n lineHeight=\"1.2\"\n >\n {truncate(optionallyPrettifyArchivedPrefix(description), {\n length: 160,\n separator: \" \",\n })}\n </Text>\n </StackView>\n </StackView>\n )\n}\n\nfunction conditionalSuffix(automation: AutomationInstance) {\n return automation?.triggerParams?.useTriggerPersonOverride\n ? \"(also applies to joint donor)\"\n : \"\"\n}\n\nfunction optionallyPrettifyArchivedPrefix(description: string) {\n if (description?.startsWith(\"[archived]\")) {\n return description.replace(\"[archived]\", \"[Archived]\")\n } else {\n return description\n }\n}\n\nasync function fetchCurrentPersonAvatar(subscription: AutomationInstance) {\n const {\n data: { avatar },\n } = await peopleClient.get({\n data: {\n fields: { Person: \"avatar\" },\n },\n url: \"me\",\n })\n\n return { avatar, subscription }\n}\n\nexport { EditableAutomation, IncomingAutomation }\n","import { Client } from \"@planningcenter/api-client\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { compact, uniq } from \"lodash\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n})\n\nasync function fetchAutomations(triggerResource: EncryptedTriggerResource) {\n const { data } = await webhooksClient.get({\n data: {\n _e: triggerResource,\n fields: {\n AutomationSubscription:\n \"id,description,created_at,created_by,operation_app_name,operation_definition_class_name,operation_params,active,created_by_name,name,trigger_admin_url,events_status,trigger_conditions,trigger_params\",\n Person: \"name\",\n },\n include: \"created_by\",\n },\n url: \"automation_subscriptions\",\n })\n\n return data\n}\n\nasync function fetchCreatorProfiles(subscriptions: AutomationInstance[]) {\n const personIds = compact(\n uniq(subscriptions.map((subscription) => subscription.createdById))\n )\n\n try {\n const { data: profiles } = await peopleClient.get({\n data: {\n fields: { Person: \"avatar\" },\n where: { id: personIds.join(\",\") },\n },\n url: \"people\",\n })\n return { profiles, subscriptions }\n } catch (error) {\n return { profiles: [], subscriptions }\n }\n}\n\nfunction mergeProfilesAndSubscriptions({\n profiles,\n subscriptions,\n}: {\n profiles: { avatar: string; id: number }[]\n subscriptions: AutomationInstance[]\n}) {\n const subscriptionsWithAvatars = subscriptions.map((subscription) => {\n const avatar = profiles.find(\n (profile) => profile.id === subscription.createdById\n )\n return {\n ...subscription,\n createdBy: { ...subscription.createdBy, avatarUrl: avatar?.avatar },\n }\n })\n\n return subscriptionsWithAvatars\n}\n\nasync function fetchPersonApps() {\n return peopleClient\n .get({\n data: {\n fields: { App: [\"name\"], PersonApp: [\"app\", \"allow_pco_login\"] },\n include: [\"app\"],\n },\n url: `/me/person_apps`,\n })\n .then(({ data }) => {\n return data\n .filter((personApp: PersonApp) => personApp.allowPcoLogin)\n .map((personApp: PersonApp) => personApp.app.name.toLowerCase())\n })\n}\n\nexport {\n fetchAutomations,\n fetchCreatorProfiles,\n fetchPersonApps,\n mergeProfilesAndSubscriptions,\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Box,\n Heading,\n Spinner,\n Summary,\n Text,\n TileView,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { truncate, upperFirst } from \"lodash\"\nimport React, { useEffect, useState } from \"react\"\n\nimport { IncomingAutomation } from \"./automation\"\nimport {\n fetchCreatorProfiles,\n fetchPersonApps,\n mergeProfilesAndSubscriptions,\n} from \"./utils/fetch-automations\"\nimport { resolveResponseDetails } from \"./utils/resolve-response-details\"\nimport {\n deobfuscateDescriptions,\n pluralize,\n singularize,\n triggerResourceParts,\n} from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\n\nasync function fetchIncomingAutomations(encryptedParam) {\n const { data } = await webhooksClient.get({\n data: {\n _e: encryptedParam,\n fields: {\n AutomationSubscription:\n \"id,description,created_at,created_by,operation_app_name,operation_definition_class_name,operation_params,active,created_by_name,name,trigger_admin_url,trigger_conditions,trigger_resource,trigger_params\",\n Person: \"name\",\n },\n include: \"created_by\",\n },\n url: \"incoming_automation_subscriptions\",\n })\n\n return data\n}\n\nasync function fetchTriggerResources(automations) {\n // We can optimize the query by fetching all the resources at once if we know\n // that the endpoint supports querying by multiple ids. Otherwise, we'll have\n // to fetch each resource individually.\n const QUERYABLE_BY_MULTIPLE_IDS = {\n people: [\"forms\", \"lists\"],\n registrations: [\"events\"],\n services: [\"teams\"],\n }\n const NOT_QUERYABLE = [\"giving\"]\n\n const automationsByModel = automations.reduce((accumulator, automation) => {\n // registrations has a weird case of signup vs event\n const automationTriggerResource = automation.triggerResource.replace(\n /signup/,\n \"event\"\n )\n const { appName, resourceType, resourcePath, resourceId } =\n triggerResourceParts(automationTriggerResource)\n\n if (!accumulator[appName]) accumulator[appName] = {}\n if (!accumulator[appName][resourceType])\n accumulator[appName][resourceType] = {}\n if (!accumulator[appName][resourceType][\"resoucePath\"])\n accumulator[appName][resourceType][\"resourcePath\"] = resourcePath\n\n if (!accumulator[appName][resourceType][\"ids\"])\n accumulator[appName][resourceType][\"ids\"] = []\n\n accumulator[appName][resourceType][\"ids\"].push(resourceId)\n\n return accumulator\n }, {})\n\n const promises = Object.keys(automationsByModel).flatMap((appName) => {\n const automationsByResourceType = automationsByModel[appName]\n\n return Object.entries(automationsByResourceType).flatMap(\n ([resourceType, resourceParts]) => {\n const fetchFn = NOT_QUERYABLE.includes(appName)\n ? fetchNothing\n : QUERYABLE_BY_MULTIPLE_IDS[appName]?.includes(resourceType)\n ? fetchAllAtOnce\n : fetchOneAtATime\n\n return fetchFn({\n appName,\n ids: resourceParts[\"ids\"],\n resourcePath: resourceParts[\"resourcePath\"],\n resourceType,\n })\n }\n )\n })\n\n const results = await Promise.allSettled(promises)\n\n return {\n automations,\n triggerResources: collectSuccessfulResults(results),\n }\n}\n\nfunction collectSuccessfulResults(settledPromises) {\n return settledPromises\n .reduce((acc, result) => {\n if (result.status === \"fulfilled\") acc = acc.concat(result.value)\n\n return acc\n }, [])\n .flatMap((d) => d.data)\n}\n\nfunction fetchAllAtOnce({ appName, resourcePath, resourceType, ids }) {\n return fetchResourceName({\n appName,\n params: {\n where: { id: ids.join(\",\") },\n },\n path: resourcePath,\n resourceType,\n })\n}\n\nfunction fetchOneAtATime({ appName, resourcePath, resourceType, ids }) {\n return ids.map((id) =>\n fetchResourceName({\n appName,\n path: `${resourcePath}/${id}`,\n resourceType,\n })\n )\n}\n\nfunction fetchNothing(_props: object) {\n return new Promise((_, reject) => {\n reject()\n })\n}\n\n// TODO (maybe): move these to webhooks, return the verb in the API response,\n// so new events don't need a code change in both places\nfunction mapNameToVerb(messageName) {\n // e.g. \"groups.v2.events.membership.created\" => \"groups.membership.created\"\n const appResourceAction = messageName.replace(\"v2.events.\", \"\")\n\n switch (appResourceAction) {\n case \"groups.membership.created\":\n return \"joins\"\n case \"groups.membership.destroyed\":\n return \"leaves\"\n case \"people.list_result.created\":\n case \"services.team_person.created\":\n return \"is added to\"\n case \"people.list_result.destroyed\":\n case \"services.team_person.destroyed\":\n return \"is removed from\"\n case \"people.form_submission.created\":\n return \"submits\"\n case \"registrations.attendee.created\":\n return \"is registered as a new attendee for\"\n case \"registrations.attendee.cancelled\":\n return \"is canceled as an attendee for\"\n case \"registrations.registration.created\":\n return \"is the registration contact on a new registration for\"\n case \"registrations.registration.cancelled\":\n return \"is the registration contact on a canceled registration for\"\n default:\n return null\n }\n}\n\nfunction buildGivingDescription(automation: AutomationInstance) {\n const action = automation.name.replace(\"giving.v2.events.\", \"\")\n\n switch (action) {\n case \"donation.payment_successful\":\n return \"When a person gives\"\n case \"profile.first_donated_automation\":\n return \"When a person gives for the first time\"\n case \"recurring_donation.setup_successful\":\n return \"When a person sets up a recurring donation\"\n default:\n return null\n }\n}\n\nfunction buildDescription(automation, triggerResourceName) {\n const verb = mapNameToVerb(automation.name)\n\n const { resourceType } = triggerResourceParts(automation.triggerResource)\n\n if (!verb) {\n // No verb mapping for this message name, so just show something generic\n const resourceName = truncate(triggerResourceName, {\n length: 160,\n separator: \" \",\n })\n\n return `When the automation is triggered from ${singularize(\n resourceType\n )} \"${resourceName}\"`\n }\n\n return `When a person ${verb} ${singularize(\n resourceType\n )} \"${triggerResourceName}\"`\n}\n\nfunction fetchResourceName({\n appName,\n path,\n resourceType,\n params = {},\n}): Promise<any> {\n const client = new Client({ root: pcoApiUrl(appName, { squiggly: false }) })\n const model = upperFirst(singularize(resourceType))\n\n return client.get({\n data: {\n fields: {\n [model]: [\"name\", \"name_or_description\"],\n },\n ...params,\n },\n url: path,\n })\n}\n\nfunction mergeTriggerResourceEventDescriptions({\n automations,\n triggerResources,\n operationApps,\n}) {\n return automations.map((automation) => {\n const { appName, resourceType, resourceId } = triggerResourceParts(\n automation.triggerResource\n )\n\n if (appName === \"giving\") {\n automation.triggerEventDescription = buildGivingDescription(automation)\n automation.canManage = operationApps.find((app) => app === \"giving\")\n\n return automation\n }\n\n // find the result that matches this automation\n const result = triggerResources.find(\n (tr) => tr.id.toString() == resourceId.toString()\n )\n\n const resourceName = result\n ? result.name || result.nameOrDescription\n : `[Hidden ${upperFirst(singularize(resourceType))}]`\n\n automation.triggerEventDescription = buildDescription(\n automation,\n resourceName\n )\n\n automation.canManage = !!result\n\n return automation\n })\n}\n\nfunction IncomingAutomations({\n encryptedParam,\n trigger,\n}: {\n encryptedParam: string\n trigger?: AutomationTrigger\n}) {\n const [loading, setLoading] = useState(true)\n const [automations, setAutomations] = useState<IncomingAutomationInstance[]>()\n\n useEffect(() => {\n fetchPersonApps().then((operationApps) => {\n fetchIncomingAutomations(encryptedParam)\n .then(fetchCreatorProfiles)\n .then(mergeProfilesAndSubscriptions)\n .then(deobfuscateDescriptions)\n .then(resolveResponseDetails)\n .then(fetchTriggerResources)\n .then(({ automations, triggerResources }) =>\n mergeTriggerResourceEventDescriptions({\n automations,\n operationApps,\n triggerResources,\n })\n )\n .then(setAutomations)\n .then(() => setLoading(false))\n })\n }, [encryptedParam])\n\n const noResults = !loading && automations.length === 0\n\n return (\n <>\n <Box\n borderBottom={`1px solid ${token(\"--t-border-color\")}`}\n marginBottom={token(\"--t-spacing-2\")}\n marginHorizontal={-3}\n marginTop={trigger ? 12 : 0}\n paddingHorizontal={token(\"--t-spacing-3\")}\n paddingVertical={token(\"--t-spacing-2\")}\n >\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n {loading\n ? \"Incoming automations\"\n : pluralize(automations.length, \"incoming automation\")}\n </Heading>\n </Box>\n {noResults ? (\n <Text\n color={token(\"--t-text-color-secondary\")}\n marginVertical={token(\"--t-spacing-3\")}\n >\n Automations that perform actions on this resource will be listed here.\n </Text>\n ) : loading ? (\n <Summary\n image={<Spinner size=\"xl\" />}\n paddingVertical={10}\n title={\"Loading incoming automations...\"}\n />\n ) : (\n <TileView\n spacing={token(\"--t-spacing-3\")}\n marginVertical={token(\"--t-spacing-3\")}\n minCellWidth={45}\n >\n {automations.map((automation) => (\n <IncomingAutomation key={automation.id} automation={automation} />\n ))}\n </TileView>\n )}\n </>\n )\n}\n\nexport default IncomingAutomations\n","import { token } from \"@planningcenter/tapestry\"\nimport { Select, StackView } from \"@planningcenter/tapestry-react\"\nimport { groupBy, uniqBy } from \"lodash\"\nimport React from \"react\"\n\nfunction operationDefinitionId(od: OperationDefinition) {\n return `OPERATION_${od.definitionClass}${od.definitionIdentifier || \"\"}`\n}\n\nfunction sectionId(section: string) {\n return `SECTION_${section}`\n}\n\nfunction idType(value: string) {\n if (value.startsWith(\"SECTION\")) {\n return \"section\"\n } else if (value.startsWith(\"OPERATION\")) {\n return \"operation\"\n } else if (!value) {\n return null\n } else {\n throw new Error(`Unexpected value: ${value}`)\n }\n}\n\nfunction renderOptionsWithoutConsideringGroup(\n options: { label: string; value: string | number }[]\n) {\n return options.map(({ label, value }) => (\n <Select.Option key={value} value={value}>\n {label}\n </Select.Option>\n ))\n}\n\nfunction renderOptions(\n options: { group?: string | null; label: string; value: string | number }[]\n) {\n const groupedOptions = groupBy(options, \"group\")\n const groupTypes = Object.keys(groupedOptions).sort()\n return groupTypes.map((gt) =>\n gt === \"null\" ? (\n renderOptionsWithoutConsideringGroup(groupedOptions[gt])\n ) : (\n <Select.OptionGroup key={gt} title={gt}>\n {renderOptionsWithoutConsideringGroup(groupedOptions[gt])}\n </Select.OptionGroup>\n )\n )\n}\n\nconst Definition = ({\n selectedOperation,\n onOperationDefinitionChange,\n operationDefinitions,\n}: {\n onOperationDefinitionChange: Function\n operationDefinitions: OperationDefinition[]\n selectedOperation: OperationDefinition\n}) => {\n const selectedSection = selectedOperation?.section\n\n const operationDefinitionsWithUniqueIds = operationDefinitions.map((od) => ({\n ...od,\n id: operationDefinitionId(od),\n }))\n\n const primaryOperations = operationDefinitionsWithUniqueIds.filter(\n (od) => !od.section\n )\n\n const primarySectionOptions = uniqBy(operationDefinitions, \"section\")\n .filter((od) => !!od.section)\n .map((od) => ({\n group: od.sectionGroup,\n label: od.section,\n value: sectionId(od.section),\n }))\n\n const secondaryOperations = selectedSection\n ? operationDefinitionsWithUniqueIds.filter(\n (od) => od.section === selectedSection\n )\n : []\n\n function handleAnySelectChange({ selectedValue }) {\n switch (idType(selectedValue)) {\n case \"section\":\n onOperationDefinitionChange(\n operationDefinitions.find(\n (od) => sectionId(od.section) === selectedValue\n )\n )\n break\n case \"operation\":\n onOperationDefinitionChange(\n operationDefinitions.find(\n (od) => operationDefinitionId(od) === selectedValue\n )\n )\n break\n case null:\n onOperationDefinitionChange(null)\n break\n }\n }\n\n function renderOperations(operations: OperationDefinition[]) {\n const operationsAsOptions = operations.map((o) => ({\n group: o.group,\n label: o.description,\n value: o.id,\n }))\n\n return renderOptions(operationsAsOptions)\n }\n\n const primarySelectedValue = selectedOperation\n ? !selectedOperation.section\n ? operationDefinitionId(selectedOperation)\n : sectionId(selectedOperation.section)\n : undefined\n\n return (\n <StackView spacing={token(\"--t-spacing-1\")}>\n <Select\n emptyValue=\"Select an action\"\n id=\"select-action\"\n onChange={handleAnySelectChange}\n size=\"lg\"\n value={primarySelectedValue}\n data-testid=\"operation-select\"\n >\n {renderOperations(primaryOperations)}\n {renderOptions(primarySectionOptions)}\n </Select>\n {secondaryOperations.length > 0 && (\n <Select\n value={operationDefinitionId(selectedOperation)}\n onChange={handleAnySelectChange}\n size=\"lg\"\n >\n {renderOperations(secondaryOperations)}\n </Select>\n )}\n </StackView>\n )\n}\n\nexport default Definition\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Avatar,\n Badge,\n Box,\n Checkbox as TapestryCheckbox,\n Combobox as TapestryCombobox,\n DateField as TapestryDateField,\n HelperDrawer,\n Highlight,\n Icon,\n Input,\n Menu,\n NumberField as TapestryNumberField,\n Radio,\n Select as TapestrySelect,\n Spinner,\n StackView,\n Text,\n TextArea as TapestryTextArea,\n} from \"@planningcenter/tapestry-react\"\nimport { camelCase, debounce, groupBy, isEqual, sortBy, uniqBy } from \"lodash\"\nimport moment from \"moment\"\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\n\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport {\n dateFNSFormat,\n dateLocalized,\n fieldListIdentifier,\n momentDateFormat,\n} from \"./utils/utils\"\n\nfunction fieldDependencies({\n field,\n selectedFieldOptions,\n}: {\n field: DefinitionField\n selectedFieldOptions: { [k: string]: any }\n}) {\n const dependsOn = field.dependsOn || []\n return dependsOn.reduce((acc, depKey) => {\n if (Object.prototype.hasOwnProperty.call(selectedFieldOptions, depKey)) {\n acc[camelCase(depKey)] = selectedFieldOptions[depKey]\n }\n return acc\n }, {})\n}\n\nfunction useMemoizedObject(generator) {\n const [memoizedObject, setMemoizedObject] = useState(generator)\n\n useEffect(() => {\n const newObject = generator()\n\n if (!isEqual(newObject, memoizedObject)) {\n setMemoizedObject(newObject)\n }\n }, [generator, memoizedObject])\n\n return memoizedObject\n}\n\nconst Field = ({\n canAccessPeople,\n field,\n onChange,\n value,\n selectedFieldOptions,\n loadListForField,\n loadedLists,\n loadingLists,\n}: {\n canAccessPeople: boolean\n field: DefinitionField\n loadListForField: LoadListForField\n loadedLists: { [k: string]: LoadedList[] }\n loadingLists: { [k: string]: boolean }\n onChange: Function\n selectedFieldOptions: { [k: string]: any }\n value: any\n}) => {\n const dependencies = useMemoizedObject(() =>\n fieldDependencies({ field, selectedFieldOptions })\n )\n\n useEffect(() => {\n if (field.listClass) {\n loadListForField({ dependencies, field })\n }\n }, [field, dependencies, loadListForField])\n\n if (field.kind === \"Hidden\") return null\n\n const listOptions =\n field.list || loadedLists[fieldListIdentifier(field)] || []\n\n const actionAllowedOptions = listOptions.filter(\n (op) => !op.automationNotAllowed\n )\n\n const loading = field.listClass && loadingLists[fieldListIdentifier(field)]\n\n function renderField() {\n switch (field.kind) {\n case \"Select\":\n return (\n <Select\n fieldId={field.id}\n listOptions={actionAllowedOptions}\n onChange={onChange}\n value={value}\n description={field.description}\n disabled={field.disabled}\n />\n )\n case \"SelectSearch\":\n return (\n <SelectSearch\n fieldId={field.id}\n listOptions={actionAllowedOptions}\n onChange={onChange}\n value={value}\n />\n )\n case \"Checkbox\":\n return <Checkbox field={field} value={value} onChange={onChange} />\n case \"TextArea\":\n return <TextArea field={field} onChange={onChange} value={value} />\n\n case \"DateField\":\n return <DateField field={field} onChange={onChange} value={value} />\n case \"Checkboxes\":\n return (\n <Checkboxes\n fieldId={field.id}\n options={actionAllowedOptions}\n onChange={onChange}\n />\n )\n case \"NumberField\":\n return <NumberField field={field} onChange={onChange} value={value} />\n case \"PersonSearch\":\n return (\n <PersonSearch\n canAccessPeople={canAccessPeople}\n field={field}\n onChange={onChange}\n listOptions={listOptions}\n isLoading={loadingLists[fieldListIdentifier(field)]}\n loadListForField={loadListForField}\n value={value}\n />\n )\n case \"TextField\":\n return <TextField field={field} onChange={onChange} value={value} />\n case \"RadioButtons\":\n return (\n <RadioButtons\n field={field}\n options={listOptions}\n onChange={onChange}\n value={value}\n />\n )\n case \"StaticText\":\n return <Text dangerouslySetInnerHTML={{ __html: field.content }} />\n default:\n console.warn(`Unknown field kind \"${field.kind}\"`)\n return null\n }\n }\n\n return (\n <StackView marginBottom={2} spacing={0.5}>\n <Input.InputLabel\n color={token(\"--t-text-color-headline\")}\n fontSize={token(\"--t-font-size-sm\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n controls={field.id}\n >\n {field.description}\n {field.description && field.info && (\n <HelperDrawer.Toggle drawerId={`${field.id}_help`} marginLeft={1} />\n )}\n </Input.InputLabel>\n <Box>\n {loading ? <Loading /> : renderField()}\n {!field.description && field.info && (\n <HelperDrawer.Toggle drawerId={`${field.id}_help`} marginLeft={1} />\n )}\n </Box>\n {field.info && (\n <HelperDrawer\n id={`${field.id}_help`}\n marginTop={token(\"--t-spacing-half\")}\n >\n <Box dangerouslySetInnerHTML={{ __html: field.info }} />\n </HelperDrawer>\n )}\n </StackView>\n )\n}\n\nconst Select = ({\n fieldId,\n listOptions,\n onChange,\n value,\n description,\n disabled,\n}: {\n description?: string\n disabled?: boolean\n fieldId: string\n listOptions: LoadedList[]\n onChange: Function\n value: any\n}) => {\n const overridenEmptyValue = listOptions?.find(\n (option) => option.value === \"no-option\"\n )\n const groupedOptions = groupBy(listOptions, \"group\")\n const groupTypes = Object.keys(groupedOptions).sort()\n const renderOptions = () => {\n return groupTypes.map((gt) =>\n gt === \"null\" || gt === \"undefined\" ? (\n renderOptionsWithoutConsideringGroup(groupedOptions[gt])\n ) : (\n <TapestrySelect.OptionGroup key={gt} title={gt}>\n {renderOptionsWithoutConsideringGroup(groupedOptions[gt])}\n </TapestrySelect.OptionGroup>\n )\n )\n }\n\n const renderOptionsWithoutConsideringGroup = (\n items: { description: string; disabled?: boolean; value: string | number }[]\n ) => {\n return items.map((item) => (\n <TapestrySelect.Option\n key={item.value}\n value={item.value.toString()}\n disabled={item.disabled}\n >\n {item.description}\n </TapestrySelect.Option>\n ))\n }\n\n const handleSelectedValueChange = ({ selectedValue }) => {\n onChange({ fieldId, value: selectedValue })\n }\n\n const generatePrompt = (word: string) => {\n let prompt = `Select `\n if (!word) {\n prompt += \"a value\"\n } else if ([\"a\", \"e\", \"i\", \"o\", \"u\"].includes(word.charAt(0))) {\n prompt += `an ${word}`\n } else {\n prompt += `a ${word}`\n }\n return prompt\n }\n\n const renderEmptyValue = () => {\n if (renderOptions().length === 0) return \"No options available\"\n return (\n overridenEmptyValue?.description ||\n generatePrompt(description?.toLowerCase())\n )\n }\n\n return (\n <TapestrySelect\n id={fieldId}\n onChange={handleSelectedValueChange}\n disabled={renderOptions().length < 1 || !!disabled}\n emptyValue={renderEmptyValue()}\n size=\"lg\"\n value={value || overridenEmptyValue?.value || null}\n placement=\"bottom-start\"\n >\n {renderOptions()}\n </TapestrySelect>\n )\n}\n\nconst SelectSearch = ({\n fieldId,\n listOptions,\n onChange,\n value,\n}: {\n fieldId: string\n listOptions: LoadedList[]\n onChange: Function\n value?: string\n}) => {\n const selectedOption: LoadedList = listOptions.find(\n (option) => option.value?.toString() === value\n )\n const selectedLabel = selectedOption?.description || \"\"\n const [prevSelectedLabel, setPrevSelectedLabel] = useState(\"\")\n const [query, setQuery] = useState(selectedLabel)\n const [showFilteredOptions, setShowFilteredOptions] = useState(false)\n const [showClearButton, setShowClearButton] = useState(false)\n\n if (selectedLabel !== prevSelectedLabel) {\n setPrevSelectedLabel(selectedLabel)\n setQuery(selectedLabel)\n setShowFilteredOptions(false)\n }\n\n let filteredOptions = sortBy(uniqBy(listOptions, \"value\"), \"group\")\n\n if (showFilteredOptions) {\n const formattedQuery = query.toLowerCase()\n filteredOptions = filteredOptions.filter((option) => {\n const optionText = `${option.description} ${option.group}`.toLowerCase()\n return optionText.includes(formattedQuery)\n })\n }\n\n const handleValueChange = (value: string) => {\n onChange({ fieldId, value })\n }\n\n return (\n <TapestryCombobox.Popover\n closeOnSelect\n closeButton={{ icon: { size: \"md\" } }}\n css={{\n \"[role='combobox']\": {\n cursor: listOptions.length > 0 ? \"pointer\" : \"not-allowed\",\n },\n }}\n cursor=\"pointer\"\n disabled={listOptions.length === 0}\n onBlur={() => {\n setShowClearButton(false)\n setQuery(selectedLabel)\n }}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(e.target.value)\n setShowFilteredOptions(true)\n setShowClearButton(true)\n }}\n onClear={\n showClearButton\n ? () => {\n setQuery(\"\")\n setShowFilteredOptions(false)\n }\n : undefined\n }\n onFocus={(e: React.ChangeEvent<HTMLInputElement>) => e.target.select()} // select all text on focus\n onSelect={(option: { description: string; value: string }) => {\n handleValueChange(option.value)\n setQuery(option.description)\n setShowFilteredOptions(false)\n setShowClearButton(false)\n }}\n openOnFocus\n paddingLeft={4.5}\n placeholder={\n listOptions.length > 0 ? \"Select an option\" : \"No options available\"\n }\n placement=\"bottom-start\"\n popoverProps={{\n matchWidths: \"minimum\",\n }}\n renderLeft={<Icon name=\"general.search\" size=\"md\" />}\n renderRight={<Icon name=\"general.downCaret\" />}\n size=\"lg\"\n value={query}\n >\n {listOptions.length > 0 && (\n <>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option: LoadedList, index: number) => {\n const isCurrent = option.value.toString() === value\n return (\n <TapestryCombobox.Item\n aria-label={option.description}\n disabled={option.disabled}\n index={index}\n key={option.value}\n paddingLeft={4.25}\n renderLeft={\n <Icon\n marginLeft={-0.5}\n name={isCurrent ? \"general.check\" : \"\"}\n size=\"sm\"\n />\n }\n role=\"option\"\n spacing={token(\"--t-spacing-1\")}\n value={{\n description: option.description,\n value: option.value.toString(),\n }}\n >\n <Text truncate>\n <Highlight text={option.description} query={query} />\n </Text>\n {option.group && (\n <Badge\n title={<Highlight text={option.group} query={query} />}\n size=\"sm\"\n marginLeft=\"auto\"\n />\n )}\n </TapestryCombobox.Item>\n )\n })\n ) : (\n <Menu.Item>\n <Text>No results for &quot;{query}&quot;</Text>\n </Menu.Item>\n )}\n </>\n )}\n </TapestryCombobox.Popover>\n )\n}\n\nconst PersonSearch = ({\n canAccessPeople,\n field,\n isLoading,\n listOptions,\n loadListForField,\n onChange,\n value,\n}: {\n canAccessPeople: boolean\n field: DefinitionField\n isLoading: boolean\n listOptions: LoadedList[]\n loadListForField: LoadListForField\n onChange: Function\n value?: string\n}) => {\n const immediateSearch = useCallback(\n (query: string) => {\n loadListForField({ dependencies: { query }, field })\n },\n [loadListForField]\n )\n\n const debouncedSearch = useMemo(\n () => debounce(immediateSearch, 300),\n [immediateSearch]\n )\n\n const search = useCallback(\n (query: string) => {\n if (!canAccessPeople) {\n return\n } else if (query.trim().length > 0) {\n debouncedSearch(query)\n } else {\n debouncedSearch.cancel()\n }\n },\n [debouncedSearch]\n )\n\n const myself: LoadedList = useMemo(\n () => ({ description: \"Myself\", value: \"self\" }),\n []\n )\n const allListOptions = useMemo(() => {\n if (!canAccessPeople) {\n return [myself]\n } else {\n return listOptions\n }\n }, [myself, listOptions])\n\n const selectedOption = allListOptions.find((option) => option.value === value)\n const selectedLabel = selectedOption?.description || \"\"\n const [query, _setQuery] = useState(selectedLabel)\n const [showClearButton, setShowClearButton] = useState(false)\n\n function setQuery(value: string) {\n _setQuery(value)\n search(value)\n if (value.trim().length === 0) {\n handleValueChange(null)\n }\n }\n\n const handleValueChange = (value: string) => {\n onChange({ fieldId: field.id, value })\n }\n\n return (\n <TapestryCombobox.Popover\n closeOnSelect\n closeButton={{ icon: { size: \"md\" } }}\n cursor=\"pointer\"\n onBlur={() => {\n setShowClearButton(false)\n setQuery(selectedLabel)\n }}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(e.target.value)\n setShowClearButton(true)\n }}\n onClear={\n showClearButton\n ? () => {\n setQuery(\"\")\n }\n : undefined\n }\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => e.target.select()} // select all text on focus\n onSelect={(option: { description: string; value: string }) => {\n handleValueChange(option.value)\n setQuery(option.description)\n setShowClearButton(false)\n }}\n openOnFocus\n paddingLeft={4.5}\n placeholder=\"Search\"\n placement=\"bottom-start\"\n popoverProps={{\n matchWidths: \"minimum\",\n }}\n renderLeft={\n selectedOption && selectedOption.meta?.avatar ? (\n <Avatar size=\"sm\" source={selectedOption.meta.avatar} />\n ) : (\n <Icon name=\"general.search\" size=\"md\" />\n )\n }\n renderRight={<Icon name=\"general.downCaret\" />}\n size=\"lg\"\n value={query}\n >\n {canAccessPeople ? (\n query.trim().length > 0 ? (\n listOptions.length > 0 ? (\n listOptions.map((option, index) => {\n return (\n <TapestryCombobox.Item\n aria-label={option.description}\n index={index}\n key={option.value}\n paddingLeft={4.25}\n renderLeft={\n <Avatar\n marginLeft={-0.5}\n source={option.meta.avatar}\n size=\"sm\"\n />\n }\n role=\"option\"\n spacing={token(\"--t-spacing-1\")}\n value={option}\n >\n <Text truncate>\n <Highlight text={option.description} query={query} />\n </Text>\n </TapestryCombobox.Item>\n )\n })\n ) : isLoading ? (\n <TapestryCombobox.Item>\n <Text>Loading...</Text>\n </TapestryCombobox.Item>\n ) : (\n <TapestryCombobox.Item>\n <Text>No results</Text>\n </TapestryCombobox.Item>\n )\n ) : (\n <TapestryCombobox.Item>\n <Text>Type to search</Text>\n </TapestryCombobox.Item>\n )\n ) : (\n <TapestryCombobox.Item value={myself} index={0} role=\"option\">\n <Text>{myself.description}</Text>\n </TapestryCombobox.Item>\n )}\n </TapestryCombobox.Popover>\n )\n}\n\nconst Checkbox = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleCheckedValueChange = (e) => {\n const value = e.target.checked\n onChange({ fieldId: field.id, value })\n }\n\n return (\n <TapestryCheckbox\n disabled={field.disabled}\n label={field.label}\n checked={value || false}\n onChange={handleCheckedValueChange}\n />\n )\n}\n\nconst TextArea = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleTextChange = (e) => {\n const val = e.target.value\n onChange({ fieldId: field.id, value: val })\n }\n return (\n <Box>\n <TapestryTextArea\n value={value}\n placeholder={field.placeholder}\n onChange={handleTextChange}\n size=\"lg\"\n />\n </Box>\n )\n}\n\nconst DateField = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const { dateFormat } = useContext(OrganizationContext)\n const todaysValue = field.customValue || \"Day automation runs\"\n const dateBeforeValue = \"Day before automation runs\"\n const orgFormat = dateFNSFormat(dateFormat)\n const allowUnansweredOption = field.allowUnansweredOption ?? false\n\n // Saved automations may store \"Date automation runs\" (the default applied in\n // fields.tsx) — the server treats it as a synonym for \"Day automation runs\".\n const initialSelection = () => {\n if (!value) return null\n if (value === todaysValue || value === \"Date automation runs\") {\n return todaysValue\n }\n if (value === dateBeforeValue) return dateBeforeValue\n return \"specific-date\"\n }\n const [selection, setSelection] = useState(initialSelection)\n const [specificDate, setSpecificDate] = useState(\n selection === \"specific-date\"\n )\n const [dateFieldValue, setDateFieldValue] = useState(() => {\n const parsed = moment(value, momentDateFormat(dateFormat))\n return parsed.isValid() ? parsed.toDate() : new Date()\n })\n\n const handleSelectChange = ({ selectedValue }) => {\n setSelection(selectedValue)\n if (selectedValue === todaysValue || selectedValue === dateBeforeValue) {\n setSpecificDate(false)\n onChange({ fieldId: field.id, value: selectedValue })\n } else if (selectedValue === \"specific-date\") {\n onChange({ fieldId: field.id, value: null })\n setSpecificDate(true)\n } else {\n setSpecificDate(false)\n onChange({ fieldId: field.id, value: null })\n }\n }\n\n const handleValueChanged = (date: Date) => {\n onChange({ fieldId: field.id, value: dateLocalized(date, dateFormat) })\n setDateFieldValue(date)\n }\n\n return (\n <StackView axis=\"horizontal\">\n <TapestrySelect\n onChange={handleSelectChange}\n size=\"lg\"\n placement=\"bottom-start\"\n value={selection}\n >\n <TapestrySelect.Option value={todaysValue}>\n {todaysValue}\n </TapestrySelect.Option>\n {!field.customValue && (\n <TapestrySelect.Option value={dateBeforeValue}>\n {dateBeforeValue}\n </TapestrySelect.Option>\n )}\n <TapestrySelect.Option value=\"specific-date\">\n A specific date\n </TapestrySelect.Option>\n {allowUnansweredOption && (\n <TapestrySelect.Option value=\"unanswered\">\n Unanswered\n </TapestrySelect.Option>\n )}\n </TapestrySelect>\n {specificDate && (\n <Box>\n <TapestryDateField\n defaultOpen\n formatValue={orgFormat}\n marginLeft={1}\n onChange={handleValueChanged}\n size=\"lg\"\n value={dateFieldValue}\n />\n </Box>\n )}\n </StackView>\n )\n}\n\nconst Checkboxes = ({\n fieldId,\n options,\n onChange,\n}: {\n fieldId: string\n onChange: Function\n options: { description: string; value: string | number }[]\n}) => {\n const [selectedValues, setSelectedValues] = useState({})\n\n const handleCheckboxesChange = (selectedValue, value) => {\n const newSelectedValues = { ...selectedValues }\n newSelectedValues[value] = selectedValue\n setSelectedValues(newSelectedValues)\n onChange({ fieldId, value: newSelectedValues })\n }\n\n return (\n <StackView spacing={1}>\n {options.map((item) => (\n <Box key={item.value}>\n <Input.InputLabel controls={`checkboxes_${fieldId}_${item.value}`}>\n {item.description || item.value}\n </Input.InputLabel>\n <TapestrySelect\n id={`checkboxes_${fieldId}_${item.value}`}\n onChange={({ selectedValue }) =>\n handleCheckboxesChange(selectedValue, item.value)\n }\n size=\"lg\"\n emptyValue={\"Don't change\"}\n >\n <TapestrySelect.Option value=\"check\">Check</TapestrySelect.Option>\n <TapestrySelect.Option value=\"uncheck\">\n Uncheck\n </TapestrySelect.Option>\n </TapestrySelect>\n </Box>\n ))}\n </StackView>\n )\n}\n\nconst NumberField = ({\n field,\n onChange,\n value,\n}: {\n field: DefinitionField\n onChange: Function\n value: string\n}) => {\n const minimumValue = field.minValue >= 0 ? field.minValue : 1\n const maximumValue =\n field.maxValue >= 1 && field.maxValue <= 365 ? field.maxValue : 365\n\n const [inputValue, setInputValue] = useState(Number(field.defaultValue) || 1)\n\n useEffect(() => {\n onChange({ fieldId: field.id, value: field.defaultValue || 1 })\n }, [field])\n\n return (\n <StackView>\n <Input.InputBox>\n <TapestryNumberField\n onChange={(value: string) => {\n const newNumberValue = Number(value) || 0\n setInputValue(newNumberValue)\n\n onChange({\n fieldId: field.id,\n value: Math.min(\n Math.max(newNumberValue, minimumValue),\n maximumValue\n ),\n })\n }}\n placeholder={field.placeholder}\n size=\"lg\"\n value={value}\n min={minimumValue}\n max={maximumValue}\n hasControls={true}\n />\n </Input.InputBox>\n {inputValue > maximumValue && (\n <Alert\n type=\"error\"\n paddingHorizontal={token(\"--t-spacing-1\")}\n paddingVertical={token(\"--t-spacing-half\")}\n display=\"inline-block\"\n marginTop={1.5}\n >\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={0.75}>\n <Icon\n name=\"general.exclamationTriangle\"\n size=\"sm\"\n color=\"delete45\"\n />\n <Text size={token(\"--t-font-size-md\")}>\n Value cannot exceed {maximumValue}.\n </Text>\n </StackView>\n </Alert>\n )}\n </StackView>\n )\n}\n\nconst TextField = ({\n field,\n value,\n onChange,\n}: {\n field: DefinitionField\n onChange: Function\n value: any\n}) => {\n const handleTextChange = (e) => {\n const val = e.target.value\n onChange({ fieldId: field.id, value: val })\n }\n return (\n <Box>\n <Input\n size=\"lg\"\n value={value ?? \"\"}\n id={field.id}\n placeholder={field.placeholder}\n onChange={handleTextChange}\n />\n </Box>\n )\n}\n\nconst RadioButtons = ({\n field,\n options,\n onChange,\n value,\n}: {\n field: DefinitionField\n onChange: Function\n options: LoadedList[]\n value: any\n}) => {\n const handleCheckedChange = (e) => {\n onChange({ fieldId: field.id, value: e.target.value })\n }\n\n return (\n <StackView marginTop={1} spacing={0.5}>\n {options.map((option) => (\n <Radio\n checked={value === option.value}\n key={option.value}\n label={option.description || option.value}\n onChange={handleCheckedChange}\n size=\"md\"\n value={option.value}\n />\n ))}\n </StackView>\n )\n}\n\nconst Loading = () => (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={token(\"--t-border-radius-md\")}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n)\n\nexport default Field\n","import React, { useEffect } from \"react\"\n\nimport Field from \"./field\"\nimport { getRenderedFields } from \"./utils/utils\"\n\ninterface FieldsProps {\n canAccessPeople: boolean\n definitionFields: DefinitionField[]\n loadListForField: LoadListForField\n loadedLists: { [k: string]: LoadedList[] }\n loadingLists: { [k: string]: boolean }\n onChange: Function\n selectedFieldOptions: SelectedFieldOptions\n}\n\nconst Fields = ({\n canAccessPeople,\n definitionFields,\n onChange,\n selectedFieldOptions,\n loadListForField,\n loadedLists,\n loadingLists,\n}: FieldsProps): JSX.Element => {\n useEffect(() => {\n const newSelections = definitionFields.reduce((acc, field) => {\n if (Object.prototype.hasOwnProperty.call(field, \"defaultValue\")) {\n acc[field.id] = field.defaultValue\n } else if (field.kind === \"DateField\") {\n acc[field.id] = field.customValue || \"Date automation runs\"\n }\n\n return acc\n }, {})\n // Merge: existing values (e.g. pre-populated from an existing automation)\n // take precedence over field defaults.\n onChange((prev: SelectedFieldOptions) => ({ ...newSelections, ...prev }))\n }, [definitionFields, onChange])\n\n const renderableFields = getRenderedFields(\n definitionFields,\n selectedFieldOptions\n )\n\n const handleSelectedFieldOptionsChange = ({ fieldId, value }) => {\n const newSelections = { ...selectedFieldOptions }\n const dependents = definitionFields.filter((field) => field.dependsOn)\n dependents.map((dependent) => {\n if (dependent.dependsOn.includes(fieldId)) {\n const deeper = dependents.find((d) =>\n d.dependsOn.includes(dependent.id)\n )\n if (deeper) {\n delete newSelections[deeper.id]\n }\n delete newSelections[dependent.id]\n\n if (\n dependent.defaultValue !== undefined &&\n newSelections[dependent.id] === undefined\n ) {\n newSelections[dependent.id] = dependent.defaultValue\n }\n }\n })\n\n if (value === \"no-option\") {\n delete newSelections[fieldId]\n } else {\n newSelections[fieldId] = value\n }\n\n onChange({ ...newSelections })\n }\n\n if (definitionFields.length) {\n return (\n <div>\n {renderableFields.map((field) => {\n return (\n <Field\n canAccessPeople={canAccessPeople}\n field={field}\n key={field.id}\n onChange={handleSelectedFieldOptionsChange}\n value={selectedFieldOptions[field.id]}\n selectedFieldOptions={selectedFieldOptions}\n loadListForField={loadListForField}\n loadedLists={loadedLists}\n loadingLists={loadingLists}\n />\n )\n })}\n </div>\n )\n } else {\n return null\n }\n}\n\nexport default Fields\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Icon,\n Input,\n Link,\n Select,\n Spinner,\n StackView,\n Text,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport Definition from \"./definition\"\nimport Fields from \"./fields\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n buildDescription,\n buildTriggerConditions,\n fieldListIdentifier,\n getRenderedFields,\n} from \"./utils/utils\"\n\nconst client = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"LATEST\",\n})\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"LATEST\",\n})\nconst errorAlertProps = {\n css: { borderRadius: token(\"--t-border-radius-md\") },\n paddingHorizontal: 1.75,\n paddingVertical: 1.25,\n type: \"error\",\n}\n\ntype TopbarResponse = {\n data: {\n apps: Array<{ name: string }>\n type: \"Topbar\"\n }\n}\n\nasync function getVisibleApps() {\n return client\n .get<TopbarResponse>({\n data: {\n fields: { Topbar: \"apps\" },\n },\n url: \"/me/topbar\",\n })\n .then(({ data }) => data.apps.map((a) => a.name))\n}\n\nasync function getWebhooksApps() {\n return webhooksClient\n .get<{ data: Array<{ name: string; type: \"OperationApp\" }> }>({\n data: { fields: { OperationApp: \"name\" } },\n url: \"/operation_apps\",\n })\n .then(({ data }) => data.map((a) => a.name))\n}\n\nasync function getOperationApps() {\n const [visibleApps, webhooksApps] = await Promise.all([\n getVisibleApps(),\n getWebhooksApps(),\n ])\n\n return visibleApps\n .filter((app) => webhooksApps.includes(app))\n .sort()\n .map((app: string) => ({ id: app.toLowerCase(), name: app }))\n}\n\nasync function getOperationDefinitions(app: string) {\n return webhooksClient\n .get({\n data: {\n fields: {\n OperationDefinition:\n \"definition_class,definition_fields,definition_identifier,description,group,section,section_group,footer_message\",\n },\n filter: \"automation_allowed\",\n walk: true,\n },\n url: `/operation_apps/${app}/operation_definitions`,\n })\n .then(({ data }) => data)\n}\n\nasync function getListOptions({\n app,\n field,\n definitionIdentifier,\n dependencies,\n}: {\n app: string\n definitionIdentifier: string\n dependencies: { [k: string]: string }\n field: DefinitionField\n}): Promise<LoadedList[]> {\n if (field.kind === \"PersonSearch\") {\n const { data: people } = await client.get<{\n data: { avatar: string; id: number; name: string }[]\n }>({\n data: {\n fields: { Person: \"avatar,name\" },\n where: { search_name_or_email: dependencies.query, status: \"active\" },\n },\n url: \"/people\",\n })\n\n return people.map((p) => ({\n description: p.name,\n meta: { avatar: p.avatar },\n value: p.id.toString(),\n }))\n } else {\n const { data } = await webhooksClient.get({\n data: {\n ...dependencies,\n definitionIdentifier,\n fields: {\n OperationDefinitionList: \"values\",\n },\n },\n url: `/operation_apps/${app}/operation_definition_lists/${field.listClass}`,\n })\n return data.values\n }\n}\n\nconst NewAutomation = forwardRef(\n (\n {\n afterCreateOptions,\n blankStateLink,\n debugMode = false,\n defaultApp,\n description,\n hideFooter = false,\n onRequestClose,\n onSuccess,\n trigger,\n }: {\n afterCreateOptions?: AfterCreateOptions\n blankStateLink: string\n debugMode?: boolean\n defaultApp: string\n description: string\n hideFooter?: boolean\n onRequestClose: () => void\n onSuccess?: () => void\n trigger: AutomationTrigger\n },\n ref: React.Ref<{ submit: () => void }>\n ) => {\n const [selectedTriggerEvent, setSelectedTriggerEvent] = useState(\n trigger.events[0]\n )\n const [dynamicTriggerConditions, setDynamicTriggerConditions] =\n useState<SelectedFieldOptions>({})\n const [selectedApp, setSelectedApp] = useState(defaultApp)\n const [operationApps, setOperationApps] = useState<\n { id: string; name: string }[]\n >([])\n const [operationDefinitions, setOperationDefinitions] = useState<\n OperationDefinition[]\n >([])\n const [loadingOperationDefinitions, setLoadingOperationDefinitions] =\n useState(true)\n const [selectedDefinition, setSelectedDefinition] =\n useState<OperationDefinition>()\n const [selectedFieldOptions, setSelectedFieldOptions] =\n useState<SelectedFieldOptions>({})\n const [loadedLists, setLoadedLists] = useState<{\n [k: string]: LoadedList[]\n }>({})\n const [loadingLists, setLoadingLists] = useState<{ [k: string]: boolean }>(\n {}\n )\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<{\n automation?: string | string[]\n definitions?: string | string[]\n selected_definition?: string | string[]\n }>({})\n const [callAfterCreate, setCallAfterCreate] = useState(false)\n const [triggerParams, setTriggerParams] = useState<{ [k: string]: string }>(\n {}\n )\n const activeAppRef = useRef(null)\n\n useImperativeHandle(ref, () => ({ submit: handleSubmit }))\n\n const canAccessPeople = useMemo(\n () => operationApps.map((a) => a.id).includes(\"people\"),\n [operationApps]\n )\n\n const definitionIdentifier = selectedDefinition?.definitionIdentifier\n const dangerAlertPresent =\n selectedDefinition?.footerMessage?.kind === \"danger\"\n\n const loadListForField = useCallback<LoadListForField>(\n ({ field, dependencies }) => {\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: true,\n }))\n getListOptions({\n app: selectedApp,\n definitionIdentifier,\n dependencies,\n field,\n })\n .then((ret) => {\n setLoadedLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: ret,\n }))\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: false,\n }))\n })\n .catch((error) => setError({ selected_definition: error }))\n },\n [selectedApp, definitionIdentifier]\n )\n\n const handleChangeSelectedApp = (app: string) => {\n setSelectedApp(app)\n setLoadingOperationDefinitions(true)\n setOperationDefinitions([])\n activeAppRef.current = app\n setSelectedDefinition(null)\n setSelectedFieldOptions({})\n setError({})\n getOperationDefinitions(app)\n .then(setOperationDefinitions)\n .then(() => setLoadingOperationDefinitions(false))\n .catch((error) => setError({ definitions: error }))\n }\n\n const handleChangeTriggerEvent = (\n selectedValue: typeof selectedTriggerEvent\n ) => {\n setSelectedTriggerEvent(selectedValue)\n setDynamicTriggerConditions({})\n }\n\n useEffect(() => {\n setError({})\n getOperationApps().then((apps) => {\n setOperationApps(apps)\n const defaultSelection = apps.find((app) => app.id === defaultApp)\n ? defaultApp\n : apps[0].id\n setSelectedApp(defaultSelection)\n getOperationDefinitions(defaultSelection)\n .then((definitions) => {\n if (!activeAppRef.current) {\n setOperationDefinitions(definitions)\n setLoadingOperationDefinitions(false)\n }\n })\n .catch((error) => setError({ definitions: error }))\n })\n }, [defaultApp])\n\n useEffect(() => {\n setError({})\n }, [selectedFieldOptions])\n\n const dynamicConditions =\n \"dynamicConditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.dynamicConditions\n : trigger.dynamicConditions\n const triggerConditions = buildTriggerConditions({\n baseConditions:\n \"conditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.conditions\n : trigger.conditions,\n dynamicConditions,\n dynamicTriggerConditions,\n })\n\n const handleSelectedDefinitionChange = (\n newDefinition: OperationDefinition\n ) => {\n setSelectedDefinition(newDefinition)\n setError({})\n setSelectedFieldOptions({})\n }\n\n function getDescription(): string {\n const descriptionParts = buildDescription({\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n })\n\n let description = descriptionParts.name\n\n if (descriptionParts.description) {\n description += ` (${descriptionParts.description})`\n }\n\n return description\n }\n\n function handleSubmit() {\n if (submitting) {\n return\n }\n const operation_params = { ...selectedFieldOptions }\n\n if (selectedDefinition.definitionIdentifier) {\n operation_params.definition_identifier =\n selectedDefinition.definitionIdentifier\n }\n\n const data = {\n _e: trigger.resource,\n data: {\n attributes: {\n description: getDescription(),\n name: selectedTriggerEvent.name,\n operation_app_name: selectedApp,\n operation_definition_class_name: selectedDefinition.definitionClass,\n operation_params,\n trigger_conditions: triggerConditions,\n trigger_params: triggerParams,\n },\n type: \"AutomationSubscription\",\n },\n }\n if (callAfterCreate) {\n alerts.confirmCreate\n .fire({\n cancelButtonText: \"Cancel\",\n confirmButtonText: \"Yes, perform action\",\n text: \"This will happen immediately after creating your new automation. Are you sure?\",\n title: `${afterCreateOptions.label}?`,\n })\n .then((result: { value: any }) => {\n if (result.value) {\n submitCreate(data)\n } else {\n setSubmitting(false)\n setCallAfterCreate(false)\n }\n })\n } else {\n submitCreate(data)\n }\n }\n\n function submitCreate(data) {\n setSubmitting(true)\n webhooksClient\n .post({\n data,\n url: \"/me/automation_subscriptions\",\n })\n .then(() => {\n if (afterCreateOptions?.onConfirm && callAfterCreate) {\n onRequestClose()\n afterCreateOptions.onConfirm({ ...data })\n } else if (onSuccess) {\n onSuccess()\n } else {\n window.location.reload()\n }\n })\n .catch((error) => {\n setSubmitting(false)\n if (error.errors) {\n setError({ automation: error.errors })\n } else {\n setError({ automation: \"something even worse happened!\" })\n }\n })\n }\n\n return (\n <StackView paddingTop={4} spacing={2}>\n {description && (\n <Box>\n <Text\n style={{\n color: token(\"--t-text-color\"),\n fontSize: token(\"--t-font-size-md\"),\n lineHeight: 1.65,\n marginBottom: token(\"--t-spacing-2\"),\n }}\n >\n {description}{\" \"}\n <Link external to={blankStateLink}>\n Learn more\n </Link>\n </Text>\n </Box>\n )}\n {error.automation && (\n <Alert {...errorAlertProps}>\n <Text>\n There was an error creating your automation. Please change your\n selections and try again or contact support if the problem\n persists.\n </Text>\n </Alert>\n )}\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color\")}\n controls=\"select-trigger-event\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n When a person...\n </Input.InputLabel>\n <Select\n id=\"select-trigger-event\"\n onChange={({ selectedValue }) =>\n handleChangeTriggerEvent(selectedValue)\n }\n size=\"lg\"\n value={selectedTriggerEvent}\n >\n {trigger.events.map((triggerEvent, idx) => (\n <Select.Option\n key={`${triggerEvent.name}_${idx}`}\n value={triggerEvent}\n >\n {triggerEvent.description}\n </Select.Option>\n ))}\n </Select>\n\n {dynamicConditions?.length > 0 && (\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={dynamicConditions}\n selectedFieldOptions={dynamicTriggerConditions}\n onChange={setDynamicTriggerConditions}\n loadedLists={{}}\n loadingLists={{}}\n loadListForField={() => null}\n />\n )}\n </StackView>\n\n <StackView spacing={1}>\n {operationApps.length > 0 ? (\n <Application\n selectedApp={selectedApp}\n operationApps={operationApps}\n onOperationAppChange={handleChangeSelectedApp}\n />\n ) : (\n <StackView spacing={1}>\n <Text\n color={token(\"--t-text-color-headline\")}\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Text>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={4}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n </StackView>\n )}\n {error.definitions ? (\n <Alert marginTop={token(\"--t-spacing-1\")} {...errorAlertProps}>\n <Text>\n There was a problem looking up automations. Please contact\n support if the problem persists.\n </Text>\n </Alert>\n ) : loadingOperationDefinitions ? (\n <LoadingOperationDefinitions />\n ) : (\n <Definition\n selectedOperation={selectedDefinition}\n operationDefinitions={operationDefinitions}\n onOperationDefinitionChange={handleSelectedDefinitionChange}\n />\n )}\n </StackView>\n\n {selectedDefinition &&\n (error.selected_definition ? (\n <Alert {...errorAlertProps}>\n <Text>\n There was a problem looking up automation options. Please\n contact support if the problem persists.\n </Text>\n </Alert>\n ) : (\n <>\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={selectedDefinition.definitionFields || []}\n onChange={setSelectedFieldOptions}\n selectedFieldOptions={selectedFieldOptions}\n loadedLists={loadedLists}\n loadListForField={loadListForField}\n loadingLists={loadingLists}\n />\n {afterCreateOptions?.label && (\n <Checkbox\n disabled={\n submitting ||\n disableSubmit(selectedDefinition, selectedFieldOptions)\n }\n label={afterCreateOptions.label}\n checked={callAfterCreate}\n onChange={() => setCallAfterCreate(!callAfterCreate)}\n />\n )}\n {selectedTriggerEvent?.triggerParams?.map((param, idx) => (\n <Checkbox\n key={`${param.key}_${idx}`}\n label={param.description}\n checked={\n (triggerParams && triggerParams[param.key]) ||\n param.defaultValue\n }\n onChange={(e) => {\n setTriggerParams((prev) => ({\n ...prev,\n [`${param.key}`]: e.target.checked,\n }))\n }}\n />\n ))}\n {dangerAlertPresent && (\n <Alert {...errorAlertProps}>\n <StackView axis=\"horizontal\" spacing={1.5}>\n <Icon\n size={token(\"--t-element-size-lg\")}\n name=\"general.exclamationTriangle\"\n color={token(\"--t-icon-color-status-error\")}\n />\n <Text\n dangerouslySetInnerHTML={{\n __html: selectedDefinition.footerMessage?.html,\n }}\n />\n </StackView>\n </Alert>\n )}\n </>\n ))}\n\n {debugMode && (\n <pre>\n {JSON.stringify(\n {\n description: selectedDefinition && getDescription(),\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n triggerConditions,\n },\n null,\n 4\n )}\n </pre>\n )}\n\n {!hideFooter && (\n <StackView\n alignment=\"center\"\n axis=\"horizontal\"\n borderTop={`1px solid ${token(\"--t-border-color\")}`}\n distribution=\"end\"\n marginTop={2}\n marginHorizontal={-4}\n paddingHorizontal={4}\n paddingTop={3}\n spacing={2}\n >\n <Button\n color={token(\"--t-text-color-headline\")}\n // for temporary backwards compatibility\n data-modal-close\n fontWeight={token(\"--t-font-weight-normal\")}\n onClick={onRequestClose}\n size=\"md\"\n title=\"Cancel\"\n variant=\"naked\"\n />\n <Button\n disabled={\n submitting ||\n dangerAlertPresent ||\n disableSubmit(\n selectedDefinition,\n selectedFieldOptions,\n dynamicConditions,\n dynamicTriggerConditions\n )\n }\n onClick={handleSubmit}\n size=\"md\"\n theme=\"primary\"\n title={getButtonText(selectedDefinition, selectedFieldOptions)}\n variant=\"fill\"\n data-testid=\"create-automation\"\n />\n </StackView>\n )}\n </StackView>\n )\n }\n)\n\nNewAutomation.displayName = \"NewAutomation\"\n\nfunction disableSubmit(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions,\n dynamicConditions?: DefinitionField[],\n dynamicTriggerConditions?: SelectedFieldOptions\n) {\n if (!selectedDefinition) return true\n\n const operationFields = getRenderedFields(\n selectedDefinition.definitionFields,\n selectedFieldOptions\n )\n if (\n !operationFields\n .filter((field) => field.required)\n .every((field) => fieldIsFilled(field, selectedFieldOptions))\n )\n return true\n if (\n !operationFields\n .filter((field) => fieldIsSelect(field))\n .every((field) => fieldIsFilled(field, selectedFieldOptions))\n )\n return true\n\n const triggerFields = getRenderedFields(\n dynamicConditions ?? [],\n dynamicTriggerConditions ?? {}\n )\n if (\n !triggerFields\n .filter((field) => field.required)\n .every((field) => fieldIsFilled(field, dynamicTriggerConditions ?? {}))\n )\n return true\n\n return false\n}\n\nfunction fieldIsSelect(field: DefinitionField) {\n return field.kind === \"Select\" || field.kind === \"SelectSearch\"\n}\n\nfunction fieldIsFilled(\n field: DefinitionField,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (fieldIsSelect(field)) {\n return selectedFieldOptions.hasOwnProperty(field.id)\n } else {\n return (\n selectedFieldOptions.hasOwnProperty(field.id) &&\n selectedFieldOptions[field.id] &&\n selectedFieldOptions[field.id].toString().trim() !== \"\"\n )\n }\n}\n\nfunction getNextRequiredDescription(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions\n) {\n if (!selectedDefinition?.definitionFields) return\n\n const renderedFields = getRenderedFields(\n selectedDefinition.definitionFields,\n selectedFieldOptions\n )\n\n for (const field of renderedFields) {\n if (field.required && !fieldIsFilled(field, selectedFieldOptions))\n return field.description\n }\n}\n\nfunction getButtonText(\n selectedDefinition: OperationDefinition,\n selectedFieldOptions: SelectedFieldOptions\n) {\n const nextRequiredDescription = getNextRequiredDescription(\n selectedDefinition,\n selectedFieldOptions\n )\n\n if (!selectedDefinition) {\n return \"Select an action\"\n } else if (nextRequiredDescription) {\n return `Select a${\n nextRequiredDescription.charAt(0).match(/[aeiou]/i) ? \"n\" : \"\"\n } ${nextRequiredDescription.toLowerCase()}`\n } else {\n return \"Create automation\"\n }\n}\n\nconst Application = ({\n onOperationAppChange,\n operationApps,\n selectedApp,\n}: {\n onOperationAppChange: (selectedValue: string) => void\n operationApps: Array<{ id: string; name: string }>\n selectedApp: string\n}) => {\n const handleChange = ({ selectedValue }) => {\n onOperationAppChange(selectedValue)\n }\n\n return (\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color-headline\")}\n controls=\"select-product\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Input.InputLabel>\n <Select\n autoFocus\n id=\"select-product\"\n onChange={handleChange}\n size=\"lg\"\n value={selectedApp}\n >\n {operationApps.map((app) => (\n <Select.Option key={app.id} value={app.id}>\n {app.name}\n </Select.Option>\n ))}\n </Select>\n </StackView>\n )\n}\n\nconst LoadingOperationDefinitions = () => (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={token(\"--t-border-radius-md\")}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n)\n\nexport default NewAutomation\n","import { token } from \"@planningcenter/tapestry\"\nimport {\n Button,\n Heading,\n Modal,\n StackView,\n ThemeProvider,\n} from \"@planningcenter/tapestry-react\"\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\n\nfunction CloseModalIcon({\n onClick,\n}: {\n onClick: React.MouseEventHandler\n}): JSX.Element {\n return (\n <Button\n as=\"button\"\n height={token(\"--t-element-size-md\")}\n icon={{ color: token(\"--t-icon-color-dim\"), name: \"general.x\" }}\n onClick={onClick}\n size={\"sm\"}\n title=\"Close\"\n variant=\"naked\"\n />\n )\n}\n\nfunction NewAutomationModal({\n children,\n onRequestClose,\n open,\n theme,\n}: {\n children: React.ReactNode\n onRequestClose: () => void\n open: boolean\n theme: object\n}): React.ReactPortal | JSX.Element {\n return createPortal(\n <ThemeProvider theme={theme}>\n <Modal\n open={open}\n onRequestClose={onRequestClose}\n maxWidth={75}\n boxShadow=\"0 0 20px rgba(0, 0, 0, 0.15)\"\n padding={token(\"--t-spacing-4\")}\n paddingBottom={token(\"--t-spacing-3\")}\n radius={token(\"--t-border-radius-lg\")}\n zIndex={10009}\n >\n <StackView\n axis=\"horizontal\"\n distribution=\"space-between\"\n alignment=\"center\"\n >\n <Heading\n level={2}\n color={token(\"--t-text-color-headline\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n fontSize={token(\"--t-font-size-2xl\")}\n lineHeight=\"1.4\"\n >\n Create automation\n </Heading>\n <CloseModalIcon onClick={onRequestClose} />\n </StackView>\n {children}\n </Modal>\n <style>{`\n .swal2-container.swal2-backdrop-show { z-index: 10001 }\n `}</style>\n </ThemeProvider>,\n document.body\n )\n}\n\nexport default NewAutomationModal\n","import * as churchCenter from \"@planningcenter/icons/paths/church-center\"\nimport * as logomark from \"@planningcenter/icons/paths/logomark\"\nimport * as services from \"@planningcenter/icons/paths/services\"\n\nexport const icons = {\n churchCenter,\n logomark,\n services,\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Box,\n Button,\n Heading,\n Icon,\n Spinner,\n StackView,\n Summary,\n Text,\n ThemeProvider,\n TileView,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport sortBy from \"lodash/sortBy\"\nimport React, { useEffect, useState } from \"react\"\n\nimport SvgAutomations from \"./assets/svg_automations\"\nimport { EditableAutomation } from \"./automation\"\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport IncomingAutomations from \"./incoming_automations\"\nimport NewAutomation from \"./new_automation\"\nimport NewAutomationModal from \"./new_automation_modal\"\nimport styles from \"./styles.scss\"\nimport * as alerts from \"./utils/alerts\"\nimport {\n fetchAutomations,\n fetchCreatorProfiles,\n mergeProfilesAndSubscriptions,\n} from \"./utils/fetch-automations\"\nimport { resolveResponseDetails } from \"./utils/resolve-response-details\"\nimport { icons } from \"./utils/theme\"\nimport {\n deobfuscateDescriptions,\n forbiddenText,\n pluralize,\n} from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"2022-10-20\",\n})\n\nfunction Header({\n afterCreateOptions,\n automations,\n blankStateLink,\n canCreate,\n defaultApp,\n description,\n hasActiveAutomations,\n loading,\n onPauseAutomations,\n theme,\n trigger,\n}: {\n afterCreateOptions?: AfterCreateOptions\n automations: AutomationInstance[]\n blankStateLink: string\n canCreate: boolean\n defaultApp: string\n description: string\n hasActiveAutomations: boolean\n loading: boolean\n onPauseAutomations: Function\n theme: object\n trigger: AutomationTrigger\n}) {\n const [newModalVisible, setNewModalVisible] = useState(false)\n const isPaused = canCreate && !hasActiveAutomations\n\n const activeCount = automations.filter(\n (automation) => automation.active\n ).length\n const pausedCount = automations.filter(\n (automation) => !automation.active\n ).length\n\n return (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n backgroundColor={\n isPaused ? token(\"--t-fill-color-status-warning-ghost\") : undefined\n }\n borderBottom={\n isPaused ? undefined : `1px solid ${token(\"--t-border-color\")}`\n }\n data-testid=\"automations-header\"\n distribution=\"space-between\"\n marginHorizontal={-3}\n marginBottom={token(\"--t-spacing-2\")}\n marginTop={-3}\n paddingHorizontal={token(\"--t-spacing-3\")}\n paddingVertical={token(\"--t-spacing-2\")}\n spacing={token(\"--t-spacing-2\")}\n wrap\n zIndex={2}\n >\n {canCreate && !hasActiveAutomations ? (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n marginHorizontal={1}\n spacing={1}\n >\n <Icon\n size={2}\n color={token(\"--t-icon-color-status-warning\")}\n name=\"general.exclamationTriangle\"\n />\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n Automations are currently paused\n </Heading>\n </StackView>\n ) : (\n <Heading\n color={token(\"--t-text-color-headline\")}\n level={2}\n size={token(\"--t-font-size-lg\")}\n >\n {loading\n ? \"Active automations\"\n : pluralize(activeCount, \"active automation\")}\n {pausedCount > 0 ? ` (${pausedCount} paused)` : \"\"}\n </Heading>\n )}\n {canCreate &&\n (hasActiveAutomations ? (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n >\n {automations.length > 0 && (\n <Button onClick={onPauseAutomations} variant=\"outline\">\n Pause automations\n </Button>\n )}\n <Button\n theme=\"primary\"\n variant=\"fill\"\n onClick={() => setNewModalVisible(true)}\n >\n Create automation\n </Button>\n <NewAutomationModal\n open={newModalVisible}\n onRequestClose={() => setNewModalVisible(false)}\n theme={theme}\n >\n <NewAutomation\n description={description}\n blankStateLink={blankStateLink}\n defaultApp={defaultApp}\n trigger={trigger}\n onRequestClose={() => setNewModalVisible(false)}\n afterCreateOptions={afterCreateOptions}\n />\n </NewAutomationModal>\n </StackView>\n ) : (\n <Box>\n <StackView axis=\"horizontal\" alignment=\"center\" spacing={1}>\n <Button\n onClick={onPauseAutomations}\n theme=\"primary\"\n variant=\"outline\"\n >\n Enable automations\n </Button>\n <Button\n theme=\"primary\"\n disabled\n tooltip={{\n title: \"Automations must be enabled to create new ones\",\n }}\n >\n Create automation\n </Button>\n </StackView>\n </Box>\n ))}\n </StackView>\n )\n}\n\nexport default function Automations({\n afterCreateOptions,\n blankStateDescription,\n blankStateLink = \"https://pcopeople.zendesk.com/hc/en-us/articles/217582148-Automations\",\n currentPersonId,\n currentPersonCanCreate,\n defaultApp,\n incomingAutomationsParam,\n theme,\n trigger,\n currentOrganization,\n permissionDeniedReason = \"You need permissions of Editor or above to add an automation.\",\n disabled = false,\n disabledReason = \"Not allowed\",\n}: {\n afterCreateOptions?: AfterCreateOptions\n blankStateDescription: string\n blankStateLink?: string\n currentOrganization: {\n dateFormat: string\n olsonTimeZone: string\n twentyFourHourTime: boolean\n }\n currentPersonCanCreate: boolean\n currentPersonId: number\n defaultApp: string\n disabled?: boolean\n disabledReason?: string\n incomingAutomationsParam?: string\n permissionDeniedReason?: string\n theme?: object\n trigger?: AutomationTrigger\n}) {\n useEffect(() => {\n if (!trigger) return setLoading(false)\n fetchAutomations(trigger.resource)\n .then(fetchCreatorProfiles)\n .then(mergeProfilesAndSubscriptions)\n .then(deobfuscateDescriptions)\n .then(resolveResponseDetails)\n .then(setAutomations)\n .then(() => setLoading(false))\n }, [trigger?.resource])\n\n const [automations, setAutomations] = useState([])\n const [loading, setLoading] = useState(true)\n const [newModalVisible, setNewModalVisible] = useState(false)\n\n const { dateFormat, twentyFourHourTime, olsonTimeZone } = currentOrganization\n\n const params = new URLSearchParams(window.location.search)\n\n const automationId = params.get(\"automation_id\")\n\n // make sure necessary icons are added to theme\n const customTheme = { ...theme, ...{ icons: { ...icons } } }\n\n useEffect(() => {\n document.body.toggleAttribute(\"data-loading-automations\", loading)\n }, [loading])\n\n const hasActiveAutomations = automations.length\n ? automations.some((a) => a.active)\n : true\n\n function handleDelete(id: number) {\n webhooksClient\n .delete({\n data: { _e: trigger.resource },\n url: `/automation_subscriptions/${id}`,\n })\n .then(() =>\n setAutomations(automations.filter((automation) => automation.id !== id))\n )\n .catch((error) => {\n const text =\n forbiddenText(error, \"delete\") ||\n \"There was a problem deleting this automation. Please try again in a few moments.\"\n alerts.alertError.fire({\n text,\n title: \"Uh oh!\",\n })\n })\n }\n\n function handlePauseAutomations() {\n webhooksClient\n .post({\n data: {\n data: {\n attributes: {\n _e: trigger.resource,\n active: !hasActiveAutomations,\n },\n },\n },\n url: \"/pause_automations\",\n })\n .then(() => {\n window.location.reload()\n })\n }\n\n const BlankStateHeadingProps = {\n color: token(\"--t-text-color\"),\n level: 2,\n size: token(\"--t-font-size-2xl\"),\n weight: token(\"--t-font-weight-bold\"),\n }\n\n const BlankStateTextProps = {\n color: token(\"--t-text-color-secondary\"),\n lineHeight: 3,\n size: token(\"--t-font-size-md\"),\n }\n\n function automationTriggerEvent(automation: AutomationInstance) {\n return trigger.events.find((event) => event.name === automation.name)\n }\n\n const handleUpdateAutomation =\n (originalAutomation: AutomationInstance) =>\n (newState: React.SetStateAction<AutomationInstance>) => {\n const updated =\n typeof newState == \"function\" ? newState(originalAutomation) : newState\n const newAutomations = [\n ...automations.filter((automation) => automation.id !== updated.id),\n updated,\n ]\n\n setAutomations(newAutomations)\n }\n\n return (\n <ThemeProvider theme={customTheme}>\n <OrganizationContext.Provider\n value={{ dateFormat, olsonTimeZone, twentyFourHourTime }}\n >\n {trigger && (\n <Header\n automations={automations}\n blankStateLink={blankStateLink}\n canCreate={currentPersonCanCreate && !disabled}\n loading={loading}\n defaultApp={defaultApp}\n description={blankStateDescription}\n theme={customTheme}\n trigger={trigger}\n hasActiveAutomations={hasActiveAutomations}\n onPauseAutomations={handlePauseAutomations}\n afterCreateOptions={afterCreateOptions}\n />\n )}\n {loading ? (\n <Summary\n image={<Spinner size=\"xl\" />}\n paddingVertical={10}\n title={\"Loading automations...\"}\n />\n ) : !trigger ? (\n <></>\n ) : (\n <Box data-testid=\"automations-section\">\n {automations?.length > 0 ? (\n <TileView spacing={3} marginVertical={3} minCellWidth={45}>\n {sortBy(automations, \"id\").map((a) => (\n <EditableAutomation\n key={a.id}\n automation={a}\n updateAutomation={handleUpdateAutomation(a)}\n onDelete={handleDelete}\n theme={customTheme}\n openHistoryNow={a.id === Number(automationId)}\n trigger={{\n event: automationTriggerEvent(a),\n resource: trigger.resource,\n }}\n currentPersonId={currentPersonId}\n currentPersonCanCreate={currentPersonCanCreate}\n disabled={disabled}\n disabledReason={disabledReason}\n />\n ))}\n </TileView>\n ) : (\n <StackView\n margin={token(\"--t-spacing-6\")}\n spacing={token(\"--t-spacing-2\")}\n alignment=\"center\"\n mediaQueries={{\n lg: {\n axis: \"horizontal\",\n distribution: \"center\",\n spacing: token(\"--t-spacing-6\"),\n },\n }}\n >\n <Box\n css={{\n \".symbol\": {\n height: \"100%\",\n width: \"100%\",\n },\n }}\n maxWidth={24}\n mediaQueries={{\n lg: {\n maxWidth: 40,\n },\n }}\n >\n <SvgAutomations />\n </Box>\n <StackView\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n maxWidth={45}\n mediaQueries={{\n lg: {\n alignment: \"start\",\n textAlign: \"left\",\n },\n }}\n textAlign=\"center\"\n >\n {currentPersonCanCreate ? (\n <>\n <Heading {...BlankStateHeadingProps}>\n Add an automation\n </Heading>\n <StackView\n alignment=\"center\"\n marginBottom={token(\"--t-spacing-1\")}\n mediaQueries={{\n lg: {\n alignment: \"start\",\n },\n }}\n spacing={1}\n >\n <Text {...BlankStateTextProps}>\n {blankStateDescription}\n </Text>\n </StackView>\n <StackView\n axis=\"horizontal\"\n spacing={token(\"--t-spacing-1\")}\n >\n <Button\n variant=\"outline\"\n to={blankStateLink}\n color={`${token(\n \"--t-text-color-status-neutral\"\n )} !important`}\n >\n Learn more\n </Button>\n <Button\n as=\"button\"\n theme=\"primary\"\n variant=\"fill\"\n onClick={() => setNewModalVisible(true)}\n >\n Create automation\n </Button>\n </StackView>\n <NewAutomationModal\n open={newModalVisible}\n onRequestClose={() => setNewModalVisible(false)}\n theme={customTheme}\n >\n <NewAutomation\n defaultApp={defaultApp}\n description={blankStateDescription}\n blankStateLink={blankStateLink}\n onRequestClose={() => setNewModalVisible(false)}\n trigger={trigger}\n afterCreateOptions={afterCreateOptions}\n />\n </NewAutomationModal>\n </>\n ) : (\n <>\n <Heading {...BlankStateHeadingProps}>Automations</Heading>\n <Text {...BlankStateTextProps}>\n {permissionDeniedReason}\n </Text>\n </>\n )}\n </StackView>\n </StackView>\n )}\n </Box>\n )}\n {incomingAutomationsParam && (\n <IncomingAutomations\n encryptedParam={incomingAutomationsParam}\n trigger={trigger}\n />\n )}\n </OrganizationContext.Provider>\n <style>{styles}</style>\n </ThemeProvider>\n )\n}\n","import { Client } from \"@planningcenter/api-client\"\nimport { token } from \"@planningcenter/tapestry\"\nimport {\n Alert,\n Button,\n Checkbox,\n Icon,\n Input,\n Select,\n Spinner,\n StackView,\n Text,\n} from \"@planningcenter/tapestry-react\"\nimport { pcoApiUrl } from \"@planningcenter/url\"\nimport { mapKeys, snakeCase } from \"lodash\"\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport { OrganizationContext } from \"./contexts/organization_context\"\nimport Definition from \"./definition\"\nimport Fields from \"./fields\"\nimport * as alerts from \"./utils/alerts\"\nimport { fetchAutomations } from \"./utils/fetch-automations\"\nimport {\n buildDescription,\n buildTriggerConditions,\n fieldListIdentifier,\n getRenderedFields,\n} from \"./utils/utils\"\n\nconst webhooksClient = new Client({\n root: pcoApiUrl(\"webhooks\", { squiggly: false }),\n version: \"LATEST\",\n})\nconst peopleClient = new Client({\n root: pcoApiUrl(\"people\", { squiggly: false }),\n version: \"LATEST\",\n})\n\nconst errorAlertProps = {\n css: { borderRadius: token(\"--t-border-radius-md\") },\n paddingHorizontal: 1.75,\n paddingVertical: 1.25,\n type: \"error\",\n}\n\nasync function getVisibleApps() {\n return peopleClient\n .get<{ data: { apps: Array<{ name: string }>; type: \"Topbar\" } }>({\n data: { fields: { Topbar: \"apps\" } },\n url: \"/me/topbar\",\n })\n .then(({ data }) => data.apps.map((a) => a.name))\n}\n\nasync function getWebhooksApps() {\n return webhooksClient\n .get<{ data: Array<{ name: string; type: \"OperationApp\" }> }>({\n data: { fields: { OperationApp: \"name\" } },\n url: \"/operation_apps\",\n })\n .then(({ data }) => data.map((a) => a.name))\n}\n\nasync function getOperationApps() {\n const [visibleApps, webhooksApps] = await Promise.all([\n getVisibleApps(),\n getWebhooksApps(),\n ])\n return visibleApps\n .filter((app) => webhooksApps.includes(app))\n .sort()\n .map((app: string) => ({ id: app.toLowerCase(), name: app }))\n}\n\nasync function getOperationDefinitions(app: string) {\n return webhooksClient\n .get({\n data: {\n fields: {\n OperationDefinition:\n \"definition_class,definition_fields,definition_identifier,description,group,section,section_group,footer_message\",\n },\n filter: \"automation_allowed\",\n walk: true,\n },\n url: `/operation_apps/${app}/operation_definitions`,\n })\n .then(({ data }) => data)\n}\n\nasync function getListOptions({\n app,\n field,\n definitionIdentifier,\n dependencies,\n}: {\n app: string\n definitionIdentifier: string\n dependencies: { [k: string]: string }\n field: DefinitionField\n}): Promise<LoadedList[]> {\n if (field.kind === \"PersonSearch\") {\n const { data: people } = await peopleClient.get<{\n data: { avatar: string; id: number; name: string }[]\n }>({\n data: {\n fields: { Person: \"avatar,name\" },\n where: { search_name_or_email: dependencies.query, status: \"active\" },\n },\n url: \"/people\",\n })\n return people.map((p) => ({\n description: p.name,\n meta: { avatar: p.avatar },\n value: p.id.toString(),\n }))\n } else {\n const { data } = await webhooksClient.get({\n data: {\n ...dependencies,\n definitionIdentifier,\n fields: { OperationDefinitionList: \"values\" },\n },\n url: `/operation_apps/${app}/operation_definition_lists/${field.listClass}`,\n })\n return data.values\n }\n}\n\nconst Application = ({\n onOperationAppChange,\n operationApps,\n selectedApp,\n}: {\n onOperationAppChange: (selectedValue: string) => void\n operationApps: Array<{ id: string; name: string }>\n selectedApp: string\n}) => {\n const handleChange = ({ selectedValue }) =>\n onOperationAppChange(selectedValue)\n return (\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color-headline\")}\n controls=\"select-product\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Input.InputLabel>\n <Select\n autoFocus\n id=\"select-product\"\n onChange={handleChange}\n size=\"lg\"\n value={selectedApp}\n >\n {operationApps.map((app) => (\n <Select.Option key={app.id} value={app.id}>\n {app.name}\n </Select.Option>\n ))}\n </Select>\n </StackView>\n )\n}\n\nconst LoadingOperationDefinitions = () => (\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={token(\"--t-border-radius-md\")}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n)\n\nconst SingleActionInline = forwardRef(\n (\n {\n blankStateLink,\n dateFormat = \"%m/%d/%Y\",\n defaultApp,\n description,\n olsonTimeZone = null,\n onLoad,\n onRequestClose,\n onSuccess,\n paddingTop = 0,\n trigger,\n twentyFourHourTime = null,\n }: {\n blankStateLink?: string\n dateFormat?: string\n defaultApp: string\n description?: string\n olsonTimeZone?: string\n onLoad?: (automation: AutomationInstance | null) => void\n onRequestClose: () => void\n onSuccess?: () => void\n paddingTop?: number\n trigger: AutomationTrigger\n twentyFourHourTime?: boolean\n },\n ref: React.Ref<{ submit: () => void }>\n ) => {\n const [loadingAutomation, setLoadingAutomation] = useState(true)\n const [existingAutomation, setExistingAutomation] =\n useState<AutomationInstance | null>(null)\n\n const [selectedTriggerEvent, setSelectedTriggerEvent] = useState(\n trigger.events[0]\n )\n const [dynamicTriggerConditions, setDynamicTriggerConditions] =\n useState<SelectedFieldOptions>({})\n const [selectedApp, setSelectedApp] = useState(defaultApp)\n const [operationApps, setOperationApps] = useState<\n { id: string; name: string }[]\n >([])\n const [operationDefinitions, setOperationDefinitions] = useState<\n OperationDefinition[]\n >([])\n const [loadingOperationDefinitions, setLoadingOperationDefinitions] =\n useState(true)\n const [selectedDefinition, setSelectedDefinition] =\n useState<OperationDefinition>()\n const [selectedFieldOptions, setSelectedFieldOptions] =\n useState<SelectedFieldOptions>({})\n const [loadedLists, setLoadedLists] = useState<{\n [k: string]: LoadedList[]\n }>({})\n const [loadingLists, setLoadingLists] = useState<{\n [k: string]: boolean\n }>({})\n const [submitting, setSubmitting] = useState(false)\n const [error, setError] = useState<{\n automation?: string | string[]\n definitions?: string | string[]\n selected_definition?: string | string[]\n }>({})\n const [triggerParams, setTriggerParams] = useState<{\n [k: string]: string\n }>({})\n\n const activeAppRef = useRef(null)\n const hasPrePopulatedRef = useRef(false)\n\n useImperativeHandle(ref, () => ({ submit: handleSubmit }))\n\n // Fetch the existing automation (if any) on mount.\n useEffect(() => {\n fetchAutomations(trigger.resource)\n .then((automations) => {\n const automation = automations[0] ?? null\n setExistingAutomation(automation)\n setLoadingAutomation(false)\n onLoad?.(automation)\n\n if (automation) {\n const matchingEvent = trigger.events.find(\n (e) => e.name === automation.name\n )\n if (matchingEvent) setSelectedTriggerEvent(matchingEvent)\n if (automation.triggerParams)\n setTriggerParams(\n automation.triggerParams as Record<string, string>\n )\n // Switch to the automation's app; the definitions effect will re-run.\n if (automation.operationAppName !== selectedApp) {\n setSelectedApp(automation.operationAppName)\n }\n }\n })\n .catch(() => {\n setLoadingAutomation(false)\n onLoad?.(null)\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [trigger.resource])\n\n // Load operation apps + definitions whenever selectedApp changes.\n useEffect(() => {\n setError({})\n getOperationApps().then((apps) => {\n setOperationApps(apps)\n const resolvedApp = apps.find((a) => a.id === selectedApp)\n ? selectedApp\n : apps[0]?.id ?? defaultApp\n if (resolvedApp !== selectedApp) setSelectedApp(resolvedApp)\n\n activeAppRef.current = null\n setLoadingOperationDefinitions(true)\n setOperationDefinitions([])\n\n getOperationDefinitions(resolvedApp)\n .then((definitions) => {\n if (activeAppRef.current) return // superseded by a manual app change\n setOperationDefinitions(definitions)\n setLoadingOperationDefinitions(false)\n })\n .catch((err) => setError({ definitions: err }))\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedApp])\n\n // Pre-populate definition + field options once both the existing automation\n // and the definitions list are available. The hasPrePopulatedRef ensures this\n // runs exactly once so the user's subsequent changes aren't reset.\n useEffect(() => {\n if (hasPrePopulatedRef.current) return\n if (!existingAutomation) return\n if (loadingOperationDefinitions || operationDefinitions.length === 0)\n return\n\n hasPrePopulatedRef.current = true\n const match = operationDefinitions.find(\n (d) =>\n d.definitionClass === existingAutomation.operationDefinitionClassName\n )\n if (match) {\n setSelectedDefinition(match)\n // The API client camelCases operation_params keys (e.g. required_field → requiredField)\n // but field IDs are stored as snake_case string values. Convert back before pre-populating.\n const camelCasedParams =\n (existingAutomation.operationParams as Record<string, any>) ?? {}\n const snakeCasedParams = mapKeys(camelCasedParams, (_, key) =>\n snakeCase(key)\n )\n const { definition_identifier, ...fieldOptions } = snakeCasedParams\n setSelectedFieldOptions(fieldOptions as SelectedFieldOptions)\n }\n }, [existingAutomation, operationDefinitions, loadingOperationDefinitions])\n\n useEffect(() => {\n setError({})\n }, [selectedFieldOptions])\n\n const canAccessPeople = useMemo(\n () => operationApps.map((a) => a.id).includes(\"people\"),\n [operationApps]\n )\n\n const definitionIdentifier = selectedDefinition?.definitionIdentifier\n const dangerAlertPresent =\n selectedDefinition?.footerMessage?.kind === \"danger\"\n\n const loadListForField = useCallback<LoadListForField>(\n ({ field, dependencies }) => {\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: true,\n }))\n getListOptions({\n app: selectedApp,\n definitionIdentifier,\n dependencies,\n field,\n })\n .then((ret) => {\n setLoadedLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: ret,\n }))\n setLoadingLists((prev) => ({\n ...prev,\n [fieldListIdentifier(field)]: false,\n }))\n })\n .catch((err) => setError({ selected_definition: err }))\n },\n [selectedApp, definitionIdentifier]\n )\n\n const handleChangeSelectedApp = (app: string) => {\n setSelectedApp(app)\n setLoadingOperationDefinitions(true)\n setOperationDefinitions([])\n activeAppRef.current = app\n setSelectedDefinition(null)\n setSelectedFieldOptions({})\n setError({})\n getOperationDefinitions(app)\n .then(setOperationDefinitions)\n .then(() => setLoadingOperationDefinitions(false))\n .catch((err) => setError({ definitions: err }))\n }\n\n const handleChangeTriggerEvent = (\n selectedValue: typeof selectedTriggerEvent\n ) => {\n setSelectedTriggerEvent(selectedValue)\n setDynamicTriggerConditions({})\n }\n\n const dynamicConditions =\n \"dynamicConditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.dynamicConditions\n : trigger.dynamicConditions\n const triggerConditions = buildTriggerConditions({\n baseConditions:\n \"conditions\" in selectedTriggerEvent\n ? selectedTriggerEvent.conditions\n : trigger.conditions,\n dynamicConditions,\n dynamicTriggerConditions,\n })\n\n const handleSelectedDefinitionChange = (newDef: OperationDefinition) => {\n setSelectedDefinition(newDef)\n setError({})\n setSelectedFieldOptions({})\n }\n\n function getDescription(): string {\n const parts = buildDescription({\n loadedLists,\n selectedDefinition,\n selectedFieldOptions,\n })\n return parts.description\n ? `${parts.name} (${parts.description})`\n : parts.name\n }\n\n // Only the attributes the AutomationSubscription vertex allows on update\n // (can_assign_on_update) — name, trigger_conditions, and trigger_params\n // are create-only and rejected on PATCH.\n function buildAttributes() {\n const operation_params: Record<string, any> = { ...selectedFieldOptions }\n if (selectedDefinition.definitionIdentifier) {\n operation_params.definition_identifier =\n selectedDefinition.definitionIdentifier\n }\n return {\n description: getDescription(),\n operation_app_name: selectedApp,\n operation_definition_class_name: selectedDefinition.definitionClass,\n operation_params,\n }\n }\n\n function handleSubmit() {\n if (submitting || !selectedDefinition) return\n\n if (existingAutomation) {\n submitUpdate()\n } else {\n submitCreate()\n }\n }\n\n function submitCreate() {\n setSubmitting(true)\n webhooksClient\n .post({\n data: {\n _e: trigger.resource,\n data: {\n attributes: {\n ...buildAttributes(),\n name: selectedTriggerEvent.name,\n trigger_conditions: triggerConditions,\n trigger_params: triggerParams,\n },\n type: \"AutomationSubscription\",\n },\n },\n url: \"/me/automation_subscriptions\",\n })\n .then(() => {\n setSubmitting(false)\n if (onSuccess) {\n onSuccess()\n } else {\n window.location.reload()\n }\n })\n .catch(handleSubmitError)\n }\n\n function submitUpdate() {\n setSubmitting(true)\n webhooksClient\n .patch({\n data: {\n _e: trigger.resource,\n data: {\n attributes: buildAttributes(),\n id: String(existingAutomation.id),\n type: \"AutomationSubscription\",\n },\n },\n url: `/me/automation_subscriptions/${existingAutomation.id}`,\n })\n .then(() => {\n setSubmitting(false)\n if (onSuccess) {\n onSuccess()\n } else {\n window.location.reload()\n }\n })\n .catch(handleSubmitError)\n }\n\n function handleSubmitError(error) {\n setSubmitting(false)\n if (error.errors) {\n setError({ automation: error.errors })\n } else {\n setError({ automation: \"something even worse happened!\" })\n }\n }\n\n if (loadingAutomation) {\n return <Spinner size=\"xl\" />\n }\n\n return (\n <OrganizationContext.Provider\n value={{ dateFormat, olsonTimeZone, twentyFourHourTime }}\n >\n <StackView paddingTop={paddingTop} spacing={2}>\n {error.automation && (\n <Alert {...errorAlertProps}>\n <Text>\n There was an error saving your automation. Please change your\n selections and try again or contact support if the problem\n persists.\n </Text>\n </Alert>\n )}\n <StackView spacing={1}>\n <Input.InputLabel\n color={token(\"--t-text-color\")}\n controls=\"select-trigger-event\"\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n When a person...\n </Input.InputLabel>\n <Select\n id=\"select-trigger-event\"\n onChange={({ selectedValue }) =>\n handleChangeTriggerEvent(selectedValue)\n }\n size=\"lg\"\n value={selectedTriggerEvent}\n >\n {trigger.events.map((triggerEvent, idx) => (\n <Select.Option\n key={`${triggerEvent.name}_${idx}`}\n value={triggerEvent}\n >\n {triggerEvent.description}\n </Select.Option>\n ))}\n </Select>\n {dynamicConditions?.length > 0 && (\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={dynamicConditions}\n selectedFieldOptions={dynamicTriggerConditions}\n onChange={setDynamicTriggerConditions}\n loadedLists={{}}\n loadingLists={{}}\n loadListForField={() => null}\n />\n )}\n </StackView>\n <StackView spacing={1}>\n {operationApps.length > 0 ? (\n <Application\n selectedApp={selectedApp}\n operationApps={operationApps}\n onOperationAppChange={handleChangeSelectedApp}\n />\n ) : (\n <StackView spacing={1}>\n <Text\n color={token(\"--t-text-color-headline\")}\n fontSize={token(\"--t-font-size-md\")}\n fontWeight={token(\"--t-font-weight-medium\")}\n >\n Then perform an action in...\n </Text>\n <StackView\n axis=\"horizontal\"\n alignment=\"center\"\n spacing={token(\"--t-spacing-1\")}\n paddingHorizontal={1.75}\n paddingVertical={token(\"--t-spacing-1\")}\n radius={4}\n border={`1px solid ${token(\"--t-border-color\")}`}\n >\n <Spinner size=\"xs\" />\n <Text fontSize={token(\"--t-font-size-md\")} lineHeight={2.75}>\n Loading\n </Text>\n </StackView>\n </StackView>\n )}\n {error.definitions ? (\n <Alert marginTop={token(\"--t-spacing-1\")} {...errorAlertProps}>\n <Text>\n There was a problem looking up automations. Please contact\n support if the problem persists.\n </Text>\n </Alert>\n ) : loadingOperationDefinitions ? (\n <LoadingOperationDefinitions />\n ) : (\n <Definition\n selectedOperation={selectedDefinition}\n operationDefinitions={operationDefinitions}\n onOperationDefinitionChange={handleSelectedDefinitionChange}\n />\n )}\n </StackView>\n {selectedDefinition &&\n (error.selected_definition ? (\n <Alert {...errorAlertProps}>\n <Text>\n There was a problem looking up automation options. Please\n contact support if the problem persists.\n </Text>\n </Alert>\n ) : (\n <>\n <Fields\n canAccessPeople={canAccessPeople}\n definitionFields={selectedDefinition.definitionFields || []}\n onChange={setSelectedFieldOptions}\n selectedFieldOptions={selectedFieldOptions}\n loadedLists={loadedLists}\n loadListForField={loadListForField}\n loadingLists={loadingLists}\n />\n {selectedTriggerEvent?.triggerParams?.map((param, idx) => (\n <Checkbox\n key={`${param.key}_${idx}`}\n label={param.description}\n checked={\n (triggerParams && triggerParams[param.key]) ||\n param.defaultValue\n }\n onChange={(e) => {\n setTriggerParams((prev) => ({\n ...prev,\n [`${param.key}`]: e.target.checked,\n }))\n }}\n />\n ))}\n {dangerAlertPresent && (\n <Alert {...errorAlertProps}>\n <StackView axis=\"horizontal\" spacing={1.5}>\n <Icon\n size={token(\"--t-element-size-lg\")}\n name=\"general.exclamationTriangle\"\n color={token(\"--t-icon-color-status-error\")}\n />\n <Text\n dangerouslySetInnerHTML={{\n __html: selectedDefinition.footerMessage?.html,\n }}\n />\n </StackView>\n </Alert>\n )}\n </>\n ))}\n </StackView>\n </OrganizationContext.Provider>\n )\n }\n)\n\nSingleActionInline.displayName = \"SingleActionInline\"\n\nexport default SingleActionInline\n"],"names":["SvgAutomations","React","createElement","id","xmlns","viewBox","className","opacity","d","fill","x","y","width","height","rx","ry","transform","OrganizationContext","createContext","dateFormat","olsonTimeZone","twentyFourHourTime","Swal","mixin","standardAlertOptions","successAlertOptions","alertError","errorAlertOptions","confirm","standardConfirmOptions","confirmDestroy","destroyConfirmOptions","confirmCreate","createConfirmOptions","deobfuscateDescriptions","subscriptions","Promise","all","map","subscription","_temp","includes","operationDefinitionClassName","isDeobfuscatable","resolve","_exit","_temp3","_result","description","_temp2","workflowId","peopleClient","get","data","fields","Workflow","where","url","catch","name","then","e","reject","fetchWorkflow","operationParams","workflow","workflowName","archivedAt","replace","actionResourceUrl","links","html","actionResourceName","fieldDefinitionId","definitionIdentifier","match","fetchFieldDefinition","FieldDefinition","FieldOption","include","fieldDefinition","values","dataType","Object","entries","action","value","fieldOptions","find","fieldOption","parseInt","capitalize","join","customFieldOptionDescription","deobfuscatedDescription","result","string","charAt","toUpperCase","slice","Client","root","pcoApiUrl","squiggly","version","fieldListIdentifier","field","listClass","kind","buildDescription","selectedDefinition","selectedFieldOptions","loadedLists","describeSelectedFields","definition","obfuscateDescriptionName","definitionClass","hasOwnProperty","object","key","prototype","call","getListForField","list","Error","JSON","stringify","buildTriggerConditions","baseConditions","dynamicConditions","dynamicTriggerConditions","triggerConditions","cloneDeep","writableFields","filter","renderOnly","renderIfChainSatisfied","set","allFields","renderIf","isBoolean","conditionKey","keys","shouldRender","upstreamId","upstream","f","getRenderedFields","definitionFields","workflow_id_WorkflowsList","sensitiveString","o","toString","workflow_id","obfuscateSelectedFieldDescriptions","label","momentDateFormat","format","dateLocalized","date","momentDate","moment","isValid","pluralize","count","word","singularize","triggerResourceParts","triggerResource","triggerParts","split","appName","resourceId","length","resourcePath","resourceType","forbiddenText","error","errors","status","parseDescription","exec","trim","fetchPeopleWhoTriggeredEvents","events","personIds","eventPersonId","body","recover","fetchPeople","people","_catch","Person","fetchEvents","automationId","params","webhooksClient","_e","Delivery","Event","order","STATUS","delivered","failed","ignored","pending","skipped","mergePeopleAndEvents","mergedData","reduce","personId","foundPerson","p","push","person","event","History","automation","filterWhere","onEventsStatusChange","loading","paginationProps","refresh","setParams","_","setError","useState","setLoading","eventPages","setEventPages","meta","setMeta","offset","resetOffset","perPage","totalCount","setOffset","currentPage","Math","floor","onPageChange","pageNum","totalPages","ceil","useCallback","usePagination","useEffect","per_page","pages","bubbleErrorToBoundary","undefined","useEvents","useContext","filteringEvents","automationCreatedRecently","diff","numDaysSince","createdAt","automationBeganOn","historyPreservationAlert","showTzLabel","Intl","DateTimeFormat","resolvedOptions","timeZone","before","after","nameIndex","indexOf","columns","cell","EventStatusBadge","css","padding","header","baseFormat","momentDateTimeFormat","tz","Link","to","maxWidth","EventStatusMessage","flex","Fragment","RetryEventButton","IgnoreEventButton","refreshHistory","textAlign","minWidth","StackView","spacing","token","Heading","level","size","color","weight","Text","italic","Box","minHeight","alignItems","axis","distribution","Input","InputLabel","fontWeight","controls","Select","emptyValue","onChange","selectedValue","title","Option","Button","iconLeft","onClick","theme","variant","maxHeight","overflow","DataTable","_extends","empty","alignment","marginTop","marginBottom","svg","fontSize","loadingTitle","bodyCell","lineHeight","bodyRow","rowData","backgroundColor","headerCell","headerRow","setStatus","retryTitleFromStatus","statusIcon","post","attributes","response","eventsStatus","alerts","fire","text","disabled","badgeColors","border","badgeIcon","badgeTitle","Badge","background","foreground","paddingLeft","paddingRight","radius","renderLeft","Icon","marginLeft","stroke","strokeAlign","strokeWeight","lastDelivery","message","delivery","ERRORS","default","duplicated_event","failed_without_deliveries","whiteSpace","ToggleableDetails","details","responseBody","parse","parsedErrors","responseErrors","deliveryFailureReason","statusMessage","fontStyle","paddingTop","children","open","setOpen","inline","was","fontFamily","ErrorBoundary","Component","constructor","props","super","this","handleContactSupport","onRequestClose","window","openHelpdesk","state","hasError","static","render","Alert","type","marginVertical","boxShadow","style","CloseModalIcon","as","icon","HistoryModal","createPortal","ThemeProvider","Modal","paddingBottom","document","VALID_LOGO_NAMES","getValidLogoName","kebabName","kebabCase","isValidLogoName","fetchCampuses","ids","Map","Campus","walk","campus","String","fetchFieldDefinitions","fd","HIDDEN_FIELD","HIDDEN_RESPONSE","FIELD_KEY_RE","SENTINEL_VALUES","Set","extractIds","conds","formId","relationships","form","selectedOptionsByField","raw","$in","optionIds","Array","isArray","has","fieldId","optionId","buildResponseDetails","fieldsByForm","fieldDefs","campuses","fieldLabel","valueLabel","fieldType","fieldableId","options","resolveResponseDetails","groups","sub","labelers","group","resolvedById","subs","resolved","extracted","targets","entry","fetchFormFields","formIds","FormField","FormFieldOption","byId","uniq","t","fieldDefIds","campusIds","add","responseDetails","formatResponseDetails","fetchCurrentPersonAvatar","avatar","AutomationContext","EditableAutomation","updateAutomation","onDelete","openHistoryNow","disabledReason","AutomationWrapper","Header","Icons","Manage","Description","EditableFooter","IncomingAutomation","LinkToAutomation","IncomingDescription","Footer","triggerEventDescription","cardOpacity","active","paddingVertical","truncate","lowerFirst","conditionalSuffix","optionallyPrettifyArchivedPrefix","separator","external","triggerAdminUrl","canManage","tooltip","hover","rest","Provider","Card","currentPersonCanCreate","currentPersonId","trigger","historyVisible","setHistoryVisible","isActive","Dropdown","iconRight","Item","onSelect","createdById","Tooltip","placement","openDelay","isConfirmed","resource","prev","createdBy","avatarUrl","createdByName","confirmButtonText","ToggleSwitch","isChecked","patch","newStatus","triggerProductName","Logo","markOnly","operationAppName","Divider","marginHorizontal","Avatar","basis","source","buttonProps","paddingHorizontal","historyProps","setHistoryProps","toLocaleString","marginRight","triggerParams","useTriggerPersonOverride","startsWith","fetchPersonApps","App","PersonApp","personApp","allowPcoLogin","app","toLowerCase","fetchCreatorProfiles","compact","profiles","fetchAutomations","AutomationSubscription","mergeProfilesAndSubscriptions","profile","fetchTriggerResources","automations","QUERYABLE_BY_MULTIPLE_IDS","registrations","services","NOT_QUERYABLE","automationsByModel","accumulator","automationTriggerResource","promises","flatMap","resourceParts","fetchNothing","fetchAllAtOnce","fetchOneAtATime","allSettled","results","triggerResources","settledPromises","acc","concat","fetchIncomingAutomations","encryptedParam","fetchResourceName","path","_props","client","model","upperFirst","IncomingAutomations","setAutomations","operationApps","buildGivingDescription","tr","resourceName","nameOrDescription","triggerResourceName","verb","messageName","mapNameToVerb","mergeTriggerResourceEventDescriptions","noResults","borderBottom","Summary","image","Spinner","TileView","minCellWidth","operationDefinitionId","od","sectionId","section","renderOptionsWithoutConsideringGroup","renderOptions","groupedOptions","groupBy","sort","gt","OptionGroup","Definition","selectedOperation","onOperationDefinitionChange","operationDefinitions","selectedSection","operationDefinitionsWithUniqueIds","primaryOperations","primarySectionOptions","uniqBy","sectionGroup","secondaryOperations","handleAnySelectChange","idType","renderOperations","operations","primarySelectedValue","Field","canAccessPeople","loadListForField","loadingLists","dependencies","generator","memoizedObject","setMemoizedObject","newObject","isEqual","useMemoizedObject","dependsOn","depKey","camelCase","fieldDependencies","listOptions","actionAllowedOptions","op","automationNotAllowed","info","HelperDrawer","Toggle","drawerId","Loading","SelectSearch","Checkbox","TextArea","DateField","Checkboxes","NumberField","PersonSearch","isLoading","TextField","RadioButtons","dangerouslySetInnerHTML","__html","content","console","warn","renderField","overridenEmptyValue","option","groupTypes","TapestrySelect","items","item","handleSelectedValueChange","prompt","generatePrompt","selectedOption","selectedLabel","prevSelectedLabel","setPrevSelectedLabel","query","setQuery","showFilteredOptions","setShowFilteredOptions","showClearButton","setShowClearButton","filteredOptions","sortBy","formattedQuery","TapestryCombobox","Popover","closeOnSelect","closeButton","cursor","onBlur","target","onClear","onFocus","select","handleValueChange","openOnFocus","placeholder","popoverProps","matchWidths","renderRight","index","isCurrent","Combobox","role","Highlight","Menu","immediateSearch","debouncedSearch","useMemo","debounce","search","cancel","myself","_setQuery","TapestryCheckbox","checked","TapestryTextArea","todaysValue","customValue","dateBeforeValue","orgFormat","allowUnansweredOption","selection","setSelection","initialSelection","specificDate","setSpecificDate","dateFieldValue","setDateFieldValue","parsed","toDate","Date","handleSelectChange","TapestryDateField","defaultOpen","formatValue","selectedValues","setSelectedValues","handleCheckboxesChange","newSelectedValues","minimumValue","minValue","maximumValue","maxValue","inputValue","setInputValue","Number","defaultValue","InputBox","TapestryNumberField","newNumberValue","min","max","hasControls","display","handleCheckedChange","Radio","Fields","newSelections","renderableFields","handleSelectedFieldOptionsChange","dependents","dependent","deeper","getOperationDefinitions","OperationDefinition","getWebhooksApps","OperationApp","a","getVisibleApps","Topbar","apps","errorAlertProps","borderRadius","NewAutomation","forwardRef","afterCreateOptions","blankStateLink","debugMode","defaultApp","hideFooter","onSuccess","ref","selectedTriggerEvent","setSelectedTriggerEvent","setDynamicTriggerConditions","selectedApp","setSelectedApp","setOperationApps","setOperationDefinitions","loadingOperationDefinitions","setLoadingOperationDefinitions","setSelectedDefinition","setSelectedFieldOptions","setLoadedLists","setLoadingLists","submitting","setSubmitting","callAfterCreate","setCallAfterCreate","setTriggerParams","activeAppRef","useRef","useImperativeHandle","submit","handleSubmit","dangerAlertPresent","footerMessage","getListOptions","search_name_or_email","OperationDefinitionList","ret","selected_definition","visibleApps","webhooksApps","getOperationApps","defaultSelection","definitions","current","conditions","getDescription","descriptionParts","operation_params","definition_identifier","operation_app_name","operation_definition_class_name","trigger_conditions","trigger_params","cancelButtonText","submitCreate","onConfirm","location","reload","handleChangeTriggerEvent","triggerEvent","idx","Application","onOperationAppChange","LoadingOperationDefinitions","newDefinition","disableSubmit","param","borderTop","getButtonText","operationFields","required","every","fieldIsFilled","fieldIsSelect","nextRequiredDescription","renderedFields","getNextRequiredDescription","displayName","autoFocus","handleChange","NewAutomationModal","zIndex","icons","churchCenter","logomark","canCreate","hasActiveAutomations","onPauseAutomations","newModalVisible","setNewModalVisible","isPaused","activeCount","pausedCount","wrap","SingleActionInline","onLoad","loadingAutomation","setLoadingAutomation","existingAutomation","setExistingAutomation","hasPrePopulatedRef","matchingEvent","resolvedApp","err","snakeCasedParams","mapKeys","snakeCase","parts","buildAttributes","handleSubmitError","newDef","blankStateDescription","incomingAutomationsParam","currentOrganization","permissionDeniedReason","URLSearchParams","customTheme","toggleAttribute","some","handleDelete","delete","BlankStateHeadingProps","BlankStateTextProps","originalAutomation","newState","updated","newAutomations","margin","mediaQueries","lg","styles"],"mappings":"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"}