@isaiahiroko/tilmart-ngx-apps-admin 0.2.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.
Files changed (75) hide show
  1. package/README.md +9 -0
  2. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-articles.module-OeLRnPwN.mjs +154 -0
  3. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-articles.module-OeLRnPwN.mjs.map +1 -0
  4. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-audit.module-C9gvw8X2.mjs +84 -0
  5. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-audit.module-C9gvw8X2.mjs.map +1 -0
  6. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-baskets.module-_lHPl1dT.mjs +294 -0
  7. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-baskets.module-_lHPl1dT.mjs.map +1 -0
  8. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-catalog.module-Bvx2tVOi.mjs +224 -0
  9. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-catalog.module-Bvx2tVOi.mjs.map +1 -0
  10. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-claims.module-Ccsd8Yx3.mjs +106 -0
  11. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-claims.module-Ccsd8Yx3.mjs.map +1 -0
  12. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-compatibility-rules.module-xN-JUWwp.mjs +261 -0
  13. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-compatibility-rules.module-xN-JUWwp.mjs.map +1 -0
  14. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-content.module-DLdKAUqc.mjs +365 -0
  15. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-content.module-DLdKAUqc.mjs.map +1 -0
  16. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-coupons.module-CQNCSlsd.mjs +106 -0
  17. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-coupons.module-CQNCSlsd.mjs.map +1 -0
  18. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-customers.module-12XdV9zo.mjs +106 -0
  19. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-customers.module-12XdV9zo.mjs.map +1 -0
  20. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-data-quality.module-Bfgh3zE5.mjs +286 -0
  21. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-data-quality.module-Bfgh3zE5.mjs.map +1 -0
  22. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-data-requests.module-C6tPNlup.mjs +104 -0
  23. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-data-requests.module-C6tPNlup.mjs.map +1 -0
  24. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-disputes.module-DmUoAS0Z.mjs +73 -0
  25. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-disputes.module-DmUoAS0Z.mjs.map +1 -0
  26. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-homepage.module-BZ3UmxE3.mjs +404 -0
  27. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-homepage.module-BZ3UmxE3.mjs.map +1 -0
  28. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-inbox.module-BZDTa1L-.mjs +290 -0
  29. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-inbox.module-BZDTa1L-.mjs.map +1 -0
  30. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-macros.module-BO4bdER2.mjs +112 -0
  31. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-macros.module-BO4bdER2.mjs.map +1 -0
  32. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-moderation.module-CZOCrias.mjs +116 -0
  33. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-moderation.module-CZOCrias.mjs.map +1 -0
  34. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-navigation.module-DoKzzRgn.mjs +281 -0
  35. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-navigation.module-DoKzzRgn.mjs.map +1 -0
  36. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-order-board.module-DIOjhptn.mjs +115 -0
  37. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-order-board.module-DIOjhptn.mjs.map +1 -0
  38. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-orders.module-Ddw49QW0.mjs +185 -0
  39. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-orders.module-Ddw49QW0.mjs.map +1 -0
  40. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-payments.module-BhqAtTZs.mjs +106 -0
  41. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-payments.module-BhqAtTZs.mjs.map +1 -0
  42. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-payouts.module-CoiscPIZ.mjs +70 -0
  43. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-payouts.module-CoiscPIZ.mjs.map +1 -0
  44. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-procurement.module-qXW-g0pf.mjs +274 -0
  45. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-procurement.module-qXW-g0pf.mjs.map +1 -0
  46. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-promotions.module-DG9uTDqX.mjs +106 -0
  47. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-promotions.module-DG9uTDqX.mjs.map +1 -0
  48. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-queues.module-K-zYYVFy.mjs +84 -0
  49. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-queues.module-K-zYYVFy.mjs.map +1 -0
  50. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-redirects.module-Hm2dO_bC.mjs +106 -0
  51. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-redirects.module-Hm2dO_bC.mjs.map +1 -0
  52. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-referrals.module-QLNhuh7q.mjs +106 -0
  53. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-referrals.module-QLNhuh7q.mjs.map +1 -0
  54. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-reports.module-DBZov0We.mjs +104 -0
  55. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-reports.module-DBZov0We.mjs.map +1 -0
  56. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-returns.module-Bd2gdo6_.mjs +106 -0
  57. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-returns.module-Bd2gdo6_.mjs.map +1 -0
  58. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-rich-editor.module-DW9Gy_QQ.mjs +81 -0
  59. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-rich-editor.module-DW9Gy_QQ.mjs.map +1 -0
  60. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-routes.module-BkVY06ci.mjs +105 -0
  61. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-routes.module-BkVY06ci.mjs.map +1 -0
  62. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-settings.module-DKeZTldO.mjs +222 -0
  63. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-settings.module-DKeZTldO.mjs.map +1 -0
  64. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-shipments.module-XuaOKr8v.mjs +150 -0
  65. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-shipments.module-XuaOKr8v.mjs.map +1 -0
  66. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-stock.module-DYiAkF7E.mjs +107 -0
  67. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-stock.module-DYiAkF7E.mjs.map +1 -0
  68. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-trace.module-Pwr-82Rc.mjs +92 -0
  69. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-trace.module-Pwr-82Rc.mjs.map +1 -0
  70. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-users.module-Bx_7fI2g.mjs +111 -0
  71. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin-users.module-Bx_7fI2g.mjs.map +1 -0
  72. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin.mjs +475 -0
  73. package/fesm2022/isaiahiroko-tilmart-ngx-apps-admin.mjs.map +1 -0
  74. package/package.json +34 -0
  75. package/types/isaiahiroko-tilmart-ngx-apps-admin.d.ts +32 -0
