@codee-sh/medusa-plugin-automations 1.0.7 → 1.0.9
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.
- package/.medusa/server/src/admin/_chunks/{__admin-extensions__-Cc5RhzDh → __admin-extensions__-BV7n9V1I} +210 -120
- package/.medusa/server/src/admin/_chunks/{__admin-extensions__-BgrPyL-G → __admin-extensions__-BZrUHl9N} +211 -121
- package/.medusa/server/src/admin/_chunks/{base-config-D8uDn9uc → base-config-CbWD1XMk} +1 -1
- package/.medusa/server/src/admin/_chunks/{base-config-zK3z6k14 → base-config-D0IqhDVr} +1 -1
- package/.medusa/server/src/admin/index.js +1 -1
- package/.medusa/server/src/admin/index.mjs +1 -1
- package/.medusa/server/src/api/middlewares.js +1 -1
- package/.medusa/server/src/modules/mpn-automation/migrations/Migration20251222121805.js +14 -0
- package/.medusa/server/src/modules/mpn-automation/models/mpn_automation_trigger.js +2 -2
- package/.medusa/server/src/modules/mpn-automation/services/base-action-service.js +1 -1
- package/.medusa/server/src/modules/mpn-automation/services/email-action-service.js +20 -7
- package/.medusa/server/src/modules/mpn-automation/services/slack-action-service.js +27 -18
- package/.medusa/server/src/modules/mpn-automation/types/modules/index.js +148 -1
- package/.medusa/server/src/modules/mpn-automation/types/modules/inventory/inventory.js +48 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/order/helpers.js +28 -0
- package/.medusa/server/src/{templates/slack/product-variant → modules/mpn-automation/types/modules/order}/index.js +2 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/order/order.js +561 -0
- package/.medusa/server/src/modules/mpn-automation/types/modules/product/helpers.js +9 -0
- package/.medusa/server/src/modules/mpn-automation/types/modules/product/product.js +89 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/product-category/product-category.js +31 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/product-tag/product-tag.js +19 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/product-type/product-type.js +19 -2
- package/.medusa/server/src/modules/mpn-automation/types/modules/product-variant/product-variant.js +51 -2
- package/.medusa/server/src/modules/mpn-automation/types/types.js +1 -1
- package/.medusa/server/src/providers/slack/service.js +26 -16
- package/.medusa/server/src/subscribers/inventory-level-updated.js +2 -2
- package/.medusa/server/src/subscribers/mpn.automation.action.email.executed.js +1 -2
- package/.medusa/server/src/subscribers/order-updated.js +36 -0
- package/.medusa/server/src/utils/types/index.js +1 -2
- package/.medusa/server/src/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/inventory/steps/get-inventory-level-by-id.js +3 -3
- package/.medusa/server/src/workflows/mpn-automation/index.js +2 -2
- package/.medusa/server/src/workflows/mpn-automation/run-automation.js +53 -10
- package/.medusa/server/src/workflows/mpn-automation/steps/create-automation.js +1 -1
- package/.medusa/server/src/workflows/mpn-automation/steps/edit-automation.js +1 -1
- package/.medusa/server/src/workflows/mpn-automation/steps/index.js +3 -2
- package/.medusa/server/src/workflows/mpn-automation/steps/retrieve-automation-triggers-by-event.js +1 -1
- package/.medusa/server/src/workflows/mpn-automation/steps/run-automation-actions.js +1 -1
- package/.medusa/server/src/workflows/mpn-automation/steps/validate-trigger-throttle.js +78 -0
- package/.medusa/server/src/workflows/mpn-automation/steps/validate-triggers-rules.js +31 -0
- package/.medusa/server/src/workflows/mpn-automation/validate-triggers-by-event.js +38 -0
- package/.medusa/server/src/workflows/notifications/steps/send-slack.js +1 -1
- package/.medusa/server/src/workflows/order/get-order-by-id.js +23 -0
- package/.medusa/server/src/{templates/slack/product → workflows/order}/index.js +2 -2
- package/.medusa/server/src/workflows/order/steps/get-order-by-id.js +40 -0
- package/.medusa/server/src/{templates/slack/inventory-level → workflows/order/steps}/index.js +2 -2
- package/.medusa/server/src/workflows/product/steps/get-product-by-id.js +3 -3
- package/package.json +2 -2
- package/.medusa/server/src/templates/slack/inventory-level/inventory-level.js +0 -95
- package/.medusa/server/src/templates/slack/inventory-level/translations/en.json +0 -18
- package/.medusa/server/src/templates/slack/inventory-level/translations/index.js +0 -15
- package/.medusa/server/src/templates/slack/inventory-level/translations/pl.json +0 -18
- package/.medusa/server/src/templates/slack/product/product.js +0 -54
- package/.medusa/server/src/templates/slack/product/translations/en.json +0 -18
- package/.medusa/server/src/templates/slack/product/translations/index.js +0 -15
- package/.medusa/server/src/templates/slack/product/translations/pl.json +0 -13
- package/.medusa/server/src/templates/slack/product-variant/product-variant.js +0 -54
- package/.medusa/server/src/templates/slack/product-variant/translations/en.json +0 -18
- package/.medusa/server/src/templates/slack/product-variant/translations/index.js +0 -15
- package/.medusa/server/src/templates/slack/product-variant/translations/pl.json +0 -13
- package/.medusa/server/src/templates/slack/types.js +0 -3
- package/.medusa/server/src/workflows/mpn-automation/steps/validate-automation-triggers.js +0 -31
- package/.medusa/server/src/workflows/mpn-automation/validate-automation-triggers-by-event.js +0 -38
|
@@ -4,7 +4,7 @@ import { ListBullet, ArrowUpRightOnBox, XMarkMini, TriangleDownMini, Check, Squa
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import React__default, { createContext, useContext, useReducer, useEffect, Fragment, useState, useMemo, useRef, forwardRef, createElement, isValidElement, cloneElement, Children, Suspense, useId, useInsertionEffect, useCallback, useLayoutEffect, Component, useImperativeHandle } from "react";
|
|
6
6
|
import { Outlet } from "react-router-dom";
|
|
7
|
-
import { Container as Container$1, Heading, Badge, Drawer, IconButton, Kbd, Label, Input, Select, Checkbox, FocusModal, Button, ProgressTabs, toast, clx, usePrompt, createDataTableColumnHelper, Tooltip, useDataTable, DataTable } from "@medusajs/ui";
|
|
7
|
+
import { Container as Container$1, Heading, Badge, Drawer, IconButton, Kbd, Label, Input, Select, Checkbox, Text, FocusModal, Button, ProgressTabs, toast, clx, Hint, usePrompt, createDataTableColumnHelper, Tooltip, useDataTable, DataTable } from "@medusajs/ui";
|
|
8
8
|
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
9
9
|
import Medusa from "@medusajs/js-sdk";
|
|
10
10
|
const NotificationsPage = () => {
|
|
@@ -709,8 +709,14 @@ var NestedClose = (props) => {
|
|
|
709
709
|
keyName,
|
|
710
710
|
parentValue
|
|
711
711
|
});
|
|
712
|
-
if (
|
|
713
|
-
|
|
712
|
+
if (shouldExpandNodeInitially && collapsed === false) {
|
|
713
|
+
if (expands[expandKey] === void 0 && !shouldExpand) {
|
|
714
|
+
return null;
|
|
715
|
+
}
|
|
716
|
+
} else {
|
|
717
|
+
if (expands[expandKey] === void 0 && shouldExpand) {
|
|
718
|
+
return null;
|
|
719
|
+
}
|
|
714
720
|
}
|
|
715
721
|
var len = Object.keys(value).length;
|
|
716
722
|
if (isExpanded || len === 0) {
|
|
@@ -1681,8 +1687,14 @@ var KeyValues = (props) => {
|
|
|
1681
1687
|
keyName,
|
|
1682
1688
|
parentValue
|
|
1683
1689
|
});
|
|
1684
|
-
if (
|
|
1685
|
-
|
|
1690
|
+
if (shouldExpandNodeInitially && collapsed === false) {
|
|
1691
|
+
if (expands[expandKey] === void 0 && !shouldExpand) {
|
|
1692
|
+
return null;
|
|
1693
|
+
}
|
|
1694
|
+
} else {
|
|
1695
|
+
if (expands[expandKey] === void 0 && shouldExpand) {
|
|
1696
|
+
return null;
|
|
1697
|
+
}
|
|
1686
1698
|
}
|
|
1687
1699
|
if (isExpanded) {
|
|
1688
1700
|
return null;
|
|
@@ -2270,7 +2282,7 @@ var JsonView = /* @__PURE__ */ forwardRef((props, ref) => {
|
|
|
2270
2282
|
value,
|
|
2271
2283
|
children,
|
|
2272
2284
|
collapsed = false,
|
|
2273
|
-
shouldExpandNodeInitially
|
|
2285
|
+
shouldExpandNodeInitially,
|
|
2274
2286
|
indentWidth = 15,
|
|
2275
2287
|
displayObjectSize = true,
|
|
2276
2288
|
shortenTextAfterLength = 30,
|
|
@@ -2296,7 +2308,7 @@ var JsonView = /* @__PURE__ */ forwardRef((props, ref) => {
|
|
|
2296
2308
|
value,
|
|
2297
2309
|
objectSortKeys,
|
|
2298
2310
|
indentWidth,
|
|
2299
|
-
shouldExpandNodeInitially: collapsed === false ? shouldExpandNodeInitially :
|
|
2311
|
+
shouldExpandNodeInitially: collapsed === false ? shouldExpandNodeInitially : void 0,
|
|
2300
2312
|
displayObjectSize,
|
|
2301
2313
|
collapsed,
|
|
2302
2314
|
enableClipboard,
|
|
@@ -5319,6 +5331,11 @@ function AutomationsGeneralForm({
|
|
|
5319
5331
|
useMemo(() => {
|
|
5320
5332
|
return (availableActionsData == null ? void 0 : availableActionsData.actions) || [];
|
|
5321
5333
|
}, [availableActionsData]);
|
|
5334
|
+
const triggerType = useWatch({
|
|
5335
|
+
control: form.control,
|
|
5336
|
+
name: "general.trigger_type"
|
|
5337
|
+
});
|
|
5338
|
+
const showIntervalField = triggerType === "event" || triggerType === "schedule";
|
|
5322
5339
|
return /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx("div", { className: "p-6 max-w-2xl mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
5323
5340
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
5324
5341
|
/* @__PURE__ */ jsx(Label, { htmlFor: "name", className: "block", children: "Name" }),
|
|
@@ -5463,6 +5480,50 @@ function AutomationsGeneralForm({
|
|
|
5463
5480
|
] })
|
|
5464
5481
|
}
|
|
5465
5482
|
)
|
|
5483
|
+
] }),
|
|
5484
|
+
showIntervalField && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
5485
|
+
/* @__PURE__ */ jsx(
|
|
5486
|
+
Label,
|
|
5487
|
+
{
|
|
5488
|
+
htmlFor: "interval_seconds",
|
|
5489
|
+
className: "block",
|
|
5490
|
+
children: triggerType === "schedule" ? "Interval (seconds)" : "Throttle (seconds)"
|
|
5491
|
+
}
|
|
5492
|
+
),
|
|
5493
|
+
/* @__PURE__ */ jsx(
|
|
5494
|
+
Controller,
|
|
5495
|
+
{
|
|
5496
|
+
name: "general.interval_seconds",
|
|
5497
|
+
control: form.control,
|
|
5498
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
5499
|
+
/* @__PURE__ */ jsx(
|
|
5500
|
+
Input,
|
|
5501
|
+
{
|
|
5502
|
+
...field,
|
|
5503
|
+
type: "number",
|
|
5504
|
+
min: 0,
|
|
5505
|
+
placeholder: triggerType === "schedule" ? "Run every X seconds" : "Minimum seconds between executions",
|
|
5506
|
+
value: field.value ?? "",
|
|
5507
|
+
onChange: (e2) => {
|
|
5508
|
+
const value = e2.target.value;
|
|
5509
|
+
field.onChange(
|
|
5510
|
+
value === "" ? null : Number(value)
|
|
5511
|
+
);
|
|
5512
|
+
}
|
|
5513
|
+
}
|
|
5514
|
+
),
|
|
5515
|
+
/* @__PURE__ */ jsx(
|
|
5516
|
+
Text,
|
|
5517
|
+
{
|
|
5518
|
+
size: "small",
|
|
5519
|
+
className: "text-ui-fg-subtle",
|
|
5520
|
+
children: triggerType === "schedule" ? "How often to run this automation" : "Optional: Limit how often this automation can run for the same target (e.g., 3600 = max once per hour)"
|
|
5521
|
+
}
|
|
5522
|
+
),
|
|
5523
|
+
fieldState.error && /* @__PURE__ */ jsx("span", { className: "text-red-500 text-sm", children: fieldState.error.message })
|
|
5524
|
+
] })
|
|
5525
|
+
}
|
|
5526
|
+
)
|
|
5466
5527
|
] })
|
|
5467
5528
|
] }) }) });
|
|
5468
5529
|
}
|
|
@@ -9108,7 +9169,7 @@ const baseAutomationFormSchema = objectType({
|
|
|
9108
9169
|
description: stringType().min(1, "Description is required").min(3, "Description must be at least 3 characters"),
|
|
9109
9170
|
trigger_type: enumType(["event", "schedule", "manual"]),
|
|
9110
9171
|
event_name: stringType().min(1, "Event name is required"),
|
|
9111
|
-
|
|
9172
|
+
interval_seconds: numberType().nullable(),
|
|
9112
9173
|
active: booleanType()
|
|
9113
9174
|
}),
|
|
9114
9175
|
rules: objectType({
|
|
@@ -9233,7 +9294,7 @@ function AutomationsCreateForm() {
|
|
|
9233
9294
|
description: "",
|
|
9234
9295
|
trigger_type: "event",
|
|
9235
9296
|
event_name: "",
|
|
9236
|
-
|
|
9297
|
+
interval_seconds: null,
|
|
9237
9298
|
active: false
|
|
9238
9299
|
},
|
|
9239
9300
|
rules: {
|
|
@@ -9252,7 +9313,7 @@ function AutomationsCreateForm() {
|
|
|
9252
9313
|
description: "",
|
|
9253
9314
|
trigger_type: "event",
|
|
9254
9315
|
event_name: "",
|
|
9255
|
-
|
|
9316
|
+
interval_seconds: null,
|
|
9256
9317
|
active: false
|
|
9257
9318
|
},
|
|
9258
9319
|
rules: {
|
|
@@ -9271,7 +9332,7 @@ function AutomationsCreateForm() {
|
|
|
9271
9332
|
description: data.general.description,
|
|
9272
9333
|
trigger_type: data.general.trigger_type,
|
|
9273
9334
|
event_name: data.general.event_name,
|
|
9274
|
-
|
|
9335
|
+
interval_seconds: data.general.interval_seconds,
|
|
9275
9336
|
active: data.general.active
|
|
9276
9337
|
};
|
|
9277
9338
|
await createAutomation({
|
|
@@ -17061,6 +17122,133 @@ function RuleValueInput({
|
|
|
17061
17122
|
}
|
|
17062
17123
|
);
|
|
17063
17124
|
}
|
|
17125
|
+
function RuleItem({
|
|
17126
|
+
control,
|
|
17127
|
+
index,
|
|
17128
|
+
eventAttributes,
|
|
17129
|
+
onRemove
|
|
17130
|
+
}) {
|
|
17131
|
+
const selectedAttributeValue = useWatch({
|
|
17132
|
+
control,
|
|
17133
|
+
name: `rules.items.${index}.attribute`
|
|
17134
|
+
});
|
|
17135
|
+
const operatorValue = useWatch({
|
|
17136
|
+
control,
|
|
17137
|
+
name: `rules.items.${index}.operator`
|
|
17138
|
+
});
|
|
17139
|
+
const selectedAttribute = selectedAttributeValue && eventAttributes.length ? eventAttributes.find(
|
|
17140
|
+
(attr) => attr.value === selectedAttributeValue
|
|
17141
|
+
) : null;
|
|
17142
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 p-4 border rounded-lg", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
17143
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-2", children: [
|
|
17144
|
+
/* @__PURE__ */ jsx(
|
|
17145
|
+
Controller,
|
|
17146
|
+
{
|
|
17147
|
+
name: `rules.items.${index}.attribute`,
|
|
17148
|
+
control,
|
|
17149
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
17150
|
+
/* @__PURE__ */ jsx(Label, { children: "Attribute" }),
|
|
17151
|
+
/* @__PURE__ */ jsxs(
|
|
17152
|
+
Select,
|
|
17153
|
+
{
|
|
17154
|
+
value: field.value ?? "",
|
|
17155
|
+
onValueChange: (value) => {
|
|
17156
|
+
field.onChange(value);
|
|
17157
|
+
},
|
|
17158
|
+
children: [
|
|
17159
|
+
/* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder: "Select the attribute" }) }),
|
|
17160
|
+
/* @__PURE__ */ jsx(Select.Content, { children: eventAttributes.map((attribute, attrIndex) => /* @__PURE__ */ jsxs(
|
|
17161
|
+
Select.Item,
|
|
17162
|
+
{
|
|
17163
|
+
value: attribute.value || "",
|
|
17164
|
+
children: [
|
|
17165
|
+
attribute.label,
|
|
17166
|
+
" ",
|
|
17167
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-gray-500", children: [
|
|
17168
|
+
"(",
|
|
17169
|
+
attribute.value,
|
|
17170
|
+
")"
|
|
17171
|
+
] })
|
|
17172
|
+
]
|
|
17173
|
+
},
|
|
17174
|
+
attribute.value || `attr-${index}-${attrIndex}`
|
|
17175
|
+
)) })
|
|
17176
|
+
]
|
|
17177
|
+
},
|
|
17178
|
+
`attribute-${index}-${eventAttributes.length}`
|
|
17179
|
+
),
|
|
17180
|
+
fieldState.error && /* @__PURE__ */ jsx("span", { className: "text-red-500 text-sm", children: fieldState.error.message }),
|
|
17181
|
+
(selectedAttribute == null ? void 0 : selectedAttribute.description) && /* @__PURE__ */ jsx(Hint, { className: "mt-1", children: selectedAttribute.description })
|
|
17182
|
+
] })
|
|
17183
|
+
}
|
|
17184
|
+
),
|
|
17185
|
+
/* @__PURE__ */ jsx(
|
|
17186
|
+
Controller,
|
|
17187
|
+
{
|
|
17188
|
+
name: `rules.items.${index}.operator`,
|
|
17189
|
+
control,
|
|
17190
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
17191
|
+
/* @__PURE__ */ jsx(Label, { children: "Operator" }),
|
|
17192
|
+
/* @__PURE__ */ jsxs(
|
|
17193
|
+
Select,
|
|
17194
|
+
{
|
|
17195
|
+
value: field.value ?? "",
|
|
17196
|
+
onValueChange: (value) => {
|
|
17197
|
+
field.onChange(value);
|
|
17198
|
+
},
|
|
17199
|
+
children: [
|
|
17200
|
+
/* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder: "Select the operator" }) }),
|
|
17201
|
+
/* @__PURE__ */ jsx(Select.Content, { children: OPERATOR_TYPES.map((operator, opIndex) => /* @__PURE__ */ jsx(
|
|
17202
|
+
Select.Item,
|
|
17203
|
+
{
|
|
17204
|
+
value: operator.value,
|
|
17205
|
+
children: operator.label
|
|
17206
|
+
},
|
|
17207
|
+
operator.value || `op-${opIndex}`
|
|
17208
|
+
)) })
|
|
17209
|
+
]
|
|
17210
|
+
},
|
|
17211
|
+
`operator-${index}-${eventAttributes.length}-${field.value ?? ""}`
|
|
17212
|
+
),
|
|
17213
|
+
fieldState.error && /* @__PURE__ */ jsx("span", { className: "text-red-500 text-sm", children: fieldState.error.message })
|
|
17214
|
+
] })
|
|
17215
|
+
}
|
|
17216
|
+
),
|
|
17217
|
+
/* @__PURE__ */ jsx(
|
|
17218
|
+
RuleValueInput,
|
|
17219
|
+
{
|
|
17220
|
+
control,
|
|
17221
|
+
name: `rules.items.${index}.rule_values.0.value`,
|
|
17222
|
+
operator: operatorValue
|
|
17223
|
+
}
|
|
17224
|
+
),
|
|
17225
|
+
(selectedAttribute == null ? void 0 : selectedAttribute.examples) && selectedAttribute.examples.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-0", children: [
|
|
17226
|
+
/* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-gray-600 mb-1", children: "Examples:" }),
|
|
17227
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: selectedAttribute.examples.map(
|
|
17228
|
+
(example, exampleIndex) => /* @__PURE__ */ jsx(
|
|
17229
|
+
"span",
|
|
17230
|
+
{
|
|
17231
|
+
className: "inline-flex items-center px-2 py-1 rounded-md bg-gray-100 text-xs text-gray-700",
|
|
17232
|
+
children: example
|
|
17233
|
+
},
|
|
17234
|
+
`example-${index}-${exampleIndex}`
|
|
17235
|
+
)
|
|
17236
|
+
) })
|
|
17237
|
+
] })
|
|
17238
|
+
] }),
|
|
17239
|
+
/* @__PURE__ */ jsx(
|
|
17240
|
+
Button,
|
|
17241
|
+
{
|
|
17242
|
+
type: "button",
|
|
17243
|
+
variant: "secondary",
|
|
17244
|
+
size: "small",
|
|
17245
|
+
onClick: onRemove,
|
|
17246
|
+
className: "mt-2",
|
|
17247
|
+
children: /* @__PURE__ */ jsx(Trash, {})
|
|
17248
|
+
}
|
|
17249
|
+
)
|
|
17250
|
+
] }) });
|
|
17251
|
+
}
|
|
17064
17252
|
function AutomationsRulesForm({
|
|
17065
17253
|
form,
|
|
17066
17254
|
isOpen
|
|
@@ -17111,110 +17299,12 @@ function AutomationsRulesForm({
|
|
|
17111
17299
|
return /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx("div", { className: "p-6 max-w-2xl mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
17112
17300
|
fields.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-500 text-center py-4", children: 'No rules added yet. Click "Add Item" to create a new rule.' }),
|
|
17113
17301
|
fields.map((field, index) => /* @__PURE__ */ jsx(
|
|
17114
|
-
|
|
17302
|
+
RuleItem,
|
|
17115
17303
|
{
|
|
17116
|
-
|
|
17117
|
-
|
|
17118
|
-
|
|
17119
|
-
|
|
17120
|
-
Controller,
|
|
17121
|
-
{
|
|
17122
|
-
name: `rules.items.${index}.attribute`,
|
|
17123
|
-
control: form.control,
|
|
17124
|
-
render: ({ field: field2, fieldState }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
17125
|
-
/* @__PURE__ */ jsx(Label, { children: "Attribute" }),
|
|
17126
|
-
/* @__PURE__ */ jsxs(
|
|
17127
|
-
Select,
|
|
17128
|
-
{
|
|
17129
|
-
value: field2.value ?? "",
|
|
17130
|
-
onValueChange: (value) => {
|
|
17131
|
-
field2.onChange(value);
|
|
17132
|
-
},
|
|
17133
|
-
children: [
|
|
17134
|
-
/* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder: "Select the attribute" }) }),
|
|
17135
|
-
/* @__PURE__ */ jsx(Select.Content, { children: eventAttributes.map(
|
|
17136
|
-
(attribute, attrIndex) => /* @__PURE__ */ jsxs(
|
|
17137
|
-
Select.Item,
|
|
17138
|
-
{
|
|
17139
|
-
value: attribute.value || "ss",
|
|
17140
|
-
children: [
|
|
17141
|
-
attribute.label,
|
|
17142
|
-
" ",
|
|
17143
|
-
/* @__PURE__ */ jsxs("span", { className: "text-xs text-gray-500", children: [
|
|
17144
|
-
"(",
|
|
17145
|
-
attribute.value,
|
|
17146
|
-
")"
|
|
17147
|
-
] })
|
|
17148
|
-
]
|
|
17149
|
-
},
|
|
17150
|
-
attribute.value || `attr-${index}-${attrIndex}`
|
|
17151
|
-
)
|
|
17152
|
-
) })
|
|
17153
|
-
]
|
|
17154
|
-
},
|
|
17155
|
-
`attribute-${index}-${eventAttributes.length}`
|
|
17156
|
-
),
|
|
17157
|
-
fieldState.error && /* @__PURE__ */ jsx("span", { className: "text-red-500 text-sm", children: fieldState.error.message })
|
|
17158
|
-
] })
|
|
17159
|
-
}
|
|
17160
|
-
),
|
|
17161
|
-
/* @__PURE__ */ jsx(
|
|
17162
|
-
Controller,
|
|
17163
|
-
{
|
|
17164
|
-
name: `rules.items.${index}.operator`,
|
|
17165
|
-
control: form.control,
|
|
17166
|
-
render: ({ field: field2, fieldState }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
17167
|
-
/* @__PURE__ */ jsx(Label, { children: "Operator" }),
|
|
17168
|
-
/* @__PURE__ */ jsxs(
|
|
17169
|
-
Select,
|
|
17170
|
-
{
|
|
17171
|
-
value: field2.value ?? "",
|
|
17172
|
-
onValueChange: (value) => {
|
|
17173
|
-
field2.onChange(value);
|
|
17174
|
-
},
|
|
17175
|
-
children: [
|
|
17176
|
-
/* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder: "Select the operator" }) }),
|
|
17177
|
-
/* @__PURE__ */ jsx(Select.Content, { children: OPERATOR_TYPES.map(
|
|
17178
|
-
(operator, opIndex) => /* @__PURE__ */ jsx(
|
|
17179
|
-
Select.Item,
|
|
17180
|
-
{
|
|
17181
|
-
value: operator.value,
|
|
17182
|
-
children: operator.label
|
|
17183
|
-
},
|
|
17184
|
-
operator.value || `op-${opIndex}`
|
|
17185
|
-
)
|
|
17186
|
-
) })
|
|
17187
|
-
]
|
|
17188
|
-
},
|
|
17189
|
-
`operator-${index}-${eventAttributes.length}-${field2.value ?? ""}`
|
|
17190
|
-
),
|
|
17191
|
-
fieldState.error && /* @__PURE__ */ jsx("span", { className: "text-red-500 text-sm", children: fieldState.error.message })
|
|
17192
|
-
] })
|
|
17193
|
-
}
|
|
17194
|
-
),
|
|
17195
|
-
/* @__PURE__ */ jsx(
|
|
17196
|
-
RuleValueInput,
|
|
17197
|
-
{
|
|
17198
|
-
control: form.control,
|
|
17199
|
-
name: `rules.items.${index}.rule_values.0.value`,
|
|
17200
|
-
operator: form.watch(
|
|
17201
|
-
`rules.items.${index}.operator`
|
|
17202
|
-
)
|
|
17203
|
-
}
|
|
17204
|
-
)
|
|
17205
|
-
] }),
|
|
17206
|
-
/* @__PURE__ */ jsx(
|
|
17207
|
-
Button,
|
|
17208
|
-
{
|
|
17209
|
-
type: "button",
|
|
17210
|
-
variant: "secondary",
|
|
17211
|
-
size: "small",
|
|
17212
|
-
onClick: () => handleRemoveRule(index),
|
|
17213
|
-
className: "mt-2",
|
|
17214
|
-
children: /* @__PURE__ */ jsx(Trash, {})
|
|
17215
|
-
}
|
|
17216
|
-
)
|
|
17217
|
-
] })
|
|
17304
|
+
control: form.control,
|
|
17305
|
+
index,
|
|
17306
|
+
eventAttributes,
|
|
17307
|
+
onRemove: () => handleRemoveRule(index)
|
|
17218
17308
|
},
|
|
17219
17309
|
(field == null ? void 0 : field.id) ?? `rule-${index}`
|
|
17220
17310
|
)),
|
|
@@ -17234,7 +17324,7 @@ function AutomationsRulesForm({
|
|
|
17234
17324
|
] }) }) });
|
|
17235
17325
|
}
|
|
17236
17326
|
const templateLoaders = {
|
|
17237
|
-
BaseConfigComponent: () => import("./base-config-
|
|
17327
|
+
BaseConfigComponent: () => import("./base-config-D0IqhDVr")
|
|
17238
17328
|
};
|
|
17239
17329
|
async function loadTemplateComponent(key) {
|
|
17240
17330
|
const loader = templateLoaders[key];
|
|
@@ -17545,7 +17635,7 @@ function AutomationsEditForm({
|
|
|
17545
17635
|
description: "",
|
|
17546
17636
|
trigger_type: "event",
|
|
17547
17637
|
event_name: "",
|
|
17548
|
-
|
|
17638
|
+
interval_seconds: null,
|
|
17549
17639
|
active: false
|
|
17550
17640
|
},
|
|
17551
17641
|
rules: {
|
|
@@ -17569,7 +17659,7 @@ function AutomationsEditForm({
|
|
|
17569
17659
|
description: trigger.description || "",
|
|
17570
17660
|
trigger_type: trigger.trigger_type || "event",
|
|
17571
17661
|
event_name: trigger.event_name || "",
|
|
17572
|
-
|
|
17662
|
+
interval_seconds: trigger.interval_seconds || null,
|
|
17573
17663
|
active: trigger.active || false
|
|
17574
17664
|
},
|
|
17575
17665
|
rules: {
|
|
@@ -17613,7 +17703,7 @@ function AutomationsEditForm({
|
|
|
17613
17703
|
description: "",
|
|
17614
17704
|
trigger_type: "event",
|
|
17615
17705
|
event_name: "",
|
|
17616
|
-
|
|
17706
|
+
interval_seconds: null,
|
|
17617
17707
|
active: false
|
|
17618
17708
|
},
|
|
17619
17709
|
rules: {
|
|
@@ -17634,7 +17724,7 @@ function AutomationsEditForm({
|
|
|
17634
17724
|
description: data.general.description,
|
|
17635
17725
|
trigger_type: data.general.trigger_type,
|
|
17636
17726
|
event_name: data.general.event_name,
|
|
17637
|
-
|
|
17727
|
+
interval_seconds: data.general.interval_seconds,
|
|
17638
17728
|
active: data.general.active
|
|
17639
17729
|
};
|
|
17640
17730
|
await editAutomation({
|
|
@@ -17877,7 +17967,7 @@ const AutomationsList = () => {
|
|
|
17877
17967
|
const columns = useMemo(
|
|
17878
17968
|
() => [
|
|
17879
17969
|
columnHelper.accessor("to", {
|
|
17880
|
-
header: "Name and
|
|
17970
|
+
header: "Name and descriptions",
|
|
17881
17971
|
cell: ({ row }) => {
|
|
17882
17972
|
var _a, _b, _c;
|
|
17883
17973
|
const tooltip = `Device (DB) ID:
|
|
@@ -17901,7 +17991,7 @@ const AutomationsList = () => {
|
|
|
17901
17991
|
}
|
|
17902
17992
|
)
|
|
17903
17993
|
] }),
|
|
17904
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
17994
|
+
/* @__PURE__ */ jsx("div", { className: "whitespace-normal text-xs max-w-[180px] min-w-[180px]", children: /* @__PURE__ */ jsx("span", { children: (_c = row == null ? void 0 : row.original) == null ? void 0 : _c.description }) })
|
|
17905
17995
|
] }) });
|
|
17906
17996
|
}
|
|
17907
17997
|
}),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
-
const __adminExtensions__ = require("./__admin-extensions__-
|
|
4
|
+
const __adminExtensions__ = require("./__admin-extensions__-BV7n9V1I");
|
|
5
5
|
const ui = require("@medusajs/ui");
|
|
6
6
|
const TextField = ({
|
|
7
7
|
label,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { C as Controller, a as ChipInput } from "./__admin-extensions__-
|
|
2
|
+
import { C as Controller, a as ChipInput } from "./__admin-extensions__-BZrUHl9N";
|
|
3
3
|
import { Input, Textarea, Select, Checkbox, Label } from "@medusajs/ui";
|
|
4
4
|
const TextField = ({
|
|
5
5
|
label,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251222121805 = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20251222121805 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "mpn_automation_trigger" rename column "interval_minutes" to "interval_seconds";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "mpn_automation_trigger" rename column "interval_seconds" to "interval_minutes";`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20251222121805 = Migration20251222121805;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEyMjIxMjE4MDUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tcG4tYXV0b21hdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUxMjIyMTIxODA1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFpRDtBQUVqRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBQzNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FDVCx3R0FBd0csQ0FDekcsQ0FBQTtJQUNILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUNULHdHQUF3RyxDQUN6RyxDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBWkQsMERBWUMifQ==
|
|
@@ -20,8 +20,8 @@ exports.MpnAutomationTrigger = utils_1.model
|
|
|
20
20
|
]),
|
|
21
21
|
// Event name — only when trigger_type = "event"
|
|
22
22
|
event_name: utils_1.model.text().nullable(),
|
|
23
|
-
// Interval in
|
|
24
|
-
|
|
23
|
+
// Interval in seconds — only when trigger_type = "schedule"
|
|
24
|
+
interval_seconds: utils_1.model.number().nullable(),
|
|
25
25
|
// Whether the trigger is enabled
|
|
26
26
|
active: utils_1.model.boolean().default(true),
|
|
27
27
|
// Delivery channels — JSON
|
|
@@ -95,4 +95,4 @@ class BaseActionService {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
exports.BaseActionService = BaseActionService;
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hY3Rpb24tc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL21wbi1hdXRvbWF0aW9uL3NlcnZpY2VzL2Jhc2UtYWN0aW9uLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscURBQW1EO0FBRW5EOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSxpQkFBaUI7SUFBOUI7UUFDRSxPQUFFLEdBQUcsTUFBTSxDQUFBO1FBQ1gsVUFBSyxHQUFHLE1BQU0sQ0FBQTtRQUNkLGdCQUFXLEdBQUcsRUFBRSxDQUFBO1FBRWhCLHVCQUFrQixHQUFHLHFCQUFxQixDQUFBO1FBRTFDLGtHQUFrRztRQUNsRyxXQUFNLEdBQWtCLEVBQUUsQ0FBQTtRQUUxQiw2REFBNkQ7UUFDbkQsZUFBVSxHQUNsQixJQUFJLEdBQUcsRUFBRSxDQUFBO0lBcUdiLENBQUM7SUFuR0M7Ozs7T0FJRztJQUNILGdCQUFnQixDQUNkLElBQVksRUFDWixRQUFhO1FBRWIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CO1FBQzNCLHVEQUF1RDtJQUN6RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLG9CQUFvQixDQUM1QixVQUFrRCxFQUFFLEVBQ3BELFlBQXFCO1FBRXJCLE9BQU87WUFDTCxJQUFJLEVBQUUsY0FBYztZQUNwQixHQUFHLEVBQUUsY0FBYztZQUNuQixLQUFLLEVBQUUsZUFBZTtZQUN0QixJQUFJLEVBQUUsUUFBaUI7WUFDdkIsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsT0FBTztZQUNoQixZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQ2xCLE9BQU8sRUFDUCxNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxHQVFaO1FBQ0MsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDdkMsZUFBTyxDQUFDLFNBQVMsQ0FDbEIsQ0FBQTtRQUVELE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQztZQUN6QixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsU0FBUztnQkFDcEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUNuQixPQUFPLEVBQUUsT0FBTztnQkFDaEIsV0FBVyxFQUFFLFdBQVc7YUFDekI7U0FDRixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLFVBQVUsRUFBRSxNQUFNLENBQUMsV0FBVztZQUM5QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUFqSEQsOENBaUhDIn0=
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EmailActionService = void 0;
|
|
4
4
|
const base_action_service_1 = require("./base-action-service");
|
|
5
5
|
const emails_1 = require("@codee-sh/medusa-plugin-notification-emails/templates/emails");
|
|
6
|
+
const utils_1 = require("@codee-sh/medusa-plugin-notification-emails/utils");
|
|
6
7
|
class EmailActionService extends base_action_service_1.BaseActionService {
|
|
7
8
|
constructor() {
|
|
8
9
|
super();
|
|
@@ -62,8 +63,12 @@ class EmailActionService extends base_action_service_1.BaseActionService {
|
|
|
62
63
|
* This method can be used to register custom templates if needed
|
|
63
64
|
*/
|
|
64
65
|
initializeTemplates() {
|
|
65
|
-
// Email
|
|
66
|
-
//
|
|
66
|
+
// Email engine already has all prebuild templates registered
|
|
67
|
+
// You can register custom templates here if needed:
|
|
68
|
+
// emailEngine.registerTemplate("custom-template", {
|
|
69
|
+
// ...emailEngine.getBaseTemplate(),
|
|
70
|
+
// getConfig: () => ({ blocks: [...], translations: {...} })
|
|
71
|
+
// })
|
|
67
72
|
}
|
|
68
73
|
/**
|
|
69
74
|
* Render email template using external plugin
|
|
@@ -71,11 +76,19 @@ class EmailActionService extends base_action_service_1.BaseActionService {
|
|
|
71
76
|
* @returns Rendered email template with html, text, and subject
|
|
72
77
|
*/
|
|
73
78
|
async renderTemplate(params) {
|
|
74
|
-
const { templateName, context,
|
|
75
|
-
|
|
76
|
-
const result = await
|
|
77
|
-
|
|
79
|
+
const { templateName, context, contextType, options = {} } = params;
|
|
80
|
+
const transformedContext = (0, utils_1.transformContext)(contextType, context);
|
|
81
|
+
const result = await emails_1.emailService.render({
|
|
82
|
+
templateName,
|
|
83
|
+
data: transformedContext,
|
|
84
|
+
options: options || {},
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
html: result.html,
|
|
88
|
+
text: result.text,
|
|
89
|
+
subject: result.subject,
|
|
90
|
+
};
|
|
78
91
|
}
|
|
79
92
|
}
|
|
80
93
|
exports.EmailActionService = EmailActionService;
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtYWN0aW9uLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tcG4tYXV0b21hdGlvbi9zZXJ2aWNlcy9lbWFpbC1hY3Rpb24tc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrREFBeUQ7QUFDekQseUZBQTJGO0FBQzNGLDZFQUFvRjtBQVFwRixNQUFhLGtCQUFtQixTQUFRLHVDQUFpQjtJQUl2RDtRQUNFLEtBQUssRUFBRSxDQUFBO1FBSlQsT0FBRSxHQUFHLE9BQU8sQ0FBQTtRQUNaLFVBQUssR0FBRyxPQUFPLENBQUE7UUFPZixXQUFNLEdBQWtCO1lBQ3RCO2dCQUNFLElBQUksRUFBRSxJQUFJO2dCQUNWLEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxJQUFJO2dCQUNYLElBQUksRUFBRSxPQUFnQjtnQkFDdEIsUUFBUSxFQUFFLElBQUk7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLEdBQUcsRUFBRSxTQUFTO2dCQUNkLEtBQUssRUFBRSxTQUFTO2dCQUNoQixJQUFJLEVBQUUsTUFBZTtnQkFDckIsUUFBUSxFQUFFLElBQUk7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxVQUFtQjtnQkFDekIsUUFBUSxFQUFFLElBQUk7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxLQUFLO2dCQUNWLEtBQUssRUFBRSxLQUFLO2dCQUNaLElBQUksRUFBRSxPQUFnQjtnQkFDdEIsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsSUFBSTtnQkFDVixHQUFHLEVBQUUsSUFBSTtnQkFDVCxLQUFLLEVBQUUsSUFBSTtnQkFDWCxJQUFJLEVBQUUsT0FBZ0I7Z0JBQ3RCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsR0FBRyxFQUFFLFNBQVM7Z0JBQ2QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLElBQUksRUFBRSxPQUFnQjtnQkFDdEIsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRCwrRkFBK0Y7WUFDL0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1NBQzVCLENBQUE7UUFoREMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDNUIsQ0FBQztJQWlERDs7OztPQUlHO0lBQ08sbUJBQW1CO1FBQzNCLDZEQUE2RDtRQUM3RCxvREFBb0Q7UUFDcEQsb0RBQW9EO1FBQ3BELHNDQUFzQztRQUN0Qyw4REFBOEQ7UUFDOUQsS0FBSztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUtwQjtRQUtDLE1BQU0sRUFDSixZQUFZLEVBQ1osT0FBTyxFQUNQLFdBQVcsRUFDWCxPQUFPLEdBQUcsRUFBRSxFQUNiLEdBQUcsTUFBTSxDQUFBO1FBRVYsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLHdCQUFnQixFQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLFlBQVk7WUFDWixJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtTQUN2QixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTFHRCxnREEwR0MifQ==
|