@open-mercato/core 0.6.3-develop.3894.1.352abf4240 → 0.6.3
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/.turbo/turbo-build.log +1 -1
- package/dist/global.d.js +1 -0
- package/dist/global.d.js.map +7 -0
- package/dist/modules/catalog/commands/variants.js +11 -5
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/create/page.js +3 -61
- package/dist/modules/customers/backend/customers/deals/create/page.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +2 -0
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/create/CreateDealForm.js +233 -0
- package/dist/modules/customers/components/detail/create/CreateDealForm.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsField.js +209 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsSection.js +67 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsSection.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCreateSidebar.js +73 -0
- package/dist/modules/customers/components/detail/create/DealCreateSidebar.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCurrencyField.js +92 -0
- package/dist/modules/customers/components/detail/create/DealCurrencyField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCustomAttributes.js +81 -0
- package/dist/modules/customers/components/detail/create/DealCustomAttributes.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealDetailsFields.js +171 -0
- package/dist/modules/customers/components/detail/create/DealDetailsFields.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealFormField.js +24 -0
- package/dist/modules/customers/components/detail/create/DealFormField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealSectionCard.js +29 -0
- package/dist/modules/customers/components/detail/create/DealSectionCard.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealTipsCard.js +19 -0
- package/dist/modules/customers/components/detail/create/DealTipsCard.js.map +7 -0
- package/dist/modules/customers/components/detail/create/PipelineSelect.js +41 -0
- package/dist/modules/customers/components/detail/create/PipelineSelect.js.map +7 -0
- package/dist/modules/customers/components/detail/create/PipelineStageSelect.js +49 -0
- package/dist/modules/customers/components/detail/create/PipelineStageSelect.js.map +7 -0
- package/dist/modules/customers/components/detail/create/SuffixInput.js +21 -0
- package/dist/modules/customers/components/detail/create/SuffixInput.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js +270 -0
- package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealFormTypes.js +17 -0
- package/dist/modules/customers/components/detail/create/dealFormTypes.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealNumericInput.js +16 -0
- package/dist/modules/customers/components/detail/create/dealNumericInput.js.map +7 -0
- package/dist/modules/customers/components/detail/create/useDealCustomFields.js +93 -0
- package/dist/modules/customers/components/detail/create/useDealCustomFields.js.map +7 -0
- package/dist/modules/customers/components/detail/create/useDealPipelines.js +59 -0
- package/dist/modules/customers/components/detail/create/useDealPipelines.js.map +7 -0
- package/dist/modules/customers/components/formConfig.js +4 -2
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +5 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/feature_toggles/lib/feature-flag-check.js +13 -5
- package/dist/modules/feature_toggles/lib/feature-flag-check.js.map +2 -2
- package/dist/modules/query_index/subscribers/coverage_refresh.js +6 -1
- package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
- package/dist/modules/sync_excel/widgets/injection/upload-config/target-options.js +33 -5
- package/dist/modules/sync_excel/widgets/injection/upload-config/target-options.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraph.js +29 -186
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +196 -0
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +7 -0
- package/package.json +8 -9
- package/src/global.d.ts +9 -0
- package/src/modules/catalog/commands/variants.ts +14 -5
- package/src/modules/customers/backend/customers/deals/create/page.tsx +3 -64
- package/src/modules/customers/components/detail/DealForm.tsx +2 -0
- package/src/modules/customers/components/detail/create/CreateDealForm.tsx +254 -0
- package/src/modules/customers/components/detail/create/DealAssociationsField.tsx +253 -0
- package/src/modules/customers/components/detail/create/DealAssociationsSection.tsx +72 -0
- package/src/modules/customers/components/detail/create/DealCreateSidebar.tsx +79 -0
- package/src/modules/customers/components/detail/create/DealCurrencyField.tsx +108 -0
- package/src/modules/customers/components/detail/create/DealCustomAttributes.tsx +118 -0
- package/src/modules/customers/components/detail/create/DealDetailsFields.tsx +171 -0
- package/src/modules/customers/components/detail/create/DealFormField.tsx +39 -0
- package/src/modules/customers/components/detail/create/DealSectionCard.tsx +40 -0
- package/src/modules/customers/components/detail/create/DealTipsCard.tsx +26 -0
- package/src/modules/customers/components/detail/create/PipelineSelect.tsx +55 -0
- package/src/modules/customers/components/detail/create/PipelineStageSelect.tsx +70 -0
- package/src/modules/customers/components/detail/create/SuffixInput.tsx +20 -0
- package/src/modules/customers/components/detail/create/dealCustomFieldControl.tsx +310 -0
- package/src/modules/customers/components/detail/create/dealFormTypes.ts +29 -0
- package/src/modules/customers/components/detail/create/dealNumericInput.ts +20 -0
- package/src/modules/customers/components/detail/create/useDealCustomFields.ts +118 -0
- package/src/modules/customers/components/detail/create/useDealPipelines.ts +80 -0
- package/src/modules/customers/components/formConfig.tsx +3 -0
- package/src/modules/customers/i18n/de.json +26 -0
- package/src/modules/customers/i18n/en.json +26 -0
- package/src/modules/customers/i18n/es.json +26 -0
- package/src/modules/customers/i18n/pl.json +26 -0
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +12 -1
- package/src/modules/feature_toggles/lib/feature-flag-check.ts +14 -4
- package/src/modules/query_index/subscribers/coverage_refresh.ts +7 -1
- package/src/modules/resources/i18n/de.json +1 -0
- package/src/modules/resources/i18n/en.json +1 -0
- package/src/modules/resources/i18n/es.json +1 -0
- package/src/modules/resources/i18n/pl.json +1 -0
- package/src/modules/sales/i18n/de.json +2 -0
- package/src/modules/sales/i18n/en.json +2 -0
- package/src/modules/sales/i18n/es.json +2 -0
- package/src/modules/sales/i18n/pl.json +2 -0
- package/src/modules/sync_excel/widgets/injection/upload-config/target-options.ts +40 -5
- package/src/modules/workflows/components/WorkflowGraph.tsx +39 -235
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +233 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { format } from "date-fns/format";
|
|
4
|
+
import { parseISO } from "date-fns/parseISO";
|
|
5
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
6
|
+
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
7
|
+
import { DatePicker } from "@open-mercato/ui/primitives/date-picker";
|
|
8
|
+
import { DictionarySelectField } from "../../formConfig.js";
|
|
9
|
+
import { DealFormField } from "./DealFormField.js";
|
|
10
|
+
import { PipelineSelect } from "./PipelineSelect.js";
|
|
11
|
+
import { PipelineStageSelect } from "./PipelineStageSelect.js";
|
|
12
|
+
import { SuffixInput } from "./SuffixInput.js";
|
|
13
|
+
import { DealCurrencyField } from "./DealCurrencyField.js";
|
|
14
|
+
import { sanitizeAmount, sanitizeProbability } from "./dealNumericInput.js";
|
|
15
|
+
function toDate(value) {
|
|
16
|
+
if (!value) return null;
|
|
17
|
+
const parsed = parseISO(value);
|
|
18
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
19
|
+
}
|
|
20
|
+
function DealDetailsFields({
|
|
21
|
+
values,
|
|
22
|
+
errors,
|
|
23
|
+
isSubmitting,
|
|
24
|
+
patch,
|
|
25
|
+
onPipelineChange,
|
|
26
|
+
pipelines,
|
|
27
|
+
stages,
|
|
28
|
+
statusLabels,
|
|
29
|
+
tr
|
|
30
|
+
}) {
|
|
31
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
DealFormField,
|
|
34
|
+
{
|
|
35
|
+
fieldId: "title",
|
|
36
|
+
label: tr("customers.deals.create.fields.title", "Deal title"),
|
|
37
|
+
required: true,
|
|
38
|
+
hint: tr("customers.deals.create.hints.title", "Short, descriptive name shown on pipeline cards"),
|
|
39
|
+
error: errors.title,
|
|
40
|
+
children: /* @__PURE__ */ jsx(
|
|
41
|
+
Input,
|
|
42
|
+
{
|
|
43
|
+
value: values.title,
|
|
44
|
+
onChange: (event) => patch({ title: event.target.value }),
|
|
45
|
+
"aria-invalid": errors.title ? true : void 0,
|
|
46
|
+
disabled: isSubmitting
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
|
|
52
|
+
/* @__PURE__ */ jsx(DealFormField, { fieldId: "status", label: tr("customers.people.detail.deals.fields.status", "Status"), children: /* @__PURE__ */ jsx(
|
|
53
|
+
DictionarySelectField,
|
|
54
|
+
{
|
|
55
|
+
kind: "deal-statuses",
|
|
56
|
+
value: values.status || void 0,
|
|
57
|
+
onChange: (next) => patch({ status: next ?? "" }),
|
|
58
|
+
labels: statusLabels,
|
|
59
|
+
selectClassName: "w-full",
|
|
60
|
+
showActiveAppearance: false
|
|
61
|
+
}
|
|
62
|
+
) }),
|
|
63
|
+
/* @__PURE__ */ jsx(DealFormField, { fieldId: "pipelineId", label: tr("customers.people.detail.deals.fields.pipeline", "Pipeline"), children: /* @__PURE__ */ jsx(
|
|
64
|
+
PipelineSelect,
|
|
65
|
+
{
|
|
66
|
+
pipelines,
|
|
67
|
+
value: values.pipelineId,
|
|
68
|
+
onChange: onPipelineChange,
|
|
69
|
+
disabled: isSubmitting,
|
|
70
|
+
placeholder: tr("customers.deals.form.pipeline.placeholder", "Select pipeline\u2026")
|
|
71
|
+
}
|
|
72
|
+
) })
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
DealFormField,
|
|
76
|
+
{
|
|
77
|
+
fieldId: "pipelineStageId",
|
|
78
|
+
label: tr("customers.people.detail.deals.fields.pipelineStage", "Pipeline stage"),
|
|
79
|
+
hint: tr("customers.deals.create.hints.pipelineStage", "Stages depend on the selected pipeline"),
|
|
80
|
+
children: /* @__PURE__ */ jsx(
|
|
81
|
+
PipelineStageSelect,
|
|
82
|
+
{
|
|
83
|
+
stages,
|
|
84
|
+
value: values.pipelineStageId,
|
|
85
|
+
onChange: (id) => patch({ pipelineStageId: id }),
|
|
86
|
+
disabled: isSubmitting || !values.pipelineId,
|
|
87
|
+
placeholder: tr("customers.deals.form.pipelineStage.placeholder", "Select stage\u2026"),
|
|
88
|
+
formatCount: (position, total) => tr("customers.deals.create.fields.stageOf", "\xB7 stage {position} of {total}", { position, total })
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
DealFormField,
|
|
96
|
+
{
|
|
97
|
+
fieldId: "valueAmount",
|
|
98
|
+
label: tr("customers.deals.create.fields.valueAmount", "Deal value"),
|
|
99
|
+
hint: tr("customers.deals.create.hints.valueAmount", "Potential revenue from this opportunity"),
|
|
100
|
+
error: errors.valueAmount,
|
|
101
|
+
children: /* @__PURE__ */ jsx(
|
|
102
|
+
SuffixInput,
|
|
103
|
+
{
|
|
104
|
+
suffix: values.valueCurrency,
|
|
105
|
+
inputMode: "decimal",
|
|
106
|
+
value: values.valueAmount,
|
|
107
|
+
onChange: (event) => patch({ valueAmount: sanitizeAmount(event.target.value) }),
|
|
108
|
+
placeholder: "0",
|
|
109
|
+
"aria-invalid": errors.valueAmount ? true : void 0,
|
|
110
|
+
disabled: isSubmitting
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsx(DealFormField, { fieldId: "valueCurrency", label: tr("customers.people.detail.deals.fields.valueCurrency", "Currency"), children: /* @__PURE__ */ jsx(
|
|
116
|
+
DealCurrencyField,
|
|
117
|
+
{
|
|
118
|
+
value: values.valueCurrency,
|
|
119
|
+
onChange: (code) => patch({ valueCurrency: code }),
|
|
120
|
+
disabled: isSubmitting
|
|
121
|
+
}
|
|
122
|
+
) })
|
|
123
|
+
] }),
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(
|
|
126
|
+
DealFormField,
|
|
127
|
+
{
|
|
128
|
+
fieldId: "probability",
|
|
129
|
+
label: tr("customers.deals.create.fields.probability", "Probability"),
|
|
130
|
+
hint: tr("customers.deals.create.hints.probability", "0 \u2013 100%, used for weighted pipeline value"),
|
|
131
|
+
error: errors.probability,
|
|
132
|
+
children: /* @__PURE__ */ jsx(
|
|
133
|
+
SuffixInput,
|
|
134
|
+
{
|
|
135
|
+
suffix: "%",
|
|
136
|
+
inputMode: "numeric",
|
|
137
|
+
value: values.probability,
|
|
138
|
+
onChange: (event) => patch({ probability: sanitizeProbability(event.target.value) }),
|
|
139
|
+
placeholder: "0",
|
|
140
|
+
"aria-invalid": errors.probability ? true : void 0,
|
|
141
|
+
disabled: isSubmitting
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
),
|
|
146
|
+
/* @__PURE__ */ jsx(DealFormField, { fieldId: "expectedCloseAt", label: tr("customers.deals.create.fields.expectedCloseAt", "Expected close date"), children: /* @__PURE__ */ jsx(
|
|
147
|
+
DatePicker,
|
|
148
|
+
{
|
|
149
|
+
value: toDate(values.expectedCloseAt),
|
|
150
|
+
onChange: (date) => patch({ expectedCloseAt: date ? format(date, "yyyy-MM-dd") : "" }),
|
|
151
|
+
disabled: isSubmitting,
|
|
152
|
+
placeholder: tr("customers.deals.create.fields.datePlaceholder", "Pick a date")
|
|
153
|
+
}
|
|
154
|
+
) })
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsx(DealFormField, { fieldId: "description", label: tr("customers.people.detail.deals.fields.description", "Description"), children: /* @__PURE__ */ jsx(
|
|
157
|
+
Textarea,
|
|
158
|
+
{
|
|
159
|
+
value: values.description,
|
|
160
|
+
onChange: (event) => patch({ description: event.target.value }),
|
|
161
|
+
disabled: isSubmitting
|
|
162
|
+
}
|
|
163
|
+
) })
|
|
164
|
+
] });
|
|
165
|
+
}
|
|
166
|
+
var DealDetailsFields_default = DealDetailsFields;
|
|
167
|
+
export {
|
|
168
|
+
DealDetailsFields,
|
|
169
|
+
DealDetailsFields_default as default
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=DealDetailsFields.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/DealDetailsFields.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { format } from 'date-fns/format'\nimport { parseISO } from 'date-fns/parseISO'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { DatePicker } from '@open-mercato/ui/primitives/date-picker'\nimport { DictionarySelectField } from '../../formConfig'\nimport { createDictionarySelectLabels } from '../utils'\nimport { DealFormField } from './DealFormField'\nimport { PipelineSelect } from './PipelineSelect'\nimport { PipelineStageSelect } from './PipelineStageSelect'\nimport { SuffixInput } from './SuffixInput'\nimport { DealCurrencyField } from './DealCurrencyField'\nimport { sanitizeAmount, sanitizeProbability } from './dealNumericInput'\nimport type { BaseValues } from './dealFormTypes'\nimport type { PipelineOption, PipelineStageOption } from './useDealPipelines'\n\ntype Translate = (key: string, fallback: string, params?: Record<string, string | number>) => string\n\nexport type DealDetailsFieldsProps = {\n values: BaseValues\n errors: Record<string, string>\n isSubmitting: boolean\n patch: (partial: Partial<BaseValues>) => void\n onPipelineChange: (id: string) => void\n pipelines: PipelineOption[]\n stages: PipelineStageOption[]\n statusLabels: ReturnType<typeof createDictionarySelectLabels>\n tr: Translate\n}\n\nfunction toDate(value: string): Date | null {\n if (!value) return null\n const parsed = parseISO(value)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nexport function DealDetailsFields({\n values,\n errors,\n isSubmitting,\n patch,\n onPipelineChange,\n pipelines,\n stages,\n statusLabels,\n tr,\n}: DealDetailsFieldsProps) {\n return (\n <>\n <DealFormField\n fieldId=\"title\"\n label={tr('customers.deals.create.fields.title', 'Deal title')}\n required\n hint={tr('customers.deals.create.hints.title', 'Short, descriptive name shown on pipeline cards')}\n error={errors.title}\n >\n <Input\n value={values.title}\n onChange={(event) => patch({ title: event.target.value })}\n aria-invalid={errors.title ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField fieldId=\"status\" label={tr('customers.people.detail.deals.fields.status', 'Status')}>\n <DictionarySelectField\n kind=\"deal-statuses\"\n value={values.status || undefined}\n onChange={(next) => patch({ status: next ?? '' })}\n labels={statusLabels}\n selectClassName=\"w-full\"\n showActiveAppearance={false}\n />\n </DealFormField>\n <DealFormField fieldId=\"pipelineId\" label={tr('customers.people.detail.deals.fields.pipeline', 'Pipeline')}>\n <PipelineSelect\n pipelines={pipelines}\n value={values.pipelineId}\n onChange={onPipelineChange}\n disabled={isSubmitting}\n placeholder={tr('customers.deals.form.pipeline.placeholder', 'Select pipeline\u2026')}\n />\n </DealFormField>\n </div>\n\n <DealFormField\n fieldId=\"pipelineStageId\"\n label={tr('customers.people.detail.deals.fields.pipelineStage', 'Pipeline stage')}\n hint={tr('customers.deals.create.hints.pipelineStage', 'Stages depend on the selected pipeline')}\n >\n <PipelineStageSelect\n stages={stages}\n value={values.pipelineStageId}\n onChange={(id) => patch({ pipelineStageId: id })}\n disabled={isSubmitting || !values.pipelineId}\n placeholder={tr('customers.deals.form.pipelineStage.placeholder', 'Select stage\u2026')}\n formatCount={(position, total) =>\n tr('customers.deals.create.fields.stageOf', '\u00B7 stage {position} of {total}', { position, total })\n }\n />\n </DealFormField>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField\n fieldId=\"valueAmount\"\n label={tr('customers.deals.create.fields.valueAmount', 'Deal value')}\n hint={tr('customers.deals.create.hints.valueAmount', 'Potential revenue from this opportunity')}\n error={errors.valueAmount}\n >\n <SuffixInput\n suffix={values.valueCurrency}\n inputMode=\"decimal\"\n value={values.valueAmount}\n onChange={(event) => patch({ valueAmount: sanitizeAmount(event.target.value) })}\n placeholder=\"0\"\n aria-invalid={errors.valueAmount ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n <DealFormField fieldId=\"valueCurrency\" label={tr('customers.people.detail.deals.fields.valueCurrency', 'Currency')}>\n <DealCurrencyField\n value={values.valueCurrency}\n onChange={(code) => patch({ valueCurrency: code })}\n disabled={isSubmitting}\n />\n </DealFormField>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <DealFormField\n fieldId=\"probability\"\n label={tr('customers.deals.create.fields.probability', 'Probability')}\n hint={tr('customers.deals.create.hints.probability', '0 \u2013 100%, used for weighted pipeline value')}\n error={errors.probability}\n >\n <SuffixInput\n suffix=\"%\"\n inputMode=\"numeric\"\n value={values.probability}\n onChange={(event) => patch({ probability: sanitizeProbability(event.target.value) })}\n placeholder=\"0\"\n aria-invalid={errors.probability ? true : undefined}\n disabled={isSubmitting}\n />\n </DealFormField>\n <DealFormField fieldId=\"expectedCloseAt\" label={tr('customers.deals.create.fields.expectedCloseAt', 'Expected close date')}>\n <DatePicker\n value={toDate(values.expectedCloseAt)}\n onChange={(date) => patch({ expectedCloseAt: date ? format(date, 'yyyy-MM-dd') : '' })}\n disabled={isSubmitting}\n placeholder={tr('customers.deals.create.fields.datePlaceholder', 'Pick a date')}\n />\n </DealFormField>\n </div>\n\n <DealFormField fieldId=\"description\" label={tr('customers.people.detail.deals.fields.description', 'Description')}>\n <Textarea\n value={values.description}\n onChange={(event) => patch({ description: event.target.value })}\n disabled={isSubmitting}\n />\n </DealFormField>\n </>\n )\n}\n\nexport default DealDetailsFields\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Label } from "@open-mercato/ui/primitives/label";
|
|
5
|
+
function DealFormField({ label, fieldId, required, hint, error, children }) {
|
|
6
|
+
const generatedId = React.useId();
|
|
7
|
+
const controlId = fieldId ?? generatedId;
|
|
8
|
+
const control = React.isValidElement(children) ? React.cloneElement(children, { id: controlId }) : children;
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", "data-crud-field-id": fieldId, children: [
|
|
10
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor: controlId, children: [
|
|
11
|
+
label,
|
|
12
|
+
required ? /* @__PURE__ */ jsx("span", { className: "text-destructive", children: " *" }) : null
|
|
13
|
+
] }),
|
|
14
|
+
control,
|
|
15
|
+
hint ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: hint }) : null,
|
|
16
|
+
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-status-error-text", children: error }) : null
|
|
17
|
+
] });
|
|
18
|
+
}
|
|
19
|
+
var DealFormField_default = DealFormField;
|
|
20
|
+
export {
|
|
21
|
+
DealFormField,
|
|
22
|
+
DealFormField_default as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=DealFormField.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/DealFormField.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Label } from '@open-mercato/ui/primitives/label'\n\nexport type DealFormFieldProps = {\n label: string\n /**\n * Stable field key exposed as `data-crud-field-id` and used as the control's `id`.\n * Lets Playwright target the control via the project's `data-crud-field-id` convention\n * (see .ai/lessons.md). Falls back to a generated id for label/control association only.\n */\n fieldId?: string\n required?: boolean\n hint?: string\n error?: string\n children: React.ReactNode\n}\n\nexport function DealFormField({ label, fieldId, required, hint, error, children }: DealFormFieldProps) {\n const generatedId = React.useId()\n const controlId = fieldId ?? generatedId\n const control = React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<{ id?: string }>, { id: controlId })\n : children\n return (\n <div className=\"space-y-2\" data-crud-field-id={fieldId}>\n <Label htmlFor={controlId}>\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {control}\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-status-error-text\">{error}</p> : null}\n </div>\n )\n}\n\nexport default DealFormField\n"],
|
|
5
|
+
"mappings": ";AA2BM,SAEc,KAFd;AAzBN,YAAY,WAAW;AACvB,SAAS,aAAa;AAgBf,SAAS,cAAc,EAAE,OAAO,SAAS,UAAU,MAAM,OAAO,SAAS,GAAuB;AACrG,QAAM,cAAc,MAAM,MAAM;AAChC,QAAM,YAAY,WAAW;AAC7B,QAAM,UAAU,MAAM,eAAe,QAAQ,IACzC,MAAM,aAAa,UAAiD,EAAE,IAAI,UAAU,CAAC,IACrF;AACJ,SACE,qBAAC,SAAI,WAAU,aAAY,sBAAoB,SAC7C;AAAA,yBAAC,SAAM,SAAS,WACb;AAAA;AAAA,MACA,WAAW,oBAAC,UAAK,WAAU,oBAAmB,gBAAE,IAAU;AAAA,OAC7D;AAAA,IACC;AAAA,IACA,OAAO,oBAAC,OAAE,WAAU,iCAAiC,gBAAK,IAAO;AAAA,IACjE,QAAQ,oBAAC,OAAE,WAAU,kCAAkC,iBAAM,IAAO;AAAA,KACvE;AAEJ;AAEA,IAAO,wBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@open-mercato/shared/lib/utils";
|
|
4
|
+
function DealSectionCard({
|
|
5
|
+
icon: Icon,
|
|
6
|
+
title,
|
|
7
|
+
subtitle,
|
|
8
|
+
actions,
|
|
9
|
+
children,
|
|
10
|
+
className
|
|
11
|
+
}) {
|
|
12
|
+
return /* @__PURE__ */ jsxs("section", { className: cn("rounded-lg border border-border bg-card shadow-sm p-6 space-y-6", className), children: [
|
|
13
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
14
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [
|
|
15
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-8 shrink-0 items-center justify-center rounded-md bg-brand-violet/10", children: /* @__PURE__ */ jsx(Icon, { className: "size-4 text-brand-violet" }) }),
|
|
16
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
|
|
17
|
+
/* @__PURE__ */ jsx("p", { className: "text-base font-semibold text-foreground", children: title }),
|
|
18
|
+
subtitle ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: subtitle }) : null
|
|
19
|
+
] })
|
|
20
|
+
] }),
|
|
21
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions }) : null
|
|
22
|
+
] }),
|
|
23
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4", children })
|
|
24
|
+
] });
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
DealSectionCard
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=DealSectionCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/DealSectionCard.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\n\nexport type DealSectionCardProps = {\n icon: React.ComponentType<{ className?: string }>\n title: string\n subtitle?: React.ReactNode\n actions?: React.ReactNode\n children: React.ReactNode\n className?: string\n}\n\nexport function DealSectionCard({\n icon: Icon,\n title,\n subtitle,\n actions,\n children,\n className,\n}: DealSectionCardProps) {\n return (\n <section className={cn('rounded-lg border border-border bg-card shadow-sm p-6 space-y-6', className)}>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-brand-violet/10\">\n <Icon className=\"size-4 text-brand-violet\" />\n </div>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <p className=\"text-base font-semibold text-foreground\">{title}</p>\n {subtitle ? <p className=\"text-xs text-muted-foreground\">{subtitle}</p> : null}\n </div>\n </div>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n <div className=\"space-y-4\">{children}</div>\n </section>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AA2BY,cAEF,YAFE;AAxBZ,SAAS,UAAU;AAWZ,SAAS,gBAAgB;AAAA,EAC9B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,SACE,qBAAC,aAAQ,WAAW,GAAG,mEAAmE,SAAS,GACjG;AAAA,yBAAC,SAAI,WAAU,2CACb;AAAA,2BAAC,SAAI,WAAU,mCACb;AAAA,4BAAC,SAAI,WAAU,kFACb,8BAAC,QAAK,WAAU,4BAA2B,GAC7C;AAAA,QACA,qBAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,OAAE,WAAU,2CAA2C,iBAAM;AAAA,UAC7D,WAAW,oBAAC,OAAE,WAAU,iCAAiC,oBAAS,IAAO;AAAA,WAC5E;AAAA,SACF;AAAA,MACC,UAAU,oBAAC,SAAI,WAAU,oCAAoC,mBAAQ,IAAS;AAAA,OACjF;AAAA,IACA,oBAAC,SAAI,WAAU,aAAa,UAAS;AAAA,KACvC;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Wand2 } from "lucide-react";
|
|
4
|
+
function DealTipsCard({ title, tips }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border-l-4 border-status-info-border bg-status-info-bg px-5 py-4 space-y-3", children: [
|
|
6
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
7
|
+
/* @__PURE__ */ jsx(Wand2, { className: "size-4 text-status-info-icon" }),
|
|
8
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-status-info-text", children: title })
|
|
9
|
+
] }),
|
|
10
|
+
tips.map((tip, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
|
|
11
|
+
/* @__PURE__ */ jsx("span", { className: "mt-1.5 size-1.5 shrink-0 rounded-full bg-status-info-icon" }),
|
|
12
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tip })
|
|
13
|
+
] }, `${tip}-${index}`))
|
|
14
|
+
] });
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
DealTipsCard
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=DealTipsCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/DealTipsCard.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Wand2 } from 'lucide-react'\n\nexport type DealTipsCardProps = {\n title: string\n tips: string[]\n}\n\nexport function DealTipsCard({ title, tips }: DealTipsCardProps) {\n return (\n <div className=\"rounded-lg border-l-4 border-status-info-border bg-status-info-bg px-5 py-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Wand2 className=\"size-4 text-status-info-icon\" />\n <p className=\"text-sm font-semibold text-status-info-text\">{title}</p>\n </div>\n {tips.map((tip, index) => (\n <div key={`${tip}-${index}`} className=\"flex items-start gap-2\">\n <span className=\"mt-1.5 size-1.5 shrink-0 rounded-full bg-status-info-icon\" />\n <p className=\"text-xs text-muted-foreground\">{tip}</p>\n </div>\n ))}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAaM,SACE,KADF;AAVN,SAAS,aAAa;AAOf,SAAS,aAAa,EAAE,OAAO,KAAK,GAAsB;AAC/D,SACE,qBAAC,SAAI,WAAU,yFACb;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAM,WAAU,gCAA+B;AAAA,MAChD,oBAAC,OAAE,WAAU,+CAA+C,iBAAM;AAAA,OACpE;AAAA,IACC,KAAK,IAAI,CAAC,KAAK,UACd,qBAAC,SAA4B,WAAU,0BACrC;AAAA,0BAAC,UAAK,WAAU,6DAA4D;AAAA,MAC5E,oBAAC,OAAE,WAAU,iCAAiC,eAAI;AAAA,SAF1C,GAAG,GAAG,IAAI,KAAK,EAGzB,CACD;AAAA,KACH;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Flag } from "lucide-react";
|
|
4
|
+
import {
|
|
5
|
+
Select,
|
|
6
|
+
SelectContent,
|
|
7
|
+
SelectItem,
|
|
8
|
+
SelectTrigger,
|
|
9
|
+
SelectTriggerLeading,
|
|
10
|
+
SelectValue
|
|
11
|
+
} from "@open-mercato/ui/primitives/select";
|
|
12
|
+
function PipelineSelect({
|
|
13
|
+
id,
|
|
14
|
+
pipelines,
|
|
15
|
+
value,
|
|
16
|
+
onChange,
|
|
17
|
+
disabled = false,
|
|
18
|
+
placeholder
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsxs(
|
|
21
|
+
Select,
|
|
22
|
+
{
|
|
23
|
+
value: typeof value === "string" && value ? value : void 0,
|
|
24
|
+
onValueChange: (next) => onChange(next ?? ""),
|
|
25
|
+
disabled,
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ jsxs(SelectTrigger, { id, size: "default", children: [
|
|
28
|
+
/* @__PURE__ */ jsx(SelectTriggerLeading, { children: /* @__PURE__ */ jsx(Flag, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }) }),
|
|
29
|
+
/* @__PURE__ */ jsx(SelectValue, { placeholder })
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsx(SelectContent, { children: pipelines.map((pipeline) => /* @__PURE__ */ jsx(SelectItem, { value: pipeline.id, children: pipeline.name }, pipeline.id)) })
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
var PipelineSelect_default = PipelineSelect;
|
|
37
|
+
export {
|
|
38
|
+
PipelineSelect,
|
|
39
|
+
PipelineSelect_default as default
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=PipelineSelect.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/PipelineSelect.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Flag } from 'lucide-react'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectTriggerLeading,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport type { PipelineOption } from './useDealPipelines'\n\nexport type PipelineSelectProps = {\n id?: string\n pipelines: PipelineOption[]\n value?: string | null\n onChange: (id: string) => void\n disabled?: boolean\n placeholder: string\n}\n\nexport function PipelineSelect({\n id,\n pipelines,\n value,\n onChange,\n disabled = false,\n placeholder,\n}: PipelineSelectProps) {\n return (\n <Select\n value={typeof value === 'string' && value ? value : undefined}\n onValueChange={(next) => onChange(next ?? '')}\n disabled={disabled}\n >\n <SelectTrigger id={id} size=\"default\">\n <SelectTriggerLeading>\n <Flag className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectTriggerLeading>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {pipelines.map((pipeline) => (\n <SelectItem key={pipeline.id} value={pipeline.id}>\n {pipeline.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport default PipelineSelect\n"],
|
|
5
|
+
"mappings": ";AAqCM,SAEI,KAFJ;AAlCN,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYA,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAwB;AACtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AAAA,MACpD,eAAe,CAAC,SAAS,SAAS,QAAQ,EAAE;AAAA,MAC5C;AAAA,MAEA;AAAA,6BAAC,iBAAc,IAAQ,MAAK,WAC1B;AAAA,8BAAC,wBACC,8BAAC,QAAK,WAAU,gCAA+B,eAAY,QAAO,GACpE;AAAA,UACA,oBAAC,eAAY,aAA0B;AAAA,WACzC;AAAA,QACA,oBAAC,iBACE,oBAAU,IAAI,CAAC,aACd,oBAAC,cAA6B,OAAO,SAAS,IAC3C,mBAAS,QADK,SAAS,EAE1B,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import {
|
|
5
|
+
Select,
|
|
6
|
+
SelectContent,
|
|
7
|
+
SelectItem,
|
|
8
|
+
SelectTrigger,
|
|
9
|
+
SelectValue
|
|
10
|
+
} from "@open-mercato/ui/primitives/select";
|
|
11
|
+
function PipelineStageSelect({
|
|
12
|
+
id,
|
|
13
|
+
stages,
|
|
14
|
+
value,
|
|
15
|
+
onChange,
|
|
16
|
+
disabled = false,
|
|
17
|
+
placeholder,
|
|
18
|
+
formatCount
|
|
19
|
+
}) {
|
|
20
|
+
const selectedIndex = React.useMemo(
|
|
21
|
+
() => value ? stages.findIndex((stage) => stage.id === value) : -1,
|
|
22
|
+
[stages, value]
|
|
23
|
+
);
|
|
24
|
+
const selectedStage = selectedIndex >= 0 ? stages[selectedIndex] : null;
|
|
25
|
+
return /* @__PURE__ */ jsxs(
|
|
26
|
+
Select,
|
|
27
|
+
{
|
|
28
|
+
value: typeof value === "string" && value ? value : void 0,
|
|
29
|
+
onValueChange: (next) => onChange(next ?? ""),
|
|
30
|
+
disabled: disabled || !stages.length,
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id, size: "default", children: /* @__PURE__ */ jsx(SelectValue, { placeholder, children: selectedStage ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-2 truncate", children: [
|
|
33
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: selectedStage.label }),
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: formatCount(selectedIndex + 1, stages.length) })
|
|
35
|
+
] }) : null }) }),
|
|
36
|
+
/* @__PURE__ */ jsx(SelectContent, { children: stages.map((stage, index) => /* @__PURE__ */ jsxs(SelectItem, { value: stage.id, children: [
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: stage.label }),
|
|
38
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: formatCount(index + 1, stages.length) })
|
|
39
|
+
] }, stage.id)) })
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
var PipelineStageSelect_default = PipelineStageSelect;
|
|
45
|
+
export {
|
|
46
|
+
PipelineStageSelect,
|
|
47
|
+
PipelineStageSelect_default as default
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=PipelineStageSelect.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/PipelineStageSelect.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport type { PipelineStageOption } from './useDealPipelines'\n\nexport type PipelineStageSelectProps = {\n id?: string\n stages: PipelineStageOption[]\n value?: string | null\n onChange: (id: string) => void\n disabled?: boolean\n placeholder: string\n formatCount: (position: number, total: number) => string\n}\n\nexport function PipelineStageSelect({\n id,\n stages,\n value,\n onChange,\n disabled = false,\n placeholder,\n formatCount,\n}: PipelineStageSelectProps) {\n const selectedIndex = React.useMemo(\n () => (value ? stages.findIndex((stage) => stage.id === value) : -1),\n [stages, value],\n )\n const selectedStage = selectedIndex >= 0 ? stages[selectedIndex] : null\n\n return (\n <Select\n value={typeof value === 'string' && value ? value : undefined}\n onValueChange={(next) => onChange(next ?? '')}\n disabled={disabled || !stages.length}\n >\n <SelectTrigger id={id} size=\"default\">\n <SelectValue placeholder={placeholder}>\n {selectedStage ? (\n <span className=\"flex min-w-0 items-center gap-2 truncate\">\n <span className=\"truncate\">{selectedStage.label}</span>\n <span className=\"text-muted-foreground\">\n {formatCount(selectedIndex + 1, stages.length)}\n </span>\n </span>\n ) : null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {stages.map((stage, index) => (\n <SelectItem key={stage.id} value={stage.id}>\n <span className=\"truncate\">{stage.label}</span>\n <span className=\"text-muted-foreground\">\n {formatCount(index + 1, stages.length)}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport default PipelineStageSelect\n"],
|
|
5
|
+
"mappings": ";AA8CY,SACE,KADF;AA5CZ,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaA,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,gBAAgB,MAAM;AAAA,IAC1B,MAAO,QAAQ,OAAO,UAAU,CAAC,UAAU,MAAM,OAAO,KAAK,IAAI;AAAA,IACjE,CAAC,QAAQ,KAAK;AAAA,EAChB;AACA,QAAM,gBAAgB,iBAAiB,IAAI,OAAO,aAAa,IAAI;AAEnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AAAA,MACpD,eAAe,CAAC,SAAS,SAAS,QAAQ,EAAE;AAAA,MAC5C,UAAU,YAAY,CAAC,OAAO;AAAA,MAE9B;AAAA,4BAAC,iBAAc,IAAQ,MAAK,WAC1B,8BAAC,eAAY,aACV,0BACC,qBAAC,UAAK,WAAU,4CACd;AAAA,8BAAC,UAAK,WAAU,YAAY,wBAAc,OAAM;AAAA,UAChD,oBAAC,UAAK,WAAU,yBACb,sBAAY,gBAAgB,GAAG,OAAO,MAAM,GAC/C;AAAA,WACF,IACE,MACN,GACF;AAAA,QACA,oBAAC,iBACE,iBAAO,IAAI,CAAC,OAAO,UAClB,qBAAC,cAA0B,OAAO,MAAM,IACtC;AAAA,8BAAC,UAAK,WAAU,YAAY,gBAAM,OAAM;AAAA,UACxC,oBAAC,UAAK,WAAU,yBACb,sBAAY,QAAQ,GAAG,OAAO,MAAM,GACvC;AAAA,aAJe,MAAM,EAKvB,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,8BAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
5
|
+
const SuffixInput = React.forwardRef(
|
|
6
|
+
({ suffix, ...props }, ref) => {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
Input,
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
rightIcon: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-muted-foreground", children: suffix }),
|
|
12
|
+
...props
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
SuffixInput.displayName = "SuffixInput";
|
|
18
|
+
export {
|
|
19
|
+
SuffixInput
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=SuffixInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/customers/components/detail/create/SuffixInput.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Input } from '@open-mercato/ui/primitives/input'\n\nexport type SuffixInputProps = React.ComponentPropsWithoutRef<typeof Input> & { suffix: string }\n\nexport const SuffixInput = React.forwardRef<HTMLInputElement, SuffixInputProps>(\n ({ suffix, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n rightIcon={<span className=\"text-sm font-medium text-muted-foreground\">{suffix}</span>}\n {...props}\n />\n )\n }\n)\n\nSuffixInput.displayName = 'SuffixInput'\n"],
|
|
5
|
+
"mappings": ";AAYmB;AAVnB,YAAY,WAAW;AACvB,SAAS,aAAa;AAIf,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,oBAAC,UAAK,WAAU,6CAA6C,kBAAO;AAAA,QAC9E,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|