@endora-commerce/mod-quote-requests 0.100.0
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/admin/index.d.ts +26 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +56 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/RfqCreatePage.d.ts +9 -0
- package/dist/admin/pages/RfqCreatePage.d.ts.map +1 -0
- package/dist/admin/pages/RfqCreatePage.js +163 -0
- package/dist/admin/pages/RfqCreatePage.js.map +1 -0
- package/dist/admin/pages/RfqDetail.d.ts +9 -0
- package/dist/admin/pages/RfqDetail.d.ts.map +1 -0
- package/dist/admin/pages/RfqDetail.js +399 -0
- package/dist/admin/pages/RfqDetail.js.map +1 -0
- package/dist/admin/pages/RfqList.d.ts +9 -0
- package/dist/admin/pages/RfqList.d.ts.map +1 -0
- package/dist/admin/pages/RfqList.js +214 -0
- package/dist/admin/pages/RfqList.js.map +1 -0
- package/dist/admin/validity.d.ts +52 -0
- package/dist/admin/validity.d.ts.map +1 -0
- package/dist/admin/validity.js +61 -0
- package/dist/admin/validity.js.map +1 -0
- package/dist/backend/entities/quote-request-event.entity.d.ts +24 -0
- package/dist/backend/entities/quote-request-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-event.entity.js +67 -0
- package/dist/backend/entities/quote-request-event.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-item.entity.d.ts +34 -0
- package/dist/backend/entities/quote-request-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-item.entity.js +119 -0
- package/dist/backend/entities/quote-request-item.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-notification-event.entity.d.ts +23 -0
- package/dist/backend/entities/quote-request-notification-event.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-notification-event.entity.js +72 -0
- package/dist/backend/entities/quote-request-notification-event.entity.js.map +1 -0
- package/dist/backend/entities/quote-request-revision.entity.d.ts +35 -0
- package/dist/backend/entities/quote-request-revision.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request-revision.entity.js +67 -0
- package/dist/backend/entities/quote-request-revision.entity.js.map +1 -0
- package/dist/backend/entities/quote-request.entity.d.ts +90 -0
- package/dist/backend/entities/quote-request.entity.d.ts.map +1 -0
- package/dist/backend/entities/quote-request.entity.js +191 -0
- package/dist/backend/entities/quote-request.entity.js.map +1 -0
- package/dist/backend/index.d.ts +120 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +361 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +95 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +152 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +13 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +82 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.customer.d.ts +18 -0
- package/dist/backend/routes.customer.d.ts.map +1 -0
- package/dist/backend/routes.customer.js +98 -0
- package/dist/backend/routes.customer.js.map +1 -0
- package/dist/backend/routes.sales-reps.d.ts +12 -0
- package/dist/backend/routes.sales-reps.d.ts.map +1 -0
- package/dist/backend/routes.sales-reps.js +57 -0
- package/dist/backend/routes.sales-reps.js.map +1 -0
- package/dist/backend/services/order-completion-reactor.d.ts +32 -0
- package/dist/backend/services/order-completion-reactor.d.ts.map +1 -0
- package/dist/backend/services/order-completion-reactor.js +57 -0
- package/dist/backend/services/order-completion-reactor.js.map +1 -0
- package/dist/backend/services/quote-request-business-id-generator.d.ts +46 -0
- package/dist/backend/services/quote-request-business-id-generator.d.ts.map +1 -0
- package/dist/backend/services/quote-request-business-id-generator.js +69 -0
- package/dist/backend/services/quote-request-business-id-generator.js.map +1 -0
- package/dist/backend/services/quote-request-read-port.d.ts +36 -0
- package/dist/backend/services/quote-request-read-port.d.ts.map +1 -0
- package/dist/backend/services/quote-request-read-port.js +96 -0
- package/dist/backend/services/quote-request-read-port.js.map +1 -0
- package/dist/backend/services/raised-on-channel.d.ts +23 -0
- package/dist/backend/services/raised-on-channel.d.ts.map +1 -0
- package/dist/backend/services/raised-on-channel.js +26 -0
- package/dist/backend/services/raised-on-channel.js.map +1 -0
- package/dist/backend/services/rfq-admin-service.d.ts +75 -0
- package/dist/backend/services/rfq-admin-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-admin-service.js +487 -0
- package/dist/backend/services/rfq-admin-service.js.map +1 -0
- package/dist/backend/services/rfq-event-service.d.ts +32 -0
- package/dist/backend/services/rfq-event-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-event-service.js +28 -0
- package/dist/backend/services/rfq-event-service.js.map +1 -0
- package/dist/backend/services/rfq-expiry-worker.d.ts +50 -0
- package/dist/backend/services/rfq-expiry-worker.d.ts.map +1 -0
- package/dist/backend/services/rfq-expiry-worker.js +70 -0
- package/dist/backend/services/rfq-expiry-worker.js.map +1 -0
- package/dist/backend/services/rfq-notification-service.d.ts +36 -0
- package/dist/backend/services/rfq-notification-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-notification-service.js +52 -0
- package/dist/backend/services/rfq-notification-service.js.map +1 -0
- package/dist/backend/services/rfq-revision-service.d.ts +70 -0
- package/dist/backend/services/rfq-revision-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-revision-service.js +120 -0
- package/dist/backend/services/rfq-revision-service.js.map +1 -0
- package/dist/backend/services/rfq-service.d.ts +140 -0
- package/dist/backend/services/rfq-service.d.ts.map +1 -0
- package/dist/backend/services/rfq-service.js +786 -0
- package/dist/backend/services/rfq-service.js.map +1 -0
- package/dist/backend/services/sales-channel-attributions.d.ts +38 -0
- package/dist/backend/services/sales-channel-attributions.d.ts.map +1 -0
- package/dist/backend/services/sales-channel-attributions.js +48 -0
- package/dist/backend/services/sales-channel-attributions.js.map +1 -0
- package/dist/manifest.d.ts +203 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +277 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260424T190112_quote_requests_init.d.ts +19 -0
- package/dist/migrations/20260424T190112_quote_requests_init.d.ts.map +1 -0
- package/dist/migrations/20260424T190112_quote_requests_init.js +65 -0
- package/dist/migrations/20260424T190112_quote_requests_init.js.map +1 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts +37 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts.map +1 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.js +251 -0
- package/dist/migrations/20260503T141344_quote_requests_workflow.js.map +1 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts +10 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts.map +1 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js +16 -0
- package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js.map +1 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts +24 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts.map +1 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.js +34 -0
- package/dist/migrations/20260611T140417_quote_requests_business_id.js.map +1 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts +21 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts.map +1 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js +29 -0
- package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js.map +1 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js.map +1 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts +34 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts.map +1 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js +57 -0
- package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js.map +1 -0
- package/dist/migrations/index.d.ts +53 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +61 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/status-mapping.d.ts +18 -0
- package/dist/migrations/status-mapping.d.ts.map +1 -0
- package/dist/migrations/status-mapping.js +28 -0
- package/dist/migrations/status-mapping.js.map +1 -0
- package/docs/quote_requests.md +168 -0
- package/i18n/en.json +14 -0
- package/i18n/pl.json +14 -0
- package/package.json +99 -0
- package/tailwind.css +14 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
|
|
2
|
+
|
|
3
|
+
# @endora-commerce/mod-quote-requests
|
|
4
|
+
|
|
5
|
+
Customer-initiated RFQ workflow with admin pricing, approvals, and expiry.
|
|
6
|
+
|
|
7
|
+
## What this is
|
|
8
|
+
|
|
9
|
+
An **Endora Commerce module package**. Its module id is `quote_requests` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
|
|
10
|
+
|
|
11
|
+
A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
|
|
12
|
+
|
|
13
|
+
## Entry points
|
|
14
|
+
|
|
15
|
+
| Import | Contents |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `@endora-commerce/mod-quote-requests` | the module manifest — its id, version, dependencies, settings and activation |
|
|
18
|
+
| `@endora-commerce/mod-quote-requests/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
|
|
19
|
+
| `@endora-commerce/mod-quote-requests/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
|
|
20
|
+
| `@endora-commerce/mod-quote-requests/migrations` | the module’s own schema migrations, in the order the platform runs them |
|
|
21
|
+
| `@endora-commerce/mod-quote-requests/tailwind.css` | the Tailwind source declaration for the admin code above |
|
|
22
|
+
|
|
23
|
+
## Depends on
|
|
24
|
+
|
|
25
|
+
Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
|
|
26
|
+
|
|
27
|
+
**Endora packages**
|
|
28
|
+
|
|
29
|
+
- `@endora-commerce/admin-kit` — *optional*
|
|
30
|
+
- `@endora-commerce/contracts`
|
|
31
|
+
- `@endora-commerce/platform`
|
|
32
|
+
|
|
33
|
+
**Third-party**
|
|
34
|
+
|
|
35
|
+
- `@mikro-orm/core` ^6
|
|
36
|
+
- `@mikro-orm/migrations` ^6
|
|
37
|
+
- `@mikro-orm/postgresql` ^6
|
|
38
|
+
- `fastify` ^5
|
|
39
|
+
- `lucide-react` ^1 — *optional*
|
|
40
|
+
- `react` ^19 — *optional*
|
|
41
|
+
- `react-router-dom` ^7 — *optional*
|
|
42
|
+
- `zod` ^4
|
|
43
|
+
|
|
44
|
+
## What the tarball carries
|
|
45
|
+
|
|
46
|
+
- `dist/` — the compiled JavaScript and its type declarations
|
|
47
|
+
- `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
|
|
48
|
+
- `docs/` — the package’s own pages in the Endora Commerce documentation site
|
|
49
|
+
- `tailwind.css` — the Tailwind source declaration
|
|
50
|
+
|
|
51
|
+
## Install
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pnpm add @endora-commerce/mod-quote-requests
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Licence
|
|
58
|
+
|
|
59
|
+
MIT — the text is in `LICENSE`, beside this file.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `quote_requests`' admin surface — three routes and one sidebar entry,
|
|
3
|
+
* declared by the module that owns them (feature 091, Phase 4, batch 12;
|
|
4
|
+
* `specs/091-module-owned-admin-surfaces/contracts/admin-contribution.md`).
|
|
5
|
+
*
|
|
6
|
+
* **Its drain is zero, re-derived on this branch before anything moved.** No
|
|
7
|
+
* shard in `backend/scripts/ledgers/cross-module-imports/`, no key in
|
|
8
|
+
* `admin-surface.ts`, none in `foreign-module-ids.ts`, and nothing outside
|
|
9
|
+
* `App.tsx` reached into the directory. The plan recorded its remaining debt as
|
|
10
|
+
* one `Section` reach into `orders`' admin directory, and P8 did not repair it —
|
|
11
|
+
* it made it stop existing: `Section` is `@endora-commerce/admin-kit/ui`'s now,
|
|
12
|
+
* so the reach is a bare specifier into a published `exports` map.
|
|
13
|
+
*
|
|
14
|
+
* **The hand-written `PALETTE_ITEMS` row is deleted and nothing replaces it**,
|
|
15
|
+
* because the manifest already declares `open-rfq-inbox` with the same
|
|
16
|
+
* destination, the same code and the same keywords. A hand-written palette row
|
|
17
|
+
* is a copy the server was never asked about — for a module an operator really
|
|
18
|
+
* can withdraw, it goes on advertising the screen after the withdrawal — and
|
|
19
|
+
* this one was a duplicate of a declaration that has been there all along.
|
|
20
|
+
*
|
|
21
|
+
* **This entry exports data and nothing else** (R2); every component is a
|
|
22
|
+
* dynamic-import factory (R6).
|
|
23
|
+
*/
|
|
24
|
+
import type { AdminContributions } from '@endora-commerce/admin-kit/contributions';
|
|
25
|
+
export declare const contributions: AdminContributions;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAkBnF,eAAO,MAAM,aAAa,EAAE,kBAwC3B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** The module's landing route: the quote desk. */
|
|
2
|
+
const ROUTE_PATH = '/quote-requests';
|
|
3
|
+
/**
|
|
4
|
+
* The one code this module's admin API has.
|
|
5
|
+
*
|
|
6
|
+
* `packages/modules/quote_requests/src/backend/routes.admin.ts` builds a single
|
|
7
|
+
* `requireAdmin('rfqs:handle')` guard and gates every admin route with it,
|
|
8
|
+
* reads and writes alike, and `routes.sales-reps.ts` does the same — so the
|
|
9
|
+
* create screen carries the same code as the list rather than a `:write` twin
|
|
10
|
+
* that does not exist. It is the code the hand-written sidebar row and the
|
|
11
|
+
* hand-written palette row both carried, and the one `open-rfq-inbox`
|
|
12
|
+
* declares.
|
|
13
|
+
*/
|
|
14
|
+
const HANDLE_PERMISSION = 'rfqs:handle';
|
|
15
|
+
export const contributions = {
|
|
16
|
+
routes: [
|
|
17
|
+
{
|
|
18
|
+
path: ROUTE_PATH,
|
|
19
|
+
component: () => import('./pages/RfqList.js'),
|
|
20
|
+
requiredPermission: HANDLE_PERMISSION,
|
|
21
|
+
index: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
path: `${ROUTE_PATH}/new`,
|
|
25
|
+
component: () => import('./pages/RfqCreatePage.js'),
|
|
26
|
+
requiredPermission: HANDLE_PERMISSION,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
// Declared after `/new`, as `App.tsx` declared it: `/quote-requests/:id`
|
|
30
|
+
// matches `/quote-requests/new` too. `<Routes>` ranks by specificity, so
|
|
31
|
+
// the static segment wins whatever the order; the ordering is kept so a
|
|
32
|
+
// reader does not have to know that.
|
|
33
|
+
path: `${ROUTE_PATH}/:id`,
|
|
34
|
+
component: () => import('./pages/RfqDetail.js'),
|
|
35
|
+
requiredPermission: HANDLE_PERMISSION,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
nav: [
|
|
39
|
+
{
|
|
40
|
+
to: ROUTE_PATH,
|
|
41
|
+
// Module-relative (R8), out of this module's own `i18n/` bundle. It was
|
|
42
|
+
// `appShell.nav.quoteRequests` in the shared `_i18n` one.
|
|
43
|
+
labelKey: 'nav.quoteRequests.label',
|
|
44
|
+
// The glyph `AppShell.tsx` rendered by hand, and the one `open-rfq-inbox`
|
|
45
|
+
// names is `Inbox`. The sidebar's is kept: this row is the sidebar's row.
|
|
46
|
+
icon: 'FileText',
|
|
47
|
+
section: 'sales',
|
|
48
|
+
// First of the three module rows this batch contributes to *Sales* —
|
|
49
|
+
// `invoices` 500, `ksef` 600 — which is the order the hand-written table
|
|
50
|
+
// had.
|
|
51
|
+
weight: 400,
|
|
52
|
+
requiredPermission: HANDLE_PERMISSION,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAyBA,kDAAkD;AAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;;;;;;;;GAUG;AACH,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,MAAM,EAAE;QACN;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC7C,kBAAkB,EAAE,iBAAiB;YACrC,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,GAAG,UAAU,MAAM;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC;YACnD,kBAAkB,EAAE,iBAAiB;SACtC;QACD;YACE,yEAAyE;YACzE,yEAAyE;YACzE,wEAAwE;YACxE,qCAAqC;YACrC,IAAI,EAAE,GAAG,UAAU,MAAM;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC;YAC/C,kBAAkB,EAAE,iBAAiB;SACtC;KACF;IACD,GAAG,EAAE;QACH;YACE,EAAE,EAAE,UAAU;YACd,wEAAwE;YACxE,0DAA0D;YAC1D,QAAQ,EAAE,yBAAyB;YACnC,0EAA0E;YAC1E,0EAA0E;YAC1E,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;YAChB,qEAAqE;YACrE,yEAAyE;YACzE,OAAO;YACP,MAAM,EAAE,GAAG;YACX,kBAAkB,EAAE,iBAAiB;SACtC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function RfqCreatePage(): ReactNode;
|
|
3
|
+
/**
|
|
4
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
5
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
6
|
+
* the spelling this module's own code and its tests use.
|
|
7
|
+
*/
|
|
8
|
+
export default RfqCreatePage;
|
|
9
|
+
//# sourceMappingURL=RfqCreatePage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfqCreatePage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/RfqCreatePage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA2HjF,wBAAgB,aAAa,IAAI,SAAS,CAqOzC;AAED;;;;GAIG;AACH,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { useNavigate } from 'react-router-dom';
|
|
4
|
+
import { Plus, Trash2 } from 'lucide-react';
|
|
5
|
+
import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
|
|
6
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Combobox, Input, Label, PageHeader, Textarea } from '@endora-commerce/admin-kit/ui';
|
|
7
|
+
import { ProductPicker } from '@endora-commerce/admin-kit/components';
|
|
8
|
+
import { useTranslation } from '@endora-commerce/admin-kit/i18n';
|
|
9
|
+
const SEARCH_DEBOUNCE_MS = 250;
|
|
10
|
+
function customerLabel(c) {
|
|
11
|
+
const name = `${c.firstName} ${c.lastName}`.trim();
|
|
12
|
+
return name.length > 0 ? name : c.email;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Debounced server-side customer picker that hands the full selected row back
|
|
16
|
+
* to the parent (we need its `organizationId`, not just the id).
|
|
17
|
+
*/
|
|
18
|
+
function CustomerPicker(props) {
|
|
19
|
+
const t = useTranslation('core');
|
|
20
|
+
const [options, setOptions] = useState([]);
|
|
21
|
+
const [cache, setCache] = useState(() => new Map());
|
|
22
|
+
const [searching, setSearching] = useState(false);
|
|
23
|
+
const timerRef = useRef(null);
|
|
24
|
+
const seqRef = useRef(0);
|
|
25
|
+
useEffect(() => () => {
|
|
26
|
+
if (timerRef.current !== null)
|
|
27
|
+
clearTimeout(timerRef.current);
|
|
28
|
+
}, []);
|
|
29
|
+
const runSearch = useCallback(async (query, seq) => {
|
|
30
|
+
setSearching(true);
|
|
31
|
+
try {
|
|
32
|
+
const params = new URLSearchParams({ page: '1', pageSize: '20', status: 'active' });
|
|
33
|
+
const trimmed = query.trim();
|
|
34
|
+
if (trimmed.length > 0)
|
|
35
|
+
params.set('q', trimmed);
|
|
36
|
+
const res = await apiClient.get(`/api/v1/admin/customers?${params.toString()}`);
|
|
37
|
+
if (seq !== seqRef.current)
|
|
38
|
+
return;
|
|
39
|
+
setCache((prev) => {
|
|
40
|
+
const next = new Map(prev);
|
|
41
|
+
for (const c of res.data)
|
|
42
|
+
next.set(c.id, c);
|
|
43
|
+
return next;
|
|
44
|
+
});
|
|
45
|
+
setOptions(res.data.map((c) => ({
|
|
46
|
+
value: c.id,
|
|
47
|
+
label: customerLabel(c),
|
|
48
|
+
description: c.organizationName ? `${c.email} · ${c.organizationName}` : c.email,
|
|
49
|
+
})));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
if (seq !== seqRef.current)
|
|
53
|
+
return;
|
|
54
|
+
setOptions([]);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
if (seq === seqRef.current)
|
|
58
|
+
setSearching(false);
|
|
59
|
+
}
|
|
60
|
+
}, []);
|
|
61
|
+
const handleSearchChange = useCallback((query) => {
|
|
62
|
+
if (timerRef.current !== null)
|
|
63
|
+
clearTimeout(timerRef.current);
|
|
64
|
+
const seq = ++seqRef.current;
|
|
65
|
+
timerRef.current = setTimeout(() => void runSearch(query, seq), SEARCH_DEBOUNCE_MS);
|
|
66
|
+
}, [runSearch]);
|
|
67
|
+
return (_jsx(Combobox, { id: "customerAccountId", ariaLabel: "customerAccountId", options: options, value: props.value?.id ?? null, selectedLabel: props.value ? customerLabel(props.value) : '', onChange: (id) => props.onChange(id ? cache.get(id) ?? null : null), onSearchChange: handleSearchChange, manualFilter: true, loading: searching, placeholder: t('rfqCreate.placeholder.customer'), emptyMessage: searching ? t('rfqCreate.loading') : t('rfqCreate.empty.customers') }));
|
|
68
|
+
}
|
|
69
|
+
function emptyLine() {
|
|
70
|
+
return { productId: '', quantity: 1, agreedUnitPrice: '', lineNote: '' };
|
|
71
|
+
}
|
|
72
|
+
export function RfqCreatePage() {
|
|
73
|
+
const t = useTranslation('core');
|
|
74
|
+
const navigate = useNavigate();
|
|
75
|
+
const [customer, setCustomer] = useState(null);
|
|
76
|
+
const [lines, setLines] = useState([emptyLine()]);
|
|
77
|
+
const [headerNote, setHeaderNote] = useState('');
|
|
78
|
+
const [expiresInDays, setExpiresInDays] = useState('');
|
|
79
|
+
const [busy, setBusy] = useState(false);
|
|
80
|
+
const [error, setError] = useState(null);
|
|
81
|
+
const setLine = (i, patch) => setLines((prev) => prev.map((row, idx) => (idx === i ? { ...row, ...patch } : row)));
|
|
82
|
+
const addRow = () => setLines((prev) => [...prev, emptyLine()]);
|
|
83
|
+
const removeRow = (i) => setLines((prev) => prev.filter((_, idx) => idx !== i));
|
|
84
|
+
// Pre-fill the agreed unit price from the selected customer's price lists.
|
|
85
|
+
// Resolution depends on the (organization, customer, product, quantity)
|
|
86
|
+
// tuple, so we re-resolve whenever any of them changes. Failures leave the
|
|
87
|
+
// field for manual entry.
|
|
88
|
+
const resolveAndFill = useCallback(async (index, productId, quantity, cust) => {
|
|
89
|
+
if (!productId.trim() || !cust?.organizationId)
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
const params = new URLSearchParams({
|
|
93
|
+
organizationId: cust.organizationId,
|
|
94
|
+
customerAccountId: cust.id,
|
|
95
|
+
quantity: String(quantity > 0 ? quantity : 1),
|
|
96
|
+
});
|
|
97
|
+
const res = await apiClient.get(`/api/v1/admin/products/${productId.trim()}/resolved-price?${params.toString()}`);
|
|
98
|
+
const amount = res.data.resolvedPrice?.amount;
|
|
99
|
+
if (amount != null) {
|
|
100
|
+
setLines((prev) => prev.map((row, idx) => (idx === index ? { ...row, agreedUnitPrice: amount } : row)));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Leave the field for manual entry when resolution is unavailable.
|
|
105
|
+
}
|
|
106
|
+
}, []);
|
|
107
|
+
const handleCustomerChange = (next) => {
|
|
108
|
+
setCustomer(next);
|
|
109
|
+
// Re-price every line already carrying a product against the new customer.
|
|
110
|
+
lines.forEach((row, idx) => {
|
|
111
|
+
if (row.productId.trim())
|
|
112
|
+
void resolveAndFill(idx, row.productId, row.quantity, next);
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const validLines = lines.filter((l) => l.productId.trim() && l.quantity > 0 && l.agreedUnitPrice.trim() !== '');
|
|
116
|
+
const hasOrg = Boolean(customer?.organizationId);
|
|
117
|
+
const total = validLines.reduce((sum, l) => sum + l.quantity * Number(l.agreedUnitPrice || 0), 0);
|
|
118
|
+
const canSubmit = hasOrg && validLines.length > 0 && !busy;
|
|
119
|
+
const submit = async () => {
|
|
120
|
+
if (!customer?.organizationId)
|
|
121
|
+
return;
|
|
122
|
+
setBusy(true);
|
|
123
|
+
setError(null);
|
|
124
|
+
try {
|
|
125
|
+
const trimmedExpiry = expiresInDays.trim();
|
|
126
|
+
const res = await apiClient.post('/api/v1/admin/quote-requests', {
|
|
127
|
+
organizationId: customer.organizationId,
|
|
128
|
+
customerAccountId: customer.id,
|
|
129
|
+
...(headerNote.trim() ? { headerNote: headerNote.trim() } : {}),
|
|
130
|
+
...(trimmedExpiry !== '' ? { expiresInDays: Number(trimmedExpiry) } : {}),
|
|
131
|
+
items: validLines.map((l) => ({
|
|
132
|
+
productId: l.productId.trim(),
|
|
133
|
+
quantity: l.quantity,
|
|
134
|
+
agreedUnitPrice: Number(l.agreedUnitPrice),
|
|
135
|
+
...(l.lineNote.trim() ? { lineNote: l.lineNote.trim() } : {}),
|
|
136
|
+
})),
|
|
137
|
+
});
|
|
138
|
+
navigate(`/quote-requests/${res.data.id}`);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('rfqCreate.error'));
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
setBusy(false);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
return (_jsxs("div", { className: "mx-auto max-w-3xl", children: [_jsx(PageHeader, { title: t('rfqCreate.title'), description: t('rfqCreate.description'), back: { label: t('rfqCreate.back'), to: '/quote-requests' } }), error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('rfqCreate.section.customer') }) }), _jsxs(CardContent, { className: "space-y-2", children: [_jsx(Label, { htmlFor: "customerAccountId", children: t('rfqCreate.field.customer') }), _jsx(CustomerPicker, { value: customer, onChange: handleCustomerChange }), customer && !hasOrg ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: t('rfqCreate.noOrgWarning') }) })) : null] })] }), _jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('rfqCreate.section.items') }) }), _jsxs(CardContent, { className: "space-y-3", children: [lines.map((row, i) => (_jsxs("div", { className: "flex items-end gap-3", children: [_jsxs("div", { className: "flex-1 space-y-1", children: [_jsx(Label, { htmlFor: `product-${i}`, children: t('rfqCreate.field.product') }), _jsx(ProductPicker, { mode: "select", id: `product-${i}`, ariaLabel: `product-${i}`, value: row.productId === '' ? null : row.productId, onChange: (next) => {
|
|
148
|
+
const pid = next ?? '';
|
|
149
|
+
setLine(i, { productId: pid });
|
|
150
|
+
void resolveAndFill(i, pid, row.quantity, customer);
|
|
151
|
+
}, placeholder: t('rfqCreate.placeholder.product') })] }), _jsxs("div", { className: "w-20 space-y-1", children: [_jsx(Label, { htmlFor: `qty-${i}`, children: t('rfqCreate.field.quantity') }), _jsx(Input, { id: `qty-${i}`, "aria-label": `qty-${i}`, type: "number", min: 1, value: row.quantity, onChange: (e) => {
|
|
152
|
+
const q = Number(e.target.value);
|
|
153
|
+
setLine(i, { quantity: q });
|
|
154
|
+
void resolveAndFill(i, row.productId, q, customer);
|
|
155
|
+
} })] }), _jsxs("div", { className: "w-32 space-y-1", children: [_jsx(Label, { htmlFor: `price-${i}`, children: t('rfqCreate.field.agreedUnitPrice') }), _jsx(Input, { id: `price-${i}`, "aria-label": `price-${i}`, type: "number", min: 0, step: "0.01", value: row.agreedUnitPrice, onChange: (e) => setLine(i, { agreedUnitPrice: e.target.value }) })] }), _jsx(Button, { variant: "ghost", size: "sm", "aria-label": `remove-item-${i}`, disabled: lines.length === 1, onClick: () => removeRow(i), children: _jsx(Trash2, {}) })] }, i))), _jsxs(Button, { variant: "outline", size: "sm", onClick: addRow, children: [_jsx(Plus, {}), t('rfqCreate.addItem')] }), _jsxs("div", { className: "flex justify-end pt-2 text-sm font-medium", children: [t('rfqCreate.total'), ": ", total.toFixed(2)] })] })] }), _jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('rfqCreate.section.options') }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "headerNote", children: t('rfqCreate.field.headerNote') }), _jsx(Textarea, { id: "headerNote", rows: 3, value: headerNote, placeholder: t('rfqCreate.placeholder.headerNote'), onChange: (e) => setHeaderNote(e.target.value) })] }), _jsxs("div", { className: "w-40 space-y-1", children: [_jsx(Label, { htmlFor: "expiresInDays", children: t('rfqCreate.field.expiresInDays') }), _jsx(Input, { id: "expiresInDays", type: "number", min: 0, value: expiresInDays, placeholder: t('rfqCreate.placeholder.expiresInDays'), onChange: (e) => setExpiresInDays(e.target.value) })] })] })] }), _jsx("div", { className: "flex justify-end", children: _jsx(Button, { disabled: !canSubmit, onClick: () => void submit(), children: busy ? t('rfqCreate.submitting') : t('rfqCreate.submit') }) })] }));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
159
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
160
|
+
* the spelling this module's own code and its tests use.
|
|
161
|
+
*/
|
|
162
|
+
export default RfqCreatePage;
|
|
163
|
+
//# sourceMappingURL=RfqCreatePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfqCreatePage.js","sourceRoot":"","sources":["../../../src/admin/pages/RfqCreatePage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function RfqDetail(): ReactNode;
|
|
3
|
+
/**
|
|
4
|
+
* The registry loads a route component through a dynamic-import factory and
|
|
5
|
+
* reads its default export (feature 091, FR-013). The named export stays: it is
|
|
6
|
+
* the spelling this module's own code and its tests use.
|
|
7
|
+
*/
|
|
8
|
+
export default RfqDetail;
|
|
9
|
+
//# sourceMappingURL=RfqDetail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfqDetail.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/RfqDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAoIjF,wBAAgB,SAAS,IAAI,SAAS,CA2hBrC;AA0ZD;;;;GAIG;AACH,eAAe,SAAS,CAAC"}
|