@open-mercato/core 0.4.6-develop-9ff1d4a9a2 → 0.4.6-develop-219dae16c5
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/dist/modules/currencies/backend/exchange-rates/[id]/page.js +17 -154
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js.map +3 -3
- package/dist/modules/currencies/backend/exchange-rates/create/page.js +14 -152
- package/dist/modules/currencies/backend/exchange-rates/create/page.js.map +2 -2
- package/dist/modules/currencies/lib/exchangeRateFormConfig.js +167 -0
- package/dist/modules/currencies/lib/exchangeRateFormConfig.js.map +7 -0
- package/dist/modules/customers/api/dashboard/widgets/utils.js +1 -34
- package/dist/modules/customers/api/dashboard/widgets/utils.js.map +2 -2
- package/dist/modules/customers/commands/activities.js +3 -8
- package/dist/modules/customers/commands/activities.js.map +2 -2
- package/dist/modules/customers/commands/comments.js +2 -8
- package/dist/modules/customers/commands/comments.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +38 -0
- package/dist/modules/dashboards/lib/widgetScope.js.map +7 -0
- package/dist/modules/entities/lib/makeActivityRoute.js +265 -0
- package/dist/modules/entities/lib/makeActivityRoute.js.map +7 -0
- package/dist/modules/resources/api/activities.js +24 -232
- package/dist/modules/resources/api/activities.js.map +2 -2
- package/dist/modules/resources/commands/activities.js +3 -8
- package/dist/modules/resources/commands/activities.js.map +2 -2
- package/dist/modules/resources/commands/comments.js +2 -8
- package/dist/modules/resources/commands/comments.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +27 -182
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +28 -183
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
- package/dist/modules/sales/api/order-line-statuses/route.js +15 -194
- package/dist/modules/sales/api/order-line-statuses/route.js.map +2 -2
- package/dist/modules/sales/api/order-lines/route.js +15 -281
- package/dist/modules/sales/api/order-lines/route.js.map +2 -2
- package/dist/modules/sales/api/order-statuses/route.js +15 -194
- package/dist/modules/sales/api/order-statuses/route.js.map +2 -2
- package/dist/modules/sales/api/payment-statuses/route.js +15 -194
- package/dist/modules/sales/api/payment-statuses/route.js.map +2 -2
- package/dist/modules/sales/api/quote-lines/route.js +15 -279
- package/dist/modules/sales/api/quote-lines/route.js.map +2 -2
- package/dist/modules/sales/api/shipment-statuses/route.js +15 -194
- package/dist/modules/sales/api/shipment-statuses/route.js.map +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js +3 -84
- package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/ProviderFieldInput.js +86 -0
- package/dist/modules/sales/components/ProviderFieldInput.js.map +7 -0
- package/dist/modules/sales/components/ShippingMethodsSettings.js +3 -82
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
- package/dist/modules/sales/lib/makeSalesLineRoute.js +308 -0
- package/dist/modules/sales/lib/makeSalesLineRoute.js.map +7 -0
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js +206 -0
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js.map +7 -0
- package/dist/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.js +178 -0
- package/dist/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.js.map +7 -0
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +1 -39
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +1 -39
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/shared.js +46 -0
- package/dist/modules/sales/widgets/dashboard/shared.js.map +7 -0
- package/dist/modules/staff/api/activities.js +24 -232
- package/dist/modules/staff/api/activities.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +14 -34
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +15 -34
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/commands/activities.js +3 -8
- package/dist/modules/staff/commands/activities.js.map +2 -2
- package/dist/modules/staff/commands/comments.js +2 -8
- package/dist/modules/staff/commands/comments.js.map +2 -2
- package/dist/modules/staff/lib/leaveRequestHelpers.js +41 -0
- package/dist/modules/staff/lib/leaveRequestHelpers.js.map +7 -0
- package/package.json +2 -2
- package/src/modules/currencies/backend/exchange-rates/[id]/page.tsx +20 -180
- package/src/modules/currencies/backend/exchange-rates/create/page.tsx +16 -175
- package/src/modules/currencies/lib/exchangeRateFormConfig.ts +200 -0
- package/src/modules/customers/api/dashboard/widgets/utils.ts +1 -53
- package/src/modules/customers/commands/activities.ts +2 -8
- package/src/modules/customers/commands/comments.ts +2 -8
- package/src/modules/dashboards/i18n/de.json +3 -0
- package/src/modules/dashboards/i18n/en.json +3 -0
- package/src/modules/dashboards/i18n/es.json +3 -0
- package/src/modules/dashboards/i18n/pl.json +3 -0
- package/src/modules/dashboards/lib/widgetScope.ts +53 -0
- package/src/modules/entities/lib/makeActivityRoute.ts +327 -0
- package/src/modules/resources/api/activities.ts +25 -269
- package/src/modules/resources/commands/activities.ts +2 -7
- package/src/modules/resources/commands/comments.ts +2 -8
- package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +29 -244
- package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +30 -245
- package/src/modules/sales/api/order-line-statuses/route.ts +16 -209
- package/src/modules/sales/api/order-lines/route.ts +16 -300
- package/src/modules/sales/api/order-statuses/route.ts +16 -209
- package/src/modules/sales/api/payment-statuses/route.ts +16 -209
- package/src/modules/sales/api/quote-lines/route.ts +16 -298
- package/src/modules/sales/api/shipment-statuses/route.ts +16 -209
- package/src/modules/sales/components/PaymentMethodsSettings.tsx +3 -88
- package/src/modules/sales/components/ProviderFieldInput.tsx +85 -0
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +3 -86
- package/src/modules/sales/lib/makeSalesLineRoute.ts +345 -0
- package/src/modules/sales/lib/makeStatusDictionaryRoute.ts +229 -0
- package/src/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.ts +247 -0
- package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +7 -50
- package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +7 -49
- package/src/modules/sales/widgets/dashboard/shared.ts +44 -0
- package/src/modules/staff/api/activities.ts +25 -269
- package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +15 -69
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +16 -65
- package/src/modules/staff/commands/activities.ts +2 -7
- package/src/modules/staff/commands/comments.ts +2 -8
- package/src/modules/staff/lib/leaveRequestHelpers.ts +78 -0
|
@@ -1,201 +1,22 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { makeCrudRoute } from "@open-mercato/shared/lib/crud/factory";
|
|
3
|
-
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
4
|
-
import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
|
|
5
|
-
import { Dictionary, DictionaryEntry } from "@open-mercato/core/modules/dictionaries/data/entities";
|
|
6
1
|
import { E } from "../../../../generated/entities.ids.generated.js";
|
|
7
2
|
import * as F from "../../../../generated/entities/dictionary_entry/index.js";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const rawBodySchema = z.object({}).passthrough();
|
|
18
|
-
const listSchema = z.object({
|
|
19
|
-
page: z.coerce.number().min(1).default(1),
|
|
20
|
-
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
21
|
-
search: z.string().optional(),
|
|
22
|
-
sortField: z.string().optional(),
|
|
23
|
-
sortDir: z.enum(["asc", "desc"]).optional()
|
|
24
|
-
}).passthrough();
|
|
25
|
-
const kind = "shipment-status";
|
|
26
|
-
const definition = getSalesDictionaryDefinition(kind);
|
|
27
|
-
const metadata = {
|
|
28
|
-
GET: { requireAuth: true, requireFeatures: ["sales.settings.manage"] },
|
|
29
|
-
POST: { requireAuth: true, requireFeatures: ["sales.settings.manage"] },
|
|
30
|
-
PUT: { requireAuth: true, requireFeatures: ["sales.settings.manage"] },
|
|
31
|
-
DELETE: { requireAuth: true, requireFeatures: ["sales.settings.manage"] }
|
|
32
|
-
};
|
|
33
|
-
const dictionaryItemSchema = z.object({
|
|
34
|
-
id: z.string().uuid(),
|
|
35
|
-
value: z.string(),
|
|
36
|
-
label: z.string().nullable(),
|
|
37
|
-
color: z.string().nullable(),
|
|
38
|
-
icon: z.string().nullable(),
|
|
39
|
-
organizationId: z.string().uuid().nullable(),
|
|
40
|
-
tenantId: z.string().uuid().nullable(),
|
|
41
|
-
createdAt: z.string(),
|
|
42
|
-
updatedAt: z.string()
|
|
43
|
-
});
|
|
44
|
-
const dictionaryListResponseSchema = createPagedListResponseSchema(dictionaryItemSchema);
|
|
45
|
-
const normalizeId = (value) => {
|
|
46
|
-
if (typeof value !== "string") return null;
|
|
47
|
-
const trimmed = value.trim();
|
|
48
|
-
return trimmed.length > 0 ? trimmed : null;
|
|
49
|
-
};
|
|
50
|
-
async function resolveDictionaryContext(ctx) {
|
|
51
|
-
if (!ctx.auth || !ctx.auth.tenantId) {
|
|
52
|
-
throw new CrudHttpError(401, { error: "Tenant context is required." });
|
|
53
|
-
}
|
|
54
|
-
const em = ctx.container.resolve("em");
|
|
55
|
-
const tenantId = ctx.auth.tenantId;
|
|
56
|
-
const candidateOrgIds = /* @__PURE__ */ new Set();
|
|
57
|
-
const pushCandidate = (value) => {
|
|
58
|
-
const normalized = normalizeId(value);
|
|
59
|
-
if (normalized) candidateOrgIds.add(normalized);
|
|
60
|
-
};
|
|
61
|
-
pushCandidate(ctx.selectedOrganizationId);
|
|
62
|
-
pushCandidate(ctx.auth.orgId ?? null);
|
|
63
|
-
const scope = ctx.organizationScope;
|
|
64
|
-
if (scope) {
|
|
65
|
-
if (Array.isArray(scope.filterIds)) {
|
|
66
|
-
for (const id of scope.filterIds) pushCandidate(id);
|
|
67
|
-
}
|
|
68
|
-
if (Array.isArray(scope.allowedIds)) {
|
|
69
|
-
for (const id of scope.allowedIds) pushCandidate(id);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
for (const orgId of candidateOrgIds) {
|
|
73
|
-
const dictionary = await ensureSalesDictionary({
|
|
74
|
-
em,
|
|
75
|
-
tenantId,
|
|
76
|
-
organizationId: orgId,
|
|
77
|
-
kind
|
|
78
|
-
});
|
|
79
|
-
if (dictionary) {
|
|
80
|
-
return { dictionaryId: dictionary.id, organizationId: orgId };
|
|
81
|
-
}
|
|
3
|
+
import { makeStatusDictionaryRoute } from "../../lib/makeStatusDictionaryRoute.js";
|
|
4
|
+
const route = makeStatusDictionaryRoute({
|
|
5
|
+
kind: "shipment-status",
|
|
6
|
+
entityId: E.dictionaries.dictionary_entry,
|
|
7
|
+
fieldConstants: F,
|
|
8
|
+
openApi: {
|
|
9
|
+
resourceName: "Shipment status",
|
|
10
|
+
pluralName: "Shipment statuses",
|
|
11
|
+
description: "Manage the lifecycle states available for shipments."
|
|
82
12
|
}
|
|
83
|
-
const fallback = await em.findOne(
|
|
84
|
-
Dictionary,
|
|
85
|
-
{
|
|
86
|
-
tenantId,
|
|
87
|
-
key: definition.key,
|
|
88
|
-
deletedAt: null
|
|
89
|
-
},
|
|
90
|
-
{ orderBy: { createdAt: "asc" } }
|
|
91
|
-
);
|
|
92
|
-
if (fallback) {
|
|
93
|
-
return { dictionaryId: fallback.id, organizationId: fallback.organizationId };
|
|
94
|
-
}
|
|
95
|
-
throw new CrudHttpError(400, { error: "Organization context is required." });
|
|
96
|
-
}
|
|
97
|
-
const crud = makeCrudRoute({
|
|
98
|
-
metadata,
|
|
99
|
-
orm: {
|
|
100
|
-
entity: DictionaryEntry,
|
|
101
|
-
idField: "id",
|
|
102
|
-
orgField: "organizationId",
|
|
103
|
-
tenantField: "tenantId",
|
|
104
|
-
softDeleteField: null
|
|
105
|
-
},
|
|
106
|
-
list: {
|
|
107
|
-
schema: listSchema,
|
|
108
|
-
entityId: E.dictionaries.dictionary_entry,
|
|
109
|
-
fields: [
|
|
110
|
-
F.id,
|
|
111
|
-
F.value,
|
|
112
|
-
F.label,
|
|
113
|
-
F.color,
|
|
114
|
-
F.icon,
|
|
115
|
-
F.organization_id,
|
|
116
|
-
F.tenant_id,
|
|
117
|
-
F.created_at,
|
|
118
|
-
F.updated_at
|
|
119
|
-
],
|
|
120
|
-
sortFieldMap: {
|
|
121
|
-
id: F.id,
|
|
122
|
-
value: F.value,
|
|
123
|
-
label: F.label,
|
|
124
|
-
createdAt: F.created_at,
|
|
125
|
-
updatedAt: F.updated_at
|
|
126
|
-
},
|
|
127
|
-
buildFilters: async (query, ctx) => {
|
|
128
|
-
const { dictionaryId } = await resolveDictionaryContext(ctx);
|
|
129
|
-
const filters = {
|
|
130
|
-
dictionary_id: dictionaryId
|
|
131
|
-
};
|
|
132
|
-
if (query.search && query.search.trim().length > 0) {
|
|
133
|
-
const term = `%${escapeLikePattern(query.search.trim())}%`;
|
|
134
|
-
filters.$or = [
|
|
135
|
-
{ [F.value]: { $ilike: term } },
|
|
136
|
-
{ [F.label]: { $ilike: term } }
|
|
137
|
-
];
|
|
138
|
-
}
|
|
139
|
-
return filters;
|
|
140
|
-
},
|
|
141
|
-
transformItem: (item) => ({
|
|
142
|
-
id: item.id,
|
|
143
|
-
value: item.value,
|
|
144
|
-
label: item.label,
|
|
145
|
-
color: item.color ?? null,
|
|
146
|
-
icon: item.icon ?? null,
|
|
147
|
-
organizationId: item.organization_id ?? null,
|
|
148
|
-
tenantId: item.tenant_id ?? null,
|
|
149
|
-
createdAt: item.created_at,
|
|
150
|
-
updatedAt: item.updated_at
|
|
151
|
-
})
|
|
152
|
-
},
|
|
153
|
-
actions: {
|
|
154
|
-
create: {
|
|
155
|
-
commandId: `${definition.commandPrefix}.create`,
|
|
156
|
-
schema: rawBodySchema,
|
|
157
|
-
mapInput: async ({ raw, ctx }) => {
|
|
158
|
-
const { translate } = await resolveTranslations();
|
|
159
|
-
return parseScopedCommandInput(statusDictionaryCreateSchema, raw ?? {}, ctx, translate);
|
|
160
|
-
},
|
|
161
|
-
response: ({ result }) => ({ id: result?.entryId ?? null }),
|
|
162
|
-
status: 201
|
|
163
|
-
},
|
|
164
|
-
update: {
|
|
165
|
-
commandId: `${definition.commandPrefix}.update`,
|
|
166
|
-
schema: rawBodySchema,
|
|
167
|
-
mapInput: async ({ raw, ctx }) => {
|
|
168
|
-
const { translate } = await resolveTranslations();
|
|
169
|
-
return parseScopedCommandInput(statusDictionaryUpdateSchema, raw ?? {}, ctx, translate);
|
|
170
|
-
},
|
|
171
|
-
response: () => ({ ok: true })
|
|
172
|
-
},
|
|
173
|
-
delete: {
|
|
174
|
-
commandId: `${definition.commandPrefix}.delete`,
|
|
175
|
-
schema: rawBodySchema,
|
|
176
|
-
mapInput: async ({ parsed, ctx }) => {
|
|
177
|
-
const { translate } = await resolveTranslations();
|
|
178
|
-
const id = resolveCrudRecordId(parsed, ctx, translate);
|
|
179
|
-
return { id };
|
|
180
|
-
},
|
|
181
|
-
response: () => ({ ok: true })
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
const openApi = createSalesCrudOpenApi({
|
|
186
|
-
resourceName: "Shipment status",
|
|
187
|
-
pluralName: "Shipment statuses",
|
|
188
|
-
description: "Manage the lifecycle states available for shipments.",
|
|
189
|
-
querySchema: listSchema,
|
|
190
|
-
listResponseSchema: dictionaryListResponseSchema,
|
|
191
|
-
create: { schema: statusDictionaryCreateSchema },
|
|
192
|
-
update: { schema: statusDictionaryUpdateSchema },
|
|
193
|
-
del: { schema: defaultDeleteRequestSchema }
|
|
194
13
|
});
|
|
195
|
-
const
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
const
|
|
14
|
+
const metadata = route.metadata;
|
|
15
|
+
const openApi = route.openApi;
|
|
16
|
+
const GET = route.GET;
|
|
17
|
+
const POST = route.POST;
|
|
18
|
+
const PUT = route.PUT;
|
|
19
|
+
const DELETE = route.DELETE;
|
|
199
20
|
export {
|
|
200
21
|
DELETE,
|
|
201
22
|
GET,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/api/shipment-statuses/route.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,
|
|
4
|
+
"sourcesContent": ["import { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/dictionary_entry'\nimport { makeStatusDictionaryRoute } from '../../lib/makeStatusDictionaryRoute'\n\nconst route = makeStatusDictionaryRoute({\n kind: 'shipment-status',\n entityId: E.dictionaries.dictionary_entry,\n fieldConstants: F,\n openApi: {\n resourceName: 'Shipment status',\n pluralName: 'Shipment statuses',\n description: 'Manage the lifecycle states available for shipments.',\n },\n})\n\nexport const metadata = route.metadata\nexport const openApi = route.openApi\nexport const GET = route.GET\nexport const POST = route.POST\nexport const PUT = route.PUT\nexport const DELETE = route.DELETE\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,SAAS;AAClB,YAAY,OAAO;AACnB,SAAS,iCAAiC;AAE1C,MAAM,QAAQ,0BAA0B;AAAA,EACtC,MAAM;AAAA,EACN,UAAU,EAAE,aAAa;AAAA,EACzB,gBAAgB;AAAA,EAChB,SAAS;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACF,CAAC;AAEM,MAAM,WAAW,MAAM;AACvB,MAAM,UAAU,MAAM;AACtB,MAAM,MAAM,MAAM;AAClB,MAAM,OAAO,MAAM;AACnB,MAAM,MAAM,MAAM;AAClB,MAAM,SAAS,MAAM;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -11,10 +11,7 @@ import {
|
|
|
11
11
|
DialogHeader,
|
|
12
12
|
DialogTitle
|
|
13
13
|
} from "@open-mercato/ui/primitives/dialog";
|
|
14
|
-
import { Input } from "@open-mercato/ui/primitives/input";
|
|
15
14
|
import { Label } from "@open-mercato/ui/primitives/label";
|
|
16
|
-
import { Switch } from "@open-mercato/ui/primitives/switch";
|
|
17
|
-
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
18
15
|
import { CrudForm } from "@open-mercato/ui/backend/CrudForm";
|
|
19
16
|
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
20
17
|
import { apiCall, readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
|
|
@@ -25,6 +22,8 @@ import { useConfirmDialog } from "@open-mercato/ui/backend/confirm-dialog";
|
|
|
25
22
|
import {
|
|
26
23
|
listPaymentProviders
|
|
27
24
|
} from "../lib/providers/index.js";
|
|
25
|
+
import { isRecord } from "@open-mercato/shared/lib/utils";
|
|
26
|
+
import { renderProviderFieldInput } from "./ProviderFieldInput.js";
|
|
28
27
|
const paymentFormSchema = z.object({
|
|
29
28
|
name: z.string().trim().min(1),
|
|
30
29
|
code: z.string().trim().min(1),
|
|
@@ -43,86 +42,6 @@ const DEFAULT_FORM = {
|
|
|
43
42
|
isActive: true,
|
|
44
43
|
providerSettings: {}
|
|
45
44
|
};
|
|
46
|
-
function isRecord(value) {
|
|
47
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
48
|
-
}
|
|
49
|
-
function renderFieldInput(opts) {
|
|
50
|
-
const { field, value, onChange } = opts;
|
|
51
|
-
const common = { id: field.key, "data-provider-setting": field.key };
|
|
52
|
-
switch (field.type) {
|
|
53
|
-
case "textarea":
|
|
54
|
-
return /* @__PURE__ */ jsx(
|
|
55
|
-
Textarea,
|
|
56
|
-
{
|
|
57
|
-
...common,
|
|
58
|
-
value: typeof value === "string" ? value : "",
|
|
59
|
-
onChange: (evt) => onChange(evt.target.value),
|
|
60
|
-
placeholder: field.placeholder
|
|
61
|
-
}
|
|
62
|
-
);
|
|
63
|
-
case "number":
|
|
64
|
-
return /* @__PURE__ */ jsx(
|
|
65
|
-
Input,
|
|
66
|
-
{
|
|
67
|
-
...common,
|
|
68
|
-
type: "number",
|
|
69
|
-
value: typeof value === "number" || typeof value === "string" ? String(value) : "",
|
|
70
|
-
onChange: (evt) => onChange(evt.target.value === "" ? "" : Number(evt.target.value)),
|
|
71
|
-
placeholder: field.placeholder
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
case "boolean":
|
|
75
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
|
|
76
|
-
/* @__PURE__ */ jsx(
|
|
77
|
-
Switch,
|
|
78
|
-
{
|
|
79
|
-
id: field.key,
|
|
80
|
-
checked: Boolean(value),
|
|
81
|
-
onCheckedChange: (checked) => onChange(checked)
|
|
82
|
-
}
|
|
83
|
-
),
|
|
84
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: field.key, children: field.placeholder ?? "" })
|
|
85
|
-
] });
|
|
86
|
-
case "select":
|
|
87
|
-
return /* @__PURE__ */ jsxs(
|
|
88
|
-
"select",
|
|
89
|
-
{
|
|
90
|
-
...common,
|
|
91
|
-
className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
|
|
92
|
-
value: typeof value === "string" ? value : "",
|
|
93
|
-
onChange: (evt) => onChange(evt.target.value),
|
|
94
|
-
children: [
|
|
95
|
-
/* @__PURE__ */ jsx("option", { value: "", children: "\u2014" }),
|
|
96
|
-
(field.options ?? []).map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value))
|
|
97
|
-
]
|
|
98
|
-
}
|
|
99
|
-
);
|
|
100
|
-
case "secret":
|
|
101
|
-
return /* @__PURE__ */ jsx(
|
|
102
|
-
Input,
|
|
103
|
-
{
|
|
104
|
-
...common,
|
|
105
|
-
type: "password",
|
|
106
|
-
value: typeof value === "string" ? value : "",
|
|
107
|
-
onChange: (evt) => onChange(evt.target.value),
|
|
108
|
-
placeholder: field.placeholder
|
|
109
|
-
}
|
|
110
|
-
);
|
|
111
|
-
case "url":
|
|
112
|
-
case "text":
|
|
113
|
-
default:
|
|
114
|
-
return /* @__PURE__ */ jsx(
|
|
115
|
-
Input,
|
|
116
|
-
{
|
|
117
|
-
...common,
|
|
118
|
-
type: field.type === "url" ? "url" : "text",
|
|
119
|
-
value: typeof value === "string" ? value : "",
|
|
120
|
-
onChange: (evt) => onChange(evt.target.value),
|
|
121
|
-
placeholder: field.placeholder
|
|
122
|
-
}
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
45
|
function createPaymentProviderSettingsRenderer(params) {
|
|
127
46
|
const { providers, selectPrompt, noFieldsLabel } = params;
|
|
128
47
|
return function PaymentProviderSettingsField({
|
|
@@ -156,7 +75,7 @@ function createPaymentProviderSettingsRenderer(params) {
|
|
|
156
75
|
field.required ? " *" : ""
|
|
157
76
|
] }),
|
|
158
77
|
field.description ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: field.description }) : null,
|
|
159
|
-
|
|
78
|
+
renderProviderFieldInput({
|
|
160
79
|
field,
|
|
161
80
|
value: fieldValue,
|
|
162
81
|
onChange: (next) => setValue({ ...settings, [field.key]: next })
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/components/PaymentMethodsSettings.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { CrudForm, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n listPaymentProviders,\n type PaymentProvider,\n type ProviderSettingField,\n} from '../lib/providers'\n\ntype PaymentMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n description: string | null\n terms: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: PaymentMethodRow }\n\nconst paymentFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n terms: z.string().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype PaymentFormValues = z.infer<typeof paymentFormSchema>\n\nconst DEFAULT_FORM: PaymentFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n terms: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction renderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n\nfunction createPaymentProviderSettingsRenderer(params: {\n providers: PaymentProvider[]\n selectPrompt: string\n noFieldsLabel: string\n}) {\n const { providers, selectPrompt, noFieldsLabel } = params\n return function PaymentProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function PaymentMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const providers = React.useMemo(() => listPaymentProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const ProviderSettingsField = React.useMemo(\n () =>\n createPaymentProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.paymentMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.paymentMethods.form.noSettings', 'No configurable settings.'),\n }),\n [providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.paymentMethods.title', 'Payment methods'),\n description: t(\n 'sales.config.paymentMethods.description',\n 'Configure payment providers and any checkout fees.'\n ),\n actions: {\n add: t('sales.config.paymentMethods.actions.add', 'Add payment method'),\n edit: t('sales.config.paymentMethods.actions.edit', 'Edit'),\n delete: t('sales.config.paymentMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.paymentMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.paymentMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.paymentMethods.table.name', 'Name'),\n code: t('sales.config.paymentMethods.table.code', 'Code'),\n provider: t('sales.config.paymentMethods.table.provider', 'Provider'),\n active: t('sales.config.paymentMethods.table.active', 'Active'),\n statusActive: t('sales.config.paymentMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.paymentMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.paymentMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.paymentMethods.table.empty', 'No payment methods yet.'),\n search: t('sales.config.paymentMethods.table.search', 'Search payment methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.paymentMethods.form.createTitle', 'Add payment method'),\n editTitle: t('sales.config.paymentMethods.form.editTitle', 'Edit payment method'),\n name: t('sales.config.paymentMethods.form.name', 'Name'),\n code: t('sales.config.paymentMethods.form.code', 'Code'),\n provider: t('sales.config.paymentMethods.form.provider', 'Provider'),\n description: t('sales.config.paymentMethods.form.description', 'Description'),\n terms: t('sales.config.paymentMethods.form.terms', 'Terms'),\n isActive: t('sales.config.paymentMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.paymentMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.paymentMethods.form.save', 'Save'),\n cancel: t('sales.config.paymentMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.paymentMethods.messages.saved', 'Payment method saved.'),\n deleted: t('sales.config.paymentMethods.messages.deleted', 'Payment method deleted.'),\n },\n errors: {\n load: t('sales.config.paymentMethods.errors.load', 'Failed to load payment methods.'),\n save: t('sales.config.paymentMethods.errors.save', 'Failed to save payment method.'),\n delete: t('sales.config.paymentMethods.errors.delete', 'Failed to delete payment method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<PaymentMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<PaymentFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/payment-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any).provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n description: typeof item.description === 'string' ? item.description : null,\n terms: typeof item.terms === 'string' ? item.terms : null,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.payment-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: PaymentMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n terms: entry.terms ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: PaymentMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n const confirmed = await confirm({\n title: message,\n variant: 'destructive',\n })\n if (!confirmed) return\n try {\n const call = await apiCall('/api/sales/payment-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.payment-methods.delete failed', err)\n const message =\n err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [confirm, loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const handleSubmit = React.useCallback(async (values: PaymentFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n terms: values.terms?.trim() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/payment-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.payment-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'terms', label: translations.form.terms, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.code, translations.form.description, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.terms])\n\n const columns = React.useMemo<ColumnDef<PaymentMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: translations.actions.edit, onSelect: () => openEdit(row) },\n { id: 'delete', label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={paymentFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n onSubmit={handleSubmit}\n cancelHref={undefined}\n embedded\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </section>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { CrudForm, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n listPaymentProviders,\n type PaymentProvider,\n} from '../lib/providers'\nimport { isRecord } from '@open-mercato/shared/lib/utils'\nimport { renderProviderFieldInput } from './ProviderFieldInput'\n\ntype PaymentMethodRow = {\n id: string\n name: string\n code: string\n providerKey: string | null\n providerLabel: string | null\n description: string | null\n terms: string | null\n isActive: boolean\n updatedAt: string | null\n providerSettings: Record<string, unknown> | null\n}\n\ntype DialogState =\n | { mode: 'create' }\n | { mode: 'edit'; entry: PaymentMethodRow }\n\nconst paymentFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n providerKey: z.string().trim().optional(),\n description: z.string().optional(),\n terms: z.string().optional(),\n isActive: z.boolean().optional(),\n providerSettings: z.record(z.string(), z.unknown()).optional(),\n})\n\ntype PaymentFormValues = z.infer<typeof paymentFormSchema>\n\nconst DEFAULT_FORM: PaymentFormValues = {\n name: '',\n code: '',\n providerKey: '',\n description: '',\n terms: '',\n isActive: true,\n providerSettings: {},\n}\n\nfunction createPaymentProviderSettingsRenderer(params: {\n providers: PaymentProvider[]\n selectPrompt: string\n noFieldsLabel: string\n}) {\n const { providers, selectPrompt, noFieldsLabel } = params\n return function PaymentProviderSettingsField({\n value,\n setValue,\n values,\n }: CrudCustomFieldRenderProps) {\n const providerKey =\n values && typeof values.providerKey === 'string' && values.providerKey.trim().length\n ? values.providerKey\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n const previousKey = React.useRef<string | null>(providerKey)\n\n React.useEffect(() => {\n if (providerKey !== previousKey.current) {\n const defaults = provider?.settings?.defaults ?? null\n setValue(defaults && typeof defaults === 'object' ? defaults : {})\n previousKey.current = providerKey\n }\n }, [providerKey, provider, setValue])\n\n if (!provider) {\n return <p className=\"text-sm text-muted-foreground\">{selectPrompt}</p>\n }\n\n const settings = isRecord(value) ? value : {}\n const fields = provider.settings?.fields ?? []\n if (!fields.length) {\n return <p className=\"text-sm text-muted-foreground\">{noFieldsLabel}</p>\n }\n\n return (\n <div className=\"space-y-4\">\n {fields.map((field) => {\n const fieldValue = settings[field.key]\n return (\n <div key={field.key} className=\"space-y-1.5\">\n <Label htmlFor={field.key} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </Label>\n {field.description ? (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n ) : null}\n {renderProviderFieldInput({\n field,\n value: fieldValue,\n onChange: (next) => setValue({ ...settings, [field.key]: next }),\n })}\n </div>\n )\n })}\n </div>\n )\n }\n}\n\nexport function PaymentMethodsSettings() {\n const t = useT()\n const scopeVersion = useOrganizationScopeVersion()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const providers = React.useMemo(() => listPaymentProviders(), [])\n const providerOptions = React.useMemo(\n () => providers.map((provider) => ({ value: provider.key, label: provider.label })),\n [providers]\n )\n const ProviderSettingsField = React.useMemo(\n () =>\n createPaymentProviderSettingsRenderer({\n providers,\n selectPrompt: t(\n 'sales.config.paymentMethods.form.selectProvider',\n 'Choose a provider to configure settings.'\n ),\n noFieldsLabel: t('sales.config.paymentMethods.form.noSettings', 'No configurable settings.'),\n }),\n [providers, t]\n )\n\n const translations = React.useMemo(() => ({\n title: t('sales.config.paymentMethods.title', 'Payment methods'),\n description: t(\n 'sales.config.paymentMethods.description',\n 'Configure payment providers and any checkout fees.'\n ),\n actions: {\n add: t('sales.config.paymentMethods.actions.add', 'Add payment method'),\n edit: t('sales.config.paymentMethods.actions.edit', 'Edit'),\n delete: t('sales.config.paymentMethods.actions.delete', 'Delete'),\n deleteConfirm: t('sales.config.paymentMethods.actions.deleteConfirm', 'Delete \"{{name}}\"?'),\n refresh: t('sales.config.paymentMethods.actions.refresh', 'Refresh'),\n },\n table: {\n name: t('sales.config.paymentMethods.table.name', 'Name'),\n code: t('sales.config.paymentMethods.table.code', 'Code'),\n provider: t('sales.config.paymentMethods.table.provider', 'Provider'),\n active: t('sales.config.paymentMethods.table.active', 'Active'),\n statusActive: t('sales.config.paymentMethods.table.statusActive', 'Active'),\n statusInactive: t('sales.config.paymentMethods.table.statusInactive', 'Inactive'),\n updatedAt: t('sales.config.paymentMethods.table.updatedAt', 'Updated'),\n empty: t('sales.config.paymentMethods.table.empty', 'No payment methods yet.'),\n search: t('sales.config.paymentMethods.table.search', 'Search payment methods\u2026'),\n },\n form: {\n createTitle: t('sales.config.paymentMethods.form.createTitle', 'Add payment method'),\n editTitle: t('sales.config.paymentMethods.form.editTitle', 'Edit payment method'),\n name: t('sales.config.paymentMethods.form.name', 'Name'),\n code: t('sales.config.paymentMethods.form.code', 'Code'),\n provider: t('sales.config.paymentMethods.form.provider', 'Provider'),\n description: t('sales.config.paymentMethods.form.description', 'Description'),\n terms: t('sales.config.paymentMethods.form.terms', 'Terms'),\n isActive: t('sales.config.paymentMethods.form.isActive', 'Active'),\n providerSettings: t('sales.config.paymentMethods.form.providerSettings', 'Provider settings'),\n save: t('sales.config.paymentMethods.form.save', 'Save'),\n cancel: t('sales.config.paymentMethods.form.cancel', 'Cancel'),\n },\n messages: {\n saved: t('sales.config.paymentMethods.messages.saved', 'Payment method saved.'),\n deleted: t('sales.config.paymentMethods.messages.deleted', 'Payment method deleted.'),\n },\n errors: {\n load: t('sales.config.paymentMethods.errors.load', 'Failed to load payment methods.'),\n save: t('sales.config.paymentMethods.errors.save', 'Failed to save payment method.'),\n delete: t('sales.config.paymentMethods.errors.delete', 'Failed to delete payment method.'),\n },\n }), [t])\n\n const [entries, setEntries] = React.useState<PaymentMethodRow[]>([])\n const [loading, setLoading] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogState | null>(null)\n const [formValues, setFormValues] = React.useState<PaymentFormValues>(DEFAULT_FORM)\n const [search, setSearch] = React.useState('')\n const [submitting, setSubmitting] = React.useState(false)\n\n const loadEntries = React.useCallback(async () => {\n setLoading(true)\n try {\n const payload = await readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/sales/payment-methods?pageSize=100',\n undefined,\n { errorMessage: translations.errors.load, fallback: { items: [] } },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n setEntries(\n items.map((item) => {\n const providerKey = typeof (item as any).providerKey === 'string'\n ? (item as any).providerKey\n : typeof (item as any).provider_key === 'string'\n ? (item as any).provider_key\n : null\n const provider = providers.find((entry) => entry.key === providerKey)\n return {\n id: String(item.id ?? ''),\n name: typeof item.name === 'string' && item.name.length ? item.name : '\u2014',\n code: typeof item.code === 'string' ? item.code : '',\n providerKey,\n providerLabel: provider?.label ?? null,\n description: typeof item.description === 'string' ? item.description : null,\n terms: typeof item.terms === 'string' ? item.terms : null,\n isActive:\n typeof item.isActive === 'boolean'\n ? item.isActive\n : typeof (item as any)?.is_active === 'boolean'\n ? (item as any).is_active\n : false,\n updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : null,\n providerSettings:\n item && typeof (item as any).providerSettings === 'object'\n ? ((item as any).providerSettings as Record<string, unknown>)\n : null,\n }\n })\n )\n } catch (err) {\n console.error('sales.payment-methods.list failed', err)\n flash(translations.errors.load, 'error')\n } finally {\n setLoading(false)\n }\n }, [providers, translations.errors.load])\n\n React.useEffect(() => {\n void loadEntries()\n }, [loadEntries, scopeVersion])\n\n const openCreate = React.useCallback(() => {\n const defaultProvider = providerOptions[0]?.value ?? ''\n setFormValues({\n ...DEFAULT_FORM,\n providerKey: defaultProvider,\n providerSettings: {},\n })\n setDialog({ mode: 'create' })\n }, [providerOptions])\n\n const openEdit = React.useCallback((entry: PaymentMethodRow) => {\n setFormValues({\n name: entry.name,\n code: entry.code,\n providerKey: entry.providerKey ?? '',\n description: entry.description ?? '',\n terms: entry.terms ?? '',\n isActive: entry.isActive,\n providerSettings: entry.providerSettings ?? {},\n })\n setDialog({ mode: 'edit', entry })\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const deleteEntry = React.useCallback(async (entry: PaymentMethodRow) => {\n const message = translations.actions.deleteConfirm.replace('{{name}}', entry.name)\n const confirmed = await confirm({\n title: message,\n variant: 'destructive',\n })\n if (!confirmed) return\n try {\n const call = await apiCall('/api/sales/payment-methods', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.delete)\n }\n flash(translations.messages.deleted, 'success')\n await loadEntries()\n } catch (err) {\n console.error('sales.payment-methods.delete failed', err)\n const message =\n err instanceof Error ? err.message : translations.errors.delete\n flash(message, 'error')\n }\n }, [confirm, loadEntries, translations.actions.deleteConfirm, translations.errors.delete, translations.messages.deleted])\n\n const handleSubmit = React.useCallback(async (values: PaymentFormValues) => {\n if (!dialog) return\n setSubmitting(true)\n const payload: Record<string, unknown> = {\n name: values.name.trim(),\n code: values.code.trim().toLowerCase(),\n description: values.description?.trim() || undefined,\n providerKey: values.providerKey?.trim() || undefined,\n terms: values.terms?.trim() || undefined,\n isActive: values.isActive ?? true,\n providerSettings: isRecord(values.providerSettings) ? values.providerSettings : undefined,\n }\n const path = '/api/sales/payment-methods'\n const method = dialog.mode === 'create' ? 'POST' : 'PUT'\n if (dialog.mode === 'edit') payload.id = dialog.entry.id\n try {\n const call = await apiCall(path, {\n method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, translations.errors.save)\n }\n flash(translations.messages.saved, 'success')\n await loadEntries()\n closeDialog()\n } catch (err) {\n console.error('sales.payment-methods.save failed', err)\n const message = err instanceof Error ? err.message : translations.errors.save\n flash(message, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [closeDialog, dialog, loadEntries, translations.errors.save, translations.messages.saved])\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', label: translations.form.name, type: 'text', required: true },\n { id: 'code', label: translations.form.code, type: 'text', required: true },\n {\n id: 'providerKey',\n label: translations.form.provider,\n type: 'select',\n required: false,\n options: providerOptions,\n },\n { id: 'description', label: translations.form.description, type: 'textarea' },\n { id: 'terms', label: translations.form.terms, type: 'textarea' },\n { id: 'isActive', label: translations.form.isActive, type: 'checkbox' },\n {\n id: 'providerSettings',\n label: translations.form.providerSettings,\n type: 'custom',\n component: ProviderSettingsField,\n },\n ], [ProviderSettingsField, providerOptions, translations.form.code, translations.form.description, translations.form.isActive, translations.form.name, translations.form.provider, translations.form.providerSettings, translations.form.terms])\n\n const columns = React.useMemo<ColumnDef<PaymentMethodRow>[]>(() => [\n {\n accessorKey: 'name',\n header: translations.table.name,\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.name}</span>\n <span className=\"text-xs text-muted-foreground\">{row.original.code}</span>\n </div>\n ),\n },\n {\n accessorKey: 'providerKey',\n header: translations.table.provider,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.providerLabel ?? row.original.providerKey ?? '\u2014'}\n </span>\n ),\n },\n {\n accessorKey: 'isActive',\n header: translations.table.active,\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {row.original.isActive ? translations.table.statusActive : translations.table.statusInactive}\n </span>\n ),\n },\n {\n accessorKey: 'updatedAt',\n header: translations.table.updatedAt,\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {row.original.updatedAt ? new Date(row.original.updatedAt).toLocaleString() : '\u2014'}\n </span>\n ),\n },\n ], [translations])\n\n const filteredEntries = React.useMemo(() => {\n if (!search.trim()) return entries\n const term = search.trim().toLowerCase()\n return entries.filter(\n (entry) =>\n entry.name.toLowerCase().includes(term) ||\n entry.code.toLowerCase().includes(term) ||\n (entry.providerLabel ?? '').toLowerCase().includes(term) ||\n (entry.providerKey ?? '').toLowerCase().includes(term)\n )\n }, [entries, search])\n\n return (\n <section className=\"rounded border bg-card text-card-foreground shadow-sm\">\n <div className=\"border-b px-6 py-4 space-y-1\">\n <h2 className=\"text-lg font-medium\">{translations.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{translations.description}</p>\n </div>\n <div className=\"px-2 py-4 sm:px-4\">\n <DataTable\n embedded\n isLoading={loading}\n columns={columns}\n data={filteredEntries}\n searchValue={search}\n onSearchChange={setSearch}\n searchPlaceholder={translations.table.search}\n emptyState={<p className=\"py-8 text-center text-sm text-muted-foreground\">{translations.table.empty}</p>}\n actions={(\n <Button size=\"sm\" onClick={openCreate}>\n {translations.actions.add}\n </Button>\n )}\n refreshButton={{\n label: translations.actions.refresh,\n onRefresh: () => { void loadEntries() },\n isRefreshing: loading,\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: translations.actions.edit, onSelect: () => openEdit(row) },\n { id: 'delete', label: translations.actions.delete, destructive: true, onSelect: () => deleteEntry(row) },\n ]}\n />\n )}\n />\n </div>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit' ? translations.form.editTitle : translations.form.createTitle}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n schema={paymentFormSchema}\n fields={fields}\n initialValues={formValues}\n submitLabel={translations.form.save}\n onSubmit={handleSubmit}\n cancelHref={undefined}\n embedded\n isLoading={submitting}\n twoColumn\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {translations.form.cancel}\n </Button>\n )}\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </section>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["message"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
3
|
+
import { Label } from "@open-mercato/ui/primitives/label";
|
|
4
|
+
import { Switch } from "@open-mercato/ui/primitives/switch";
|
|
5
|
+
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
6
|
+
function renderProviderFieldInput(opts) {
|
|
7
|
+
const { field, value, onChange } = opts;
|
|
8
|
+
const common = { id: field.key, "data-provider-setting": field.key };
|
|
9
|
+
switch (field.type) {
|
|
10
|
+
case "textarea":
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
Textarea,
|
|
13
|
+
{
|
|
14
|
+
...common,
|
|
15
|
+
value: typeof value === "string" ? value : "",
|
|
16
|
+
onChange: (evt) => onChange(evt.target.value),
|
|
17
|
+
placeholder: field.placeholder
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
case "number":
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
Input,
|
|
23
|
+
{
|
|
24
|
+
...common,
|
|
25
|
+
type: "number",
|
|
26
|
+
value: typeof value === "number" || typeof value === "string" ? String(value) : "",
|
|
27
|
+
onChange: (evt) => onChange(evt.target.value === "" ? "" : Number(evt.target.value)),
|
|
28
|
+
placeholder: field.placeholder
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
case "boolean":
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
Switch,
|
|
35
|
+
{
|
|
36
|
+
id: field.key,
|
|
37
|
+
checked: Boolean(value),
|
|
38
|
+
onCheckedChange: (checked) => onChange(checked)
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: field.key, children: field.placeholder ?? "" })
|
|
42
|
+
] });
|
|
43
|
+
case "select":
|
|
44
|
+
return /* @__PURE__ */ jsxs(
|
|
45
|
+
"select",
|
|
46
|
+
{
|
|
47
|
+
...common,
|
|
48
|
+
className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
|
|
49
|
+
value: typeof value === "string" ? value : "",
|
|
50
|
+
onChange: (evt) => onChange(evt.target.value),
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx("option", { value: "", children: "\u2014" }),
|
|
53
|
+
(field.options ?? []).map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value))
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
case "secret":
|
|
58
|
+
return /* @__PURE__ */ jsx(
|
|
59
|
+
Input,
|
|
60
|
+
{
|
|
61
|
+
...common,
|
|
62
|
+
type: "password",
|
|
63
|
+
value: typeof value === "string" ? value : "",
|
|
64
|
+
onChange: (evt) => onChange(evt.target.value),
|
|
65
|
+
placeholder: field.placeholder
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
case "url":
|
|
69
|
+
case "text":
|
|
70
|
+
default:
|
|
71
|
+
return /* @__PURE__ */ jsx(
|
|
72
|
+
Input,
|
|
73
|
+
{
|
|
74
|
+
...common,
|
|
75
|
+
type: field.type === "url" ? "url" : "text",
|
|
76
|
+
value: typeof value === "string" ? value : "",
|
|
77
|
+
onChange: (evt) => onChange(evt.target.value),
|
|
78
|
+
placeholder: field.placeholder
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
renderProviderFieldInput
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=ProviderFieldInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/sales/components/ProviderFieldInput.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { isRecord } from '@open-mercato/shared/lib/utils'\nimport type { ProviderSettingField } from '../lib/providers'\n\nexport function renderProviderFieldInput(opts: {\n field: ProviderSettingField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const { field, value, onChange } = opts\n const common = { id: field.key, 'data-provider-setting': field.key }\n switch (field.type) {\n case 'textarea':\n return (\n <Textarea\n {...common}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'number':\n return (\n <Input\n {...common}\n type=\"number\"\n value={typeof value === 'number' || typeof value === 'string' ? String(value) : ''}\n onChange={(evt) => onChange(evt.target.value === '' ? '' : Number(evt.target.value))}\n placeholder={field.placeholder}\n />\n )\n case 'boolean':\n return (\n <div className=\"flex items-center gap-2 py-1\">\n <Switch\n id={field.key}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n <Label htmlFor={field.key}>{field.placeholder ?? ''}</Label>\n </div>\n )\n case 'select':\n return (\n <select\n {...common}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n >\n <option value=\"\">\u2014</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n case 'secret':\n return (\n <Input\n {...common}\n type=\"password\"\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n case 'url':\n case 'text':\n default:\n return (\n <Input\n {...common}\n type={field.type === 'url' ? 'url' : 'text'}\n value={typeof value === 'string' ? value : ''}\n onChange={(evt) => onChange(evt.target.value)}\n placeholder={field.placeholder}\n />\n )\n }\n}\n"],
|
|
5
|
+
"mappings": "AAiBQ,cAmBA,YAnBA;AAjBR,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAIlB,SAAS,yBAAyB,MAItC;AACD,QAAM,EAAE,OAAO,OAAO,SAAS,IAAI;AACnC,QAAM,SAAS,EAAE,IAAI,MAAM,KAAK,yBAAyB,MAAM,IAAI;AACnE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,QAAQ,SAAS,IAAI,OAAO,KAAK;AAAA,UAC5C,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,MAAK;AAAA,UACL,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAAA,UAChF,UAAU,CAAC,QAAQ,SAAS,IAAI,OAAO,UAAU,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC;AAAA,UACnF,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AACH,aACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,SAAS,QAAQ,KAAK;AAAA,YACtB,iBAAiB,CAAC,YAAY,SAAS,OAAO;AAAA;AAAA,QAChD;AAAA,QACA,oBAAC,SAAM,SAAS,MAAM,KAAM,gBAAM,eAAe,IAAG;AAAA,SACtD;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,WAAU;AAAA,UACV,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,QAAQ,SAAS,IAAI,OAAO,KAAK;AAAA,UAE5C;AAAA,gCAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,aAChB,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,QAC1B,oBAAC,YAAuB,OAAO,IAAI,OAChC,cAAI,SADM,IAAI,KAEjB,CACD;AAAA;AAAA;AAAA,MACH;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,MAAK;AAAA,UACL,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,QAAQ,SAAS,IAAI,OAAO,KAAK;AAAA,UAC5C,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,IAEJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,MAAM,MAAM,SAAS,QAAQ,QAAQ;AAAA,UACrC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAU,CAAC,QAAQ,SAAS,IAAI,OAAO,KAAK;AAAA,UAC5C,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,EAEN;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|