@@ -0,0 +1,107 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, NgModule } from '@angular/core';
3
+ import * as i1$1 from '@angular/router';
4
+ import { RouterModule } from '@angular/router';
5
+ import { BaseDirective, using, titleCase, SharedModule } from '@thescaffold/ngx-core';
6
+ import * as i1 from '@thescaffold/ngx-ui';
7
+ import { ElementsModule, WebgetsModule } from '@thescaffold/ngx-ui';
8
+ import { BehaviorSubject, takeUntil, map } from 'rxjs';
9
+ import * as i2 from '@angular/common';
10
+
11
+ // P7.1 — ops console section pass (PRD 6.2, TRD 9.2). A standard list
12
+ // view on `x-webget-collection` over `apps/commerce/stock-level`, matching the
13
+ // established admin pattern (users, routes, inbox). ops CRUD is covered
14
+ // by `admin:*:apps:commerce:*`.
15
+ class StockComponent extends BaseDirective {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.pluralName = 'stock';
19
+ this.dataSource = this.apiService.on('apps/commerce/stock-level');
20
+ this.columns = [
21
+ { key: 'variantId', value: 'Variant' },
22
+ { key: 'locationId', value: 'Location' },
23
+ { key: 'available', value: 'Available' },
24
+ { key: 'reserved', value: 'Reserved' },
25
+ { key: 'incoming', value: 'Incoming' },
26
+ ];
27
+ this.page = 1;
28
+ this.perPage = 25;
29
+ this.list$ = new BehaviorSubject(null);
30
+ this.init = () => {
31
+ this.list();
32
+ };
33
+ }
34
+ list(page = this.page, perPage = this.perPage) {
35
+ this.dataSource
36
+ .getMany({ page, perPage })
37
+ .pipe(takeUntil(this.$), map((response) => this.toCollection(response)))
38
+ .subscribe(using((data) => this.list$.next(data)));
39
+ }
40
+ toCollection(response) {
41
+ return {
42
+ title: titleCase(this.pluralName),
43
+ columns: this.columns,
44
+ rows: response?.data,
45
+ hasHeaders: true,
46
+ hasTextFilter: true,
47
+ page: response?.meta?.current_page,
48
+ perPage: response?.meta?.per_page,
49
+ total: response?.meta?.total,
50
+ onPage: (page) => this.list(page),
51
+ };
52
+ }
53
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StockComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
54
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: StockComponent, isStandalone: false, selector: "x-stock", usesInheritance: true, ngImport: i0, template: `
55
+ <div class="x-page-head">
56
+ <div class="x-page-title">Stock</div>
57
+ <div class="x-page-subtitle">Per-variant, per-location levels — available, reserved and incoming.</div>
58
+ </div>
59
+
60
+ @if (list$ | async; as list) {
61
+ <x-webget-collection [data]="list"></x-webget-collection>
62
+ } @else {
63
+ <x-element-loader></x-element-loader>
64
+ }
65
+ `, isInline: true, styles: [".x-page-head{margin-bottom:20px}.x-page-title{font-size:24px;font-weight:800;color:var(--color-text)}.x-page-subtitle{font-size:13.5px;color:var(--color-text-muted);margin-top:2px}\n"], dependencies: [{ kind: "component", type: i1.LoaderComponent, selector: "x-element-loader", inputs: ["data"] }, { kind: "component", type: i1.CollectionComponent, selector: "x-webget-collection", inputs: ["data"], outputs: ["search", "filter", "refresh", "select", "page", "show"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
66
+ }
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StockComponent, decorators: [{
68
+ type: Component,
69
+ args: [{ standalone: false, selector: 'x-stock', template: `
70
+ <div class="x-page-head">
71
+ <div class="x-page-title">Stock</div>
72
+ <div class="x-page-subtitle">Per-variant, per-location levels — available, reserved and incoming.</div>
73
+ </div>
74
+
75
+ @if (list$ | async; as list) {
76
+ <x-webget-collection [data]="list"></x-webget-collection>
77
+ } @else {
78
+ <x-element-loader></x-element-loader>
79
+ }
80
+ `, styles: [".x-page-head{margin-bottom:20px}.x-page-title{font-size:24px;font-weight:800;color:var(--color-text)}.x-page-subtitle{font-size:13.5px;color:var(--color-text-muted);margin-top:2px}\n"] }]
81
+ }] });
82
+
83
+ class StockModule {
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
85
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.16", ngImport: i0, type: StockModule, declarations: [StockComponent], imports: [SharedModule,
86
+ ElementsModule,
87
+ WebgetsModule, i1$1.RouterModule] }); }
88
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StockModule, imports: [SharedModule,
89
+ ElementsModule,
90
+ WebgetsModule,
91
+ RouterModule.forChild([{ path: '', component: StockComponent }])] }); }
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: StockModule, decorators: [{
94
+ type: NgModule,
95
+ args: [{
96
+ declarations: [StockComponent],
97
+ imports: [
98
+ SharedModule,
99
+ ElementsModule,
100
+ WebgetsModule,
101
+ RouterModule.forChild([{ path: '', component: StockComponent }]),
102
+ ],
103
+ }]
104
+ }] });
105
+
106
+ export { StockModule };
107
+ //# sourceMappingURL=isaiahiroko-tilmart-ngx-apps-admin-stock.module-DYiAkF7E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isaiahiroko-tilmart-ngx-apps-admin-stock.module-DYiAkF7E.mjs","sources":["../../../projects/admin/src/lib/pages/stock/stock.component.ts","../../../projects/admin/src/lib/pages/stock/stock.module.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BaseDirective, titleCase, using } from '@thescaffold/ngx-core';\nimport { BehaviorSubject, map, takeUntil } from 'rxjs';\n\n// P7.1 — ops console section pass (PRD 6.2, TRD 9.2). A standard list\n// view on `x-webget-collection` over `apps/commerce/stock-level`, matching the\n// established admin pattern (users, routes, inbox). ops CRUD is covered\n// by `admin:*:apps:commerce:*`.\n@Component({\n standalone: false,\n selector: 'x-stock',\n template: `\n <div class=\"x-page-head\">\n <div class=\"x-page-title\">Stock</div>\n <div class=\"x-page-subtitle\">Per-variant, per-location levels — available, reserved and incoming.</div>\n </div>\n\n @if (list$ | async; as list) {\n <x-webget-collection [data]=\"list\"></x-webget-collection>\n } @else {\n <x-element-loader></x-element-loader>\n }\n `,\n styles: [\n `\n .x-page-head {\n margin-bottom: 20px;\n }\n .x-page-title {\n font-size: 24px;\n font-weight: 800;\n color: var(--color-text);\n }\n .x-page-subtitle {\n font-size: 13.5px;\n color: var(--color-text-muted);\n margin-top: 2px;\n }\n `,\n ],\n})\nexport class StockComponent extends BaseDirective {\n pluralName = 'stock';\n dataSource = this.apiService.on('apps/commerce/stock-level');\n\n columns = [\n { key: 'variantId', value: 'Variant' },\n { key: 'locationId', value: 'Location' },\n { key: 'available', value: 'Available' },\n { key: 'reserved', value: 'Reserved' },\n { key: 'incoming', value: 'Incoming' },\n ];\n\n page = 1;\n perPage = 25;\n\n list$ = new BehaviorSubject<any>(null);\n\n override init = () => {\n this.list();\n };\n\n list(page = this.page, perPage = this.perPage) {\n this.dataSource\n .getMany({ page, perPage })\n .pipe(\n takeUntil(this.$),\n map((response) => this.toCollection(response)),\n )\n .subscribe(using((data) => this.list$.next(data)));\n }\n\n private toCollection(response: any) {\n return {\n title: titleCase(this.pluralName),\n columns: this.columns,\n rows: response?.data,\n hasHeaders: true,\n hasTextFilter: true,\n page: response?.meta?.current_page,\n perPage: response?.meta?.per_page,\n total: response?.meta?.total,\n onPage: (page: number) => this.list(page),\n };\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@thescaffold/ngx-core';\nimport { ElementsModule, WebgetsModule } from '@thescaffold/ngx-ui';\nimport { StockComponent } from './stock.component';\n\n@NgModule({\n declarations: [StockComponent],\n imports: [\n SharedModule,\n ElementsModule,\n WebgetsModule,\n RouterModule.forChild([{ path: '', component: StockComponent }]),\n ],\n})\nexport class StockModule {}\n"],"names":["i1"],"mappings":";;;;;;;;;;AAIA;AACA;AACA;AACA;AAkCM,MAAO,cAAe,SAAQ,aAAa,CAAA;AAjCjD,IAAA,WAAA,GAAA;;QAkCE,IAAA,CAAA,UAAU,GAAG,OAAO;QACpB,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,2BAA2B,CAAC;AAE5D,QAAA,IAAA,CAAA,OAAO,GAAG;AACR,YAAA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE;AACxC,YAAA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;AACxC,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;AACtC,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;SACvC;QAED,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,OAAO,GAAG,EAAE;AAEZ,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC;QAE7B,IAAA,CAAA,IAAI,GAAG,MAAK;YACnB,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC;AAyBF,IAAA;IAvBC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,EAAA;AAC3C,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;aACzB,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EACjB,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAE/C,aAAA,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD;AAEQ,IAAA,YAAY,CAAC,QAAa,EAAA;QAChC,OAAO;AACL,YAAA,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,QAAQ,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;AAClC,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;AACjC,YAAA,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;YAC5B,MAAM,EAAE,CAAC,IAAY,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1C;IACH;+GA3CW,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9Bf;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAmBU,cAAc,EAAA,UAAA,EAAA,CAAA;kBAjC1B,SAAS;iCACI,KAAK,EAAA,QAAA,EACP,SAAS,EAAA,QAAA,EACT;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA;;;MCPU,WAAW,CAAA;+GAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAX,WAAW,EAAA,YAAA,EAAA,CARP,cAAc,CAAA,EAAA,OAAA,EAAA,CAE3B,YAAY;YACZ,cAAc;YACd,aAAa,EAAAA,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA,CAAA;AAIJ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YANpB,YAAY;YACZ,cAAc;YACd,aAAa;AACb,YAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA,EAAA,CAAA,CAAA;;4FAGvD,WAAW,EAAA,UAAA,EAAA,CAAA;kBATvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,cAAc,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,cAAc;wBACd,aAAa;AACb,wBAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;AACjE,qBAAA;AACF,iBAAA;;;;;"}
@@ -0,0 +1,92 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Component, NgModule } from '@angular/core';
3
+ import * as i1$2 from '@angular/router';
4
+ import { ActivatedRoute, RouterModule } from '@angular/router';
5
+ import { BaseDirective, using, SharedModule } from '@thescaffold/ngx-core';
6
+ import * as i1$1 from '@thescaffold/ngx-ui';
7
+ import { ElementsModule } from '@thescaffold/ngx-ui';
8
+ import { takeUntil } from 'rxjs';
9
+ import * as i1 from '@angular/forms';
10
+ import * as i2 from '@angular/common';
11
+
12
+ // P7.14 (N.4) — trace one order end-to-end without leaving the back
13
+ // office. Reads `GET apps/commerce/reports/trace?ref=<...>` (order
14
+ // number, order id, or a payment provider ref) and renders the merged
15
+ // timeline: status history, payments + attempts, shipments + exceptions,
16
+ // returns, the notifications sent for it, and its audit-log entries.
17
+ class TraceComponent extends BaseDirective {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.source = this.apiService.on('apps/commerce/reports');
21
+ this.route = inject(ActivatedRoute);
22
+ this.ref = '';
23
+ this.loading = false;
24
+ this.notFound = false;
25
+ this.data = null;
26
+ this.init = () => {
27
+ const q = this.route.snapshot.queryParamMap.get('ref');
28
+ if (q) {
29
+ this.ref = q;
30
+ this.run();
31
+ }
32
+ };
33
+ }
34
+ run() {
35
+ const ref = this.ref.trim();
36
+ if (!ref)
37
+ return;
38
+ this.loading = true;
39
+ this.notFound = false;
40
+ this.data = null;
41
+ this.source
42
+ .getOne(`trace?ref=${encodeURIComponent(ref)}`)
43
+ .pipe(takeUntil(this.$))
44
+ .subscribe(using((res) => {
45
+ const payload = res?.data ?? {};
46
+ if (payload.ok === false || !payload.data) {
47
+ this.notFound = true;
48
+ }
49
+ else {
50
+ this.data = payload.data ?? payload;
51
+ }
52
+ this.loading = false;
53
+ }));
54
+ }
55
+ detailText(d) {
56
+ if (!d)
57
+ return '';
58
+ return Object.entries(d)
59
+ .filter(([, v]) => v != null && v !== '')
60
+ .map(([k, v]) => `${k}: ${v}`)
61
+ .join(' · ');
62
+ }
63
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TraceComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
64
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: TraceComponent, isStandalone: false, selector: "x-trace", usesInheritance: true, ngImport: i0, template: "<div class=\"x-page-head\">\n <div class=\"x-page-title\">Trace</div>\n <div class=\"x-page-subtitle\">\n Follow one order end-to-end \u2014 status, payments, fulfilment, returns,\n notifications and audit \u2014 from here alone (N.4).\n </div>\n</div>\n\n<form class=\"x-tr-search\" (ngSubmit)=\"run()\">\n <input\n type=\"search\"\n placeholder=\"Order number, order id, or payment reference\"\n [(ngModel)]=\"ref\"\n name=\"ref\"\n />\n <button type=\"submit\" [disabled]=\"loading || !ref.trim()\">Trace</button>\n</form>\n\n@if (loading) {\n <x-element-loader></x-element-loader>\n} @else if (notFound) {\n <p class=\"x-tr-empty\">Nothing found for that reference.</p>\n} @else if (data) {\n <div class=\"x-tr-summary\">\n <div><strong>{{ data.order.orderNumber }}</strong></div>\n <div class=\"x-tr-muted\">\n {{ data.order.status }} \u00B7\n \u20A6{{ data.order.grandTotal | number: '1.0-0' }} {{ data.order.currency }} \u00B7\n placed {{ data.order.createdAt | date: 'medium' }}\n </div>\n <div class=\"x-tr-counts\">\n <span>{{ data.payments.length }} payment(s)</span>\n <span>{{ data.shipments.length }} shipment(s)</span>\n <span>{{ data.returns.length }} return(s)</span>\n <span>{{ data.notifications.length }} notification(s)</span>\n <span>{{ data.auditEntries.length }} audit entr(ies)</span>\n </div>\n </div>\n\n <ol class=\"x-tr-timeline\">\n @for (e of data.timeline; track $index) {\n <li class=\"x-tr-event x-tr-kind-{{ e.kind }}\">\n <div class=\"x-tr-when\">{{ e.at ? (e.at | date: 'short') : '\u2014' }}</div>\n <div class=\"x-tr-body\">\n <span class=\"x-tr-tag\">{{ e.kind }}</span>\n <span class=\"x-tr-label\">{{ e.label }}</span>\n @if (detailText(e.detail)) {\n <div class=\"x-tr-detail\">{{ detailText(e.detail) }}</div>\n }\n </div>\n </li>\n }\n </ol>\n}\n\n<style>\n .x-page-head { margin-bottom: 16px; }\n .x-page-title { font-size: 24px; font-weight: 800; color: var(--color-text); }\n .x-page-subtitle { font-size: 13.5px; color: var(--color-text-muted); margin-top: 2px; max-width: 620px; }\n .x-tr-search { display: flex; gap: 8px; margin-bottom: 20px; }\n .x-tr-search input { flex: 1; max-width: 420px; font: inherit; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-surface, #fff); color: var(--color-text); }\n .x-tr-search button { font: inherit; font-weight: 600; padding: 8px 16px; border: 0; border-radius: 6px; background: var(--color-brand); color: #fff; cursor: pointer; }\n .x-tr-search button:disabled { opacity: 0.5; }\n .x-tr-empty { color: var(--color-text-muted); font-size: 13px; }\n .x-tr-summary { border: 1px solid var(--color-border); border-radius: 10px; padding: 14px; margin-bottom: 18px; }\n .x-tr-muted { color: var(--color-text-muted); font-size: 13px; margin-top: 3px; }\n .x-tr-counts { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 12px; color: var(--color-text-muted); }\n .x-tr-timeline { list-style: none; margin: 0; padding: 0; border-left: 2px solid var(--color-border); }\n .x-tr-event { display: flex; gap: 14px; padding: 8px 0 8px 16px; position: relative; }\n .x-tr-event::before { content: ''; position: absolute; left: -7px; top: 13px; width: 10px; height: 10px; border-radius: 50%; background: var(--color-text-muted); }\n .x-tr-kind-payment::before, .x-tr-kind-payment-attempt::before { background: var(--color-brand); }\n .x-tr-kind-delivery-exception::before, .x-tr-kind-return::before { background: var(--color-danger, #c0392b); }\n .x-tr-when { font-size: 11.5px; color: var(--color-text-muted); min-width: 96px; padding-top: 2px; }\n .x-tr-tag { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 700; color: var(--color-text-muted); margin-right: 8px; }\n .x-tr-label { font-size: 13.5px; color: var(--color-text); }\n .x-tr-detail { font-size: 12px; color: var(--color-text-muted); margin-top: 2px; }\n</style>\n", styles: [".x-page-head{margin-bottom:16px}.x-page-title{font-size:24px;font-weight:800;color:var(--color-text)}.x-page-subtitle{font-size:13.5px;color:var(--color-text-muted);margin-top:2px;max-width:620px}.x-tr-search{display:flex;gap:8px;margin-bottom:20px}.x-tr-search input{flex:1;max-width:420px;font:inherit;padding:8px 12px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface, #fff);color:var(--color-text)}.x-tr-search button{font:inherit;font-weight:600;padding:8px 16px;border:0;border-radius:6px;background:var(--color-brand);color:#fff;cursor:pointer}.x-tr-search button:disabled{opacity:.5}.x-tr-empty{color:var(--color-text-muted);font-size:13px}.x-tr-summary{border:1px solid var(--color-border);border-radius:10px;padding:14px;margin-bottom:18px}.x-tr-muted{color:var(--color-text-muted);font-size:13px;margin-top:3px}.x-tr-counts{display:flex;flex-wrap:wrap;gap:12px;margin-top:10px;font-size:12px;color:var(--color-text-muted)}.x-tr-timeline{list-style:none;margin:0;padding:0;border-left:2px solid var(--color-border)}.x-tr-event{display:flex;gap:14px;padding:8px 0 8px 16px;position:relative}.x-tr-event:before{content:\"\";position:absolute;left:-7px;top:13px;width:10px;height:10px;border-radius:50%;background:var(--color-text-muted)}.x-tr-kind-payment:before,.x-tr-kind-payment-attempt:before{background:var(--color-brand)}.x-tr-kind-delivery-exception:before,.x-tr-kind-return:before{background:var(--color-danger, #c0392b)}.x-tr-when{font-size:11.5px;color:var(--color-text-muted);min-width:96px;padding-top:2px}.x-tr-tag{font-size:10px;text-transform:uppercase;letter-spacing:.04em;font-weight:700;color:var(--color-text-muted);margin-right:8px}.x-tr-label{font-size:13.5px;color:var(--color-text)}.x-tr-detail{font-size:12px;color:var(--color-text-muted);margin-top:2px}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1$1.LoaderComponent, selector: "x-element-loader", inputs: ["data"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] }); }
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TraceComponent, decorators: [{
67
+ type: Component,
68
+ args: [{ standalone: false, selector: 'x-trace', template: "<div class=\"x-page-head\">\n <div class=\"x-page-title\">Trace</div>\n <div class=\"x-page-subtitle\">\n Follow one order end-to-end \u2014 status, payments, fulfilment, returns,\n notifications and audit \u2014 from here alone (N.4).\n </div>\n</div>\n\n<form class=\"x-tr-search\" (ngSubmit)=\"run()\">\n <input\n type=\"search\"\n placeholder=\"Order number, order id, or payment reference\"\n [(ngModel)]=\"ref\"\n name=\"ref\"\n />\n <button type=\"submit\" [disabled]=\"loading || !ref.trim()\">Trace</button>\n</form>\n\n@if (loading) {\n <x-element-loader></x-element-loader>\n} @else if (notFound) {\n <p class=\"x-tr-empty\">Nothing found for that reference.</p>\n} @else if (data) {\n <div class=\"x-tr-summary\">\n <div><strong>{{ data.order.orderNumber }}</strong></div>\n <div class=\"x-tr-muted\">\n {{ data.order.status }} \u00B7\n \u20A6{{ data.order.grandTotal | number: '1.0-0' }} {{ data.order.currency }} \u00B7\n placed {{ data.order.createdAt | date: 'medium' }}\n </div>\n <div class=\"x-tr-counts\">\n <span>{{ data.payments.length }} payment(s)</span>\n <span>{{ data.shipments.length }} shipment(s)</span>\n <span>{{ data.returns.length }} return(s)</span>\n <span>{{ data.notifications.length }} notification(s)</span>\n <span>{{ data.auditEntries.length }} audit entr(ies)</span>\n </div>\n </div>\n\n <ol class=\"x-tr-timeline\">\n @for (e of data.timeline; track $index) {\n <li class=\"x-tr-event x-tr-kind-{{ e.kind }}\">\n <div class=\"x-tr-when\">{{ e.at ? (e.at | date: 'short') : '\u2014' }}</div>\n <div class=\"x-tr-body\">\n <span class=\"x-tr-tag\">{{ e.kind }}</span>\n <span class=\"x-tr-label\">{{ e.label }}</span>\n @if (detailText(e.detail)) {\n <div class=\"x-tr-detail\">{{ detailText(e.detail) }}</div>\n }\n </div>\n </li>\n }\n </ol>\n}\n\n<style>\n .x-page-head { margin-bottom: 16px; }\n .x-page-title { font-size: 24px; font-weight: 800; color: var(--color-text); }\n .x-page-subtitle { font-size: 13.5px; color: var(--color-text-muted); margin-top: 2px; max-width: 620px; }\n .x-tr-search { display: flex; gap: 8px; margin-bottom: 20px; }\n .x-tr-search input { flex: 1; max-width: 420px; font: inherit; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-surface, #fff); color: var(--color-text); }\n .x-tr-search button { font: inherit; font-weight: 600; padding: 8px 16px; border: 0; border-radius: 6px; background: var(--color-brand); color: #fff; cursor: pointer; }\n .x-tr-search button:disabled { opacity: 0.5; }\n .x-tr-empty { color: var(--color-text-muted); font-size: 13px; }\n .x-tr-summary { border: 1px solid var(--color-border); border-radius: 10px; padding: 14px; margin-bottom: 18px; }\n .x-tr-muted { color: var(--color-text-muted); font-size: 13px; margin-top: 3px; }\n .x-tr-counts { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 12px; color: var(--color-text-muted); }\n .x-tr-timeline { list-style: none; margin: 0; padding: 0; border-left: 2px solid var(--color-border); }\n .x-tr-event { display: flex; gap: 14px; padding: 8px 0 8px 16px; position: relative; }\n .x-tr-event::before { content: ''; position: absolute; left: -7px; top: 13px; width: 10px; height: 10px; border-radius: 50%; background: var(--color-text-muted); }\n .x-tr-kind-payment::before, .x-tr-kind-payment-attempt::before { background: var(--color-brand); }\n .x-tr-kind-delivery-exception::before, .x-tr-kind-return::before { background: var(--color-danger, #c0392b); }\n .x-tr-when { font-size: 11.5px; color: var(--color-text-muted); min-width: 96px; padding-top: 2px; }\n .x-tr-tag { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 700; color: var(--color-text-muted); margin-right: 8px; }\n .x-tr-label { font-size: 13.5px; color: var(--color-text); }\n .x-tr-detail { font-size: 12px; color: var(--color-text-muted); margin-top: 2px; }\n</style>\n" }]
69
+ }] });
70
+
71
+ class TraceModule {
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TraceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
73
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.16", ngImport: i0, type: TraceModule, declarations: [TraceComponent], imports: [SharedModule,
74
+ ElementsModule, i1$2.RouterModule] }); }
75
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TraceModule, imports: [SharedModule,
76
+ ElementsModule,
77
+ RouterModule.forChild([{ path: '', component: TraceComponent }])] }); }
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: TraceModule, decorators: [{
80
+ type: NgModule,
81
+ args: [{
82
+ declarations: [TraceComponent],
83
+ imports: [
84
+ SharedModule,
85
+ ElementsModule,
86
+ RouterModule.forChild([{ path: '', component: TraceComponent }]),
87
+ ],
88
+ }]
89
+ }] });
90
+
91
+ export { TraceModule };
92
+ //# sourceMappingURL=isaiahiroko-tilmart-ngx-apps-admin-trace.module-Pwr-82Rc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isaiahiroko-tilmart-ngx-apps-admin-trace.module-Pwr-82Rc.mjs","sources":["../../../projects/admin/src/lib/pages/trace/trace.component.ts","../../../projects/admin/src/lib/pages/trace/trace.component.html","../../../projects/admin/src/lib/pages/trace/trace.module.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { BaseDirective, using } from '@thescaffold/ngx-core';\nimport { takeUntil } from 'rxjs';\n\ninterface TraceEvent {\n at: string | null;\n kind: string;\n label: string;\n detail?: Record<string, unknown>;\n}\n\n// P7.14 (N.4) — trace one order end-to-end without leaving the back\n// office. Reads `GET apps/commerce/reports/trace?ref=<...>` (order\n// number, order id, or a payment provider ref) and renders the merged\n// timeline: status history, payments + attempts, shipments + exceptions,\n// returns, the notifications sent for it, and its audit-log entries.\n@Component({\n standalone: false,\n selector: 'x-trace',\n templateUrl: './trace.component.html',\n})\nexport class TraceComponent extends BaseDirective {\n private readonly source = this.apiService.on('apps/commerce/reports');\n private readonly route = inject(ActivatedRoute);\n\n ref = '';\n loading = false;\n notFound = false;\n data: any = null;\n\n override init = () => {\n const q = this.route.snapshot.queryParamMap.get('ref');\n if (q) {\n this.ref = q;\n this.run();\n }\n };\n\n run(): void {\n const ref = this.ref.trim();\n if (!ref) return;\n this.loading = true;\n this.notFound = false;\n this.data = null;\n this.source\n .getOne(`trace?ref=${encodeURIComponent(ref)}`)\n .pipe(takeUntil(this.$))\n .subscribe(\n using((res: any) => {\n const payload = res?.data ?? {};\n if (payload.ok === false || !payload.data) {\n this.notFound = true;\n } else {\n this.data = payload.data ?? payload;\n }\n this.loading = false;\n }),\n );\n }\n\n detailText(d?: Record<string, unknown>): string {\n if (!d) return '';\n return Object.entries(d)\n .filter(([, v]) => v != null && v !== '')\n .map(([k, v]) => `${k}: ${v}`)\n .join(' · ');\n }\n}\n","<div class=\"x-page-head\">\n <div class=\"x-page-title\">Trace</div>\n <div class=\"x-page-subtitle\">\n Follow one order end-to-end — status, payments, fulfilment, returns,\n notifications and audit — from here alone (N.4).\n </div>\n</div>\n\n<form class=\"x-tr-search\" (ngSubmit)=\"run()\">\n <input\n type=\"search\"\n placeholder=\"Order number, order id, or payment reference\"\n [(ngModel)]=\"ref\"\n name=\"ref\"\n />\n <button type=\"submit\" [disabled]=\"loading || !ref.trim()\">Trace</button>\n</form>\n\n@if (loading) {\n <x-element-loader></x-element-loader>\n} @else if (notFound) {\n <p class=\"x-tr-empty\">Nothing found for that reference.</p>\n} @else if (data) {\n <div class=\"x-tr-summary\">\n <div><strong>{{ data.order.orderNumber }}</strong></div>\n <div class=\"x-tr-muted\">\n {{ data.order.status }} ·\n ₦{{ data.order.grandTotal | number: '1.0-0' }} {{ data.order.currency }} ·\n placed {{ data.order.createdAt | date: 'medium' }}\n </div>\n <div class=\"x-tr-counts\">\n <span>{{ data.payments.length }} payment(s)</span>\n <span>{{ data.shipments.length }} shipment(s)</span>\n <span>{{ data.returns.length }} return(s)</span>\n <span>{{ data.notifications.length }} notification(s)</span>\n <span>{{ data.auditEntries.length }} audit entr(ies)</span>\n </div>\n </div>\n\n <ol class=\"x-tr-timeline\">\n @for (e of data.timeline; track $index) {\n <li class=\"x-tr-event x-tr-kind-{{ e.kind }}\">\n <div class=\"x-tr-when\">{{ e.at ? (e.at | date: 'short') : '—' }}</div>\n <div class=\"x-tr-body\">\n <span class=\"x-tr-tag\">{{ e.kind }}</span>\n <span class=\"x-tr-label\">{{ e.label }}</span>\n @if (detailText(e.detail)) {\n <div class=\"x-tr-detail\">{{ detailText(e.detail) }}</div>\n }\n </div>\n </li>\n }\n </ol>\n}\n\n<style>\n .x-page-head { margin-bottom: 16px; }\n .x-page-title { font-size: 24px; font-weight: 800; color: var(--color-text); }\n .x-page-subtitle { font-size: 13.5px; color: var(--color-text-muted); margin-top: 2px; max-width: 620px; }\n .x-tr-search { display: flex; gap: 8px; margin-bottom: 20px; }\n .x-tr-search input { flex: 1; max-width: 420px; font: inherit; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-surface, #fff); color: var(--color-text); }\n .x-tr-search button { font: inherit; font-weight: 600; padding: 8px 16px; border: 0; border-radius: 6px; background: var(--color-brand); color: #fff; cursor: pointer; }\n .x-tr-search button:disabled { opacity: 0.5; }\n .x-tr-empty { color: var(--color-text-muted); font-size: 13px; }\n .x-tr-summary { border: 1px solid var(--color-border); border-radius: 10px; padding: 14px; margin-bottom: 18px; }\n .x-tr-muted { color: var(--color-text-muted); font-size: 13px; margin-top: 3px; }\n .x-tr-counts { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 12px; color: var(--color-text-muted); }\n .x-tr-timeline { list-style: none; margin: 0; padding: 0; border-left: 2px solid var(--color-border); }\n .x-tr-event { display: flex; gap: 14px; padding: 8px 0 8px 16px; position: relative; }\n .x-tr-event::before { content: ''; position: absolute; left: -7px; top: 13px; width: 10px; height: 10px; border-radius: 50%; background: var(--color-text-muted); }\n .x-tr-kind-payment::before, .x-tr-kind-payment-attempt::before { background: var(--color-brand); }\n .x-tr-kind-delivery-exception::before, .x-tr-kind-return::before { background: var(--color-danger, #c0392b); }\n .x-tr-when { font-size: 11.5px; color: var(--color-text-muted); min-width: 96px; padding-top: 2px; }\n .x-tr-tag { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 700; color: var(--color-text-muted); margin-right: 8px; }\n .x-tr-label { font-size: 13.5px; color: var(--color-text); }\n .x-tr-detail { font-size: 12px; color: var(--color-text-muted); margin-top: 2px; }\n</style>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@thescaffold/ngx-core';\nimport { ElementsModule } from '@thescaffold/ngx-ui';\nimport { TraceComponent } from './trace.component';\n\n@NgModule({\n declarations: [TraceComponent],\n imports: [\n SharedModule,\n ElementsModule,\n RouterModule.forChild([{ path: '', component: TraceComponent }]),\n ],\n})\nexport class TraceModule {}\n"],"names":["i2","i3","i1"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, NgModule } from '@angular/core';
3
+ import * as i1$1 from '@angular/router';
4
+ import { RouterModule } from '@angular/router';
5
+ import { BaseDirective, using, titleCase, SharedModule } from '@thescaffold/ngx-core';
6
+ import * as i1 from '@thescaffold/ngx-ui';
7
+ import { ElementsModule, WebgetsModule } from '@thescaffold/ngx-ui';
8
+ import { BehaviorSubject, takeUntil, map } from 'rxjs';
9
+ import * as i2 from '@angular/common';
10
+
11
+ // Read-only, searchable User browser (docs/PLAN_2.md Phase 10 req #25) - no
12
+ // list/detail existed anywhere in Tilmart's admin before this. Deliberately
13
+ // thin: identity's own vendor "people" Angular pages (ngx-apps/projects/
14
+ // identity/src/lib/pages/people/) are workspace-team-membership management
15
+ // ("invite a teammate to my workspace", backed by apps/identity/role-type),
16
+ // the wrong shape entirely for "browse every registered buyer platform-
17
+ // wide" - so this is a fresh page against apps/identity/user directly,
18
+ // matching this app's established x-webget-collection pattern (routes,
19
+ // inbox, payments) rather than pulling in that vendor module.
20
+ class UsersComponent extends BaseDirective {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.name = 'user';
24
+ this.pluralName = 'users';
25
+ this.dataSource = this.apiService.on('apps/identity/user');
26
+ this.columns = [
27
+ { key: 'ref', value: 'Email / phone' },
28
+ { key: 'type', value: 'Type', type: 'class', class: 'badge text-bg-light border' },
29
+ { key: 'createdAt', value: 'Joined', type: 'date' },
30
+ ];
31
+ this.page = 1;
32
+ this.perPage = 25;
33
+ this.list$ = new BehaviorSubject(null);
34
+ this.init = () => {
35
+ this.list();
36
+ };
37
+ }
38
+ list(page = this.page, perPage = this.perPage) {
39
+ this.dataSource
40
+ .getMany({ page, perPage })
41
+ .pipe(takeUntil(this.$), map((response) => this.toCollection(response)))
42
+ .subscribe(using((data) => this.list$.next(data)));
43
+ }
44
+ toCollection(response) {
45
+ return {
46
+ title: titleCase(this.pluralName),
47
+ columns: this.columns,
48
+ rows: response?.data,
49
+ hasHeaders: true,
50
+ hasTextFilter: true,
51
+ page: response?.meta?.current_page,
52
+ perPage: response?.meta?.per_page,
53
+ total: response?.meta?.total,
54
+ onPage: (page) => this.list(page),
55
+ };
56
+ }
57
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: UsersComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
58
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: UsersComponent, isStandalone: false, selector: "x-users", usesInheritance: true, ngImport: i0, template: `
59
+ <div class="x-page-head">
60
+ <div class="x-page-title">Users</div>
61
+ <div class="x-page-subtitle">Every registered account, across all workspaces.</div>
62
+ </div>
63
+
64
+ @if (list$ | async; as list) {
65
+ <x-webget-collection [data]="list"></x-webget-collection>
66
+ } @else {
67
+ <x-element-loader></x-element-loader>
68
+ }
69
+ `, isInline: true, styles: [".x-page-head{margin-bottom:20px}.x-page-title{font-size:24px;font-weight:800;color:var(--color-text)}.x-page-subtitle{font-size:13.5px;color:var(--color-text-muted);margin-top:2px}\n"], dependencies: [{ kind: "component", type: i1.LoaderComponent, selector: "x-element-loader", inputs: ["data"] }, { kind: "component", type: i1.CollectionComponent, selector: "x-webget-collection", inputs: ["data"], outputs: ["search", "filter", "refresh", "select", "page", "show"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: UsersComponent, decorators: [{
72
+ type: Component,
73
+ args: [{ standalone: false, selector: 'x-users', template: `
74
+ <div class="x-page-head">
75
+ <div class="x-page-title">Users</div>
76
+ <div class="x-page-subtitle">Every registered account, across all workspaces.</div>
77
+ </div>
78
+
79
+ @if (list$ | async; as list) {
80
+ <x-webget-collection [data]="list"></x-webget-collection>
81
+ } @else {
82
+ <x-element-loader></x-element-loader>
83
+ }
84
+ `, styles: [".x-page-head{margin-bottom:20px}.x-page-title{font-size:24px;font-weight:800;color:var(--color-text)}.x-page-subtitle{font-size:13.5px;color:var(--color-text-muted);margin-top:2px}\n"] }]
85
+ }] });
86
+
87
+ class UsersModule {
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: UsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
89
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.16", ngImport: i0, type: UsersModule, declarations: [UsersComponent], imports: [SharedModule,
90
+ ElementsModule,
91
+ WebgetsModule, i1$1.RouterModule] }); }
92
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: UsersModule, imports: [SharedModule,
93
+ ElementsModule,
94
+ WebgetsModule,
95
+ RouterModule.forChild([{ path: '', component: UsersComponent }])] }); }
96
+ }
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: UsersModule, decorators: [{
98
+ type: NgModule,
99
+ args: [{
100
+ declarations: [UsersComponent],
101
+ imports: [
102
+ SharedModule,
103
+ ElementsModule,
104
+ WebgetsModule,
105
+ RouterModule.forChild([{ path: '', component: UsersComponent }]),
106
+ ],
107
+ }]
108
+ }] });
109
+
110
+ export { UsersModule };
111
+ //# sourceMappingURL=isaiahiroko-tilmart-ngx-apps-admin-users.module-Bx_7fI2g.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isaiahiroko-tilmart-ngx-apps-admin-users.module-Bx_7fI2g.mjs","sources":["../../../projects/admin/src/lib/pages/users/users.component.ts","../../../projects/admin/src/lib/pages/users/users.module.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BaseDirective, titleCase, using } from '@thescaffold/ngx-core';\nimport { BehaviorSubject, takeUntil, map } from 'rxjs';\n\n// Read-only, searchable User browser (docs/PLAN_2.md Phase 10 req #25) - no\n// list/detail existed anywhere in Tilmart's admin before this. Deliberately\n// thin: identity's own vendor \"people\" Angular pages (ngx-apps/projects/\n// identity/src/lib/pages/people/) are workspace-team-membership management\n// (\"invite a teammate to my workspace\", backed by apps/identity/role-type),\n// the wrong shape entirely for \"browse every registered buyer platform-\n// wide\" - so this is a fresh page against apps/identity/user directly,\n// matching this app's established x-webget-collection pattern (routes,\n// inbox, payments) rather than pulling in that vendor module.\n@Component({\n standalone: false,\n selector: 'x-users',\n template: `\n <div class=\"x-page-head\">\n <div class=\"x-page-title\">Users</div>\n <div class=\"x-page-subtitle\">Every registered account, across all workspaces.</div>\n </div>\n\n @if (list$ | async; as list) {\n <x-webget-collection [data]=\"list\"></x-webget-collection>\n } @else {\n <x-element-loader></x-element-loader>\n }\n `,\n styles: [\n `\n .x-page-head {\n margin-bottom: 20px;\n }\n .x-page-title {\n font-size: 24px;\n font-weight: 800;\n color: var(--color-text);\n }\n .x-page-subtitle {\n font-size: 13.5px;\n color: var(--color-text-muted);\n margin-top: 2px;\n }\n `,\n ],\n})\nexport class UsersComponent extends BaseDirective {\n name = 'user';\n pluralName = 'users';\n dataSource = this.apiService.on('apps/identity/user');\n\n columns = [\n { key: 'ref', value: 'Email / phone' },\n { key: 'type', value: 'Type', type: 'class', class: 'badge text-bg-light border' },\n { key: 'createdAt', value: 'Joined', type: 'date' },\n ];\n\n page = 1;\n perPage = 25;\n\n list$ = new BehaviorSubject<any>(null);\n\n override init = () => {\n this.list();\n };\n\n list(page = this.page, perPage = this.perPage) {\n this.dataSource\n .getMany({ page, perPage })\n .pipe(\n takeUntil(this.$),\n map((response) => this.toCollection(response)),\n )\n .subscribe(using((data) => this.list$.next(data)));\n }\n\n private toCollection(response: any) {\n return {\n title: titleCase(this.pluralName),\n columns: this.columns,\n rows: response?.data,\n hasHeaders: true,\n hasTextFilter: true,\n page: response?.meta?.current_page,\n perPage: response?.meta?.per_page,\n total: response?.meta?.total,\n onPage: (page: number) => this.list(page),\n };\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@thescaffold/ngx-core';\nimport { ElementsModule, WebgetsModule } from '@thescaffold/ngx-ui';\nimport { UsersComponent } from './users.component';\n\n@NgModule({\n declarations: [UsersComponent],\n imports: [\n SharedModule,\n ElementsModule,\n WebgetsModule,\n RouterModule.forChild([{ path: '', component: UsersComponent }]),\n ],\n})\nexport class UsersModule {}\n"],"names":["i1"],"mappings":";;;;;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAkCM,MAAO,cAAe,SAAQ,aAAa,CAAA;AAjCjD,IAAA,WAAA,GAAA;;QAkCE,IAAA,CAAA,IAAI,GAAG,MAAM;QACb,IAAA,CAAA,UAAU,GAAG,OAAO;QACpB,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,CAAC;AAErD,QAAA,IAAA,CAAA,OAAO,GAAG;AACR,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE;AACtC,YAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE;YAClF,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;SACpD;QAED,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,OAAO,GAAG,EAAE;AAEZ,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC;QAE7B,IAAA,CAAA,IAAI,GAAG,MAAK;YACnB,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC;AAyBF,IAAA;IAvBC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,EAAA;AAC3C,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;aACzB,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EACjB,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAE/C,aAAA,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD;AAEQ,IAAA,YAAY,CAAC,QAAa,EAAA;QAChC,OAAO;AACL,YAAA,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,QAAQ,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;AAClC,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;AACjC,YAAA,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;YAC5B,MAAM,EAAE,CAAC,IAAY,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1C;IACH;+GA1CW,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9Bf;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAmBU,cAAc,EAAA,UAAA,EAAA,CAAA;kBAjC1B,SAAS;iCACI,KAAK,EAAA,QAAA,EACP,SAAS,EAAA,QAAA,EACT;;;;;;;;;;;AAWT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA;;;MCZU,WAAW,CAAA;+GAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAX,WAAW,EAAA,YAAA,EAAA,CARP,cAAc,CAAA,EAAA,OAAA,EAAA,CAE3B,YAAY;YACZ,cAAc;YACd,aAAa,EAAAA,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA,CAAA;AAIJ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YANpB,YAAY;YACZ,cAAc;YACd,aAAa;AACb,YAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA,EAAA,CAAA,CAAA;;4FAGvD,WAAW,EAAA,UAAA,EAAA,CAAA;kBATvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,cAAc,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,cAAc;wBACd,aAAa;AACb,wBAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;AACjE,qBAAA;AACF,iBAAA;;;;;"}