diff --git a/README.md b/README.md
index 01537f5d..53c7c370 100644
--- a/README.md
+++ b/README.md
@@ -116,7 +116,7 @@ Built on the Events object.
Developer sandbox pages — not for production use.
-- `/testing/ae_obj_field_editor_v3/` — V3 field editor playground
+- `/testing/ae_obj_field_editor/` — V3 field editor playground
- `/testing/data_store_v3/` — Data store V3 playground
- `/testing/editor_test/` — CodeMirror / TipTap editor tests
- `/testing/hosted_files/` — File upload tests
diff --git a/documentation/AE__Components.md b/documentation/AE__Components.md
index eceb2d67..45114b9a 100644
--- a/documentation/AE__Components.md
+++ b/documentation/AE__Components.md
@@ -62,7 +62,7 @@ These are reusable components that provide common functionalities across differe
- Bindings: `bind:trigger`, `bind:show_spinner`, `bind:show_percent`.
- Status: `started`, `downloading`, `finished`.
- **`data_store`**: Component for interacting with data stores.
-- **`element_ae_obj_field_editor_v3`**: Standard single-field inline editor. Replaces retired `ae_crud` v1/v2 components.
+- **`element_ae_obj_field_editor`**: Standard single-field inline editor. Replaces retired `ae_crud` v1/v2 components.
- Props: `object_type`, `object_id`, `field_name`, `field_type`, `current_value`
- Field types: `text`, `textarea`, `select`, `tiptap`, `checkbox`, `date`, `datetime`, `number`
- Callbacks: `on_success`, `on_error`
diff --git a/documentation/GUIDE__Development.md b/documentation/GUIDE__Development.md
index 88511f0a..81ab4c4d 100644
--- a/documentation/GUIDE__Development.md
+++ b/documentation/GUIDE__Development.md
@@ -53,12 +53,12 @@ You are not working in a vacuum. Coordinate with the Backend Agent via MCP tools
| `documentation/PROJECT__AE_Events_Launcher_Native_integration.md` | Electron/Launcher reference |
| `tests/README.md` | Playwright test guide — shared helpers, hard-won lessons, demo IDs |
-## 6. Inline Field Editing — `element_ae_obj_field_editor_v3`
+## 6. Inline Field Editing — `element_ae_obj_field_editor`
The standard component for single-field inline editing throughout the platform. Wraps a `PATCH /v3/crud/{obj_type}/{obj_id}` call behind a click-to-edit UI that respects `$ae_loc.edit_mode`.
```svelte
-import Element_ae_obj_field_editor_v3 from '$lib/elements/element_ae_obj_field_editor_v3.svelte';
+import Element_ae_obj_field_editor from '$lib/elements/element_ae_obj_field_editor.svelte';
```
### Basic usage — text field with custom display
@@ -66,7 +66,7 @@ import Element_ae_obj_field_editor_v3 from '$lib/elements/element_ae_obj_field_e
Wrap the display content in the default snippet. The component renders it in view mode and swaps in the input on edit.
```svelte
- events_func.load_ae_obj_id__event_session({ api_cfg: $ae_api, event_session_id: session.id })}
>
{session.name}
-
+
```
### Field types
@@ -94,7 +94,7 @@ Wrap the display content in the default snippet. The component renders it in vie
### Select with nullable FK
```svelte
- events_func.load_ae_obj_id__event_presenter({ api_cfg: $ae_api, event_presenter_id: presenter.event_presenter_id })}
>
{presenter.person_id ?? 'Not linked'}
-
+
```
### Key props
diff --git a/documentation/PROJECT__AE_Object_Field_Editor_V3_upgrade.md b/documentation/PROJECT__AE_Object_Field_Editor_V3_upgrade.md
index f3c8e61f..7b615c8f 100644
--- a/documentation/PROJECT__AE_Object_Field_Editor_V3_upgrade.md
+++ b/documentation/PROJECT__AE_Object_Field_Editor_V3_upgrade.md
@@ -2,7 +2,7 @@
> **Status:** 🟡 Mostly Complete — Phase 3 items + GUIDE update remaining
> **Date:** February 13, 2026 (last updated: 2026-03-20)
-> **Target Component:** `src/lib/elements/element_ae_obj_field_editor_v3.svelte`
+> **Target Component:** `src/lib/elements/element_ae_obj_field_editor.svelte`
> **Replaces:** `element_ae_crud.svelte` and `element_ae_crud_v2.svelte`
## 1. Overview
@@ -36,7 +36,7 @@ Consolidate the legacy CRUD components into a single, high-performance "Aether O
- [ ] Implement searchable dropdowns for the `select` type.
### Phase 4: Migration & Cleanup
-- [x] Create a playground route for V3 verification (`/testing/ae_obj_field_editor_v3`).
+- [x] Create a playground route for V3 verification (`/testing/ae_obj_field_editor`).
- [x] Deprecate and remove `v1` and `v2` files — `element_ae_crud.svelte` and `element_ae_crud_v2.svelte` removed 2026-03-20.
- [ ] Update `GUIDE__Development.md` with the new usage patterns.
diff --git a/src/lib/ae_api/api_get__data_store.ts b/src/lib/ae_api/api_get__data_store.ts
index 5ef0827a..07b4d56e 100644
--- a/src/lib/ae_api/api_get__data_store.ts
+++ b/src/lib/ae_api/api_get__data_store.ts
@@ -15,7 +15,7 @@ interface GetDataStoreV3Params {
* Uses hierarchical fallback logic (Specific -> Account -> Global)
* Path: GET /v3/data_store/code/{code}
*/
-export async function get_data_store_v3({
+export async function get_data_store({
api_cfg,
code,
for_type = null,
@@ -24,7 +24,7 @@ export async function get_data_store_v3({
log_lvl = 0
}: GetDataStoreV3Params): Promise {
if (log_lvl) {
- console.log(`*** get_data_store_v3() *** code=${code} no_account_id=${no_account_id}`);
+ console.log(`*** get_data_store() *** code=${code} no_account_id=${no_account_id}`);
}
const endpoint = `/v3/data_store/code/${code}`;
diff --git a/src/lib/ae_core/core__crud_generic.ts b/src/lib/ae_core/core__crud_generic.ts
deleted file mode 100644
index 2a967837..00000000
--- a/src/lib/ae_core/core__crud_generic.ts
+++ /dev/null
@@ -1,351 +0,0 @@
-import { marked } from 'marked';
-
-import type { key_val } from '$lib/stores/ae_stores';
-import { api } from '$lib/api/api';
-
-import { db_save_ae_obj_li__ae_obj } from '$lib/ae_core/core__idb_dexie';
-
-// Define generic CRUD args
-export interface GenericCrudArgs {
- api_cfg: any;
- obj_type: string;
- obj_id?: string;
- for_obj_type?: string;
- for_obj_id?: string;
-
- db_instance?: any; // Optional DB instance for caching
- db_field_li?: string[]; // Optional list of fields to save in DB
-
- // Flags to include related core object models
- inc_account_li?: boolean;
- inc_address_li?: boolean;
- inc_contact_li?: boolean;
- inc_person_li?: boolean;
- inc_site_li?: boolean;
- inc_site_domain_li?: boolean;
- inc_user_li?: boolean;
-
- // Flags to include related other object models
- inc_archive_li?: boolean;
- inc_archive_entry_li?: boolean;
- inc_event_li?: boolean;
- inc_event_session_li?: boolean;
- inc_post_li?: boolean;
- inc_post_comment_li?: boolean;
- inc_journal_li?: boolean;
- inc_journal_entry_li?: boolean;
-
- inc_obj_type_li?: string[]; // Optional list of object types to include
-
- data_kv?: key_val;
- enabled?: 'enabled' | 'not_enabled' | 'all';
- hidden?: 'not_hidden' | 'hidden' | 'all';
- method?: string;
- limit?: number;
- offset?: number;
- order_by_li?: Record | Record[] | null;
- params?: key_val;
- try_cache?: boolean;
- log_lvl?: number;
-}
-
-// Generic function: Load single object by ID
-export async function load_ae_obj_id(args: GenericCrudArgs): Promise {
- const { api_cfg, obj_type, obj_id, log_lvl = 0 } = args;
-
- if (!obj_id) {
- if (log_lvl) console.warn('load_ae_obj_id called without obj_id');
- return null;
- }
-
- if (log_lvl) {
- console.log(`*** load_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`);
- }
-
- const result = await api.get_ae_obj_id_crud({
- api_cfg,
- obj_type,
- obj_id,
- params: {},
- log_lvl
- });
-
- return result;
-}
-
-// Generic function: Load list of objects
-export async function load_ae_obj_li(args: GenericCrudArgs): Promise {
- const {
- api_cfg,
- obj_type,
- for_obj_type = '',
- for_obj_id,
- inc_obj_type_li,
- enabled = 'enabled',
- hidden = 'not_hidden',
- limit = 99,
- offset = 0,
- order_by_li = {},
- params = {},
- try_cache = true,
- log_lvl = 0
- } = args;
-
- if (log_lvl) {
- console.log(
- `*** load_ae_obj_li() *** obj_type=${obj_type} for_obj_type=${for_obj_type} for_obj_id=${for_obj_id}`
- );
- }
-
- const params_json: key_val = {};
-
- const result = await api.get_ae_obj_li_for_obj_id_crud_v2({
- api_cfg,
- obj_type,
- for_obj_type,
- for_obj_id: for_obj_id ?? '',
- enabled,
- hidden,
- order_by_li,
- limit,
- offset,
- params_json: {},
- params,
- log_lvl
- });
-
- return result;
-}
-
-// Generic function: Create object
-export async function create_ae_obj(args: GenericCrudArgs): Promise {
- const { api_cfg, obj_type, data_kv, log_lvl = 0 } = args;
-
- if (log_lvl) {
- console.log(`*** create_ae_obj() *** obj_type=${obj_type}`, data_kv);
- }
-
- const result = await api.create_ae_obj_crud({
- api_cfg,
- obj_type,
- fields: data_kv,
- key: api_cfg.api_crud_super_key,
- params: {},
- return_obj: true,
- log_lvl
- });
-
- return result;
-}
-
-// Generic function: Update object
-export async function update_ae_obj(args: GenericCrudArgs): Promise {
- const { api_cfg, obj_type, obj_id, data_kv, log_lvl = 0 } = args;
-
- if (!obj_id) {
- if (log_lvl) console.warn('update_ae_obj called without obj_id');
- return null;
- }
-
- if (log_lvl) {
- console.log(`*** update_ae_obj() *** obj_type=${obj_type} obj_id=${obj_id}`, data_kv);
- }
-
- const result = await api.update_ae_obj_id_crud({
- api_cfg,
- obj_type,
- obj_id,
- fields: data_kv,
- key: api_cfg.api_crud_super_key,
- params: {},
- return_obj: true,
- log_lvl
- });
-
- return result;
-}
-
-// Generic function: Delete object
-export async function delete_ae_obj_id(args: GenericCrudArgs): Promise {
- const { api_cfg, obj_type, obj_id, method = 'delete', log_lvl = 0 } = args;
-
- if (!obj_id) {
- if (log_lvl) console.warn('delete_ae_obj_id called without obj_id');
- return null;
- }
-
- if (log_lvl) {
- console.log(`*** delete_ae_obj_id() *** obj_type=${obj_type} obj_id=${obj_id}`);
- }
-
- const result = await api.delete_ae_obj_id_crud({
- api_cfg,
- obj_type,
- obj_id,
- key: api_cfg.api_crud_super_key,
- params: {},
- method,
- log_lvl
- });
-
- return result;
-}
-
-// Additional Modules that might be needed for reloads
-import { load_ae_obj_id__archive } from '$lib/ae_archives/ae_archives__archive';
-import { load_ae_obj_id__archive_content } from '$lib/ae_archives/ae_archives__archive_content';
-import { load_ae_obj_id__event } from '$lib/ae_events/ae_events__event';
-import { load_ae_obj_id__event_device } from '$lib/ae_events/ae_events__event_device';
-import { load_ae_obj_id__event_file } from '$lib/ae_events/ae_events__event_file';
-import { load_ae_obj_id__event_location } from '$lib/ae_events/ae_events__event_location';
-import { load_ae_obj_id__event_presentation } from '$lib/ae_events/ae_events__event_presentation';
-import { load_ae_obj_id__event_presenter } from '$lib/ae_events/ae_events__event_presenter';
-import { load_ae_obj_id__event_session } from '$lib/ae_events/ae_events__event_session';
-import { load_ae_obj_id__journal } from '$lib/ae_journals/ae_journals__journal';
-import { load_ae_obj_id__journal_entry } from '$lib/ae_journals/ae_journals__journal_entry';
-import { load_ae_obj_id__post } from '$lib/ae_posts/ae_posts__post';
-import { load_ae_obj_id__post_comment } from '$lib/ae_posts/ae_posts__post_comment';
-import { load_ae_obj_id__person } from '$lib/ae_core/ae_core__person';
-
-export async function update_ae_obj_id_crud_v2({
- api_cfg,
- object_type,
- object_id,
- object_reload = false,
- field_name,
- new_field_value,
- log_lvl = 0
-}: {
- api_cfg: any;
- object_type: string;
- object_id: string;
- object_reload?: boolean;
- field_name: string;
- new_field_value: any;
- log_lvl?: number;
-}) {
- if (log_lvl) {
- console.log(
- `*** update_ae_obj_id_crud_v2() *** object_type=${object_type}, object_id=${object_id}, object_reload=${object_reload}, field_name=${field_name}, new_field_value=`,
- new_field_value
- );
- }
-
- try {
- const results = await api.update_ae_obj_id_crud({
- api_cfg: api_cfg,
- obj_type: object_type,
- obj_id: object_id,
- field_name: field_name,
- field_value: new_field_value,
- key: api_cfg.api_crud_super_key,
- log_lvl: log_lvl
- });
-
- if (!results) {
- if (log_lvl) console.log(
- `Not Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}; Account ID: ${api_cfg.account_id}`
- );
- return false;
- }
-
- if (log_lvl) console.log(`Patched - Field Name: ${field_name} with new Field Value: ${new_field_value}`);
-
- if (object_reload) {
- if (log_lvl) console.log(`Reloading the object after patching...`);
-
- const reload_fns: { [key: string]: (args: any) => Promise } = {
- person: load_ae_obj_id__person,
- archive: load_ae_obj_id__archive,
- archive_content: load_ae_obj_id__archive_content,
- journal: load_ae_obj_id__journal,
- journal_entry: load_ae_obj_id__journal_entry,
- event: load_ae_obj_id__event,
- event_device: load_ae_obj_id__event_device,
- event_file: load_ae_obj_id__event_file,
- event_location: load_ae_obj_id__event_location,
- event_presentation: load_ae_obj_id__event_presentation,
- event_presenter: load_ae_obj_id__event_presenter,
- event_session: load_ae_obj_id__event_session,
- post: load_ae_obj_id__post,
- post_comment: load_ae_obj_id__post_comment
- };
-
- const reload_fn = reload_fns[object_type];
- if (reload_fn) {
- const id_key = `${object_type}_id`;
- return await reload_fn({ api_cfg, [id_key]: object_id, log_lvl });
- }
- }
-
- return true;
- } catch (error) {
- console.log('Something went wrong patching the record.', error);
- return false;
- }
-}
-
-export async function download_export_li({
- api_cfg,
- get_obj_type,
- for_obj_type,
- for_obj_id,
- exp_alt = null,
- file_type = 'CSV',
- return_file = true,
- filename = 'no_filename.csv',
- auto_download = false,
- limit = 5000,
- params = {},
- log_lvl = 0
-}: {
- api_cfg: any;
- get_obj_type: string;
- for_obj_type: string;
- for_obj_id: string;
- exp_alt?: null | string;
- file_type?: string;
- return_file?: boolean;
- filename?: string;
- auto_download?: boolean;
- limit?: number;
- params?: key_val;
- log_lvl?: number;
-}) {
- if (log_lvl) console.log('*** download_export_li() ***');
-
- const endpoint = `/v2/crud/${get_obj_type}/list`;
- params['for_obj_type'] = for_obj_type;
- params['for_obj_id'] = for_obj_id;
-
- if (file_type === 'CSV' || file_type === 'Excel') {
- params['file_type'] = file_type;
- }
- params['return_file'] = true;
- params['mdl_alt'] = 'out';
-
- if (exp_alt) {
- params['exp_alt'] = exp_alt;
- }
-
- const clean_filename = filename.replace(/[^a-zA-Z0-9\[\]-_.]/gi, '_');
-
- if (limit >= 0) {
- params['limit'] = limit;
- }
-
- const download_result = await api.get_object({
- api_cfg: api_cfg,
- endpoint: endpoint,
- params: params,
- timeout: 90000,
- return_blob: return_file,
- filename: clean_filename,
- auto_download: auto_download,
- task_id: for_obj_id,
- log_lvl: log_lvl
- });
-
- if (log_lvl) console.log('download_result:', download_result);
- return download_result;
-}
diff --git a/src/lib/ae_core/core__data_store.ts b/src/lib/ae_core/core__data_store.ts
index fc7b8cd2..b08c42f6 100644
--- a/src/lib/ae_core/core__data_store.ts
+++ b/src/lib/ae_core/core__data_store.ts
@@ -39,7 +39,7 @@ export async function load_ae_obj_by_code__data_store({
}
try {
- const get_ds_result = await api.get_data_store_v3({
+ const get_ds_result = await api.get_data_store({
api_cfg,
code,
log_lvl
@@ -60,7 +60,7 @@ export async function load_ae_obj_by_code__data_store({
// Map content fields for convenience
const text_val = get_ds_result.text || '';
const json_val = get_ds_result.json || (get_ds_result.json_str ? JSON.parse(get_ds_result.json_str) : null);
-
+
const mapped_ds: ae_DataStore = {
...get_ds_result,
id: ds_id,
@@ -77,7 +77,7 @@ export async function load_ae_obj_by_code__data_store({
if (data_type === 'html') return mapped_ds.html;
if (data_type === 'json') return mapped_ds.json;
return mapped_ds.text;
-
+
} catch (error) {
if (log_lvl) console.error('*ae_func* Fetch failed.', error);
return null;
diff --git a/src/lib/api/api.ts b/src/lib/api/api.ts
index d79125b0..d7837f1c 100644
--- a/src/lib/api/api.ts
+++ b/src/lib/api/api.ts
@@ -27,7 +27,7 @@ import {
delete_nested_ae_obj_v3
} from '$lib/ae_api/api_post__crud_obj_v3';
-import { get_data_store_v3 } from '$lib/ae_api/api_get__data_store';
+import { get_data_store } from '$lib/ae_api/api_get__data_store';
/**
* Get a list of lookup objects (V3)
@@ -670,7 +670,7 @@ const obj = {
delete_ae_obj_id_crud: delete_ae_obj_id_crud,
download_hosted_file: download_hosted_file,
delete_hosted_file: delete_hosted_file,
- get_data_store_v3: get_data_store_v3,
+ get_data_store: get_data_store,
get_data_store_obj_w_code: get_data_store_obj_w_code,
get_ae_obj_li_for_lu: get_ae_obj_li_for_lu,
send_email: send_email
diff --git a/src/lib/elements/element_ae_obj_field_editor_v3.svelte b/src/lib/elements/element_ae_obj_field_editor.svelte
similarity index 99%
rename from src/lib/elements/element_ae_obj_field_editor_v3.svelte
rename to src/lib/elements/element_ae_obj_field_editor.svelte
index f7268737..72706302 100644
--- a/src/lib/elements/element_ae_obj_field_editor_v3.svelte
+++ b/src/lib/elements/element_ae_obj_field_editor.svelte
@@ -155,7 +155,7 @@
@@ -312,7 +312,7 @@