diff --git a/packages/angular/package.json b/packages/angular/package.json
index 4dfd7b5e1..b0b48d8f8 100644
--- a/packages/angular/package.json
+++ b/packages/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@simple-table/angular",
- "version": "3.0.0-beta.16",
+ "version": "3.0.0-beta.17",
"main": "dist/cjs/index.js",
"module": "dist/index.es.js",
"types": "dist/types/angular/src/index.d.ts",
diff --git a/packages/angular/src/buildVanillaConfig.ts b/packages/angular/src/buildVanillaConfig.ts
index 13d161f86..ec7a19d2a 100644
--- a/packages/angular/src/buildVanillaConfig.ts
+++ b/packages/angular/src/buildVanillaConfig.ts
@@ -1,9 +1,10 @@
import type { ApplicationRef, EnvironmentInjector } from "@angular/core";
-import type { SimpleTableConfig, HeaderObject, ColumnEditorConfig } from "simple-table-core";
+import type { SimpleTableConfig, HeaderObject, ColumnEditorConfig, Row } from "simple-table-core";
import type {
SimpleTableAngularProps,
AngularHeaderObject,
AngularColumnEditorConfig,
+ AngularIconsConfig,
} from "./types";
import { wrapAngularRenderer } from "./utils/wrapAngularRenderer";
@@ -14,6 +15,7 @@ export function buildVanillaConfig(
): SimpleTableConfig {
const {
defaultHeaders,
+ rows,
footerRenderer,
emptyStateRenderer,
errorStateRenderer,
@@ -21,12 +23,28 @@ export function buildVanillaConfig(
tableEmptyStateRenderer,
headerDropdown,
columnEditorConfig,
+ icons,
...rest
} = config;
const wrap =
(component: any) =>
wrapAngularRenderer
(component, appRef, injector);
+ function transformIcons(icons: AngularIconsConfig): NonNullable {
+ const result: NonNullable = {};
+ for (const [key, value] of Object.entries(icons)) {
+ if (value == null) continue;
+ if (typeof value === "string" || value instanceof HTMLElement || value instanceof SVGSVGElement) {
+ (result as any)[key] = value;
+ } else if ((value as any).ɵcmp) {
+ (result as any)[key] = wrap(value as any)({});
+ } else {
+ (result as any)[key] = value;
+ }
+ }
+ return result;
+ }
+
function transformColumnEditorConfig(cfg: AngularColumnEditorConfig): ColumnEditorConfig {
const { rowRenderer, customRenderer, ...cfgRest } = cfg;
return {
@@ -66,6 +84,7 @@ export function buildVanillaConfig(
const vanillaConfig: SimpleTableConfig = {
...rest,
+ rows: rows as Row[],
defaultHeaders: defaultHeaders.map(transformHeader),
};
@@ -113,5 +132,9 @@ export function buildVanillaConfig(
vanillaConfig.columnEditorConfig = transformColumnEditorConfig(columnEditorConfig);
}
+ if (icons !== undefined) {
+ vanillaConfig.icons = transformIcons(icons);
+ }
+
return vanillaConfig;
}
diff --git a/packages/angular/src/defaultHeadersFromCore.ts b/packages/angular/src/defaultHeadersFromCore.ts
new file mode 100644
index 000000000..f33527e9a
--- /dev/null
+++ b/packages/angular/src/defaultHeadersFromCore.ts
@@ -0,0 +1,14 @@
+import type { HeaderObject } from "simple-table-core";
+import type { AngularHeaderObject } from "./types";
+
+export function defaultHeaderFromCore(header: HeaderObject): AngularHeaderObject {
+ return header as unknown as AngularHeaderObject;
+}
+
+export function defaultHeadersFromCore(headers: readonly HeaderObject[]): AngularHeaderObject[] {
+ return headers as unknown as AngularHeaderObject[];
+}
+
+export function mapToAngularHeaderObjects(columns: readonly object[]): AngularHeaderObject[] {
+ return columns as unknown as AngularHeaderObject[];
+}
diff --git a/packages/angular/src/index.ts b/packages/angular/src/index.ts
index e8e49e839..c95bf5e9a 100644
--- a/packages/angular/src/index.ts
+++ b/packages/angular/src/index.ts
@@ -1,5 +1,11 @@
// Component
export { SimpleTableComponent } from "./lib/SimpleTableComponent";
+export { asRows } from "simple-table-core";
+export {
+ defaultHeaderFromCore,
+ defaultHeadersFromCore,
+ mapToAngularHeaderObjects,
+} from "./defaultHeadersFromCore";
// Provider helper
export { provideSimpleTable } from "./lib/provideSimpleTable";
@@ -9,6 +15,8 @@ export type {
SimpleTableAngularProps,
TableInstance,
AngularHeaderObject,
+ AngularIconsConfig,
+ AngularIconSlot,
AngularColumnEditorConfig,
AngularCellRenderer,
AngularHeaderRenderer,
@@ -31,6 +39,7 @@ export type {
Cell,
CellChangeProps,
CellClickProps,
+ CellRenderer,
CellRendererProps,
CellValue,
ChartOptions,
diff --git a/packages/angular/src/lib/SimpleTableComponent.ts b/packages/angular/src/lib/SimpleTableComponent.ts
index d1a76435d..ccf49767c 100644
--- a/packages/angular/src/lib/SimpleTableComponent.ts
+++ b/packages/angular/src/lib/SimpleTableComponent.ts
@@ -15,7 +15,6 @@ import { SimpleTableVanilla } from "simple-table-core";
import type { TableAPI } from "simple-table-core";
import { buildVanillaConfig } from "../buildVanillaConfig";
import type { SimpleTableAngularProps, TableInstance, AngularHeaderObject } from "../types";
-import type { Row } from "simple-table-core";
/**
* SimpleTable — Angular adapter for simple-table-core.
@@ -36,7 +35,7 @@ import type { Row } from "simple-table-core";
styles: [":host { display: block; }"],
})
export class SimpleTableComponent implements OnInit, OnChanges, OnDestroy {
- @Input({ required: true }) rows!: Row[];
+ @Input({ required: true }) rows!: SimpleTableAngularProps["rows"];
@Input({ required: true }) defaultHeaders!: AngularHeaderObject[];
// All optional SimpleTableAngularProps inputs
diff --git a/packages/angular/src/types.ts b/packages/angular/src/types.ts
index 20d802a32..115bfa7ca 100644
--- a/packages/angular/src/types.ts
+++ b/packages/angular/src/types.ts
@@ -3,6 +3,7 @@ import type {
SimpleTableProps,
SimpleTableConfig,
HeaderObject,
+ Row,
TableAPI,
CellRendererProps,
HeaderRendererProps,
@@ -14,7 +15,6 @@ import type {
ColumnEditorRowRendererProps,
ColumnEditorCustomRendererProps,
ColumnEditorConfig,
- IconsConfig,
} from "simple-table-core";
// ─── Internal instance contract ───────────────────────────────────────────────
@@ -37,6 +37,23 @@ export type AngularLoadingStateRenderer = Type;
export type AngularErrorStateRenderer = Type;
export type AngularEmptyStateRenderer = Type;
+/** Per-slot icon: Angular component or vanilla element/string (pass-through). */
+export type AngularIconSlot = Type | SVGSVGElement | HTMLElement | string;
+
+export interface AngularIconsConfig {
+ drag?: AngularIconSlot;
+ expand?: AngularIconSlot;
+ filter?: AngularIconSlot;
+ headerCollapse?: AngularIconSlot;
+ headerExpand?: AngularIconSlot;
+ next?: AngularIconSlot;
+ prev?: AngularIconSlot;
+ sortDown?: AngularIconSlot;
+ sortUp?: AngularIconSlot;
+ pinnedLeftIcon?: AngularIconSlot;
+ pinnedRightIcon?: AngularIconSlot;
+}
+
// ─── Column editor config override ───────────────────────────────────────────
export interface AngularColumnEditorConfig
extends Omit {
@@ -45,33 +62,33 @@ export interface AngularColumnEditorConfig
}
// ─── HeaderObject override ────────────────────────────────────────────────────
+/**
+ * Column definition for `defaultHeaders`: core column metadata with Angular-only
+ * renderer fields. For trees from `simple-table-core`, use `defaultHeadersFromCore` /
+ * `mapToAngularHeaderObjects`.
+ */
export interface AngularHeaderObject
extends Omit {
cellRenderer?: AngularCellRenderer;
headerRenderer?: AngularHeaderRenderer;
children?: AngularHeaderObject[];
- nestedTable?: Omit;
+ nestedTable?: Omit<
+ SimpleTableAngularProps,
+ | "rows"
+ | "loadingStateRenderer"
+ | "errorStateRenderer"
+ | "emptyStateRenderer"
+ | "tableEmptyStateRenderer"
+ >;
}
// ─── Top-level props ──────────────────────────────────────────────────────────
-// Mirrors SimpleTableProps with Angular-specific overrides.
-// `tableRef` is omitted — consumers use Angular's @ViewChild decorator instead:
-// @ViewChild(SimpleTableComponent) tableRef!: SimpleTableComponent;
-// then: this.tableRef.getAPI()?.sort(...)
+// Mirrors SimpleTableProps with Angular-specific overrides. Use @ViewChild on the
+// table component and `getAPI()` for the imperative TableAPI.
export interface SimpleTableAngularProps
extends Omit<
SimpleTableProps,
- | "tableRef"
- | "allowAnimations"
- | "expandIcon"
- | "filterIcon"
- | "headerCollapseIcon"
- | "headerExpandIcon"
- | "nextIcon"
- | "prevIcon"
- | "sortDownIcon"
- | "sortUpIcon"
- | "columnEditorText"
+ | "rows"
| "defaultHeaders"
| "footerRenderer"
| "emptyStateRenderer"
@@ -80,8 +97,11 @@ export interface SimpleTableAngularProps
| "tableEmptyStateRenderer"
| "headerDropdown"
| "columnEditorConfig"
+ | "icons"
> {
defaultHeaders: AngularHeaderObject[];
+ /** Row data: domain objects or core `Row[]`; cast inside the adapter. */
+ rows: ReadonlyArray | ReadonlyArray